diff options
author | Raven Szewczyk <git@eigenraven.me> | 2024-05-24 19:14:53 +0100 |
---|---|---|
committer | Raven Szewczyk <git@eigenraven.me> | 2024-05-24 19:14:53 +0100 |
commit | d6ec3506a48a02199975f878e9e447a5d4190cc0 (patch) | |
tree | aa279651c3ef3bc5a0d4bbb180de5f5c9c49993b | |
parent | 9f42a6f1f90a8d36df7a7febd19a1afc563c0dca (diff) | |
parent | a0adfb78d99c2db252e8458ba8d7837d34da8461 (diff) | |
download | GT5-Unofficial-d6ec3506a48a02199975f878e9e447a5d4190cc0.tar.gz GT5-Unofficial-d6ec3506a48a02199975f878e9e447a5d4190cc0.tar.bz2 GT5-Unofficial-d6ec3506a48a02199975f878e9e447a5d4190cc0.zip |
Merge in TecTech with history
git-subtree-dir: tectech
git-subtree-mainline: 9f42a6f1f90a8d36df7a7febd19a1afc563c0dca
git-subtree-split: a0adfb78d99c2db252e8458ba8d7837d34da8461
631 files changed, 65809 insertions, 0 deletions
diff --git a/tectech/.git-blame-ignore-revs b/tectech/.git-blame-ignore-revs new file mode 100644 index 0000000000..04fc809578 --- /dev/null +++ b/tectech/.git-blame-ignore-revs @@ -0,0 +1,3 @@ +# Ignore spotlessApply reformat +f32d404a051f6ad9d181792d6b489ed6e4a8f80f +a242a3324c398a709ce83325160ffe593bfe2a81 diff --git a/tectech/.gitattributes b/tectech/.gitattributes new file mode 100644 index 0000000000..fd2792b6cb --- /dev/null +++ b/tectech/.gitattributes @@ -0,0 +1,44 @@ +* text eol=lf + +*.[jJ][aA][rR] binary + +*.[pP][nN][gG] binary +*.[jJ][pP][gG] binary +*.[jJ][pP][eE][gG] binary +*.[gG][iI][fF] binary +*.[tT][iI][fF] binary +*.[tT][iI][fF][fF] binary +*.[iI][cC][oO] binary +*.[sS][vV][gG] text +*.[eE][pP][sS] binary +*.[xX][cC][fF] binary + +*.[kK][aA][rR] binary +*.[mM]4[aA] binary +*.[mM][iI][dD] binary +*.[mM][iI][dD][iI] binary +*.[mM][pP]3 binary +*.[oO][gG][gG] binary +*.[rR][aA] binary + +*.7[zZ] binary +*.[gG][zZ] binary +*.[tT][aA][rR] binary +*.[tT][gG][zZ] binary +*.[zZ][iI][pP] binary + +*.[tT][cC][nN] binary +*.[sS][oO] binary +*.[dD][lL][lL] binary +*.[dD][yY][lL][iI][bB] binary +*.[pP][sS][dD] binary +*.[tT][tT][fF] binary +*.[oO][tT][fF] binary + +*.[pP][aA][tT][cC][hH] -text + +*.[bB][aA][tT] text eol=crlf +*.[cC][mM][dD] text eol=crlf +*.[pP][sS]1 text eol=crlf + +*[aA][uU][tT][oO][gG][eE][nN][eE][rR][aA][tT][eE][dD]* binary diff --git a/tectech/.github/workflows/build-and-test.yml b/tectech/.github/workflows/build-and-test.yml new file mode 100644 index 0000000000..3ee2f686fd --- /dev/null +++ b/tectech/.github/workflows/build-and-test.yml @@ -0,0 +1,13 @@ + +name: Build and test + +on: + pull_request: + branches: [ master, main ] + push: + branches: [ master, main ] + +jobs: + build-and-test: + uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master + secrets: inherit diff --git a/tectech/.github/workflows/release-tags.yml b/tectech/.github/workflows/release-tags.yml new file mode 100644 index 0000000000..e4c0be6b0d --- /dev/null +++ b/tectech/.github/workflows/release-tags.yml @@ -0,0 +1,14 @@ + +name: Release tagged build + +on: + push: + tags: [ '*' ] + +permissions: + contents: write + +jobs: + release-tags: + uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master + secrets: inherit diff --git a/tectech/.gitignore b/tectech/.gitignore new file mode 100644 index 0000000000..27a8ae0f17 --- /dev/null +++ b/tectech/.gitignore @@ -0,0 +1,38 @@ +.gradle +.settings +/.idea/ +/.vscode/ +/run/ +/build/ +/eclipse/ +.classpath +.project +/bin/ +/config/ +/crash-reports/ +/logs/ +options.txt +/saves/ +usernamecache.json +banned-ips.json +banned-players.json +eula.txt +ops.json +server.properties +servers.dat +usercache.json +whitelist.json +/out/ +*.iml +*.ipr +*.iws +src/main/resources/mixins.*([!.]).json +*.bat +*.DS_Store +!gradlew.bat +.factorypath +addon.local.gradle +addon.local.gradle.kts +addon.late.local.gradle +addon.late.local.gradle.kts +layout.json
\ No newline at end of file diff --git a/tectech/.gitmodules b/tectech/.gitmodules new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tectech/.gitmodules diff --git a/tectech/CODEOWNERS b/tectech/CODEOWNERS new file mode 100644 index 0000000000..a6b5f68cd0 --- /dev/null +++ b/tectech/CODEOWNERS @@ -0,0 +1,3 @@ +# Any Github changes require admin approval +/.github/** @GTNewHorizons/admin + diff --git a/tectech/LICENSE.txt b/tectech/LICENSE.txt new file mode 100644 index 0000000000..31a900b34e --- /dev/null +++ b/tectech/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-2022 TecTech + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tectech/README.md b/tectech/README.md new file mode 100644 index 0000000000..87ad473415 --- /dev/null +++ b/tectech/README.md @@ -0,0 +1,23 @@ +# TecTech [](http://jenkins.usrv.eu:8080/job/Tec%20Tech) +GT additions EXTREME + +# WIKI +https://github.com/Technus/TecTech/wiki + +# Jenkins Builds +http://jenkins.usrv.eu:8080/job/Tec%20Tech/ + +# Runtime Dependencies? +https://github.com/Technus/TecTech/blob/master/src/main/java/com/github/technus/tectech/TecTech.java#L33 +- Required After + + +# License + +Copyright (c) 2017-2022 TecTech and licensed under the MIT License + +GTNH changes are under the MIT License to maintain upstream compatibility. + +# Credit + +Original mod from Technus, link was broken with upstream due to multi year inactivity. diff --git a/tectech/build.gradle b/tectech/build.gradle new file mode 100644 index 0000000000..e57a16f9f1 --- /dev/null +++ b/tectech/build.gradle @@ -0,0 +1,5 @@ +//version: 1707058017 + +plugins { + id 'com.gtnewhorizons.gtnhconvention' +} diff --git a/tectech/dependencies.gradle b/tectech/dependencies.gradle new file mode 100644 index 0000000000..6d54b5e925 --- /dev/null +++ b/tectech/dependencies.gradle @@ -0,0 +1,27 @@ +// Add your dependencies here + +dependencies { + shadowImplementation('com.github.GTNewHorizons:AVRcore:1.0.1') + api('com.github.GTNewHorizons:GT5-Unofficial:5.09.46.23:dev') + api('com.github.GTNewHorizons:Yamcl:0.6.0:dev') + implementation('com.github.GTNewHorizons:GTNEIOrePlugin:1.2.0:dev') + + compileOnly("TGregworks:TGregworks:1.7.10-GTNH-1.0.23:deobf") {transitive=false} + compileOnly('com.github.GTNewHorizons:TinkersConstruct:1.12.1-GTNH:dev') {transitive=false} + compileOnly('com.github.GTNewHorizons:OpenComputers:1.10.11-GTNH:dev') {transitive=false} + compileOnly('com.github.GTNewHorizons:GTplusplus:1.12.10:dev') {transitive=false} + compileOnly('com.github.GTNewHorizons:Avaritia:1.49:dev') {transitive=false} + + compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') {transitive=false} + compileOnly("curse.maven:extra-utilities-225561:2264384") {transitive=false} + + // for testing EOH recipes + //runtimeOnlyNonPublishable("TGregworks:TGregworks:1.7.10-GTNH-1.0.23:deobf") + //runtimeOnlyNonPublishable('com.github.GTNewHorizons:TinkersConstruct:1.12.1-GTNH:dev') + //runtimeOnlyNonPublishable('com.github.GTNewHorizons:NewHorizonsCoreMod:2.4.9:dev') + //runtimeOnlyNonPublishable('com.github.GTNewHorizons:GoodGenerator:0.9.5:dev') { + // exclude group: "com.github.GTNewHorizons", module: "TecTech" + //} + //runtimeOnlyNonPublishable("curse.maven:extra-utilities-225561:2264384") {transitive=false} + //runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritia:1.49:dev') {transitive=false} +} diff --git a/tectech/dependencies/WorldEditCuiFe-v1.0.7-mf-1.7.10-10.13.4.1566.jar b/tectech/dependencies/WorldEditCuiFe-v1.0.7-mf-1.7.10-10.13.4.1566.jar Binary files differnew file mode 100644 index 0000000000..2891f1480f --- /dev/null +++ b/tectech/dependencies/WorldEditCuiFe-v1.0.7-mf-1.7.10-10.13.4.1566.jar diff --git a/tectech/draw_io_graph.png b/tectech/draw_io_graph.png Binary files differnew file mode 100644 index 0000000000..241c41d604 --- /dev/null +++ b/tectech/draw_io_graph.png diff --git a/tectech/draw_io_graph.xml b/tectech/draw_io_graph.xml new file mode 100644 index 0000000000..b5eeb2c2fd --- /dev/null +++ b/tectech/draw_io_graph.xml @@ -0,0 +1 @@ +<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36" version="8.7.3" editor="www.draw.io" type="device"><diagram id="0a0e746e-b74a-e6df-5b0f-cbfcf109565d" name="Page-1">7R1dk5s48rfkwVWTh7tCfPM440wyudrcZjMzu8m9ySDbXDD4MJ6P/fUngWSDJAO2BcbObNVmQDQy9He3Ws3IGC9ePqVwOf+SBCga6VrwMjI+jHQdmLqN/5CR12LEMbRiYJaGAQXaDtyHfyM6yMDWYYBWFcAsSaIsXFYH/SSOkZ9VxmCaJs9VsGkSVX91CWdIGLj3YSSO/hUG2bwYdXVnO36Hwtmc/TKwveLKBPo/Z2myjunvjXRjmv9XXF5ANhd90dUcBslzaci4HRnjNEmy4mjxMkYRwS1DW3Hfxx1XN8+dojhrdYNOnyN7Ze+OAowKepqk2TyZJTGMbrejN/n7ITKDhs/m2SLChwAfopcw+06G/2nRsx/sSpylr6VL5PQHneC/KMteKQ/AdZbgoe3v/pYkSzrHKkuTnxt6GHhEfFuKgFWyTn36PvQNM5jOEIUyiiHypqXbKIY+oWSB8ONhgBRFMAufqkwBKW/NNnBb/OIDimI5us2O0K0PG9/AUo3w/NbrNIWvJYBlEsbZqjTzVzKAAahecqjQUaXkcqLBQYNjoHWzCbwWHh8UL7flqg2WWjEaJcITjNZoowe0r8kzSgUOrPLX8zzM0P0S5uR8xuq9ynPTMIrGSZSk+b1GYCE3MDfMUrri6hPDtuuY5gmlGXqp5Qd61eSQRU+ft6oZsLF5SS0zo3OMxLqdSCwoiWtJQr/TO7biml87TGDJSABX8/w5QFvpNSTSC06lLl2je+Q73WC/tbqUIVw7FcINQW3gSbVxsliuM6I5tDFchfHs/FUIMHvUIaaAVZGt4+Ca+K34LE5iVI8wiNypL0OY7btoMq1DWCNLlfBhSdDBxvYz1E3WcoN5NkMhIPSmGjPq6g0TFWIlTHSARbXeiMgh36saZfdQGoKGidTR0H6jYS0NTVMRDYWJ1NHQeaNhLQ1tTRENhYnU0ZCp/xIRjaqfcbNeCWQdvpOhc1EdcHv0MpibXkKqXkXqn4hS7syx2qfvxmT0/OK/1hEIy86UQxCGzv5DEKuTmG9QGUkpwk+Wk7TNThBe4XC9yuKl8xOi3FaO8oOyklwsZGhurZnm05INeUk+51kFPzrPCDoS1xr9WMrYMObBDh9lHfcoVto/XSbjK8MbBF9xobFBH3UXo3DglteQwDZq4RUwVg9qicv9iYagwhCquOxgxjKVG+WDGIujvEFN1y5O4RmlQWHhuKMOXgFjjXg32czd5DiDYbw4TxfZ5G1In3HHW1alPiJ3bA7Lh0bkwkQKI/K3tEo9Eb2DU9SgYSKFRHTfiFhLRKCpSlKLM6kjI2OQEhn/wKd/rGGcrRf46FMEV9g+azdR4v98d4bmis/o9GqvDEcUigvL6MgWldkq5AkyOnYXCK8vejo8wXAwgtWHfW0RLFm2x5ZAu0uiCCt6lephOp3qvtQiBPbEtrrxZk27T2/W6kQ9sFhTzq3dZDTac7MpcrP6WLM1N4vlEk4eoIXRGfIyb+p6ZWa7I17uRvMeWkDlidxrD7Lg1G5KfRwFDrSGmlOnHv7ozAojRElwrRGXWdGugycYY+46SpLV2xi7z5pSy+1GLAe0xMXQWxZKSx+EUPIJRoffItFQqs3BHy02bOvIRStpGT/Y9jD4gUtQO1o9PxwHDrQGdmu64Wh+Y6QoqWlbUNMfQxSdXknzzlOvWpqpiQvOEzCNXNHSJwtj2dOUGBM/i5ZzWBYu0MnZkfMZnD6ru2z94n0GS+bIn2zviSV6s6T0QntAEVri18a/lsQnZ0leQ/bLk2LFISlC1D5gYY1XIeGKwSHI67N40JbspyHnjxHWZzBDvNkdln7rF1XisjwwalBVBJL+8CJJANouZvA18gehTVx8B2Yd2obp2PWLNKejtNiAbCnL9ZRtqXMyW+r0FeK2xWptKFzNvaskgKuaADtCTi7DAVru5Ng3cja5ULUhX8k/1p7gDKW74Pmn4eCPLxxjlbd9rgwNQW8AbRiF0qa3F/842lHgZkOexrZr4Y9mN0YJroXDQwrj1TRJF5JGDqs5XJJD9IIpdxMk60l+BQhsOMSaEJPviNGjQ+B2ItmDSvUw41+xR/rJHAJJ5DjSx1fGezx4/xxm/vyyubv1HjYV7A30nvZUKa2xYdxZ4diT7ZJiT8NxLB4aV7euXhLXWrwj2S/XdlQ31oW71Y6jJVVjnjMI32qzssKsr93gnLvHwRsN8KZdC3+8dyXtdLMR529ohWBKjJB2vyPTe1GCvdlV2Idge9b5yPWB3pYnsV3eMKIoXtKNho1+llcLf7Qkep3khoble7sSbjiZ7w1AR97gkJpQylAO1DeyU5I2M6z9EmH7wjftuORtrfIdl+YgSqpPt5dXKv/K/b7WkYy4SwzTe0xWjf61jv3Lc3b42Lv1biMlqSWxmv23xz/xwD/w/7/HEXlO0lIxIkt1E7KhK//BFVpM8msL6M/DmFxcpmiKUsmCZ1ZQpYTmKjrpPr8y7ukQjMJZjE99jFwcuxo3BKmhD6NremERBkEujTK6KiAN4JwLWdLPk1DGUkEZccX5P1+/UMpcbykQUfSjlKJfm2IcYsqsoyxkFPMTrGqSKEIpVvzjXGxXWfGA+BfjgnxPYULaWmlZKEkUnDMV+eBRQsbNiq9yARNXwDfyVQrj3mhWTzODiUMTzZSInrjb/PFuJ9H8vOcsIcKVP0cYAbmCJGL5/tejGyMT89UkgXt3ZBM9h8fbnWSDkVj9dcaI57cN2LYoMN3ZKrEY8fGzBPPPYUb+3H6peA5+CqdZ3rZZu1rH4WIZIVINhIJ37y+JQnw1gswKydw8vqvGQTktcbX28UsdgcaEJnlXxl+EOjqXAQZan6rLExccH78z+uSGA06SJyIsN48P+N+v15///e6d2FvhjAnA0gbbmjtZ0teVEEBFfSfLd4lR53jT3AIH4EQgyJy69gH9bzt2SeEon3vvNRz1xHUPRgaXkuIWhz4Y7/AXowpnPVrv01ahnYCmC9i8uCUR6vNXK8tOVpLqiSFIWR/d+zCOL43HhUSY16PmAawX0znw+AGNQBkrV/hb76bid+8VBz7D31DbyCtDDv74FQFNdMfKZsihUojlIAqD3PxcPQDRHe5IGqeuj+SdQSauZVpaN9LY2uIokUZttyNAuq18jqfr1aXpP5vDuNVrORM4o75j7VQekKk8oHxXf3sLc/lelBznrZsudlBMIGrykfExT3FsElD96BAEsBZxZDrEsx0DduRDtW5JoMaH6mgLyqA43JZpFeWOVGucGx2Vq+1XvaBYc8twbCjvEHlYgRqXp2pqg8Vv3NkXHmgNHVz4B+JvULCzTNJC2yjSLT58vSwFyqe/+lWgVifCXOOEgZHghJ3wowJAVhY3ELl3hA8uN8gx/xFJ1f3sgKyfdi6W9xmchFGfSdB+QlJeNlt3E1Hj3Ox2JTerZZekCXlXsl9sd9WVeR9Xsl/lp0uV3+lCJ32XeqmkvQgE++qytl7OUhggycrwWesdk/OwXEsiCXZXkmDs0jt/JelinkS9RbA9IZvrA9u6zY8aZF9+79ONQ1VVNKfLixliDXLB4NdxHM7DqNcNbqfxZDZdNHvicjGgu8rr4WgxI0Y/2el+c/fpwtEONEmVXHdoF8vkRrod5YgMn/DhjBziN4Rk7sJ/HzMIPHsJSHLfOvYxImAYh9nrPvcFMCPFFCEGTIr74IIQK56syJ8Z/ZrLNJykpACJgvuQEH7Hb+zgGR+mwd6c0c/aixCtmRLGkFV/Cc2LDuIMSdPbq7wYnJAC/yDM/DkiVIiT5/cjWkEZxss1CTiL0pdknVVO8btP8+9rbK6cP1U2e3N7ooroeeWIX4YYcXlpNyLfO3p4/PbtllTl3V3/+F1WlXcOmObrixzRHslq7xQhWm/J/qQccpJzeZxkuTOCzRZ5jXUcoVxNPRMdBYMA/4u5Pw9SSI39itbiM401SRVpqy50j8QV6JDJxZX2qiXRvjcaqS3I5VkC2+iXHJ18V7aaAXa623C+f2WStPNTN70IGguJgMORsO339yz+4yX8RIpaGlp8N9eGpoM8PKuVVve1WjFJ9KFwEG9gTHax0c02xYao0WaHQUjecqvYOY7vpVZHUAkSVt2pJYBd3ehkWC0DiQOK1fFpmmBzVyISRsL8SxIgAvF/</diagram></mxfile>
\ No newline at end of file diff --git a/tectech/gradle.properties b/tectech/gradle.properties new file mode 100644 index 0000000000..531424abd1 --- /dev/null +++ b/tectech/gradle.properties @@ -0,0 +1,192 @@ +# ExampleMod tag to use as Blowdryer (Spotless, etc.) settings version, leave empty to disable. +# LOCAL to test local config updates. +gtnh.settings.blowdryerTag = 0.2.2 + +# Human-readable mod name, available for mcmod.info population. +modName = TecTech - Tec Technology\! + +# Case-sensitive identifier string, available for mcmod.info population and used for automatic mixin JSON generation. +# Conventionally lowercase. +modId = tectech + +# Root package of the mod, used to find various classes in other properties, +# mcmod.info substitution, enabling assertions in run tasks, etc. +modGroup = com.github.technus.tectech + +# Whether to use modGroup as the maven publishing group. +# Due to a history of using JitPack, the default is com.github.GTNewHorizons for all mods. +useModGroupForPublishing = false + +# Updates your build.gradle and settings.gradle automatically whenever an update is available. +autoUpdateBuildScript = false + +# Version of Minecraft to target +minecraftVersion = 1.7.10 + +# Version of Minecraft Forge to target +forgeVersion = 10.13.4.1614 + +# Specify an MCP channel for dependency deobfuscation and the deobfParams task. +channel = stable + +# Specify an MCP mappings version for dependency deobfuscation and the deobfParams task. +mappingsVersion = 12 + +# Defines other MCP mappings for dependency deobfuscation. +remoteMappings = https\://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/ + +# Select a default username for testing your mod. You can always override this per-run by running +# `./gradlew runClient --username=AnotherPlayer`, or configuring this command in your IDE. +developmentEnvironmentUserName = Developer + +# Enables using modern Java syntax (up to version 17) via Jabel, while still targeting JVM 8. +# See https://github.com/bsideup/jabel for details on how this works. +enableModernJavaSyntax = true + +# Enables injecting missing generics into the decompiled source code for a better coding experience. +# Turns most publicly visible List, Map, etc. into proper List<E>, Map<K, V> types. +enableGenericInjection = true + +# Generate a class with a String field for the mod version named as defined below. +# If generateGradleTokenClass is empty or not missing, no such class will be generated. +# If gradleTokenVersion is empty or missing, the field will not be present in the class. +generateGradleTokenClass = com.github.technus.tectech.Tags + +# Name of the token containing the project's current version to generate/replace. +gradleTokenVersion = VERSION + +# [DEPRECATED] Mod ID replacement token. +gradleTokenModId = + +# [DEPRECATED] Mod name replacement token. +gradleTokenModName = + +# [DEPRECATED] Mod Group replacement token. +gradleTokenGroupName = + +# [DEPRECATED] +# Multiple source files can be defined here by providing a comma-separated list: Class1.java,Class2.java,Class3.java +# public static final String VERSION = "GRADLETOKEN_VERSION"; +# The string's content will be replaced with your mod's version when compiled. You should use this to specify your mod's +# version in @Mod([...], version = VERSION, [...]). +# Leave these properties empty to skip individual token replacements. +replaceGradleTokenInFile = + +# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can +# leave this property empty. +# Example value: (apiPackage = api) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.api +apiPackage = + +# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/ +# There can be multiple files in a space-separated list. +# Example value: mymodid_at.cfg nei_at.cfg +accessTransformersFile = tectech_at.cfg + +# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled! +usesMixins = false + +# Adds some debug arguments like verbose output and class export. +usesMixinDebug = false + +# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise. +mixinPlugin = + +# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail! +mixinsPackage = + +# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin! +# This parameter is for legacy compatibility only +# Example value: (coreModClass = asm.FMLPlugin) + (modGroup = com.myname.mymodid) -> com.myname.mymodid.asm.FMLPlugin +coreModClass = + +# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod ( = some class +# that is annotated with @Mod) you want this to be true. When in doubt: leave it on false! +containsMixinsAndOrCoreModOnly = false + +# Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins. +forceEnableMixins = true + +# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated into your jar. It is your +# responsibility to check the license and request permission for distribution if required. +usesShadowedDependencies = true + +# If disabled, won't remove unused classes from shadowed dependencies. Some libraries use reflection to access +# their own classes, making the minimization unreliable. +minimizeShadowedDependencies = true + +# If disabled, won't rename the shadowed classes. +relocateShadowedDependencies = true + +# Adds the GTNH maven, CurseMaven, Modrinth, and some more well-known 1.7.10 repositories. +includeWellKnownRepositories = true + +# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven. +# Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables. +# If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle. +usesMavenPublishing = true + +# Maven repository to publish the mod to. +# mavenPublishUrl = https\://nexus.gtnewhorizons.com/repository/releases/ + +# Publishing to Modrinth requires you to set the MODRINTH_TOKEN environment variable to your current Modrinth API token. +# +# The project's ID on Modrinth. Can be either the slug or the ID. +# Leave this empty if you don't want to publish to Modrinth. +modrinthProjectId = + +# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth. +# Syntax: scope1-type1:name1;scope2-type2:name2;... +# Where scope can be one of [required, optional, incompatible, embedded], +# type can be one of [project, version], +# and the name is the Modrinth project or version slug/id of the other mod. +# Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech +# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true +modrinthRelations = + +# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens. +# +# The project's numeric ID on CurseForge. You can find this in the About Project box. +# Leave this empty if you don't want to publish on CurseForge. +curseForgeProjectId = + +# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge. +# Syntax: type1:name1;type2:name2;... +# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible], +# and the name is the CurseForge project slug of the other mod. +# Example: requiredDependency:railcraft;embeddedLibrary:cofhlib;incompatible:buildcraft +# Note: UniMixins is automatically set as a required dependency if usesMixins = true. +curseForgeRelations = + +# Optional parameter to customize the produced artifacts. Use this to preserve artifact naming when migrating older +# projects. New projects should not use this parameter. +customArchiveBaseName = TecTech + +# Optional parameter to have the build automatically fail if an illegal version is used. +# This can be useful if you e.g. only want to allow versions in the form of '1.1.xxx'. +# The check is ONLY performed if the version is a git tag. +# Note: the specified string must be escaped, so e.g. 1\\.1\\.\\d+ instead of 1\.1\.\d+ +# versionPattern = + +# Uncomment to prevent the source code from being published. +# noPublishedSources = true + +# Uncomment this to disable Spotless checks. +# This should only be uncommented to keep it easier to sync with upstream/other forks. +# That is, if there is no other active fork/upstream, NEVER change this. +# disableSpotless = true + +# Uncomment this to disable Checkstyle checks (currently wildcard import check). +# disableCheckstyle = true + +# Override the IDEA build type. Valid values are: "" (leave blank, do not override), "idea" (force use native IDEA build), "gradle" +# (force use delegated build). +# This is meant to be set in $HOME/.gradle/gradle.properties. +# e.g. add "systemProp.org.gradle.project.ideaOverrideBuildType=idea" will override the build type to be native build. +# WARNING: If you do use this option, it will overwrite whatever you have in your existing projects. This might not be what you want! +# Usually there is no need to uncomment this here as other developers do not necessarily use the same build type as you. +# ideaOverrideBuildType = idea + +# Whether IDEA should run spotless checks when pressing the Build button. +# This is meant to be set in $HOME/.gradle/gradle.properties. +# ideaCheckSpotlessOnBuild = true + diff --git a/tectech/gradle/wrapper/gradle-wrapper.jar b/tectech/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 0000000000..e6441136f3 --- /dev/null +++ b/tectech/gradle/wrapper/gradle-wrapper.jar diff --git a/tectech/gradle/wrapper/gradle-wrapper.properties b/tectech/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b82aa23a4f --- /dev/null +++ b/tectech/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/tectech/gradlew b/tectech/gradlew new file mode 100755 index 0000000000..1aa94a4269 --- /dev/null +++ b/tectech/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original 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 POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# 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 + if ! command -v java >/dev/null 2>&1 + then + 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 +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# 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"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/tectech/gradlew.bat b/tectech/gradlew.bat new file mode 100644 index 0000000000..25da30dbde --- /dev/null +++ b/tectech/gradlew.bat @@ -0,0 +1,92 @@ +@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=. +@rem This is normally unused +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% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +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% equ 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! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/tectech/jitpack.yml b/tectech/jitpack.yml new file mode 100644 index 0000000000..09bbb514fc --- /dev/null +++ b/tectech/jitpack.yml @@ -0,0 +1,2 @@ +before_install: + - ./gradlew setupCIWorkspace
\ No newline at end of file diff --git a/tectech/repositories.gradle b/tectech/repositories.gradle new file mode 100644 index 0000000000..40118b1677 --- /dev/null +++ b/tectech/repositories.gradle @@ -0,0 +1,16 @@ +// Add any additional repositories for your dependencies here + +repositories { + ivy { + url 'https://files.vexatos.com/' + patternLayout { + artifact "[module]/[artifact]-[revision](-[classifier])(.[ext])" + } + content { + includeGroup("TGregworks") + } + metadataSources { + artifact() + } + } +} diff --git a/tectech/settings.gradle b/tectech/settings.gradle new file mode 100644 index 0000000000..94c2daf35c --- /dev/null +++ b/tectech/settings.gradle @@ -0,0 +1,23 @@ + +pluginManagement { + repositories { + maven { + // RetroFuturaGradle + name "GTNH Maven" + url "https://nexus.gtnewhorizons.com/repository/public/" + mavenContent { + includeGroup("com.gtnewhorizons") + includeGroupByRegex("com\\.gtnewhorizons\\..+") + } + } + gradlePluginPortal() + mavenCentral() + mavenLocal() + } +} + +plugins { + id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.22' +} + + diff --git a/tectech/src/main/java/com/github/technus/tectech/Reference.java b/tectech/src/main/java/com/github/technus/tectech/Reference.java new file mode 100644 index 0000000000..928a4a4e0f --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/Reference.java @@ -0,0 +1,15 @@ +package com.github.technus.tectech; + +import gregtech.api.enums.Mods; + +public final class Reference { + + public static final String MODID = Mods.Names.TECTECH; + public static final String NAME = "TecTech - Tec Technology!"; + public static final String VERSION = Tags.VERSION; + public static final String COLLECTIONNAME = "TecTech"; + public static final String CLIENTSIDE = "com.github.technus.tectech.proxy.ClientProxy"; + public static final String SERVERSIDE = "com.github.technus.tectech.proxy.CommonProxy"; + + private Reference() {} +} diff --git a/tectech/src/main/java/com/github/technus/tectech/TecTech.java b/tectech/src/main/java/com/github/technus/tectech/TecTech.java new file mode 100644 index 0000000000..593f5f9627 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/TecTech.java @@ -0,0 +1,119 @@ +package com.github.technus.tectech; + +import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE; +import static gregtech.api.enums.Mods.COFHCore; + +import net.minecraftforge.common.MinecraftForge; + +import com.github.technus.tectech.loader.MainLoader; +import com.github.technus.tectech.loader.TecTechConfig; +import com.github.technus.tectech.loader.gui.CreativeTabTecTech; +import com.github.technus.tectech.loader.thing.MuTeLoader; +import com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData; +import com.github.technus.tectech.proxy.CommonProxy; +import com.github.technus.tectech.recipe.EyeOfHarmonyRecipeStorage; +import com.github.technus.tectech.recipe.TecTechRecipeMaps; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLLoadCompleteEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import eu.usrv.yamcore.auxiliary.IngameErrorLog; +import eu.usrv.yamcore.auxiliary.LogHelper; +import gregtech.api.objects.XSTR; + +@Mod( + modid = Reference.MODID, + name = Reference.NAME, + version = Reference.VERSION, + dependencies = "required-after:Forge@[10.13.4.1614,);" + "required-after:YAMCore@[0.5.70,);" + + "required-after:structurelib;" + + "after:ComputerCraft;" + + "after:OpenComputers;" + + "required-after:gtneioreplugin;" + + "required-after:gregtech;" + + "after:dreamcraft;" + + "after:appliedenergistics2;" + + "after:CoFHCore;" + + "after:Thaumcraft;") +public class TecTech { + + @SidedProxy(clientSide = Reference.CLIENTSIDE, serverSide = Reference.SERVERSIDE) + public static CommonProxy proxy; + + @Mod.Instance(Reference.MODID) + public static TecTech instance; + + public static final XSTR RANDOM = XSTR.XSTR_INSTANCE; + public static final LogHelper LOGGER = new LogHelper(Reference.MODID); + public static CreativeTabTecTech creativeTabTecTech; + + public static TecTechConfig configTecTech; + + public static EnderWorldSavedData enderWorldSavedData; + + /** + * For Loader.isModLoaded checks during the runtime + */ + public static boolean hasCOFH = false; + + public static final byte tectechTexturePage1 = 8; + + @Mod.EventHandler + @SuppressWarnings("unused") + public void PreLoad(FMLPreInitializationEvent PreEvent) { + LOGGER.setDebugOutput(true); + + configTecTech = new TecTechConfig( + PreEvent.getModConfigurationDirectory(), + Reference.COLLECTIONNAME, + Reference.MODID); + + if (!configTecTech.LoadConfig()) { + LOGGER.error(Reference.MODID + " could not load its config file. Things are going to be weird!"); + } + + if (configTecTech.MOD_ADMIN_ERROR_LOGS) { + LOGGER.setDebugOutput(DEBUG_MODE); + LOGGER.debug("moduleAdminErrorLogs is enabled"); + IngameErrorLog moduleAdminErrorLogs = new IngameErrorLog(); + } + + enderWorldSavedData = new EnderWorldSavedData(); + FMLCommonHandler.instance() + .bus() + .register(enderWorldSavedData); + MinecraftForge.EVENT_BUS.register(enderWorldSavedData); + + TecTechRecipeMaps.init(); + MainLoader.preLoad(); + new MuTeLoader().run(); + } + + @Mod.EventHandler + @SuppressWarnings("unused") + public void Load(FMLInitializationEvent event) { + hasCOFH = COFHCore.isModLoaded(); + + MainLoader.load(); + MainLoader.addAfterGregTechPostLoadRunner(); + } + + @Mod.EventHandler + @SuppressWarnings("unused") + public void PostLoad(FMLPostInitializationEvent PostEvent) { + MainLoader.postLoad(); + } + + @Mod.EventHandler + @SuppressWarnings("unused") + public void onLoadCompleted(FMLLoadCompleteEvent event) { + eyeOfHarmonyRecipeStorage = new EyeOfHarmonyRecipeStorage(); + } + + public static EyeOfHarmonyRecipeStorage eyeOfHarmonyRecipeStorage = null; + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/compatibility/openComputers/AvrArchitecture.java b/tectech/src/main/java/com/github/technus/tectech/compatibility/openComputers/AvrArchitecture.java new file mode 100644 index 0000000000..74e7a26839 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/compatibility/openComputers/AvrArchitecture.java @@ -0,0 +1,307 @@ +package com.github.technus.tectech.compatibility.openComputers; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import org.apache.commons.compress.utils.IOUtils; + +import com.github.technus.avrClone.AvrCore; +import com.github.technus.avrClone.instructions.ExecutionEvent; +import com.github.technus.avrClone.instructions.InstructionRegistry; +import com.github.technus.avrClone.instructions.exceptions.DebugEvent; +import com.github.technus.avrClone.instructions.exceptions.DelayEvent; +import com.github.technus.avrClone.memory.EepromMemory; +import com.github.technus.avrClone.memory.RemovableMemory; +import com.github.technus.avrClone.memory.program.ProgramMemory; +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.util.Converter; + +import li.cil.oc.Settings; +import li.cil.oc.api.Driver; +import li.cil.oc.api.driver.Item; +import li.cil.oc.api.driver.item.Memory; +import li.cil.oc.api.machine.Architecture; +import li.cil.oc.api.machine.ExecutionResult; +import li.cil.oc.api.machine.Machine; +import li.cil.oc.api.machine.Signal; +import li.cil.oc.common.SaveHandler; + +@Architecture.Name("AVR 32Bit Clone") +@Architecture.NoMemoryRequirements +public class AvrArchitecture implements Architecture { + + private final Machine machine; + private AvrCore core; + private boolean debugRun; + private int delay; + private int[] tempData; + private int memSize; + + public AvrArchitecture(Machine machine) { + this.machine = machine; + } + + @Override + public boolean isInitialized() { + return core != null && core.checkValid(); + } + + @Override + public boolean recomputeMemory(Iterable<ItemStack> components) { + computeMemory(components); + return true; + } + + private void computeMemory(Iterable<ItemStack> components) { + int memory = 0; + for (ItemStack component : components) { + Item driver = Driver.driverFor(component); + if (driver instanceof Memory memoryDriver) { + memory += memoryDriver.amount(component) * 256; // in integers + } // else if (driver instanceof DriverEEPROM$) { + + // } + } + memory = Math.min( + Math.max(memory, 0), + Settings.get() + .maxTotalRam()); + if (memory != memSize) {} + } + + @Override + public boolean initialize() { + core = new AvrCore(); + + computeMemory( + this.machine.host() + .internalComponents()); + + if (isInitialized()) { + machine.beep("."); + return true; + } + return false; + } + + @Override + public void close() { + core = null; + tempData = null; + delay = 0; + } + + @Override + public void runSynchronized() { + core.cycle(); + } + + @Override + public ExecutionResult runThreaded(boolean isSynchronizedReturn) { + if (core.awoken) { + delay = 0; + for (int load = 0; load < 512;) { + load += core.getInstruction() + .getCost(core); + ExecutionEvent executionEvent = core.cpuCycleForce(); + if (executionEvent != null) { + if (executionEvent.throwable instanceof DelayEvent) { + delay = executionEvent.data[0]; + break; + } else if (executionEvent.throwable instanceof DebugEvent) { + if (debugRun) { + // aBaseMetaTileEntity.setActive(false); + break; + } + } + } + } + } else if (delay > 0) { + delay--; + if (delay == 0) { + core.awoken = true; + } + } + return null; + } + + @Override + public void onSignal() { + Signal signal = machine.popSignal(); + + core.interruptsHandle(); + } + + @Override + public void onConnect() { + // init network components, in case init was called from load logic (pre first tick?) + } + + @Override + public void load(NBTTagCompound avr) { + debugRun = avr.getBoolean("debugRun"); + delay = avr.getInteger("delay"); + core.active = avr.getBoolean("active"); + core.awoken = (avr.getBoolean("awoken")); + core.programCounter = avr.getInteger("programCounter"); + InstructionRegistry registry = InstructionRegistry.REGISTRIES.get(avr.getString("instructionRegistry")); + if (registry != null) { + byte[] instructions = SaveHandler.load( + avr, + this.machine.node() + .address() + "_instructionsMemory"); + byte[] param0 = SaveHandler.load( + avr, + this.machine.node() + .address() + "_param0Memory"); + byte[] param1 = SaveHandler.load( + avr, + this.machine.node() + .address() + "_param1Memory"); + if (instructions != null && param0 != null + && param1 != null + && instructions.length > 0 + && param0.length > 0 + && param1.length > 0) { + int[] instr = null, par0 = null, par1 = null; + try { + GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(instructions)); + instr = Converter.readInts(IOUtils.toByteArray(gzis)); + IOUtils.closeQuietly(gzis); + } catch (IOException e) { + TecTech.LOGGER.error("Failed to decompress instructions memory from disk."); + e.printStackTrace(); + } + try { + GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(param0)); + par0 = Converter.readInts(IOUtils.toByteArray(gzis)); + IOUtils.closeQuietly(gzis); + } catch (IOException e) { + TecTech.LOGGER.error("Failed to decompress param0 memory from disk."); + e.printStackTrace(); + } + try { + GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(param1)); + par1 = Converter.readInts(IOUtils.toByteArray(gzis)); + IOUtils.closeQuietly(gzis); + } catch (IOException e) { + TecTech.LOGGER.error("Failed to decompress param1 memory from disk."); + e.printStackTrace(); + } + if (instr != null && par0 != null + && par1 != null + && instr.length == par0.length + && instr.length == par1.length) { + core.setProgramMemory(new ProgramMemory(registry, avr.getBoolean("immersive"), instr, par0, par1)); + } + } + } + if (avr.hasKey("eepromSize")) { + core.restoreEepromDefinition(EepromMemory.make(avr.getInteger("eepromSize"))); + } + byte[] data = SaveHandler.load( + avr, + this.machine.node() + .address() + "_dataMemory"); + if (data != null && data.length > 0) { + try { + GZIPInputStream gzis = new GZIPInputStream(new ByteArrayInputStream(data)); + tempData = Converter.readInts(IOUtils.toByteArray(gzis)); + IOUtils.closeQuietly(gzis); + } catch (IOException e) { + TecTech.LOGGER.error("Failed to decompress data memory from disk."); + e.printStackTrace(); + } + } + core.checkValid(); + } + + @Override + public void save(NBTTagCompound avr) { + avr.setBoolean("debugRun", debugRun); + avr.setInteger("delay", delay); + avr.setBoolean("active", core.active); + avr.setBoolean("awoken", core.awoken); + avr.setInteger("programCounter", core.programCounter); + ProgramMemory programMemory = core.getProgramMemory(); + if (programMemory != null) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gzos = new GZIPOutputStream(baos); + gzos.write(Converter.writeInts(programMemory.instructions)); + gzos.close(); + SaveHandler.scheduleSave( + machine.host(), + avr, + machine.node() + .address() + "_instructionsMemory", + baos.toByteArray()); + } catch (IOException e) { + TecTech.LOGGER.error("Failed to compress instructions memory to disk"); + e.printStackTrace(); + } + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gzos = new GZIPOutputStream(baos); + gzos.write(Converter.writeInts(programMemory.param0)); + gzos.close(); + SaveHandler.scheduleSave( + machine.host(), + avr, + machine.node() + .address() + "_param0Memory", + baos.toByteArray()); + } catch (IOException e) { + TecTech.LOGGER.error("Failed to compress param0 memory to disk"); + e.printStackTrace(); + } + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gzos = new GZIPOutputStream(baos); + gzos.write(Converter.writeInts(programMemory.param1)); + gzos.close(); + SaveHandler.scheduleSave( + machine.host(), + avr, + machine.node() + .address() + "_param1Memory", + baos.toByteArray()); + } catch (IOException e) { + TecTech.LOGGER.error("Failed to compress param1 memory to disk"); + e.printStackTrace(); + } + avr.setBoolean("immersive", programMemory.immersiveOperands); + avr.setString("instructionRegistry", programMemory.registry.toString()); + } + RemovableMemory<EepromMemory> eeprom = core.getEepromMemory(); + if (eeprom != null) { + avr.setInteger( + "eepromSize", + eeprom.getDefinition() + .getSize()); + } + if (core.dataMemory != null) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gzos = new GZIPOutputStream(baos); + gzos.write(Converter.writeInts(core.dataMemory)); + gzos.close(); + SaveHandler.scheduleSave( + machine.host(), + avr, + machine.node() + .address() + "_dataMemory", + baos.toByteArray()); + } catch (IOException e) { + TecTech.LOGGER.error("Failed to compress data memory to disk"); + e.printStackTrace(); + } + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/MainLoader.java b/tectech/src/main/java/com/github/technus/tectech/loader/MainLoader.java new file mode 100644 index 0000000000..01d63392e5 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/MainLoader.java @@ -0,0 +1,202 @@ +package com.github.technus.tectech.loader; + +import static com.github.technus.tectech.TecTech.LOGGER; +import static com.github.technus.tectech.TecTech.configTecTech; +import static com.github.technus.tectech.TecTech.creativeTabTecTech; +import static com.github.technus.tectech.TecTech.proxy; +import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; +import static gregtech.api.enums.Mods.TwilightForest; + +import java.util.HashMap; + +import net.minecraft.block.Block; +import net.minecraft.util.DamageSource; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.loader.gui.CreativeTabTecTech; +import com.github.technus.tectech.loader.recipe.BaseRecipeLoader; +import com.github.technus.tectech.loader.thing.CoverLoader; +import com.github.technus.tectech.loader.thing.MachineLoader; +import com.github.technus.tectech.loader.thing.ThingsLoader; +import com.github.technus.tectech.thing.casing.TT_Container_Casings; +import com.github.technus.tectech.thing.metaTileEntity.Textures; + +import cpw.mods.fml.common.ProgressManager; +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.GregTech_API; +import gregtech.api.enums.Materials; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GT_Recipe; + +@SuppressWarnings("deprecation") +public final class MainLoader { + + public static DamageSource microwaving; + + private MainLoader() {} + + public static void preLoad() { + creativeTabTecTech = new CreativeTabTecTech("TecTech"); + + // set expanded texture arrays for tiers + try { + Textures.run(); + } catch (Throwable t) { + LOGGER.error("Loading textures...", t); + } + } + + public static void load() { + ProgressManager.ProgressBar progressBarLoad = ProgressManager.push("TecTech Loader", 6); + + progressBarLoad.step("Regular Things"); + new ThingsLoader().run(); + LOGGER.info("Block/Item Init Done"); + + progressBarLoad.step("Machine Things"); + new MachineLoader().run(); + LOGGER.info("Machine Init Done"); + + progressBarLoad.step("Cover Things"); + new CoverLoader().run(); + LOGGER.info("Cover Init Done"); + + progressBarLoad.step("Add damage types"); + microwaving = new DamageSource("microwaving").setDamageBypassesArmor(); + LOGGER.info("Damage types addition Done"); + + progressBarLoad.step("Register Packet Dispatcher"); + new NetworkDispatcher(); + LOGGER.info("Packet Dispatcher registered"); + + progressBarLoad.step("Register GUI Handler"); + proxy.registerRenderInfo(); + LOGGER.info("GUI Handler registered"); + + ProgressManager.pop(progressBarLoad); + } + + public static void postLoad() { + ProgressManager.ProgressBar progressBarPostLoad = ProgressManager.push("TecTech Post Loader", 4); + + progressBarPostLoad.step("Dreamcraft Compatibility"); + if (NewHorizonsCoreMod.isModLoaded()) { + try { + Class<?> clazz = Class.forName("com.dreammaster.gthandler.casings.GT_Container_CasingsNH"); + TT_Container_Casings.sBlockCasingsNH = (Block) clazz.getField("sBlockCasingsNH") + .get(null); + + if (TT_Container_Casings.sBlockCasingsNH == null) { + throw new NullPointerException("sBlockCasingsNH Is not set at this time"); + } + } catch (Exception e) { + throw new Error("Unable to get NH casings", e); + } + } + + progressBarPostLoad.step("Recipes"); + new BaseRecipeLoader().run(); + TecTech.LOGGER.info("Recipe Init Done"); + + if (!configTecTech.DISABLE_BLOCK_HARDNESS_NERF) { + progressBarPostLoad.step("Nerf blocks blast resistance"); + adjustTwilightBlockResistance(); + TecTech.LOGGER.info("Blocks nerf done"); + } else { + progressBarPostLoad.step("Do not nerf blocks blast resistance"); + TecTech.LOGGER.info("Blocks were not nerfed"); + } + + // ProgressManager.pop(progressBarPostLoad); + } + + public static void addAfterGregTechPostLoadRunner() { + GregTech_API.sAfterGTPostload.add(() -> { + if (TecTech.configTecTech.NERF_FUSION) { + FixBrokenFusionRecipes(); + } + }); + } + + private static void FixBrokenFusionRecipes() { + HashMap<Fluid, Fluid> binds = new HashMap<>(); + for (Materials material : Materials.values()) { + FluidStack p = material.getPlasma(1); + if (p != null) { + if (DEBUG_MODE) { + LOGGER.info("Found Plasma of " + material.mName); + } + if (material.mElement != null && (material.mElement.mProtons >= Materials.Iron.mElement.mProtons + || -material.mElement.mProtons >= Materials.Iron.mElement.mProtons + || material.mElement.mNeutrons >= Materials.Iron.mElement.mNeutrons + || -material.mElement.mNeutrons >= Materials.Iron.mElement.mNeutrons)) { + if (DEBUG_MODE) { + LOGGER.info("Attempting to bind " + material.mName); + } + if (material.getMolten(1) != null) { + binds.put( + p.getFluid(), + material.getMolten(1) + .getFluid()); + } else if (material.getGas(1) != null) { + binds.put( + p.getFluid(), + material.getGas(1) + .getFluid()); + } else if (material.getFluid(1) != null) { + binds.put( + p.getFluid(), + material.getFluid(1) + .getFluid()); + } else { + binds.put( + p.getFluid(), + Materials.Iron.getMolten(1) + .getFluid()); + } + } + } + } + for (GT_Recipe r : RecipeMaps.fusionRecipes.getAllRecipes()) { + Fluid fluid = binds.get(r.mFluidOutputs[0].getFluid()); + if (fluid != null) { + if (DEBUG_MODE) { + LOGGER.info("Nerfing Recipe " + r.mFluidOutputs[0].getUnlocalizedName()); + } + r.mFluidOutputs[0] = new FluidStack(fluid, r.mFluidOutputs[0].amount); + } + fluid = binds.get(r.mFluidInputs[0].getFluid()); + if (fluid != null) { + if (DEBUG_MODE) { + LOGGER.info("Fixing plasma use in Recipe " + r.mFluidInputs[0].getUnlocalizedName()); + } + r.mFluidInputs[0] = new FluidStack(fluid, r.mFluidInputs[0].amount); + } + fluid = binds.get(r.mFluidInputs[1].getFluid()); + if (fluid != null) { + if (DEBUG_MODE) { + LOGGER.info("Fixing plasma use in Recipe " + r.mFluidInputs[1].getUnlocalizedName()); + } + r.mFluidInputs[1] = new FluidStack(fluid, r.mFluidInputs[1].amount); + } + } + } + + private static void safeSetResistance(Block block, float resistance) { + if (block != null) { + block.setResistance(resistance); + } + } + + private static void adjustTwilightBlockResistance() { + if (TwilightForest.isModLoaded()) { + safeSetResistance(GameRegistry.findBlock("TwilightForest", "tile.TFShield"), 30); + safeSetResistance(GameRegistry.findBlock("TwilightForest", "tile.TFThorns"), 10); + safeSetResistance(GameRegistry.findBlock("TwilightForest", "tile.TFTowerTranslucent"), 30); + safeSetResistance(GameRegistry.findBlock("TwilightForest", "tile.TFDeadrock"), 5); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java b/tectech/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java new file mode 100644 index 0000000000..c195364d91 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/NetworkDispatcher.java @@ -0,0 +1,25 @@ +package com.github.technus.tectech.loader; + +import static com.github.technus.tectech.Reference.MODID; + +import com.github.technus.tectech.mechanics.pipe.PipeActivityMessage; +import com.github.technus.tectech.mechanics.spark.RendererMessage; + +public class NetworkDispatcher extends eu.usrv.yamcore.network.PacketDispatcher { + + public static NetworkDispatcher INSTANCE; + + public NetworkDispatcher() { + super(MODID); + INSTANCE = this; + registerPackets(); + } + + @Override + public void registerPackets() { + registerMessage(PipeActivityMessage.ServerHandler.class, PipeActivityMessage.PipeActivityQuery.class); + registerMessage(PipeActivityMessage.ClientHandler.class, PipeActivityMessage.PipeActivityData.class); + + registerMessage(RendererMessage.ClientHandler.class, RendererMessage.RendererData.class); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/TecTechConfig.java b/tectech/src/main/java/com/github/technus/tectech/loader/TecTechConfig.java new file mode 100644 index 0000000000..cb27933eb7 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/TecTechConfig.java @@ -0,0 +1,257 @@ +package com.github.technus.tectech.loader; + +import java.io.File; + +import eu.usrv.yamcore.config.ConfigManager; + +public class TecTechConfig extends ConfigManager { + + public TecTechConfig(File pConfigBaseDirectory, String pModCollectionDirectory, String pModID) { + super(pConfigBaseDirectory, pModCollectionDirectory, pModID); + } + + // final static to allow compiler to remove the debug code when this is false + public static boolean DEBUG_MODE = false; + public static boolean POWERLESS_MODE = false; + public boolean BOOM_ENABLE; + public boolean DISABLE_BLOCK_HARDNESS_NERF; + public boolean EASY_SCAN; + public boolean NERF_FUSION; + public boolean ENABLE_TURRET_EXPLOSIONS; + public float TURRET_DAMAGE_FACTOR; + public float TURRET_EXPLOSION_FACTOR; + + public boolean MOD_ADMIN_ERROR_LOGS; + + public boolean TESLA_MULTI_GAS_OUTPUT; + public float TESLA_MULTI_LOSS_FACTOR_OVERDRIVE; + public int TESLA_MULTI_LOSS_PER_BLOCK_T0; + public int TESLA_MULTI_LOSS_PER_BLOCK_T1; + public int TESLA_MULTI_LOSS_PER_BLOCK_T2; + public int TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM; + public int TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN; + public int TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON; + public int TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1; + public int TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2; + public int TESLA_MULTI_RANGE_COVER; + public int TESLA_MULTI_RANGE_TOWER; + public int TESLA_MULTI_RANGE_TRANSCEIVER; + public float TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE; + public int TESLA_SINGLE_LOSS_PER_BLOCK; + public int TESLA_SINGLE_RANGE; + public boolean TESLA_VISUAL_EFFECT; + + /** + * This loading phases do not correspond to mod loading phases! + */ + @Override + protected void PreInit() { + + BOOM_ENABLE = true; + DISABLE_BLOCK_HARDNESS_NERF = false; + EASY_SCAN = false; + NERF_FUSION = false; + ENABLE_TURRET_EXPLOSIONS = true; + TURRET_DAMAGE_FACTOR = 10; + TURRET_EXPLOSION_FACTOR = 1; + + MOD_ADMIN_ERROR_LOGS = false; + + TESLA_MULTI_GAS_OUTPUT = false; + TESLA_MULTI_LOSS_FACTOR_OVERDRIVE = 0.25F; + TESLA_MULTI_LOSS_PER_BLOCK_T0 = 1; + TESLA_MULTI_LOSS_PER_BLOCK_T1 = 1; + TESLA_MULTI_LOSS_PER_BLOCK_T2 = 1; + TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM = 100; + TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN = 50; + TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON = 50; + TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1 = 2; + TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2 = 4; + TESLA_MULTI_RANGE_COVER = 16; + TESLA_MULTI_RANGE_TOWER = 32; + TESLA_MULTI_RANGE_TRANSCEIVER = 16; + TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE = 0.25F; + TESLA_SINGLE_LOSS_PER_BLOCK = 1; + TESLA_SINGLE_RANGE = 20; + TESLA_VISUAL_EFFECT = true; + } + + /** + * This loading phases do not correspond to mod loading phases! + */ + @Override + protected void Init() { + DEBUG_MODE = _mainConfig + .getBoolean("DebugMode", "debug", DEBUG_MODE, "Enables logging and other purely debug features"); + POWERLESS_MODE = _mainConfig + .getBoolean("PowerlessMode", "debug", POWERLESS_MODE, "Enables 0EU/t multi block machinery"); + + BOOM_ENABLE = _mainConfig.getBoolean( + "BoomEnable", + "features", + BOOM_ENABLE, + "Set to false to disable explosions on everything bad that you can do"); + DISABLE_BLOCK_HARDNESS_NERF = _mainConfig.getBoolean( + "DisableBlockHardnessNerf", + "features", + DISABLE_BLOCK_HARDNESS_NERF, + "Set to true to disable the block hardness nerf"); + EASY_SCAN = _mainConfig.getBoolean( + "EasyScan", + "features", + EASY_SCAN, + "Enables tricorder to scan EM i/o hatches directly, too CHEEKY"); + NERF_FUSION = _mainConfig.getBoolean( + "NerfFusion", + "features", + NERF_FUSION, + "Set to true to enable removal of plasmas heavier than Fe and other weird ones"); + ENABLE_TURRET_EXPLOSIONS = _mainConfig.getBoolean( + "TurretBoomEnable", + "features", + ENABLE_TURRET_EXPLOSIONS, + "Set to false to disable explosions caused by EM turrets"); + TURRET_DAMAGE_FACTOR = _mainConfig.getFloat( + "TurretDamageFactor", + "features", + TURRET_DAMAGE_FACTOR, + 0, + Short.MAX_VALUE, + "Damage is multiplied by this number"); + TURRET_EXPLOSION_FACTOR = _mainConfig.getFloat( + "TurretExplosionFactor", + "features", + TURRET_EXPLOSION_FACTOR, + 0, + Short.MAX_VALUE, + "Explosion strength is multiplied by this number"); + + MOD_ADMIN_ERROR_LOGS = _mainConfig.getBoolean( + "AdminErrorLog", + "modules", + MOD_ADMIN_ERROR_LOGS, + "If set to true, every op/admin will receive all errors occurred during the startup phase as in game message on join"); + + TESLA_MULTI_GAS_OUTPUT = _mainConfig.getBoolean( + "TeslaMultiGasOutput", + "tesla_tweaks", + TESLA_MULTI_GAS_OUTPUT, + "Set to true to enable outputting plasmas as gasses from the tesla tower with a 1:1 ratio"); + TESLA_MULTI_LOSS_FACTOR_OVERDRIVE = _mainConfig.getFloat( + "TeslaMultiLossFactorOverdrive", + "tesla_tweaks", + TESLA_MULTI_LOSS_FACTOR_OVERDRIVE, + 0, + 1, + "Additional Tesla Tower power loss per amp as a factor of the tier voltage"); + TESLA_MULTI_LOSS_PER_BLOCK_T0 = _mainConfig.getInt( + "TeslaMultiLossPerBlockT0", + "tesla_tweaks", + TESLA_MULTI_LOSS_PER_BLOCK_T0, + 0, + Integer.MAX_VALUE, + "Tesla Tower power transmission loss per block per amp using no plasmas"); + TESLA_MULTI_LOSS_PER_BLOCK_T1 = _mainConfig.getInt( + "TeslaMultiLossPerBlockT1", + "tesla_tweaks", + TESLA_MULTI_LOSS_PER_BLOCK_T1, + 0, + Integer.MAX_VALUE, + "Tesla Tower power transmission loss per block per amp using helium or nitrogen plasma"); + TESLA_MULTI_LOSS_PER_BLOCK_T2 = _mainConfig.getInt( + "TeslaMultiLossPerBlockT2", + "tesla_tweaks", + TESLA_MULTI_LOSS_PER_BLOCK_T2, + 0, + Integer.MAX_VALUE, + "Tesla Tower power transmission loss per block per amp using radon plasma"); + TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM = _mainConfig.getInt( + "TeslaMultiPlasmaPerSecondT1Helium", + "tesla_tweaks", + TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM, + 0, + Integer.MAX_VALUE, + "Tesla Tower helium plasma consumed each second the tesla tower is active"); + TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN = _mainConfig.getInt( + "TeslaMultiPlasmaPerSecondT1Nitrogen", + "tesla_tweaks", + TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN, + 0, + Integer.MAX_VALUE, + "Tesla Tower nitrogen plasma consumed each second the tesla tower is active"); + TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON = _mainConfig.getInt( + "TeslaMultiPlasmaPerSecondT2Radon", + "tesla_tweaks", + TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON, + 0, + Integer.MAX_VALUE, + "Tesla Tower radon plasma consumed each second the tesla tower is active"); + TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1 = _mainConfig.getInt( + "TeslaMultiRangeCoefficientPlasmaT1", + "tesla_tweaks", + TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1, + 0, + Integer.MAX_VALUE, + "Tesla Tower T1 Plasmas Range Multiplier"); + TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2 = _mainConfig.getInt( + "TeslaMultiRangeCoefficientPlasmaT2", + "tesla_tweaks", + TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2, + 0, + Integer.MAX_VALUE, + "Tesla Tower T2 Plasmas Range Multiplier"); + TESLA_MULTI_RANGE_COVER = _mainConfig.getInt( + "TeslaMultiRangeCover", + "tesla_tweaks", + TESLA_MULTI_RANGE_COVER, + 0, + Integer.MAX_VALUE, + "Tesla Tower to Tesla Coil Rich Edition Cover max range"); + TESLA_MULTI_RANGE_TOWER = _mainConfig.getInt( + "TeslaMultiRangeTower", + "tesla_tweaks", + TESLA_MULTI_RANGE_TOWER, + 0, + Integer.MAX_VALUE, + "Tesla Tower to Tower max range"); + TESLA_MULTI_RANGE_TRANSCEIVER = _mainConfig.getInt( + "TeslaMultiRangeTransceiver", + "tesla_tweaks", + TESLA_MULTI_RANGE_TRANSCEIVER, + 0, + Integer.MAX_VALUE, + "Tesla Tower to Transceiver max range"); + TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE = _mainConfig.getFloat( + "TeslaSingleLossFactorOverdrive", + "tesla_tweaks", + TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE, + 0, + 1, + "Additional Tesla Transceiver power loss per amp as a factor of the tier voltage"); + TESLA_SINGLE_LOSS_PER_BLOCK = _mainConfig.getInt( + "TeslaSingleLossPerBlock", + "tesla_tweaks", + TESLA_SINGLE_LOSS_PER_BLOCK, + 0, + Integer.MAX_VALUE, + "Tesla Transceiver power transmission loss per block per amp"); + TESLA_SINGLE_RANGE = _mainConfig.getInt( + "TeslaSingleRange", + "tesla_tweaks", + TESLA_SINGLE_RANGE, + 0, + Integer.MAX_VALUE, + "Tesla Transceiver to max range"); + TESLA_VISUAL_EFFECT = _mainConfig.getBoolean( + "EnableTeslaVisualEffect", + "tesla_tweaks", + TESLA_VISUAL_EFFECT, + "Set true to enable the cool visual effect when tesla tower running."); + } + + /** + * This loading phases do not correspond to mod loading phases! + */ + @Override + protected void PostInit() {} +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/gui/CreativeTabTecTech.java b/tectech/src/main/java/com/github/technus/tectech/loader/gui/CreativeTabTecTech.java new file mode 100644 index 0000000000..56a125b8f4 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/gui/CreativeTabTecTech.java @@ -0,0 +1,37 @@ +package com.github.technus.tectech.loader.gui; + +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import com.github.technus.tectech.thing.CustomItemList; +import com.github.technus.tectech.thing.casing.TT_Container_Casings; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTech_API; + +public class CreativeTabTecTech extends CreativeTabs { + + public CreativeTabTecTech(String name) { + super(name); + } + + @SideOnly(Side.CLIENT) + @Override + public Item getTabIconItem() { + return Item.getItemFromBlock(TT_Container_Casings.sBlockCasingsTT); // High power casing + } + + @Override + public void displayAllReleventItems(List<ItemStack> stuffToShow) { + for (CustomItemList item : CustomItemList.values()) { + if (item.hasBeenSet() && item.getBlock() == GregTech_API.sBlockMachines) { + stuffToShow.add(item.get(1)); + } + } + super.displayAllReleventItems(stuffToShow); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Assembler.java b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Assembler.java new file mode 100644 index 0000000000..7467343599 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Assembler.java @@ -0,0 +1,3029 @@ +package com.github.technus.tectech.loader.recipe; + +import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getItemContainer; +import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getOrDefault; +import static gregtech.api.enums.GT_Values.RA; +import static gregtech.api.enums.Mods.BartWorks; +import static gregtech.api.util.GT_ModHandler.getModItem; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.thing.CustomItemList; +import com.github.technus.tectech.thing.block.QuantumGlassBlock; +import com.gtnewhorizon.structurelib.StructureLibAPI; + +import gregtech.api.enums.GT_Values; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.TierEU; +import gregtech.api.util.GT_ModHandler; +import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.GT_Utility; + +public class Assembler implements Runnable { + + @Override + public void run() { + + cleanroomRecipes(); + + for (int i = 0; i <= 15; i++) { + RA.addAssemblerRecipe( + new ItemStack[] { GT_Utility.getIntegratedCircuit(i + 1), + GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Cobalt, 1) }, + Materials.Aluminium.getMolten(864), + new ItemStack(StructureLibAPI.getBlockHint(), 1, i), + 32, + 120); + } + + // Quantum Glass + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.eM_Containment.get(1), GT_ModHandler.getIC2Item("reinforcedGlass", 1L) }, + getOrDefault("Trinium", Materials.Osmium).getMolten(576), + new ItemStack(QuantumGlassBlock.INSTANCE, 1), + 200, + 500000); + + // recipe for assline data hatches + RA.addAssemblerRecipe( + ItemList.Hatch_DataAccess_EV.get(1), + CustomItemList.dataIn_Hatch.get(1), + CustomItemList.dataInAss_Hatch.get(1), + 2048, + 12000); + RA.addAssemblerRecipe( + ItemList.Hatch_DataAccess_EV.get(1), + CustomItemList.dataOut_Hatch.get(1), + CustomItemList.dataOutAss_Hatch.get(1), + 2048, + 12000); + + // High Power Casing + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Iridium, 1), + GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Iridium, 6), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 1), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Cobalt, 16), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 16), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NiobiumTitanium, 2) }, + Materials.TungstenSteel.getMolten(576), + CustomItemList.eM_Power.get(1), + 100, + 30720); + + // Computer Casing + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.eM_Power.get(1), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 8), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Ultimate, 1), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NiobiumTitanium, 2) }, + Materials.Aluminium.getMolten(1296), + CustomItemList.eM_Computer_Casing.get(1), + 200, + 122880); + // Computer Vent Casing + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.StainlessSteel, 1), + ItemList.Electric_Motor_IV.get(2), + GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.StainlessSteel, 2), + GT_OreDictUnificator.get(OrePrefixes.pipeTiny, Materials.StainlessSteel, 16), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Copper, 16), + GT_OreDictUnificator + .get(OrePrefixes.wireGt01, getOrDefault("SuperconductorIV", Materials.SuperconductorUHV), 1) }, + Materials.SolderingAlloy.getMolten(1296), + CustomItemList.eM_Computer_Vent.get(1), + 100, + 1920); + + // Molecular Casing + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.eM_Power.get(1), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Osmiridium, 6), + GT_OreDictUnificator.get(OrePrefixes.foil, getOrDefault("Trinium", Materials.Osmium), 12), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.TungstenSteel, 24), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.TungstenSteel, 24), + ItemList.Field_Generator_IV.get(1) }, + Materials.Osmium.getMolten(1296), + CustomItemList.eM_Containment.get(1), + 800, + 500000); + + // Tesla Base + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 6), + GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.NickelZincFerrite, 1) }, + null, + CustomItemList.tM_TeslaBase.get(1), + 50, + 16); + + // Tesla Toroid + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 6), + GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Aluminium, 1) }, + null, + CustomItemList.tM_TeslaToroid.get(1), + 50, + 16); + + // Tesla Secondary Windings + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(8, 0), + getItemContainer("MicaInsulatorFoil").get(12) }, + Materials.Silver.getMolten(144), + CustomItemList.tM_TeslaSecondary.get(1), + 200, + 120); + + // Tesla Primary Coils T0 + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.RedstoneAlloy, 8), + getItemContainer("MicaInsulatorFoil").get(8) }, + Materials.RedAlloy.getMolten(144), + CustomItemList.tM_TeslaPrimary_0.get(1), + 200, + 30); + + // Tesla Primary Coils T1 + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorMV, 8), + getItemContainer("MicaInsulatorFoil").get(12) }, + Materials.Magnesium.getMolten(144), + CustomItemList.tM_TeslaPrimary_1.get(1), + 200, + 120); + + // Tesla Primary Coils T2 + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorHV, 8), + getItemContainer("MicaInsulatorFoil").get(16) }, + Materials.Barium.getMolten(144), + CustomItemList.tM_TeslaPrimary_2.get(1), + 200, + 480); + + // Tesla Primary Coils T3 + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorEV, 8), + getItemContainer("MicaInsulatorFoil").get(20) }, + Materials.Platinum.getMolten(144), + CustomItemList.tM_TeslaPrimary_3.get(1), + 200, + 1920); + + // Tesla Primary Coils T4 + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorIV, 8), + getItemContainer("MicaInsulatorFoil").get(24) }, + Materials.Vanadium.getMolten(144), + CustomItemList.tM_TeslaPrimary_4.get(1), + 200, + 7680); + + // Tesla Primary Coils T5 + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorLuV, 8), + getItemContainer("MicaInsulatorFoil").get(28) }, + Materials.Indium.getMolten(144), + CustomItemList.tM_TeslaPrimary_5.get(1), + 200, + 30720); + + // Tesla Primary Coils T6 + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorZPM, 8), + getItemContainer("MicaInsulatorFoil").get(32) }, + Materials.Naquadah.getMolten(144), + CustomItemList.tM_TeslaPrimary_6.get(1), + 200, + 122880); + + // Dynamo Hatches + { + // Dynamo Hatches 4A + { + // Dynamo EV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Dynamo_EV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Aluminium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2) }, + Materials.Silver.getMolten(144), + CustomItemList.eM_dynamoMulti4_EV.get(1), + 100, + 480); + + // Dynamo IV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Dynamo_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Tungsten, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2) }, + Materials.Silver.getMolten(144), + CustomItemList.eM_dynamoMulti4_IV.get(1), + 100, + 1920); + + // Dynamo LuV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Dynamo_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 2) }, + Materials.Silver.getMolten(288), + CustomItemList.eM_dynamoMulti4_LuV.get(1), + 100, + 7680); + + // Dynamo ZPM 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Dynamo_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2) }, + Materials.Silver.getMolten(576), + CustomItemList.eM_dynamoMulti4_ZPM.get(1), + 100, + 30720); + + // Dynamo UV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Dynamo_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2) }, + Materials.Silver.getMolten(1152), + CustomItemList.eM_dynamoMulti4_UV.get(1), + 100, + 122880); + + // Dynamo UHV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Dynamo_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUHV, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2) }, + Materials.Silver.getMolten(2304), + CustomItemList.eM_dynamoMulti4_UHV.get(1), + 100, + 500000); + + // Dynamo UEV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hatch_Dynamo_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 2) }, + Materials.Silver.getMolten(4608), + CustomItemList.eM_dynamoMulti4_UEV.get(1), + 100, + 2000000); + + // Dynamo UIV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hatch_Dynamo_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 2) }, + Materials.Silver.getMolten(9216), + CustomItemList.eM_dynamoMulti4_UIV.get(1), + 100, + 8000000); + + // Dynamo UMV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hatch_Dynamo_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 2) }, + Materials.Silver.getMolten(9216), + CustomItemList.eM_dynamoMulti4_UMV.get(1), + 100, + 32000000); + + // Dynamo UXV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hatch_Dynamo_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1), + GT_OreDictUnificator.get("plateShirabon", 1L) }, + Materials.Silver.getMolten(9216), + CustomItemList.eM_dynamoMulti4_UXV.get(1), + 100, + (int) TierEU.RECIPE_UMV); + } + + // Dynamo Hatches 16A + { + // Dynamo EV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_IV_EV.get(1), CustomItemList.eM_dynamoMulti4_EV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Aluminium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 4) }, + Materials.Electrum.getMolten(144), + CustomItemList.eM_dynamoMulti16_EV.get(1), + 200, + 480); + + // Dynamo IV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_LuV_IV.get(1), CustomItemList.eM_dynamoMulti4_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Tungsten, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 4) }, + Materials.Electrum.getMolten(144), + CustomItemList.eM_dynamoMulti16_IV.get(1), + 200, + 1920); + + // Dynamo LuV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_ZPM_LuV.get(1), CustomItemList.eM_dynamoMulti4_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 4) }, + Materials.Electrum.getMolten(288), + CustomItemList.eM_dynamoMulti16_LuV.get(1), + 200, + 7680); + + // Dynamo ZPM 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_UV_ZPM.get(1), CustomItemList.eM_dynamoMulti4_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 4) }, + Materials.Electrum.getMolten(576), + CustomItemList.eM_dynamoMulti16_ZPM.get(1), + 200, + 30720); + + // Dynamo UV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_MAX_UV.get(1), CustomItemList.eM_dynamoMulti4_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 4) }, + Materials.Electrum.getMolten(1152), + CustomItemList.eM_dynamoMulti16_UV.get(1), + 200, + 122880); + + // Dynamo UHV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UEV_UHV").get(1), + CustomItemList.eM_dynamoMulti4_UHV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.SuperconductorUHV, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 4) }, + Materials.Electrum.getMolten(2304), + CustomItemList.eM_dynamoMulti16_UHV.get(1), + 200, + 500000); + + // Dynamo UEV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UIV_UEV").get(1), + CustomItemList.eM_dynamoMulti4_UEV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 4) }, + Materials.Electrum.getMolten(4608), + CustomItemList.eM_dynamoMulti16_UEV.get(1), + 200, + 2000000); + + // Dynamo UIV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UMV_UIV").get(1), + CustomItemList.eM_dynamoMulti4_UIV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 4) }, + Materials.Electrum.getMolten(9216), + CustomItemList.eM_dynamoMulti16_UIV.get(1), + 200, + 8000000); + + // Dynamo UMV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UXV_UMV").get(1), + CustomItemList.eM_dynamoMulti4_UMV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 4) }, + Materials.Electrum.getMolten(9216), + CustomItemList.eM_dynamoMulti16_UMV.get(1), + 200, + 32000000); + + // Dynamo UXV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_MAX_UXV").get(1), + CustomItemList.eM_dynamoMulti4_UXV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2), + GT_OreDictUnificator.get("plateShirabon", 2L) }, + Materials.Electrum.getMolten(9216), + CustomItemList.eM_dynamoMulti16_UXV.get(1), + 200, + (int) TierEU.RECIPE_UMV); + } + + // Dynamo Hatches 64A + { + // Dynamo EV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_IV_EV").get(1), + CustomItemList.eM_dynamoMulti16_EV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Aluminium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6) }, + Materials.Tungsten.getMolten(144), + CustomItemList.eM_dynamoMulti64_EV.get(1), + 400, + 480); + + // Dynamo IV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_LuV_IV").get(1), + CustomItemList.eM_dynamoMulti16_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Tungsten, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6) }, + Materials.Tungsten.getMolten(144), + CustomItemList.eM_dynamoMulti64_IV.get(1), + 400, + 1920); + + // Dynamo LuV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_ZPM_LuV").get(1), + CustomItemList.eM_dynamoMulti16_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.VanadiumGallium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 6) }, + Materials.Tungsten.getMolten(288), + CustomItemList.eM_dynamoMulti64_LuV.get(1), + 400, + 7680); + + // Dynamo ZPM 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UV_ZPM").get(1), + CustomItemList.eM_dynamoMulti16_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Naquadah, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 6) }, + Materials.Tungsten.getMolten(576), + CustomItemList.eM_dynamoMulti64_ZPM.get(1), + 400, + 30720); + + // Dynamo UV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UHV_UV").get(1), + CustomItemList.eM_dynamoMulti16_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.NaquadahAlloy, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 6) }, + Materials.Tungsten.getMolten(1152), + CustomItemList.eM_dynamoMulti64_UV.get(1), + 400, + 122880); + + // Dynamo UHV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UEV_UHV").get(1), + CustomItemList.eM_dynamoMulti16_UHV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.SuperconductorUHV, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6) }, + Materials.Tungsten.getMolten(2304), + CustomItemList.eM_dynamoMulti64_UHV.get(1), + 400, + 2000000); + + // Dynamo UEV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UIV_UEV").get(1), + CustomItemList.eM_dynamoMulti16_UEV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Draconium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 6) }, + Materials.Tungsten.getMolten(4608), + CustomItemList.eM_dynamoMulti64_UEV.get(1), + 400, + 2000000); + + // Dynamo UIV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UMV_UIV").get(1), + CustomItemList.eM_dynamoMulti16_UIV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.NetherStar, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 6) }, + Materials.Tungsten.getMolten(9216), + CustomItemList.eM_dynamoMulti64_UIV.get(1), + 400, + 8000000); + + // Dynamo UMV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UXV_UMV").get(1), + CustomItemList.eM_dynamoMulti16_UMV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Quantium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 6) }, + Materials.Tungsten.getMolten(9216), + CustomItemList.eM_dynamoMulti64_UMV.get(1), + 400, + 32000000); + + // Dynamo UXV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_MAX_UXV").get(1), + CustomItemList.eM_dynamoMulti16_UXV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.BlackPlutonium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 3), + GT_OreDictUnificator.get("plateShirabon", 3L) }, + Materials.Tungsten.getMolten(9216), + CustomItemList.eM_dynamoMulti64_UXV.get(1), + 400, + (int) TierEU.RECIPE_UMV); + } + } + + // Energy Hatches + { + // Energy Hatches 4A + { + // Energy Hatch EV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Energy_EV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Aluminium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 2) }, + Materials.Silver.getMolten(144), + CustomItemList.eM_energyMulti4_EV.get(1), + 100, + 480); + + // Energy Hatch IV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Energy_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Tungsten, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2) }, + Materials.Silver.getMolten(144), + CustomItemList.eM_energyMulti4_IV.get(1), + 100, + 1920); + + // Energy Hatch LuV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Energy_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 2) }, + Materials.Silver.getMolten(288), + CustomItemList.eM_energyMulti4_LuV.get(1), + 100, + 7680); + + // Energy Hatch ZPM 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Energy_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2) }, + Materials.Silver.getMolten(576), + CustomItemList.eM_energyMulti4_ZPM.get(1), + 100, + 30720); + + // Energy Hatch UV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Energy_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2) }, + Materials.Silver.getMolten(1152), + CustomItemList.eM_energyMulti4_UV.get(1), + 100, + 122880); + + // Energy Hatch UHV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Energy_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUHV, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2) }, + Materials.Silver.getMolten(2304), + CustomItemList.eM_energyMulti4_UHV.get(1), + 100, + 500000); + + // Energy Hatch UEV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hatch_Energy_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 2) }, + Materials.Silver.getMolten(4608), + CustomItemList.eM_energyMulti4_UEV.get(1), + 100, + 2000000); + + // Energy Hatch UIV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hatch_Energy_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 2) }, + Materials.Silver.getMolten(9216), + CustomItemList.eM_energyMulti4_UIV.get(1), + 100, + 8000000); + + // Energy Hatch UMV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hatch_Energy_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 2) }, + Materials.Silver.getMolten(9216), + CustomItemList.eM_energyMulti4_UMV.get(1), + 100, + 32000000); + + // Energy Hatch UXV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hatch_Energy_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1), + GT_OreDictUnificator.get("plateShirabon", 1L) }, + Materials.Silver.getMolten(9216), + CustomItemList.eM_energyMulti4_UXV.get(1), + 100, + (int) TierEU.RECIPE_UMV); + } + + // Energy Hatches 16A + { + // Energy Hatch EV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_IV_EV.get(1), CustomItemList.eM_energyMulti4_EV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Aluminium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 4) }, + Materials.Electrum.getMolten(144), + CustomItemList.eM_energyMulti16_EV.get(1), + 200, + 480); + + // Energy Hatch IV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_LuV_IV.get(1), CustomItemList.eM_energyMulti4_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Tungsten, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 4) }, + Materials.Electrum.getMolten(144), + CustomItemList.eM_energyMulti16_IV.get(1), + 200, + 1920); + + // Energy Hatch LuV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_ZPM_LuV.get(1), CustomItemList.eM_energyMulti4_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 4) }, + Materials.Electrum.getMolten(288), + CustomItemList.eM_energyMulti16_LuV.get(1), + 200, + 7680); + + // Energy Hatch ZPM 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_UV_ZPM.get(1), CustomItemList.eM_energyMulti4_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 4) }, + Materials.Electrum.getMolten(576), + CustomItemList.eM_energyMulti16_ZPM.get(1), + 200, + 30720); + + // Energy Hatch UV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_MAX_UV.get(1), CustomItemList.eM_energyMulti4_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 4) }, + Materials.Electrum.getMolten(1152), + CustomItemList.eM_energyMulti16_UV.get(1), + 200, + 122880); + + // Energy Hatch UHV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UEV_UHV").get(1), + CustomItemList.eM_energyMulti4_UHV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.SuperconductorUHV, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 4) }, + Materials.Electrum.getMolten(2304), + CustomItemList.eM_energyMulti16_UHV.get(1), + 200, + 500000); + + // Energy Hatch UEV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UIV_UEV").get(1), + CustomItemList.eM_energyMulti4_UEV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 4) }, + Materials.Electrum.getMolten(4608), + CustomItemList.eM_energyMulti16_UEV.get(1), + 200, + 2000000); + + // Energy Hatch UIV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UMV_UIV").get(1), + CustomItemList.eM_energyMulti4_UIV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 4) }, + Materials.Electrum.getMolten(9216), + CustomItemList.eM_energyMulti16_UIV.get(1), + 200, + 8000000); + + // Energy Hatch UMV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UXV_UMV").get(1), + CustomItemList.eM_energyMulti4_UMV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 4) }, + Materials.Electrum.getMolten(9216), + CustomItemList.eM_energyMulti16_UMV.get(1), + 200, + 32000000); + + // Energy Hatch UXV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_MAX_UXV").get(1), + CustomItemList.eM_energyMulti4_UXV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2), + GT_OreDictUnificator.get("plateShirabon", 2L) }, + Materials.Electrum.getMolten(9216), + CustomItemList.eM_energyMulti16_UXV.get(1), + 200, + (int) TierEU.RECIPE_UMV); + } + + // Energy Hatches 64A + { + // Energy Hatch EV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_IV_EV").get(1), + CustomItemList.eM_energyMulti16_EV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Aluminium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Titanium, 6) }, + Materials.Tungsten.getMolten(144), + CustomItemList.eM_energyMulti64_EV.get(1), + 400, + 480); + + // Energy Hatch IV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_LuV_IV").get(1), + CustomItemList.eM_energyMulti16_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Tungsten, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 6) }, + Materials.Tungsten.getMolten(144), + CustomItemList.eM_energyMulti64_IV.get(1), + 400, + 1920); + + // Energy Hatch LuV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_ZPM_LuV").get(1), + CustomItemList.eM_energyMulti16_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.VanadiumGallium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 6) }, + Materials.Tungsten.getMolten(288), + CustomItemList.eM_energyMulti64_LuV.get(1), + 400, + 7680); + + // Energy Hatch ZPM 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UV_ZPM").get(1), + CustomItemList.eM_energyMulti16_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Naquadah, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 6) }, + Materials.Tungsten.getMolten(576), + CustomItemList.eM_energyMulti64_ZPM.get(1), + 400, + 30720); + + // Energy Hatch UV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UHV_UV").get(1), + CustomItemList.eM_energyMulti16_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.NaquadahAlloy, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 6) }, + Materials.Tungsten.getMolten(1152), + CustomItemList.eM_energyMulti64_UV.get(1), + 400, + 122880); + + // Energy Hatch UHV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UEV_UHV").get(1), + CustomItemList.eM_energyMulti16_UHV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.SuperconductorUHV, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 6) }, + Materials.Tungsten.getMolten(2304), + CustomItemList.eM_energyMulti64_UHV.get(1), + 400, + 500000); + + // Energy Hatch UEV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UIV_UEV").get(1), + CustomItemList.eM_energyMulti16_UEV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Draconium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 6) }, + Materials.Tungsten.getMolten(4608), + CustomItemList.eM_energyMulti64_UEV.get(1), + 400, + 2000000); + + // Energy Hatch UIV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UMV_UIV").get(1), + CustomItemList.eM_energyMulti16_UIV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.NetherStar, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 6) }, + Materials.Tungsten.getMolten(9216), + CustomItemList.eM_energyMulti64_UIV.get(1), + 400, + 8000000); + + // Energy Hatch UMV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_UXV_UMV").get(1), + CustomItemList.eM_energyMulti16_UMV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.Quantium, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 6) }, + Materials.Tungsten.getMolten(9216), + CustomItemList.eM_energyMulti64_UMV.get(1), + 400, + 32000000); + + // Energy Hatch UXV 64A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_MAX_UXV").get(1), + CustomItemList.eM_energyMulti16_UXV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt12, Materials.BlackPlutonium, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 3), + GT_OreDictUnificator.get("plateShirabon", 3L) }, + Materials.Tungsten.getMolten(9216), + CustomItemList.eM_energyMulti64_UXV.get(1), + 400, + (int) TierEU.RECIPE_UMV); + + } + } + + // Buck Converter IV-UIV + if (BartWorks.isModLoaded()) { + // Buck Converter IV + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_LuV_IV.get(1), getItemContainer("Display").get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Elite, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.TungstenSteel, 2), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.TungstenSteel, 4), + getModItem(BartWorks.ID, "BW_GlasBlocks", 2L, 2) }, + Materials.TungstenSteel.getMolten(288), + CustomItemList.Machine_BuckConverter_IV.get(1), + 100, + 7680); + + // Buck Converter LuV + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_ZPM_LuV.get(1), getItemContainer("Display").get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome), 2), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NiobiumTitanium, 4), + getModItem(BartWorks.ID, "BW_GlasBlocks", 2L, 3) }, + new FluidStack(FluidRegistry.getFluid("molten.rhodium-plated palladium"), 288), + CustomItemList.Machine_BuckConverter_LuV.get(1), + 100, + 30720); + + // Buck Converter ZPM + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_UV_ZPM.get(1), getItemContainer("Display").get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Ultimate, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Iridium, 2), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.TungstenSteel, 4), + getModItem(BartWorks.ID, "BW_GlasBlocks", 2L, 4) }, + Materials.Iridium.getMolten(288), + CustomItemList.Machine_BuckConverter_ZPM.get(1), + 100, + 122880); + + // Buck Converter UV + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Transformer_MAX_UV.get(1), getItemContainer("Display").get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.SuperconductorUHV, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmium, 2), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Naquadah, 4), + getModItem(BartWorks.ID, "BW_GlasBlocks", 2L, 5) }, + Materials.Osmium.getMolten(288), + CustomItemList.Machine_BuckConverter_UV.get(1), + 100, + 500000); + + // Buck Converter UHV + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UEV_UHV").get(1), getItemContainer("Display").get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Infinite, 2), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 2), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.ElectrumFlux, 4), + getModItem(BartWorks.ID, "BW_GlasBlocks", 4L, 5) }, + Materials.Neutronium.getMolten(288), + CustomItemList.Machine_BuckConverter_UHV.get(1), + 100, + 2000000); + + // Buck Converter UEV + GT_Values.RA + .addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UIV_UEV").get(1), + getItemContainer("Display").get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Bio, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("Bedrockium", Materials.Neutronium), 2), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Bedrockium, 4), + getModItem(BartWorks.ID, "BW_GlasBlocks", 8L, 5) }, + getOrDefault("Bedrockium", Materials.Neutronium).getMolten(288), + CustomItemList.Machine_BuckConverter_UEV.get(1), + 100, + 8000000); + + // Buck Converter UIV + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Transformer_UMV_UIV").get(1), getItemContainer("Display").get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Optical, 2), + GT_OreDictUnificator + .get(OrePrefixes.plate, getOrDefault("BlackPlutonium", Materials.Neutronium), 2), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Draconium, 4), + getModItem(BartWorks.ID, "BW_GlasBlocks", 16L, 5) }, + getOrDefault("BlackPlutonium", Materials.Neutronium).getMolten(288), + CustomItemList.Machine_BuckConverter_UIV.get(1), + 200, + 8000000); + } + + // Laser Dynamo + { + // Laser Dynamo IV-UXV 256/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_IV.get(1), + ItemList.Electric_Pump_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.TungstenSteel, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_IV.get(1), + 1000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_LuV.get(1), + ItemList.Electric_Pump_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.VanadiumGallium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_LuV.get(1), + 1000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_ZPM.get(1), + ItemList.Electric_Pump_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Naquadah, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_ZPM.get(1), + 1000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UV.get(1), + ItemList.Electric_Pump_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.NaquadahAlloy, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_UV.get(1), + 1000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UHV.get(1), + ItemList.Electric_Pump_UHV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Bedrockium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_UHV.get(1), + 1000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UEV.get(1), + ItemList.Electric_Pump_UEV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Draconium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_UEV.get(1), + 1000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UIV.get(1), + ItemList.Electric_Pump_UIV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.NetherStar, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_UIV.get(1), + 1000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UMV.get(1), + ItemList.Electric_Pump_UMV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Quantium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_UMV.get(1), + 1000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Emitter_UXV.get(1), + ItemList.Electric_Pump_UXV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.BlackPlutonium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_dynamoTunnel1_UXV.get(1), + 1000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Dynamo IV-UXV 1024/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_IV.get(2), + ItemList.Electric_Pump_IV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.TungstenSteel, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_IV.get(1), + 2000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_LuV.get(2), + ItemList.Electric_Pump_LuV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.VanadiumGallium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_LuV.get(1), + 2000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_ZPM.get(2), + ItemList.Electric_Pump_ZPM.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Naquadah, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_ZPM.get(1), + 2000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UV.get(2), + ItemList.Electric_Pump_UV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NaquadahAlloy, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_UV.get(1), + 2000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UHV.get(2), + ItemList.Electric_Pump_UHV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Bedrockium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_UHV.get(1), + 2000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UEV.get(2), + ItemList.Electric_Pump_UEV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Draconium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_UEV.get(1), + 2000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UIV.get(2), + ItemList.Electric_Pump_UIV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NetherStar, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_UIV.get(1), + 2000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UMV.get(2), + ItemList.Electric_Pump_UMV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Quantium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_UMV.get(1), + 2000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Emitter_UXV.get(2), + ItemList.Electric_Pump_UXV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.BlackPlutonium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_dynamoTunnel2_UXV.get(1), + 2000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Dynamo IV-UXV 4096/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_IV.get(4), + ItemList.Electric_Pump_IV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.TungstenSteel, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_IV.get(1), + 4000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_LuV.get(4), + ItemList.Electric_Pump_LuV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_LuV.get(1), + 4000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_ZPM.get(4), + ItemList.Electric_Pump_ZPM.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_ZPM.get(1), + 4000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UV.get(4), + ItemList.Electric_Pump_UV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_UV.get(1), + 4000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UHV.get(4), + ItemList.Electric_Pump_UHV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Bedrockium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_UHV.get(1), + 4000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UEV.get(4), + ItemList.Electric_Pump_UEV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_UEV.get(1), + 4000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UIV.get(4), + ItemList.Electric_Pump_UIV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_UIV.get(1), + 4000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UMV.get(4), + ItemList.Electric_Pump_UMV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_UMV.get(1), + 4000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UXV.get(4), + ItemList.Electric_Pump_UXV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_dynamoTunnel3_UXV.get(1), + 4000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Dynamo IV-UXV 16384/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_IV.get(8), + ItemList.Electric_Pump_IV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.TungstenSteel, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_IV.get(1), + 8000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_LuV.get(8), + ItemList.Electric_Pump_LuV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_LuV.get(1), + 8000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_ZPM.get(8), + ItemList.Electric_Pump_ZPM.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_ZPM.get(1), + 8000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_UV.get(8), + ItemList.Electric_Pump_UV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_UV.get(1), + 8000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_UHV.get(8), + ItemList.Electric_Pump_UHV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Bedrockium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_UHV.get(1), + 8000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_UEV.get(8), + ItemList.Electric_Pump_UEV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_UEV.get(1), + 8000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Emitter_UIV.get(8), + ItemList.Electric_Pump_UIV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_UIV.get(1), + 8000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UMV.get(8), + ItemList.Electric_Pump_UMV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_UMV.get(1), + 8000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Emitter_UXV.get(8), + ItemList.Electric_Pump_UXV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_dynamoTunnel4_UXV.get(1), + 8000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Dynamo IV-UXV 65536/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_IV.get(16), + ItemList.Electric_Pump_IV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.TungstenSteel, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_IV.get(1), + 16000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_LuV.get(16), + ItemList.Electric_Pump_LuV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_LuV.get(1), + 16000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_ZPM.get(16), + ItemList.Electric_Pump_ZPM.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_ZPM.get(1), + 16000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UV.get(16), + ItemList.Electric_Pump_UV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_UV.get(1), + 16000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UHV.get(16), + ItemList.Electric_Pump_UHV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Bedrockium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_UHV.get(1), + 16000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UEV.get(16), + ItemList.Electric_Pump_UEV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_UEV.get(1), + 16000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UIV.get(16), + ItemList.Electric_Pump_UIV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_UIV.get(1), + 16000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UMV.get(16), + ItemList.Electric_Pump_UMV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_UMV.get(1), + 16000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Emitter_UXV.get(16), + ItemList.Electric_Pump_UXV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_dynamoTunnel5_UXV.get(1), + 16000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Dynamo IV-UXV 262144/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_IV.get(32), + ItemList.Electric_Pump_IV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.TungstenSteel, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_IV.get(1), + 32000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_LuV.get(32), + ItemList.Electric_Pump_LuV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_LuV.get(1), + 32000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_ZPM.get(32), + ItemList.Electric_Pump_ZPM.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_ZPM.get(1), + 32000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UV.get(32), + ItemList.Electric_Pump_UV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_UV.get(1), + 32000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UHV.get(32), + ItemList.Electric_Pump_UHV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Bedrockium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_UHV.get(1), + 32000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UEV.get(32), + ItemList.Electric_Pump_UEV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_UEV.get(1), + 32000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UIV.get(32), + ItemList.Electric_Pump_UIV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_UIV.get(1), + 32000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UMV.get(32), + ItemList.Electric_Pump_UMV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_UMV.get(1), + 32000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Emitter_UXV.get(32), + ItemList.Electric_Pump_UXV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_dynamoTunnel6_UXV.get(1), + 32000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Dynamo IV-UXV 1048576/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_IV.get(64), + ItemList.Electric_Pump_IV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.TungstenSteel, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_IV.get(1), + 64000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_LuV.get(64), + ItemList.Electric_Pump_LuV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.VanadiumGallium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_LuV.get(1), + 64000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_ZPM.get(64), + ItemList.Electric_Pump_ZPM.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Naquadah, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_ZPM.get(1), + 64000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UV.get(64), + ItemList.Electric_Pump_UV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NaquadahAlloy, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_UV.get(1), + 64000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UHV.get(64), + ItemList.Electric_Pump_UHV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Bedrockium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_UHV.get(1), + 64000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UEV.get(64), + ItemList.Electric_Pump_UEV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Draconium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_UEV.get(1), + 64000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UIV.get(64), + ItemList.Electric_Pump_UIV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NetherStar, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_UIV.get(1), + 64000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UMV.get(64), + ItemList.Electric_Pump_UMV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Quantium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_UMV.get(1), + 64000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Emitter_UXV.get(64), + ItemList.Electric_Pump_UXV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.BlackPlutonium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_dynamoTunnel7_UXV.get(1), + 64000, + (int) TierEU.RECIPE_UXV); + } + } + + // Laser Target + { + // Laser Target IV-UXV 256/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_IV.get(1), + ItemList.Electric_Pump_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.TungstenSteel, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_IV.get(1), + 1000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_LuV.get(1), + ItemList.Electric_Pump_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.VanadiumGallium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_LuV.get(1), + 1000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_ZPM.get(1), + ItemList.Electric_Pump_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Naquadah, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_ZPM.get(1), + 1000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UV.get(1), + ItemList.Electric_Pump_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.NaquadahAlloy, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_UV.get(1), + 1000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UHV.get(1), + ItemList.Electric_Pump_UHV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Bedrockium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_UHV.get(1), + 1000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UEV.get(1), + ItemList.Electric_Pump_UEV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Draconium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_UEV.get(1), + 1000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UIV.get(1), + ItemList.Electric_Pump_UIV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.NetherStar, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_UIV.get(1), + 1000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UMV.get(1), + ItemList.Electric_Pump_UMV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.Quantium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_UMV.get(1), + 1000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UXV.get(1), + ItemList.Electric_Pump_UXV.get(1), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.BlackPlutonium, 2), + GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.eM_energyTunnel1_UXV.get(1), + 1000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Target IV-UXV 1024/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_IV.get(2), + ItemList.Electric_Pump_IV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.TungstenSteel, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_IV.get(1), + 2000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_LuV.get(2), + ItemList.Electric_Pump_LuV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.VanadiumGallium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_LuV.get(1), + 2000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_ZPM.get(2), + ItemList.Electric_Pump_ZPM.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Naquadah, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_ZPM.get(1), + 2000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UV.get(2), + ItemList.Electric_Pump_UV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NaquadahAlloy, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_UV.get(1), + 2000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UHV.get(2), + ItemList.Electric_Pump_UHV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Bedrockium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_UHV.get(1), + 2000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UEV.get(2), + ItemList.Electric_Pump_UEV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Draconium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_UEV.get(1), + 2000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UIV.get(2), + ItemList.Electric_Pump_UIV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.NetherStar, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_UIV.get(1), + 2000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UMV.get(2), + ItemList.Electric_Pump_UMV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Quantium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_UMV.get(1), + 2000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 2), ItemList.Sensor_UXV.get(2), + ItemList.Electric_Pump_UXV.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.BlackPlutonium, 4), + GT_Utility.getIntegratedCircuit(2) }, + null, + CustomItemList.eM_energyTunnel2_UXV.get(1), + 2000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Target IV-UXV 4096/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_IV.get(4), + ItemList.Electric_Pump_IV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.TungstenSteel, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_IV.get(1), + 4000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_LuV.get(4), + ItemList.Electric_Pump_LuV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_LuV.get(1), + 4000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_ZPM.get(4), + ItemList.Electric_Pump_ZPM.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_ZPM.get(1), + 4000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_UV.get(4), + ItemList.Electric_Pump_UV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_UV.get(1), + 4000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_UHV.get(4), + ItemList.Electric_Pump_UHV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Bedrockium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_UHV.get(1), + 4000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_UEV.get(4), + ItemList.Electric_Pump_UEV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_UEV.get(1), + 4000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 4), ItemList.Sensor_UIV.get(4), + ItemList.Electric_Pump_UIV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_UIV.get(1), + 4000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UMV.get(4), + ItemList.Electric_Pump_UMV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_UMV.get(1), + 4000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 1), ItemList.Sensor_UXV.get(4), + ItemList.Electric_Pump_UXV.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 4), + GT_Utility.getIntegratedCircuit(3) }, + null, + CustomItemList.eM_energyTunnel3_UXV.get(1), + 4000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Target IV-UXV 16384/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_IV.get(8), + ItemList.Electric_Pump_IV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.TungstenSteel, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_IV.get(1), + 8000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_LuV.get(8), + ItemList.Electric_Pump_LuV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.VanadiumGallium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_LuV.get(1), + 8000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_ZPM.get(8), + ItemList.Electric_Pump_ZPM.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Naquadah, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_ZPM.get(1), + 8000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UV.get(8), + ItemList.Electric_Pump_UV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NaquadahAlloy, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_UV.get(1), + 8000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UHV.get(8), + ItemList.Electric_Pump_UHV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Bedrockium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_UHV.get(1), + 8000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UEV.get(8), + ItemList.Electric_Pump_UEV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Draconium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_UEV.get(1), + 8000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UIV.get(8), + ItemList.Electric_Pump_UIV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.NetherStar, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_UIV.get(1), + 8000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UMV.get(8), + ItemList.Electric_Pump_UMV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Quantium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_UMV.get(1), + 8000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 8), ItemList.Sensor_UXV.get(8), + ItemList.Electric_Pump_UXV.get(8), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.BlackPlutonium, 8), + GT_Utility.getIntegratedCircuit(4) }, + null, + CustomItemList.eM_energyTunnel4_UXV.get(1), + 8000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Target IV-UXV 65536/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_IV.get(16), + ItemList.Electric_Pump_IV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.TungstenSteel, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_IV.get(1), + 16000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_LuV.get(16), + ItemList.Electric_Pump_LuV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_LuV.get(1), + 16000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_ZPM.get(16), + ItemList.Electric_Pump_ZPM.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_ZPM.get(1), + 16000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UV.get(16), + ItemList.Electric_Pump_UV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_UV.get(1), + 16000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UHV.get(16), + ItemList.Electric_Pump_UHV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Bedrockium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_UHV.get(1), + 16000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UEV.get(16), + ItemList.Electric_Pump_UEV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_UEV.get(1), + 16000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UIV.get(16), + ItemList.Electric_Pump_UIV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_UIV.get(1), + 16000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UMV.get(16), + ItemList.Electric_Pump_UMV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_UMV.get(1), + 16000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 16), ItemList.Sensor_UXV.get(16), + ItemList.Electric_Pump_UXV.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 8), + GT_Utility.getIntegratedCircuit(5) }, + null, + CustomItemList.eM_energyTunnel5_UXV.get(1), + 16000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Target IV-UXV 262144/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_IV.get(32), + ItemList.Electric_Pump_IV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.TungstenSteel, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_IV.get(1), + 32000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_LuV.get(32), + ItemList.Electric_Pump_LuV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.VanadiumGallium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_LuV.get(1), + 32000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_ZPM.get(32), + ItemList.Electric_Pump_ZPM.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Naquadah, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_ZPM.get(1), + 32000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UV.get(32), + ItemList.Electric_Pump_UV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NaquadahAlloy, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_UV.get(1), + 32000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UHV.get(32), + ItemList.Electric_Pump_UHV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Bedrockium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_UHV.get(1), + 32000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UEV.get(32), + ItemList.Electric_Pump_UEV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Draconium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_UEV.get(1), + 32000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UIV.get(32), + ItemList.Electric_Pump_UIV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.NetherStar, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_UIV.get(1), + 32000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UMV.get(32), + ItemList.Electric_Pump_UMV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.Quantium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_UMV.get(1), + 32000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 32), ItemList.Sensor_UXV.get(32), + ItemList.Electric_Pump_UXV.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.BlackPlutonium, 16), + GT_Utility.getIntegratedCircuit(6) }, + null, + CustomItemList.eM_energyTunnel6_UXV.get(1), + 32000, + (int) TierEU.RECIPE_UXV); + } + + // Laser Target IV-UXV 1048576/t + { + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_IV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_IV.get(64), + ItemList.Electric_Pump_IV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.TungstenSteel, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_IV.get(1), + 64000, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_LuV.get(64), + ItemList.Electric_Pump_LuV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.VanadiumGallium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_LuV.get(1), + 64000, + 30720); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_ZPM.get(64), + ItemList.Electric_Pump_ZPM.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Naquadah, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_ZPM.get(1), + 64000, + 122880); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_UV.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UV.get(64), + ItemList.Electric_Pump_UV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NaquadahAlloy, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_UV.get(1), + 64000, + 500000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hull_MAX.get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UHV.get(64), + ItemList.Electric_Pump_UHV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Bedrockium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_UHV.get(1), + 64000, + 2000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UEV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UEV.get(64), + ItemList.Electric_Pump_UEV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Draconium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_UEV.get(1), + 64000, + 8000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UIV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UIV.get(64), + ItemList.Electric_Pump_UIV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.NetherStar, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_UIV.get(1), + 64000, + 32000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UMV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UMV.get(64), + ItemList.Electric_Pump_UMV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Quantium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_UMV.get(1), + 64000, + 128000000); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("Hull_UXV").get(1), + GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Diamond, 64), ItemList.Sensor_UXV.get(64), + ItemList.Electric_Pump_UXV.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.BlackPlutonium, 16), + GT_Utility.getIntegratedCircuit(7) }, + null, + CustomItemList.eM_energyTunnel7_UXV.get(1), + 64000, + (int) TierEU.RECIPE_UXV); + } + } + + // Tesla Capacitor + { + // LV Tesla Capacitor + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tin, 4), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 4), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 8), }, + Materials.Epoxid.getMolten(72), + CustomItemList.teslaCapacitor.getWithDamage(1, 0), + 320, + 30); + // MV Tesla Capacitor + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Copper, 4), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 6), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 12), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 12), }, + Materials.Epoxid.getMolten(144), + CustomItemList.teslaCapacitor.getWithDamage(1, 1), + 320, + 120); + // HV Tesla Capacitor + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Gold, 4), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 8), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 16), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 16), }, + Materials.Epoxid.getMolten(216), + CustomItemList.teslaCapacitor.getWithDamage(1, 2), + 320, + 480); + // EV Tesla Capacitor + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Aluminium, 4), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 10), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 20), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 20), }, + Materials.Epoxid.getMolten(288), + CustomItemList.teslaCapacitor.getWithDamage(1, 3), + 320, + 1920); + // IV Tesla Capacitor + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Tungsten, 4), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 12), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 24), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 24), }, + Materials.Epoxid.getMolten(360), + CustomItemList.teslaCapacitor.getWithDamage(1, 4), + 320, + 7680); + // LuV Tesla Capacitor + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.HSSG, 4), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 14), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 28), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 28), }, + Materials.Epoxid.getMolten(432), + CustomItemList.teslaCapacitor.getWithDamage(1, 5), + 320, + 30720); + // ZPM Tesla Capacitor + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt01, Materials.Naquadah, 4), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 16), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 32), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silicone, 32), }, + Materials.Epoxid.getMolten(504), + CustomItemList.teslaCapacitor.getWithDamage(1, 6), + 320, + 122880); + } + + // Tesla Cover + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 0), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Gold, 16), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), }, + Materials.Lead.getMolten(288), + CustomItemList.teslaCover.getWithDamage(1, 0), + 320, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 0), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Gold, 16), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), }, + Materials.Tin.getMolten(144), + CustomItemList.teslaCover.getWithDamage(1, 0), + 320, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 0), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 2), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Gold, 16), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), }, + Materials.SolderingAlloy.getMolten(72), + CustomItemList.teslaCover.getWithDamage(1, 0), + 320, + 480); + // Ultimate Tesla Cover + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tungsten, 16), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), }, + Materials.Lead.getMolten(288), + CustomItemList.teslaCover.getWithDamage(1, 1), + 320, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tungsten, 16), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), }, + Materials.Tin.getMolten(144), + CustomItemList.teslaCover.getWithDamage(1, 1), + 320, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.teslaComponent.getWithDamage(4, 1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tungsten, 16), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 2), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Aluminium, 8), }, + Materials.SolderingAlloy.getMolten(72), + CustomItemList.teslaCover.getWithDamage(1, 1), + 320, + 7680); + + // Ender Fluid Link Cover + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Enderium, 4), + ItemList.Sensor_LuV.get(1), ItemList.Emitter_LuV.get(1), ItemList.Electric_Pump_LuV.get(1), }, + getOrDefault("Rhodium-PlatedPalladium", Materials.Chrome).getMolten(288), + CustomItemList.enderLinkFluidCover.getWithDamage(1, 0), + 320, + 30720); + + // Power Pass Upgrade Cover + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.Machine_Multi_Transformer.get(1), GT_Utility.getIntegratedCircuit(1) }, + null, + CustomItemList.powerPassUpgradeCover.getWithDamage(1, 0), + 320, + 30720); + + // Tesla Winding Components + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 32), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NickelZincFerrite, 8), }, + Materials.Epoxid.getMolten(288), + CustomItemList.teslaComponent.getWithDamage(1, 0), + 320, + 30); + + // Tesla Winding Components Ultimate (ADD BLOOD VARIANT) + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorLuV, 4), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.NickelZincFerrite, 8), }, + Materials.Epoxid.getMolten(576), + CustomItemList.teslaComponent.getWithDamage(1, 1), + 320, + 7680); + + // Tesla Transceiver LV 1A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_1by1_LV.get(1), + 400, + 30); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_1by1_LV.get(1), + 400, + 30); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_1by1_LV.get(1), + 400, + 30); + // Tesla Transceiver MV 1A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_1by1_MV.get(1), + 400, + 120); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_1by1_MV.get(1), + 400, + 120); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_1by1_MV.get(1), + 400, + 120); + // Tesla Transceiver HV 1A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_1by1_HV.get(1), + 400, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_1by1_HV.get(1), + 400, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_1by1_HV.get(1), + 400, + 480); + // Tesla Transceiver EV 1A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_1by1_EV.get(1), + 400, + 1920); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_1by1_EV.get(1), + 400, + 1920); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_1by1_EV.get(1), + 400, + 1920); + // Tesla Transceiver IV 1A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_1by1_IV.get(1), + 400, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_1by1_IV.get(1), + 400, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_1by1_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_1by1_IV.get(1), + 400, + 7680); + // Tesla Transceiver LV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_2by2_LV.get(1), + 400, + 30); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_2by2_LV.get(1), + 400, + 30); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_2by2_LV.get(1), + 400, + 30); + // Tesla Transceiver MV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_2by2_MV.get(1), + 400, + 120); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_2by2_MV.get(1), + 400, + 120); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_2by2_MV.get(1), + 400, + 120); + // Tesla Transceiver HV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_2by2_HV.get(1), + 400, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_2by2_HV.get(1), + 400, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_2by2_HV.get(1), + 400, + 480); + // Tesla Transceiver EV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_2by2_EV.get(1), + 400, + 1920); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_2by2_EV.get(1), + 400, + 1920); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_2by2_EV.get(1), + 400, + 1920); + // Tesla Transceiver IV 4A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_2by2_IV.get(1), + 400, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_2by2_IV.get(1), + 400, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_2by2_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_2by2_IV.get(1), + 400, + 7680); + // Tesla Transceiver LV 9A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_3by3_LV.get(1), + 400, + 30); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_3by3_LV.get(1), + 400, + 30); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_3by3_LV.get(1), + 400, + 30); + // Tesla Transceiver MV 9A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_3by3_MV.get(1), + 400, + 120); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_3by3_MV.get(1), + 400, + 120); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_3by3_MV.get(1), + 400, + 120); + // Tesla Transceiver HV 9A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_3by3_HV.get(1), + 400, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_3by3_HV.get(1), + 400, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_3by3_HV.get(1), + 400, + 480); + // Tesla Transceiver EV 9A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_3by3_EV.get(1), + 400, + 1920); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_3by3_EV.get(1), + 400, + 1920); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_3by3_EV.get(1), + 400, + 1920); + // Tesla Transceiver IV 9A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_3by3_IV.get(1), + 400, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_3by3_IV.get(1), + 400, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_3by3_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_3by3_IV.get(1), + 400, + 7680); + // Tesla Transceiver LV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_4by4_LV.get(1), + 400, + 30); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_4by4_LV.get(1), + 400, + 30); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_LV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_4by4_LV.get(1), + 400, + 30); + // Tesla Transceiver MV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_4by4_MV.get(1), + 400, + 120); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_4by4_MV.get(1), + 400, + 120); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_MV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_4by4_MV.get(1), + 400, + 120); + // Tesla Transceiver HV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_4by4_HV.get(1), + 400, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_4by4_HV.get(1), + 400, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_HV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_4by4_HV.get(1), + 400, + 480); + // Tesla Transceiver EV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_4by4_EV.get(1), + 400, + 1920); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_4by4_EV.get(1), + 400, + 1920); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_EV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_4by4_EV.get(1), + 400, + 1920); + // Tesla Transceiver IV 16A + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Lead.getMolten(576), + CustomItemList.Machine_TeslaCoil_4by4_IV.get(1), + 400, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.Tin.getMolten(288), + CustomItemList.Machine_TeslaCoil_4by4_IV.get(1), + 400, + 7680); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Battery_Buffer_4by4_IV.get(1), CustomItemList.teslaCover.getWithDamage(1, 0) }, + Materials.SolderingAlloy.getMolten(144), + CustomItemList.Machine_TeslaCoil_4by4_IV.get(1), + 400, + 7680); + + // Tesla Tower + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { GT_ModHandler.getIC2Item("teslaCoil", 1), CustomItemList.tM_TeslaSecondary.get(4), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 4), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 4), + ItemList.Upgrade_Overclocker.get(4), }, + Materials.Silver.getMolten(576), + CustomItemList.Machine_Multi_TeslaCoil.get(1), + 800, + 480); + + // Microwave Grinder + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Machine_HV_Microwave.get(1), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.StainlessSteel, 4), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Advanced, 4), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.AnnealedCopper, 16), + ItemList.Upgrade_Overclocker.get(4), }, + Materials.Copper.getMolten(576), + CustomItemList.Machine_Multi_Microwave.get(1), + 800, + 480); + + // Active Transformer + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { getItemContainer("WetTransformer_ZPM_LuV").get(1), + getItemContainer("HighEnergyFlowCircuit").get(1), + GT_OreDictUnificator + .get(OrePrefixes.wireGt01, getOrDefault("SuperconductorLuV", Materials.SuperconductorUHV), 16), + ItemList.valueOf("Circuit_Chip_UHPIC") + .get(2), }, + Materials.TungstenSteel.getMolten(576), + CustomItemList.Machine_Multi_Transformer.get(1), + 400, + 30720); + + // Network Switch + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { CustomItemList.Machine_Multi_Transformer.get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 4), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Cobalt, 64), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Copper, 64), CustomItemList.DATApipe.get(4), }, + Materials.Iridium.getMolten(1296), + CustomItemList.Machine_Multi_Switch.get(1), + 800, + 122880); + + } + + public void cleanroomRecipes() { + // Data + addAssemblerRecipeWithCleanroom( + new ItemStack[] { ItemList.Circuit_Parts_GlassFiber.get(8), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Silver, 8) }, + Materials.Polytetrafluoroethylene.getMolten(144), + CustomItemList.DATApipe.get(1), + 200, + 30720); + + // Data Casing + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.DATApipe.get(1), ItemList.Casing_LuV.get(1) }, + null, + CustomItemList.DATApipeBlock.get(1), + 20, + 30720); + + // Laser + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.DATApipe.get(1), GT_ModHandler.getIC2Item("reinforcedGlass", 1L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Osmiridium, 2) }, + null, + CustomItemList.LASERpipe.get(1), + 100, + 500000); + + // Laser Casing + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.LASERpipe.get(1), ItemList.Casing_LuV.get(1) }, + null, + CustomItemList.LASERpipeBlock.get(1), + 20, + 30720); + + // Advanced Computer Casing + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Ultimate, 1), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Cobalt, 64), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Electrum, 64), + GT_OreDictUnificator + .get(OrePrefixes.wireGt02, getOrDefault("SuperconductorLuV", Materials.SuperconductorUHV), 4) }, + Materials.Iridium.getMolten(1296), + CustomItemList.eM_Computer_Bus.get(1), + 200, + 122880); + + // Data Input + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1), ItemList.Hatch_Input_Bus_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 1), CustomItemList.DATApipe.get(2) }, + Materials.Iridium.getMolten(1296), + CustomItemList.dataIn_Hatch.get(1), + 200, + 122880); + + // Data Output + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1), ItemList.Hatch_Output_Bus_LuV.get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 1), CustomItemList.DATApipe.get(2) }, + Materials.Iridium.getMolten(1296), + CustomItemList.dataOut_Hatch.get(1), + 200, + 122880); + + // Rack + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.eM_Computer_Bus.get(1), ItemList.Hatch_Input_Bus_ZPM.get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Master, 2), CustomItemList.DATApipe.get(4) }, + Materials.Iridium.getMolten(1296), + CustomItemList.rack_Hatch.get(1), + 800, + 122880); + + // Uncertainty + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Ultimate, 1), CustomItemList.DATApipe.get(16), + ItemList.Cover_Screen.get(1), new ItemStack(Blocks.stone_button, 16), + GT_Utility.getIntegratedCircuit(4), }, + Materials.Iridium.getMolten(2592), + CustomItemList.Uncertainty_Hatch.get(1), + 1200, + 122880); + + // Uncertainty X + addAssemblerRecipeWithCleanroom( + new ItemStack[] { CustomItemList.eM_Computer_Casing.get(1), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Bio, 1), CustomItemList.DATApipe.get(32), + ItemList.Cover_Screen.get(1), new ItemStack(Blocks.stone_button, 16), + GT_Utility.getIntegratedCircuit(5), }, + Materials.Iridium.getMolten(2592), + CustomItemList.UncertaintyX_Hatch.get(1), + 1200, + 122880); + + // Capacitor Hatch + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Input_Bus_HV.get(1), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 4), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Gold, 4), }, + Materials.Silver.getMolten(576), + CustomItemList.capacitor_Hatch.get(1), + 800, + 480); + GT_Values.RA.addAssemblerRecipe( + new ItemStack[] { ItemList.Hatch_Output_Bus_HV.get(1), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.NickelZincFerrite, 4), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.Gold, 4), }, + Materials.Silver.getMolten(576), + CustomItemList.capacitor_Hatch.get(1), + 800, + 480); + + } + + private void addAssemblerRecipeWithCleanroom(ItemStack[] items, FluidStack fluid, ItemStack output, int time, + int eut) { + GT_Values.RA.addAssemblerRecipe(items, fluid, output, time, eut, true); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/recipe/AssemblyLine.java b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/AssemblyLine.java new file mode 100644 index 0000000000..cd8ea21b51 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/AssemblyLine.java @@ -0,0 +1,128 @@ +package com.github.technus.tectech.loader.recipe; + +import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getItemContainer; +import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getOrDefault; +import static gregtech.api.enums.GT_Values.RA; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.thing.CustomItemList; + +import gregtech.api.enums.GT_Values; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GT_OreDictUnificator; + +public class AssemblyLine implements Runnable { + + @Override + public void run() { + // Data Bank + RA.addAssemblylineRecipe( + ItemList.Hatch_DataAccess_EV.get(1), + 20000, + new Object[] { CustomItemList.Machine_Multi_Switch.get(1), + new Object[] { OrePrefixes.circuit.get(Materials.Master), 2 }, ItemList.Tool_DataOrb.get(1), + ItemList.Cover_Screen.get(1), }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), + Materials.Hydrogen.getGas(1000), }, + CustomItemList.Machine_Multi_DataBank.get(1), + 12000, + 14000); + + // Hollow Casing + GT_Values.RA.addAssemblylineRecipe( + CustomItemList.eM_Containment.get(1), + 7500, + new ItemStack[] { CustomItemList.eM_Containment.get(1), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Europium, 2), + GT_OreDictUnificator.get(OrePrefixes.plateQuadruple, Materials.Plutonium, 4), + GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Lead, 8), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Uranium, 16), + GT_OreDictUnificator.get(OrePrefixes.screw, getOrDefault("Quantium", Materials.Europium), 16), }, + new FluidStack[] { getOrDefault("Trinium", Materials.Osmium).getMolten(1296), + Materials.Osmium.getMolten(1296), new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), + Materials.Argon.getGas(1000), }, + CustomItemList.eM_Hollow.get(2), + 200, + 200000); + + // EM Coil + GT_Values.RA.addAssemblylineRecipe( + CustomItemList.eM_Hollow.get(1), + 7500, + new ItemStack[] { CustomItemList.eM_Hollow.get(1), ItemList.Casing_Fusion_Coil.get(2), + ItemList.Casing_Coil_NaquadahAlloy.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Europium, 64), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Europium, 64), }, + new FluidStack[] { Materials.Glass.getMolten(2304), Materials.Silicone.getMolten(1872), + new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), + getOrDefault("Trinium", Materials.Osmium).getMolten(1296), }, + CustomItemList.eM_Coil.get(4), + 800, + 200000); + + // Object Holder + GT_Values.RA.addAssemblylineRecipe( + ItemList.Hatch_Input_Bus_ZPM.get(1), + 10000, + new Object[] { ItemList.Hatch_Input_Bus_ZPM.get(1), CustomItemList.eM_Computer_Bus.get(1), + ItemList.Emitter_ZPM.get(8), ItemList.Robot_Arm_ZPM.get(1), ItemList.Electric_Motor_ZPM.get(2), + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1 }, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt02, Materials.Naquadah, 2) }, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Naquadah, 16) }, + CustomItemList.DATApipe.get(2), }, + new FluidStack[] { Materials.UUMatter.getFluid(500), Materials.Iridium.getMolten(1296), + new FluidStack(FluidRegistry.getFluid("ic2coolant"), 1000) }, + CustomItemList.holder_Hatch.get(1), + 1200, + 100000); + + // Quantum Computer + GT_Values.RA.addAssemblylineRecipe( + ItemList.Tool_DataOrb.get(1), + 20000, + new Object[] { CustomItemList.Machine_Multi_Switch.get(1), + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 2 }, ItemList.Tool_DataOrb.get(1), + ItemList.Cover_Screen.get(1), + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUV, 8) }, + CustomItemList.DATApipe.get(8), }, + new FluidStack[] { Materials.UUMatter.getFluid(1000), Materials.Iridium.getMolten(1296), + new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), Materials.Hydrogen.getGas(1000), }, + CustomItemList.Machine_Multi_Computer.get(1), + 12000, + 100000); + + // Research Station + GT_Values.RA.addAssemblylineRecipe( + getItemContainer("ScannerZPM").get(1), + 80000, + new Object[] { CustomItemList.Machine_Multi_Switch.get(1), ItemList.Sensor_ZPM.get(8), + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4 }, + ItemList.Field_Generator_ZPM.get(1), ItemList.Electric_Motor_ZPM.get(2), + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.cableGt02, Materials.Naquadah, 4) }, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Naquadah, 32) }, + CustomItemList.DATApipe.get(16), }, + new FluidStack[] { Materials.UUMatter.getFluid(1000), Materials.Iridium.getMolten(1296), + new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), Materials.Osmium.getMolten(1296), }, + CustomItemList.Machine_Multi_Research.get(1), + 12000, + 100000); + + // Multi Infuser + GT_Values.RA.addAssemblylineRecipe( + CustomItemList.Machine_Multi_Transformer.get(1), + 7500, + new ItemStack[] { CustomItemList.Machine_Multi_Transformer.get(1), CustomItemList.eM_Coil.get(8), + CustomItemList.eM_Power.get(8), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.NeodymiumMagnetic, 16), }, + new FluidStack[] { Materials.Electrum.getMolten(2592), Materials.Europium.getMolten(1872), + new FluidStack(FluidRegistry.getFluid("ic2coolant"), 2000), }, + CustomItemList.Machine_Multi_Infuser.get(1), + 8000, + 200000); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java new file mode 100644 index 0000000000..3c75b38465 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java @@ -0,0 +1,49 @@ +package com.github.technus.tectech.loader.recipe; + +import static com.github.technus.tectech.TecTech.LOGGER; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; + +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.IItemContainer; + +/** + * Created by danie_000 on 16.11.2016. + */ +public class BaseRecipeLoader { + + @SuppressWarnings("rawtypes") + private static Class CUSTOM_ITEM_LIST; + + static { + try { + CUSTOM_ITEM_LIST = Class.forName("com.dreammaster.gthandler.CustomItemList"); + } catch (Exception e) { + LOGGER.error("NHCoreMod not present. Disabling all the recipes"); + } + } + + @SuppressWarnings("unchecked") + public static IItemContainer getItemContainer(String name) { + // must never be called before the try catch block is ran + return (IItemContainer) Enum.valueOf(CUSTOM_ITEM_LIST, name); + } + + public static Materials getOrDefault(String name, Materials def) { + Materials mat = Materials.get(name); + return mat == Materials._NULL || mat == null ? def : mat; + } + + public void run() { + // todo: Move those recipes in NHCore + if (NewHorizonsCoreMod.isModLoaded()) { + new Assembler().run(); + new AssemblyLine().run(); + new CircuitAssembler().run(); + new Crafting().run(); + new Extractor().run(); + new ResearchStationAssemblyLine().run(); + } else { + new Godforge().run(); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/recipe/CircuitAssembler.java b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/CircuitAssembler.java new file mode 100644 index 0000000000..ff6f4694ce --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/CircuitAssembler.java @@ -0,0 +1,46 @@ +package com.github.technus.tectech.loader.recipe; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.thing.CustomItemList; + +import gregtech.api.enums.GT_Values; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GT_OreDictUnificator; + +public class CircuitAssembler implements Runnable { + + @Override + public void run() { + Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null + ? FluidRegistry.getFluid("molten.mutatedlivingsolder") + : FluidRegistry.getFluid("molten.solderingalloy"); + + // Optical Processor + GT_Values.RA.addCircuitAssemblerRecipe( + new ItemStack[] { ItemList.Optically_Perfected_CPU.get(1L), ItemList.Optically_Compatible_Memory.get(2L), + ItemList.Circuit_Parts_CapacitorXSMD.get(16L), ItemList.Circuit_Parts_DiodeXSMD.get(16L), + CustomItemList.DATApipe.get(4L), + GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.EnrichedHolmium, 16) }, + new FluidStack(solderUEV, 288), + ItemList.Circuit_OpticalProcessor.get(1L), + 20 * 20, + 614400, + true); + + // Parametrizer Memory Card + GT_Values.RA.addCircuitAssemblerRecipe( + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Basic, 2), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Gold, 4), }, + Materials.Plastic.getMolten(72), + CustomItemList.parametrizerMemory.get(1), + 200, + 480, + true); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Crafting.java b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Crafting.java new file mode 100644 index 0000000000..73afec47ff --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Crafting.java @@ -0,0 +1,57 @@ +package com.github.technus.tectech.loader.recipe; + +import net.minecraft.item.ItemStack; + +import com.github.technus.tectech.thing.CustomItemList; +import com.github.technus.tectech.thing.item.EuMeterGT; +import com.gtnewhorizon.structurelib.StructureLibAPI; + +import gregtech.api.enums.Dyes; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GT_ModHandler; + +public class Crafting implements Runnable { + + @Override + public void run() { + + // Front Rotation Tool + GT_ModHandler.addCraftingRecipe( + GT_ModHandler.getModItem(StructureLibAPI.MOD_ID, "item.structurelib.frontRotationTool", 1L, 0), + GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "fPR", " RP", "S h", 'P', OrePrefixes.plate.get(Materials.Cobalt), 'R', + OrePrefixes.stick.get(Materials.Cobalt), 'S', OrePrefixes.stick.get(Materials.Wood), }); + + // GT EU reader + GT_ModHandler.addCraftingRecipe( + new ItemStack(EuMeterGT.INSTANCE, 1), + GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "PGW", "SCW", "BRN", 'P', OrePrefixes.plateDouble.get(Materials.Steel), 'G', + OrePrefixes.plate.get(Materials.Glass), 'W', OrePrefixes.cableGt01.get(Materials.Copper), 'S', + OrePrefixes.stick.get(Materials.Brass), 'C', ItemList.Casing_Coil_Cupronickel.get(1), 'B', Dyes.dyeBlue, + 'R', Dyes.dyeRed, 'N', Dyes.dyeBlack, }); + + // Owner detector + GT_ModHandler.addCraftingRecipe( + CustomItemList.Machine_OwnerDetector.get(1), + GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "PPP", "GEG", "PPP", 'P', OrePrefixes.plate.get(Materials.IronMagnetic), 'G', + OrePrefixes.plate.get(Materials.Glass), 'E', OrePrefixes.gem.get(Materials.EnderPearl) }); + + // Tesla Base + GT_ModHandler.addCraftingRecipe( + CustomItemList.tM_TeslaBase.get(1), + GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "PhP", "PFP", "PwP", 'P', OrePrefixes.plate.get(Materials.NickelZincFerrite), 'F', + OrePrefixes.frameGt.get(Materials.NickelZincFerrite) }); + + // Tesla Toroid + GT_ModHandler.addCraftingRecipe( + CustomItemList.tM_TeslaToroid.get(1), + GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE, + new Object[] { "PhP", "PFP", "PwP", 'P', OrePrefixes.foil.get(Materials.Aluminium), 'F', + OrePrefixes.frameGt.get(Materials.Aluminium) }); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Extractor.java b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Extractor.java new file mode 100644 index 0000000000..4ec2b55122 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Extractor.java @@ -0,0 +1,57 @@ +package com.github.technus.tectech.loader.recipe; + +import com.github.technus.tectech.thing.CustomItemList; + +import gregtech.api.enums.GT_Values; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GT_OreDictUnificator; + +public class Extractor implements Runnable { + + @Override + public void run() { + // LV Tesla Capacitor + GT_Values.RA.addExtractorRecipe( + CustomItemList.teslaCapacitor.getWithDamage(1, 0), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 4), + 300, + 2); + // MV Tesla Capacitor + GT_Values.RA.addExtractorRecipe( + CustomItemList.teslaCapacitor.getWithDamage(1, 1), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 6), + 300, + 2); + // HV Tesla Capacitor + GT_Values.RA.addExtractorRecipe( + CustomItemList.teslaCapacitor.getWithDamage(1, 2), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 8), + 300, + 2); + // EV Tesla Capacitor + GT_Values.RA.addExtractorRecipe( + CustomItemList.teslaCapacitor.getWithDamage(1, 3), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 10), + 300, + 2); + // IV Tesla Capacitor + GT_Values.RA.addExtractorRecipe( + CustomItemList.teslaCapacitor.getWithDamage(1, 4), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 12), + 300, + 2); + // LuV Tesla Capacitor + GT_Values.RA.addExtractorRecipe( + CustomItemList.teslaCapacitor.getWithDamage(1, 5), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 14), + 300, + 2); + // ZPM Tesla Capacitor + GT_Values.RA.addExtractorRecipe( + CustomItemList.teslaCapacitor.getWithDamage(1, 6), + GT_OreDictUnificator.get(OrePrefixes.itemCasing, Materials.BatteryAlloy, 16), + 300, + 2); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java new file mode 100644 index 0000000000..4df4e4f209 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java @@ -0,0 +1,563 @@ +package com.github.technus.tectech.loader.recipe; + +import static com.github.technus.tectech.util.GodforgeMath.getRandomIntInRange; +import static gregtech.api.enums.Mods.GTPlusPlus; +import static gregtech.api.util.GT_RecipeBuilder.SECONDS; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.recipe.TT_recipeAdder; + +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.TierEU; +import gregtech.api.util.GT_Utility; +import gtPlusPlus.core.material.ELEMENT; + +public class Godforge implements Runnable { + + public static final ArrayList<Materials> plasmaGTMaterialList = new ArrayList<>(); + public static final ArrayList<Integer> plasmaGTWeightList = new ArrayList<>(); + public static final HashMap<ItemStack, Integer> exoticModulePlasmaItemMap = new HashMap<>(); + public static final HashMap<FluidStack, Integer> exoticModulePlasmaFluidMap = new HashMap<>(); + public static final HashMap<ItemStack, Integer> exoticModuleMagmatterItemMap = new HashMap<>(); + public static final List<ItemStack> quarkGluonFluidItemsForNEI = new ArrayList<>(); + public static final List<ItemStack> quarkGluonItemsForNEI = new ArrayList<>(); + public static final List<ItemStack> magmatterTimeFluidItemsForNEI = new ArrayList<>(); + public static final List<ItemStack> magmatterSpaceFluidItemsForNEI = new ArrayList<>(); + public static final List<ItemStack> magmatterItemsForNEI = new ArrayList<>(); + + @Override + public void run() { + + if (GTPlusPlus.isModLoaded()) { + // Solid to plasma recipes + { + // Fusion tier 1-3 + { + // Single step + ItemStack[] solids_t0_1step = { Materials.Aluminium.getDust(1), Materials.Iron.getDust(1), + Materials.Calcium.getDust(1), Materials.Sulfur.getDust(1), Materials.Zinc.getDust(1), + Materials.Niobium.getDust(1), Materials.Tin.getDust(1), Materials.Titanium.getDust(1), + Materials.Nickel.getDust(1), Materials.Silver.getDust(1), Materials.Americium.getDust(1), + Materials.Antimony.getDust(1), Materials.Ardite.getDust(1), Materials.Arsenic.getDust(1), + Materials.Barium.getDust(1), Materials.Beryllium.getDust(1), Materials.Caesium.getDust(1), + Materials.Cadmium.getDust(1), Materials.Carbon.getDust(1), Materials.Cerium.getDust(1), + Materials.Cobalt.getDust(1), Materials.Copper.getDust(1), Materials.Desh.getDust(1), + Materials.Dysprosium.getDust(1), Materials.Erbium.getDust(1), Materials.Europium.getDust(1), + Materials.Gadolinium.getDust(1), Materials.Gallium.getDust(1), Materials.Gold.getDust(1), + Materials.Holmium.getDust(1), Materials.Indium.getDust(1), Materials.Lanthanum.getDust(1), + Materials.Lithium.getDust(1), Materials.Lutetium.getDust(1), Materials.Magnesium.getDust(1), + Materials.Manganese.getDust(1), Materials.MeteoricIron.getDust(1), + Materials.Molybdenum.getDust(1), Materials.Neodymium.getDust(1), + Materials.Oriharukon.getDust(1), Materials.Palladium.getDust(1), + Materials.Phosphorus.getDust(1), Materials.Potassium.getDust(1), + Materials.Praseodymium.getDust(1), Materials.Promethium.getDust(1), + Materials.Rubidium.getDust(1), Materials.Samarium.getDust(1), Materials.Silicon.getDust(1), + Materials.Sodium.getDust(1), Materials.Strontium.getDust(1), Materials.Tantalum.getDust(1), + Materials.Tellurium.getDust(1), Materials.Terbium.getDust(1), Materials.Thulium.getDust(1), + Materials.Tungsten.getDust(1), Materials.Uranium.getDust(1), Materials.Uranium235.getDust(1), + Materials.Vanadium.getDust(1), Materials.Ytterbium.getDust(1), Materials.Yttrium.getDust(1), + ELEMENT.getInstance().ZIRCONIUM.getDust(1), ELEMENT.getInstance().THORIUM232.getDust(1), + ELEMENT.getInstance().GERMANIUM.getDust(1), ELEMENT.getInstance().THALLIUM.getDust(1), + ELEMENT.getInstance().RUTHENIUM.getDust(1), ELEMENT.getInstance().RHENIUM.getDust(1), + ELEMENT.getInstance().RHODIUM.getDust(1), ELEMENT.getInstance().IODINE.getDust(1), + ELEMENT.getInstance().HAFNIUM.getDust(1), ELEMENT.getInstance().CURIUM.getDust(1) }; + FluidStack[] solid_plasmas_t0_1step = { Materials.Aluminium.getPlasma(144), + Materials.Iron.getPlasma(144), Materials.Calcium.getPlasma(144), + Materials.Sulfur.getPlasma(144), Materials.Zinc.getPlasma(144), + Materials.Niobium.getPlasma(144), Materials.Tin.getPlasma(144), + Materials.Titanium.getPlasma(144), Materials.Nickel.getPlasma(144), + Materials.Silver.getPlasma(144), Materials.Americium.getPlasma(144), + Materials.Antimony.getPlasma(144), Materials.Ardite.getPlasma(144), + Materials.Arsenic.getPlasma(144), Materials.Barium.getPlasma(144), + Materials.Beryllium.getPlasma(144), Materials.Caesium.getPlasma(144), + Materials.Cadmium.getPlasma(144), Materials.Carbon.getPlasma(144), + Materials.Cerium.getPlasma(144), Materials.Cobalt.getPlasma(144), + Materials.Copper.getPlasma(144), Materials.Desh.getPlasma(144), + Materials.Dysprosium.getPlasma(144), Materials.Erbium.getPlasma(144), + Materials.Europium.getPlasma(144), Materials.Gadolinium.getPlasma(144), + Materials.Gallium.getPlasma(144), Materials.Gold.getPlasma(144), + Materials.Holmium.getPlasma(144), Materials.Indium.getPlasma(144), + Materials.Lanthanum.getPlasma(144), Materials.Lithium.getPlasma(144), + Materials.Lutetium.getPlasma(144), Materials.Magnesium.getPlasma(144), + Materials.Manganese.getPlasma(144), Materials.MeteoricIron.getPlasma(144), + Materials.Molybdenum.getPlasma(144), Materials.Neodymium.getPlasma(144), + Materials.Oriharukon.getPlasma(144), Materials.Palladium.getPlasma(144), + Materials.Phosphorus.getPlasma(144), Materials.Potassium.getPlasma(144), + Materials.Praseodymium.getPlasma(144), Materials.Promethium.getPlasma(144), + Materials.Rubidium.getPlasma(144), Materials.Samarium.getPlasma(144), + Materials.Silicon.getPlasma(144), Materials.Sodium.getPlasma(144), + Materials.Strontium.getPlasma(144), Materials.Tantalum.getPlasma(144), + Materials.Tellurium.getPlasma(144), Materials.Terbium.getPlasma(144), + Materials.Thulium.getPlasma(144), Materials.Tungsten.getPlasma(144), + Materials.Uranium.getPlasma(144), Materials.Uranium235.getPlasma(144), + Materials.Vanadium.getPlasma(144), Materials.Ytterbium.getPlasma(144), + Materials.Yttrium.getPlasma(144), + new FluidStack(ELEMENT.getInstance().ZIRCONIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().THORIUM232.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().GERMANIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().THALLIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().RUTHENIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().RHENIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().RHODIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().IODINE.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().HAFNIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().CURIUM.getPlasma(), 144) }; + + for (int i = 0; i < solids_t0_1step.length; i++) { + TT_recipeAdder.addFOGPlasmaRecipe( + new ItemStack[] { solids_t0_1step[i] }, + new FluidStack[] { solid_plasmas_t0_1step[i] }, + 1 * SECONDS, + (int) TierEU.RECIPE_MAX, + false, + 0); + } + + // Multi-step + ItemStack[] solids_t0_xstep = { Materials.Force.getDust(1), Materials.Bismuth.getDust(1), + ELEMENT.STANDALONE.ADVANCED_NITINOL.getDust(1), Materials.Boron.getDust(1), + ELEMENT.STANDALONE.ASTRAL_TITANIUM.getDust(1), ELEMENT.STANDALONE.RUNITE.getDust(1), + ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getDust(1), Materials.Iridium.getDust(1), + Materials.Naquadah.getDust(1), Materials.Osmium.getDust(1), Materials.Platinum.getDust(1), + Materials.Plutonium.getDust(1), ELEMENT.getInstance().CALIFORNIUM.getDust(1), + Materials.Chrome.getDust(1) }; + FluidStack[] solid_plasmas_t0_xstep = { new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 144), + Materials.Bismuth.getPlasma(144), + new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 144), + Materials.Boron.getPlasma(144), + new FluidStack(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getPlasma(), 144), + new FluidStack(ELEMENT.STANDALONE.RUNITE.getPlasma(), 144), + new FluidStack(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getPlasma(), 144), + Materials.Iridium.getPlasma(144), Materials.Naquadah.getPlasma(144), + Materials.Osmium.getPlasma(144), Materials.Platinum.getPlasma(144), + Materials.Plutonium.getPlasma(144), + new FluidStack(ELEMENT.getInstance().CALIFORNIUM.getPlasma(), 144), + Materials.Chrome.getPlasma(144), }; + + for (int i = 0; i < solids_t0_xstep.length; i++) { + TT_recipeAdder.addFOGPlasmaRecipe( + new ItemStack[] { solids_t0_xstep[i] }, + new FluidStack[] { solid_plasmas_t0_xstep[i] }, + 3 * SECONDS, + (int) TierEU.RECIPE_MAX, + true, + 0); + } + } + // Fusion tier 4-5 + { + // Single step + ItemStack[] solids_t1_1step = { Materials.Lead.getDust(1), Materials.Plutonium241.getDust(1), + Materials.Thorium.getDust(1) }; + FluidStack[] solid_plasmas_t1_1step = { Materials.Lead.getPlasma(144), + Materials.Plutonium241.getPlasma(144), Materials.Thorium.getPlasma(144) }; + + for (int i = 0; i < solids_t1_1step.length; i++) { + TT_recipeAdder.addFOGPlasmaRecipe( + new ItemStack[] { solids_t1_1step[i] }, + new FluidStack[] { solid_plasmas_t1_1step[i] }, + 5 * SECONDS, + (int) TierEU.RECIPE_MAX, + false, + 1); + } + + // Multi-step + ItemStack[] solids_t1_xstep = { ELEMENT.getInstance().NEPTUNIUM.getDust(1), + ELEMENT.getInstance().FERMIUM.getDust(1) }; + FluidStack[] solid_plasmas_t1_xstep = { + new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 144), + new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 144) }; + + for (int i = 0; i < solids_t1_xstep.length; i++) { + TT_recipeAdder.addFOGPlasmaRecipe( + new ItemStack[] { solids_t1_xstep[i] }, + new FluidStack[] { solid_plasmas_t1_xstep[i] }, + 7 * SECONDS, + (int) TierEU.RECIPE_MAX, + true, + 1); + } + } + // Exotic Plasmas + { + // Single step + ItemStack[] solids_t2_1step = { ELEMENT.STANDALONE.RHUGNOR.getDust(1), + ELEMENT.STANDALONE.DRAGON_METAL.getDust(1), ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getDust(1), + Materials.CosmicNeutronium.getDust(1), Materials.Draconium.getDust(1), + Materials.DraconiumAwakened.getDust(1), Materials.Ichorium.getDust(1) }; + FluidStack[] solid_plasmas_t2_1step = { new FluidStack(ELEMENT.STANDALONE.RHUGNOR.getPlasma(), 144), + new FluidStack(ELEMENT.STANDALONE.DRAGON_METAL.getPlasma(), 144), + new FluidStack(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getPlasma(), 144), + Materials.CosmicNeutronium.getPlasma(144), Materials.Draconium.getPlasma(144), + Materials.DraconiumAwakened.getPlasma(144), Materials.Ichorium.getPlasma(144) }; + + for (int i = 0; i < solids_t2_1step.length; i++) { + TT_recipeAdder.addFOGPlasmaRecipe( + new ItemStack[] { solids_t2_1step[i] }, + new FluidStack[] { solid_plasmas_t2_1step[i] }, + 15 * SECONDS, + (int) TierEU.RECIPE_MAX, + false, + 2); + } + + // Multi-step + ItemStack[] solids_t2_xstep = { ELEMENT.STANDALONE.HYPOGEN.getDust(1), + Materials.Tritanium.getDust(1), Materials.Flerovium.getDust(1), + Materials.Neutronium.getDust(1), }; + FluidStack[] solid_plasmas_t2_xstep = { new FluidStack(ELEMENT.STANDALONE.HYPOGEN.getPlasma(), 144), + Materials.Tritanium.getPlasma(144), Materials.Flerovium.getPlasma(144), + Materials.Neutronium.getPlasma(144), }; + + for (int i = 0; i < solids_t2_xstep.length; i++) { + TT_recipeAdder.addFOGPlasmaRecipe( + new ItemStack[] { solids_t2_xstep[i] }, + new FluidStack[] { solid_plasmas_t2_xstep[i] }, + 25 * SECONDS, + (int) TierEU.RECIPE_MAX, + true, + 2); + } + + } + + } + + // Fluid to plasma recipes + { + // Fusion tier 1-3 + { + // Single step + FluidStack[] fluids_t0_1step = { Materials.Helium.getGas(1000), Materials.Nitrogen.getGas(1000), + Materials.Argon.getGas(1000), Materials.Chlorine.getGas(1000), Materials.Deuterium.getGas(1000), + Materials.Fluorine.getGas(1000), Materials.Hydrogen.getGas(1000), Materials.Radon.getGas(1000), + Materials.Tritium.getGas(1000), Materials.Mercury.getFluid(1000) }; + FluidStack[] fluid_plasmas_t0_1step = { Materials.Helium.getPlasma(1000), + Materials.Nitrogen.getPlasma(1000), Materials.Argon.getPlasma(1000), + Materials.Chlorine.getPlasma(1000), Materials.Deuterium.getPlasma(1000), + Materials.Fluorine.getPlasma(1000), Materials.Hydrogen.getPlasma(1000), + Materials.Radon.getPlasma(1000), Materials.Tritium.getPlasma(1000), + Materials.Mercury.getPlasma(1000) }; + + for (int i = 0; i < fluids_t0_1step.length; i++) { + TT_recipeAdder.addFOGPlasmaRecipe( + new FluidStack[] { fluids_t0_1step[i] }, + new FluidStack[] { fluid_plasmas_t0_1step[i] }, + 1 * SECONDS, + (int) TierEU.RECIPE_MAX, + false, + 0); + } + + // Multi-step + FluidStack[] fluids_t0_xstep = { ELEMENT.getInstance().NEON.getFluidStack(1000), + Materials.Oxygen.getGas(1000), ELEMENT.getInstance().KRYPTON.getFluidStack(1000), + ELEMENT.getInstance().XENON.getFluidStack(1000) }; + FluidStack[] fluid_plasmas_t0_xstep = { + new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 1000), Materials.Oxygen.getPlasma(1000), + new FluidStack(ELEMENT.getInstance().KRYPTON.getPlasma(), 1000), + new FluidStack(ELEMENT.getInstance().XENON.getPlasma(), 1000) }; + + for (int i = 0; i < fluids_t0_xstep.length; i++) { + TT_recipeAdder.addFOGPlasmaRecipe( + new FluidStack[] { fluids_t0_xstep[i] }, + new FluidStack[] { fluid_plasmas_t0_xstep[i] }, + 3 * SECONDS, + (int) TierEU.RECIPE_MAX, + true, + 0); + } + } + // Fusion tier 4-5 + { + // Single step + // None yet + + // Multi-step + // None yet + } + // Exotic + { + // None yet + } + } + + // Exotic module fake recipes + { + TT_recipeAdder.addFOGExoticFakeRecipe( + new ItemStack[] { Materials.Iron.getDust(1) }, + new FluidStack[] { Materials.Iron.getMolten(1) }, + new FluidStack[] { MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000) }, + 10 * SECONDS, + (int) TierEU.RECIPE_MAX, + 1); + + TT_recipeAdder.addFOGExoticFakeRecipe( + new ItemStack[] { Materials.Iron.getDust(1) }, + new FluidStack[] { Materials.Iron.getMolten(1), Materials.Bismuth.getMolten(1) }, + new FluidStack[] { MaterialsUEVplus.MagMatter.getMolten(144) }, + 10 * SECONDS, + (int) TierEU.RECIPE_MAX, + 1); + } + } + + // Exotic module plasma material maps + // GT materials + plasmaGTMaterialList.addAll( + Arrays.asList( + Materials.Aluminium, + Materials.Americium, + Materials.Antimony, + Materials.Ardite, + Materials.Argon, + Materials.Arsenic, + Materials.Barium, + Materials.Beryllium, + Materials.Bismuth, + Materials.Boron, + Materials.Caesium, + Materials.Calcium, + Materials.Cadmium, + Materials.Carbon, + Materials.Cerium, + Materials.Chlorine, + Materials.Chrome, + Materials.Cobalt, + Materials.Copper, + Materials.Desh, + Materials.Deuterium, + Materials.Dysprosium, + Materials.Erbium, + Materials.Europium, + Materials.Fluorine, + Materials.Gadolinium, + Materials.Gallium, + Materials.Gold, + Materials.Helium, + Materials.Holmium, + Materials.Hydrogen, + Materials.Indium, + Materials.Iridium, + Materials.Iron, + Materials.Lanthanum, + Materials.Lead, + Materials.Lithium, + Materials.Lutetium, + Materials.Magnesium, + Materials.Manganese, + Materials.MeteoricIron, + Materials.Molybdenum, + Materials.Naquadah, + Materials.Neodymium, + Materials.Nickel, + Materials.Niobium, + Materials.Nitrogen, + Materials.Oriharukon, + Materials.Osmium, + Materials.Oxygen, + Materials.Palladium, + Materials.Phosphorus, + Materials.Platinum, + Materials.Plutonium, + Materials.Plutonium241, + Materials.Potassium, + Materials.Praseodymium, + Materials.Promethium, + Materials.Radon, + Materials.Rubidium, + Materials.Samarium, + Materials.Silicon, + Materials.Silver, + Materials.Sodium, + Materials.Strontium, + Materials.Sulfur, + Materials.Tantalum, + Materials.Tellurium, + Materials.Terbium, + Materials.Thorium, + Materials.Thulium, + Materials.Tin, + Materials.Titanium, + Materials.Tritium, + Materials.Tungsten, + Materials.Uranium235, + Materials.Uranium, + Materials.Vanadium, + Materials.Ytterbium, + Materials.Yttrium, + Materials.Zinc)); + + plasmaGTWeightList.addAll( + Arrays.asList( + 6000 /* Aluminium */, + 10000 /* Americium */, + 6000 /* Antimony */, + 6000 /* Ardite */, + 6000 /* Argon */, + 6000 /* Arsenic */, + 6000 /* Barium */, + 6000 /* Beryllium */, + 8000 /* Bismuth */, + 8000 /* Boron */, + 6000 /* Caesium */, + 10000 /* Calcium */, + 6000 /* Cadmium */, + 6000 /* Carbon */, + 6000 /* Cerium */, + 6000 /* Chlorine */, + 6000 /* Chrome */, + 6000 /* Cobalt */, + 6000 /* Copper */, + 6000 /* Desh */, + 6000 /* Deuterium */, + 2000 /* Dysprosium */, + 2000 /* Erbium */, + 6000 /* Europium */, + 6000 /* Fluorine */, + 2000 /* Gadolinium */, + 6000 /* Gallium */, + 6000 /* Gold */, + 10000 /* Helium */, + 6000 /* Holmium */, + 10000 /* Hydrogen */, + 6000 /* Indium */, + 6000 /* Iridium */, + 10000 /* Iron */, + 6000 /* Lanthanum */, + 500 /* Lead */, + 6000 /* Lithium */, + 6000 /* Lutetium */, + 6000 /* Magnesium */, + 6000 /* Manganese */, + 6000 /* Meteoric Iron */, + 6000 /* Molybdenum */, + 6000 /* Naquadah */, + 6000 /* Neodymium */, + 10000 /* Nickel */, + 10000 /* Niobium */, + 10000 /* Nitrogen */, + 6000 /* Oriharukon */, + 6000 /* Osmium */, + 8000 /* Oxygen */, + 6000 /* Palladium */, + 6000 /* Phosphorus */, + 6000 /* Platinum */, + 6000 /* Plutonium 239 */, + 500 /* Plutonium 241 */, + 6000 /* Potassium */, + 6000 /* Praseodymium */, + 2000 /* Promethium */, + 10000 /* Radon */, + 2000 /* Rubidium */, + 6000 /* Samarium */, + 6000 /* Raw Silicon */, + 10000 /* Silver */, + 6000 /* Sodium */, + 2000 /* Strontium */, + 10000 /* Sulfur */, + 6000 /* Tantalum */, + 2000 /* Tellurium */, + 1000 /* Terbium */, + 500 /* Thorium */, + 6000 /* Thulium */, + 10000 /* Tin */, + 10000 /* Titanium */, + 6000 /* Tritium */, + 6000 /* Tungsten */, + 6000 /* Uranium 235 */, + 6000 /* Uranium 238 */, + 6000 /* Vanadium */, + 2000 /* Ytterbium */, + 6000 /* Yttrium */, + 6000 /* Zinc */)); + + // GT++ materials + if (GTPlusPlus.isModLoaded()) { + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().ZIRCONIUM.getTinyDust(1), 6000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().THORIUM232.getTinyDust(1), 6000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().GERMANIUM.getTinyDust(1), 2000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().THALLIUM.getTinyDust(1), 2000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RUTHENIUM.getTinyDust(1), 6000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RHENIUM.getTinyDust(1), 2000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RHODIUM.getTinyDust(1), 6000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().IODINE.getTinyDust(1), 6000); + exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getTinyDust(1), 8000); + exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.ADVANCED_NITINOL.getTinyDust(1), 8000); + exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.FORCE.getTinyDust(1), 8000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().HAFNIUM.getTinyDust(1), 6000); + exoticModulePlasmaItemMap.put(ELEMENT.getInstance().CALIFORNIUM.getTinyDust(1), 1000); + exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.RUNITE.getTinyDust(1), 8000); + + exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().XENON.getFluid(), 1), 8000); + exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().KRYPTON.getFluid(), 1), 8000); + exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().NEON.getFluid(), 1), 8000); + // These are here because they cant be solidified + exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().CURIUM.getFluid(), 1), 10000); + exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getFluid(), 1), 800); + exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().FERMIUM.getFluid(), 1), 800); + } + // Mercury is weird, it has neither dust nor gas, so it needs to be added separately + exoticModulePlasmaFluidMap.put(Materials.Mercury.getFluid(1), 6000); + + // Loop for adding all GT plasma materials + for (int i = 0; i < plasmaGTMaterialList.size(); i++) { + if (plasmaGTMaterialList.get(i) + .getDustTiny(1) != null) { + exoticModulePlasmaItemMap.put( + plasmaGTMaterialList.get(i) + .getDustTiny(1), + plasmaGTWeightList.get(i)); + } else { + exoticModulePlasmaFluidMap.put( + plasmaGTMaterialList.get(i) + .getGas(1), + plasmaGTWeightList.get(i)); + } + } + + // Magmatter map + // GT materials + exoticModuleMagmatterItemMap.put(Materials.CosmicNeutronium.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(Materials.Draconium.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(Materials.DraconiumAwakened.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(Materials.Ichorium.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(Materials.Neutronium.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(Materials.Flerovium.getDustTiny(1), 100000); + + // GT++ materials + if (GTPlusPlus.isModLoaded()) { + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getTinyDust(1), 100000); + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.HYPOGEN.getTinyDust(1), 100000); + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.RHUGNOR.getTinyDust(1), 100000); + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getTinyDust(1), 100000); + exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.DRAGON_METAL.getTinyDust(1), 100000); + } + + // For NEI + for (FluidStack fluid : exoticModulePlasmaFluidMap.keySet()) { + fluid.amount = getRandomIntInRange(1, 64); + quarkGluonFluidItemsForNEI.add(GT_Utility.getFluidDisplayStack(fluid, true)); + } + for (ItemStack item : exoticModulePlasmaItemMap.keySet()) { + item.stackSize = getRandomIntInRange(1, 64); + quarkGluonItemsForNEI.add(item); + } + for (int i = 0; i < 21; i++) { + magmatterTimeFluidItemsForNEI.add( + GT_Utility.getFluidDisplayStack(MaterialsUEVplus.Time.getMolten(getRandomIntInRange(1, 50)), true)); + magmatterSpaceFluidItemsForNEI.add( + GT_Utility.getFluidDisplayStack(MaterialsUEVplus.Space.getMolten(getRandomIntInRange(51, 100)), true)); + } + magmatterItemsForNEI.addAll(exoticModuleMagmatterItemMap.keySet()); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java new file mode 100644 index 0000000000..63885b5b7d --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/recipe/ResearchStationAssemblyLine.java @@ -0,0 +1,3272 @@ +package com.github.technus.tectech.loader.recipe; + +import static com.github.technus.tectech.loader.recipe.BaseRecipeLoader.getItemContainer; +import static com.google.common.math.LongMath.pow; +import static gregtech.api.enums.Mods.Avaritia; +import static gregtech.api.enums.Mods.AvaritiaAddons; +import static gregtech.api.enums.Mods.BartWorks; +import static gregtech.api.enums.Mods.BloodMagic; +import static gregtech.api.enums.Mods.DraconicEvolution; +import static gregtech.api.enums.Mods.EternalSingularity; +import static gregtech.api.enums.Mods.ExtraUtilities; +import static gregtech.api.enums.Mods.GTNHIntergalactic; +import static gregtech.api.enums.Mods.GTPlusPlus; +import static gregtech.api.enums.Mods.GTPlusPlusEverglades; +import static gregtech.api.enums.Mods.GalaxySpace; +import static gregtech.api.enums.Mods.GoodGenerator; +import static gregtech.api.enums.Mods.GraviSuite; +import static gregtech.api.enums.Mods.GregTech; +import static gregtech.api.enums.Mods.IndustrialCraft2; +import static gregtech.api.enums.Mods.KekzTech; +import static gregtech.api.enums.Mods.KubaTech; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; +import static gregtech.api.enums.Mods.SGCraft; +import static gregtech.api.enums.Mods.SuperSolarPanels; +import static gregtech.api.enums.Mods.Thaumcraft; +import static gregtech.api.enums.Mods.TinkersGregworks; +import static gregtech.api.util.GT_ModHandler.getModItem; +import static gregtech.api.util.GT_RecipeBuilder.INGOTS; +import static gregtech.api.util.GT_RecipeBuilder.MINUTES; +import static gregtech.api.util.GT_RecipeBuilder.SECONDS; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.recipe.TT_recipeAdder; +import com.github.technus.tectech.thing.CustomItemList; +import com.rwtema.extrautils.ExtraUtils; + +import fox.spiteful.avaritia.compat.ticon.Tonkers; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsBotania; +import gregtech.api.enums.MaterialsKevlar; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.TierEU; +import gregtech.api.util.GT_ModHandler; +import gregtech.api.util.GT_OreDictUnificator; +import gtPlusPlus.core.material.ALLOY; +import gtPlusPlus.core.material.ELEMENT; +import gtPlusPlus.core.util.minecraft.FluidUtils; +import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList; +import tconstruct.tools.TinkerTools; +import vexatos.tgregworks.reference.PartTypes; +import vexatos.tgregworks.util.TGregUtils; + +public class ResearchStationAssemblyLine implements Runnable { + + @Override + public void run() { + itemPartsUHVAsslineRecipes(); + itemPartsUEVAsslineRecipes(); + itemPartsUIVAsslineRecipes(); + itemPartsUMVAsslineRecipes(); + itemPartsUXVAsslineRecipes(); + addWirelessEnergyRecipes(); + + if (TinkersGregworks.isModLoaded() && GoodGenerator.isModLoaded() // Shirabon + && Avaritia.isModLoaded() // Infinity, Cosmic Neutronium + && ExtraUtilities.isModLoaded() // Bedrockium + ) { + addEOHRecipes(); + } + + Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null + ? FluidRegistry.getFluid("molten.mutatedlivingsolder") + : FluidRegistry.getFluid("molten.solderingalloy"); + + Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null + ? FluidRegistry.getFluid("molten.indalloy140") + : FluidRegistry.getFluid("molten.solderingalloy"); + + // Infinite Oil Rig + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.OilDrill4.get(1), + 16777216, + 2048, + 2000000, + 4, + new Object[] { ItemList.OilDrill4.get(1), + GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 4), + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4L }, ItemList.Electric_Motor_UHV.get(4), + ItemList.Electric_Pump_UHV.get(4), + GT_OreDictUnificator.get(OrePrefixes.gearGt, Materials.Neutronium, 4), ItemList.Sensor_UHV.get(3), + ItemList.Field_Generator_UHV.get(3), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Neutronium, 12) }, + new FluidStack[] { new FluidStack(solderUEV, 1296), Materials.Neutronium.getMolten(576) }, + ItemList.OilDrillInfinite.get(1), + 6000, + 2000000); + + // Infinity Coil + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Casing_Coil_AwakenedDraconium.get(1), + 16_777_216, + 2048, + 8_000_000, + 1, + new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L }, + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.Infinity, 8), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Infinity, 8), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 32, 0) }, + new FluidStack[] { Materials.DraconiumAwakened.getMolten(576), }, + ItemList.Casing_Coil_Infinity.get(1), + 60 * 20, + 8_000_000); + + if (GTPlusPlus.isModLoaded()) { + // Hypogen Coil + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Casing_Coil_Infinity.get(1), + 16_777_216 * 2, + 2048 * 2, + 32_000_000, + 1, + new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, + GT_OreDictUnificator.get("wireGt02Hypogen", 8L), + getModItem(GTPlusPlus.ID, "itemScrewHypogen", 8, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), }, + new FluidStack[] { Materials.Infinity.getMolten(576), }, + ItemList.Casing_Coil_Hypogen.get(1), + 60 * 20, + 8000000 * 4); + + // Eternal coil + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Casing_Coil_Hypogen.get(1), + 16_777_216 * 4, + 8_192, + 128_000_000, + 1, + new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, + GT_OreDictUnificator.get(OrePrefixes.wireGt02, MaterialsUEVplus.SpaceTime, 8), + GT_OreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.SpaceTime, 8), + getModItem(EternalSingularity.ID, "eternal_singularity", 1L), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), + getModItem(NewHorizonsCoreMod.ID, "item.MicaInsulatorFoil", 64, 0), }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("molten.hypogen"), 576), }, + ItemList.Casing_Coil_Eternal.get(1), + 60 * 20, + 8_000_000 * 16); + } + + // UHV-UMV Energy Hatch & Dynamo + { + // Energy Hatches + { + // Energy Hatch UHV + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Hatch_Energy_UV.get(1L), + 24000, + 16, + 50000, + 2, + new Object[] { ItemList.Hull_MAX.get(1L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUHV, 2L), + ItemList.Circuit_Chip_QPIC.get(2L), + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 2L }, ItemList.UHV_Coil.get(2L), + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + ItemList.Electric_Pump_UHV.get(1L) }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000), + new FluidStack(solderIndalloy, 40 * 144) }, + ItemList.Hatch_Energy_MAX.get(1L), + 1000, + 2000000); + + // Energy Hatch UEV + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Hatch_Energy_MAX.get(1L), + 48000, + 32, + 100000, + 4, + new Object[] { getItemContainer("Hull_UEV").get(1L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUEV, 2L), + ItemList.Circuit_Chip_QPIC.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Bio), 2L }, + ItemList.UHV_Coil.get(4L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Electric_Pump_UEV.get(1L) }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 32000), + new FluidStack(solderUEV, 20 * 144), Materials.UUMatter.getFluid(8000L) }, + getItemContainer("Hatch_Energy_UEV").get(1L), + 1000, + 8000000); + + // Energy Hatch UIV + TT_recipeAdder.addResearchableAssemblylineRecipe( + getItemContainer("Hatch_Energy_UEV").get(1L), + 96_000, + 64, + 200_000, + 8, + new Object[] { getItemContainer("Hull_UIV").get(1L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUIV, 2L), + ItemList.Circuit_Chip_QPIC.get(4L), + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 2L }, ItemList.UHV_Coil.get(8L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Electric_Pump_UIV.get(1L) }, + new FluidStack[] { Materials.SuperCoolant.getFluid(16_000L), new FluidStack(solderUEV, 20 * 144), + Materials.UUMatter.getFluid(16_000L) }, + getItemContainer("Hatch_Energy_UIV").get(1L), + 1000, + 32_000_000); + + // Energy Hatch UMV + TT_recipeAdder.addResearchableAssemblylineRecipe( + getItemContainer("Hatch_Energy_UIV").get(1L), + 192000, + 128, + 400000, + 16, + new Object[] { getItemContainer("Hull_UMV").get(1L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUMV, 2L), + ItemList.Circuit_Chip_QPIC.get(4L), getItemContainer("PikoCircuit").get(2), + ItemList.UHV_Coil.get(16L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Electric_Pump_UMV.get(1L) }, + new FluidStack[] { Materials.SuperCoolant.getFluid(32_000L), new FluidStack(solderUEV, 40 * 144), + Materials.UUMatter.getFluid(32000L) }, + getItemContainer("Hatch_Energy_UMV").get(1L), + 1000, + 128_000_000); + + // Energy Hatch UXV + TT_recipeAdder.addResearchableAssemblylineRecipe( + getItemContainer("Hatch_Energy_UMV").get(1L), + 384000, + 256, + 800000, + 32, + new Object[] { getItemContainer("Hull_UXV").get(1L), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.SuperconductorUMV, 4L), + ItemList.Circuit_Chip_QPIC.get(16L), getItemContainer("QuantumCircuit").get(2), + ItemList.UHV_Coil.get(32L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Electric_Pump_UXV.get(1L) }, + new FluidStack[] { Materials.SuperCoolant.getFluid(64_000L), new FluidStack(solderUEV, 80 * 144), + Materials.UUMatter.getFluid(64000L) }, + getItemContainer("Hatch_Energy_UXV").get(1L), + 1000, + 512_000_000); + } + + // Dynamo Hatch + { + // Dynamo Hatch UHV + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Hatch_Dynamo_UV.get(1L), + 48000, + 32, + 100000, + 4, + new Object[] { ItemList.Hull_MAX.get(1L), + GT_OreDictUnificator.get(OrePrefixes.spring, Materials.Longasssuperconductornameforuhvwire, 8L), + ItemList.Circuit_Chip_QPIC.get(2L), + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 2L }, ItemList.UHV_Coil.get(2L), + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + new ItemStack[] { ItemList.Reactor_Coolant_He_6.get(1L), ItemList.Reactor_Coolant_NaK_6.get(1L), + ItemList.Reactor_Coolant_Sp_2.get(1L) }, + ItemList.Electric_Pump_UHV.get(1L) }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000), + new FluidStack(solderIndalloy, 40 * 144) }, + ItemList.Hatch_Dynamo_MAX.get(1L), + 1000, + 2000000); + + // Dynamo Hatch UEV + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Hatch_Dynamo_MAX.get(1L), + 96000, + 64, + 200000, + 8, + new Object[] { getItemContainer("Hull_UEV").get(1L), + GT_OreDictUnificator.get(OrePrefixes.spring, Materials.SuperconductorUEVBase, 8L), + ItemList.Circuit_Chip_QPIC.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Bio), 2L }, + ItemList.UHV_Coil.get(4L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Electric_Pump_UEV.get(1L) }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("ic2coolant"), 32000), + new FluidStack(solderUEV, 20 * 144), Materials.UUMatter.getFluid(8000L) }, + getItemContainer("Hatch_Dynamo_UEV").get(1L), + 1000, + 8000000); + + // Dynamo Hatch UIV + TT_recipeAdder.addResearchableAssemblylineRecipe( + getItemContainer("Hatch_Dynamo_UEV").get(1L), + 192_000, + 128, + 400_000, + 16, + new Object[] { getItemContainer("Hull_UIV").get(1L), + GT_OreDictUnificator.get(OrePrefixes.spring, Materials.SuperconductorUIVBase, 8L), + ItemList.Circuit_Chip_QPIC.get(4L), + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 2L }, ItemList.UHV_Coil.get(8L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Electric_Pump_UIV.get(1L) }, + new FluidStack[] { Materials.SuperCoolant.getFluid(16_000L), new FluidStack(solderUEV, 20 * 144), + Materials.UUMatter.getFluid(16_000L) }, + getItemContainer("Hatch_Dynamo_UIV").get(1L), + 1000, + 32_000_000); + + // Dynamo Hatch UMV + TT_recipeAdder.addResearchableAssemblylineRecipe( + getItemContainer("Hatch_Dynamo_UIV").get(1L), + 384000, + 256, + 800000, + 32, + new Object[] { getItemContainer("Hull_UMV").get(1L), + GT_OreDictUnificator.get(OrePrefixes.spring, Materials.SuperconductorUMVBase, 8L), + ItemList.Circuit_Chip_QPIC.get(4L), getItemContainer("PikoCircuit").get(2), + ItemList.UHV_Coil.get(16L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Electric_Pump_UMV.get(1L) }, + new FluidStack[] { Materials.SuperCoolant.getFluid(32_000L), new FluidStack(solderUEV, 40 * 144), + Materials.UUMatter.getFluid(32000L) }, + getItemContainer("Hatch_Dynamo_UMV").get(1L), + 1000, + 128_000_000); + + // Dynamo Hatch UXV + TT_recipeAdder.addResearchableAssemblylineRecipe( + getItemContainer("Hatch_Dynamo_UMV").get(1L), + 384000, + 256, + 800000, + 32, + new Object[] { getItemContainer("Hull_UXV").get(1L), + GT_OreDictUnificator.get(OrePrefixes.spring, Materials.SuperconductorUMVBase, 16L), + ItemList.Circuit_Chip_QPIC.get(16L), getItemContainer("QuantumCircuit").get(2), + ItemList.UHV_Coil.get(32L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Electric_Pump_UXV.get(1L) }, + new FluidStack[] { Materials.SuperCoolant.getFluid(64_000L), new FluidStack(solderUEV, 80 * 144), + Materials.UUMatter.getFluid(64000L) }, + getItemContainer("Hatch_Dynamo_UXV").get(1L), + 1000, + 512_000_000); + } + } + + // UHV Circuit Wetwaremainframe + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Circuit_Wetwaresupercomputer.get(1L), + 24000, + 64, + 50000, + 4, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Tritanium, 2), + ItemList.Circuit_Wetwaresupercomputer.get(2L), + new ItemStack[] { ItemList.Circuit_Parts_InductorASMD.get(16L), + ItemList.Circuit_Parts_InductorXSMD.get(4L) }, + new ItemStack[] { ItemList.Circuit_Parts_CapacitorASMD.get(16L), + ItemList.Circuit_Parts_CapacitorXSMD.get(4L) }, + new ItemStack[] { ItemList.Circuit_Parts_ResistorASMD.get(16L), + ItemList.Circuit_Parts_ResistorXSMD.get(4L) }, + new ItemStack[] { ItemList.Circuit_Parts_TransistorASMD.get(16L), + ItemList.Circuit_Parts_TransistorXSMD.get(4L) }, + new ItemStack[] { ItemList.Circuit_Parts_DiodeASMD.get(16L), ItemList.Circuit_Parts_DiodeXSMD.get(4L) }, + ItemList.Circuit_Chip_Ram.get(48L), + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorZPM, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUV, 32L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 16L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 8L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 4L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 2L) }, + new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, }, + new FluidStack[] { new FluidStack(solderIndalloy, 2880), + new FluidStack(FluidRegistry.getFluid("ic2coolant"), 10000), Materials.Radon.getGas(2500L), }, + ItemList.Circuit_Wetwaremainframe.get(1L), + 2000, + 300000); + + // Bioware SuperComputer + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Circuit_Biowarecomputer.get(1L), + 48000, + 128, + 500000, + 8, + new Object[] { ItemList.Circuit_Board_Bio_Ultra.get(2L), ItemList.Circuit_Biowarecomputer.get(2L), + new ItemStack[] { ItemList.Circuit_Parts_TransistorASMD.get(16L), + ItemList.Circuit_Parts_TransistorXSMD.get(4L) }, + new ItemStack[] { ItemList.Circuit_Parts_ResistorASMD.get(16L), + ItemList.Circuit_Parts_ResistorXSMD.get(4L) }, + new ItemStack[] { ItemList.Circuit_Parts_CapacitorASMD.get(16L), + ItemList.Circuit_Parts_CapacitorXSMD.get(4L) }, + new ItemStack[] { ItemList.Circuit_Parts_DiodeASMD.get(16L), ItemList.Circuit_Parts_DiodeXSMD.get(4L) }, + ItemList.Circuit_Chip_NOR.get(32L), ItemList.Circuit_Chip_Ram.get(64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.NiobiumTitanium, 32L), + new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, }, + new FluidStack[] { new FluidStack(solderUEV, 1440), Materials.BioMediumSterilized.getFluid(1440L), + Materials.SuperCoolant.getFluid(10_000L), }, + ItemList.Circuit_Biowaresupercomputer.get(1L), + 4000, + 500000); + + // Bio Mainframe + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Circuit_Biowaresupercomputer.get(1L), + 96000, + 256, + 1000000, + 16, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Tritanium, 4L), + ItemList.Circuit_Biowaresupercomputer.get(2L), + new ItemStack[] { ItemList.Circuit_Parts_InductorASMD.get(24L), + ItemList.Circuit_Parts_InductorXSMD.get(6L) }, + new ItemStack[] { ItemList.Circuit_Parts_TransistorASMD.get(24L), + ItemList.Circuit_Parts_TransistorXSMD.get(6L) }, + new ItemStack[] { ItemList.Circuit_Parts_ResistorASMD.get(24L), + ItemList.Circuit_Parts_ResistorXSMD.get(6L) }, + new ItemStack[] { ItemList.Circuit_Parts_CapacitorASMD.get(24L), + ItemList.Circuit_Parts_CapacitorXSMD.get(6L) }, + new ItemStack[] { ItemList.Circuit_Parts_DiodeASMD.get(24L), ItemList.Circuit_Parts_DiodeXSMD.get(6L) }, + ItemList.Circuit_Chip_Ram.get(64L), + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 32L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 16L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 8L) }, + new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64) }, + new FluidStack[] { new FluidStack(solderUEV, 2880), Materials.BioMediumSterilized.getFluid(2880L), + Materials.SuperCoolant.getFluid(20_000L), }, + ItemList.Circuit_Biomainframe.get(1L), + 6000, + 2000000); + + // Optical Assembly + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Circuit_OpticalProcessor.get(1L), + 192_000, + 256, + 2_000_000, + 16, + new Object[] { ItemList.Circuit_Board_Optical.get(1L), ItemList.Circuit_OpticalProcessor.get(2L), + ItemList.Circuit_Parts_InductorXSMD.get(16L), ItemList.Circuit_Parts_CapacitorXSMD.get(20L), + ItemList.Circuit_Parts_ResistorXSMD.get(20L), ItemList.Circuit_Chip_NOR.get(32L), + ItemList.Circuit_Chip_Ram.get(64L), + GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedwireFine", 24L, 10101), // Fine + // Lumiium + // Wire + new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, }, + new FluidStack[] { new FluidStack(solderUEV, 1440), Materials.Radon.getPlasma(1440L), + Materials.SuperCoolant.getFluid(10_000L), new FluidStack(FluidRegistry.getFluid("oganesson"), 500) }, + ItemList.Circuit_OpticalAssembly.get(1L), + 20 * 20, + 2_000_000); + + // Optical Computer + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Circuit_OpticalAssembly.get(1L), + 384_000, + 512, + 4_000_000, + 32, + new Object[] { ItemList.Circuit_Board_Optical.get(2L), ItemList.Circuit_OpticalAssembly.get(2L), + ItemList.Circuit_Parts_TransistorXSMD.get(24L), ItemList.Circuit_Parts_ResistorXSMD.get(24L), + ItemList.Circuit_Parts_CapacitorXSMD.get(24L), ItemList.Circuit_Parts_DiodeXSMD.get(24L), + ItemList.Circuit_Chip_NOR.get(64L), ItemList.Circuit_Chip_SoC2.get(32L), + GT_ModHandler.getModItem(BartWorks.ID, "gt.bwMetaGeneratedwireFine", 32L, 10101), // Fine + // Lumiium + // Wire + new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64), }, + new FluidStack[] { new FluidStack(solderUEV, 1440 * 2), Materials.Radon.getPlasma(1440L * 2), + Materials.SuperCoolant.getFluid(10_000L * 2), + new FluidStack(FluidRegistry.getFluid("oganesson"), 500 * 2) }, + ItemList.Circuit_OpticalComputer.get(1L), + 200 * 20, + 2_000_000); + + // Optical Mainframe + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Circuit_OpticalComputer.get(1L), + 768_000, + 1024, + 8_000_000, + 64, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Tritanium, 8), + ItemList.Circuit_OpticalComputer.get(2L), ItemList.Circuit_Parts_InductorXSMD.get(32L), + ItemList.Circuit_Parts_TransistorXSMD.get(32L), ItemList.Circuit_Parts_ResistorXSMD.get(32L), + ItemList.Circuit_Parts_CapacitorXSMD.get(32L), ItemList.Circuit_Parts_DiodeXSMD.get(32L), + ItemList.Circuit_Chip_SoC2.get(64L), + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUEV, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUIV, 32L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, 16L) }, + new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, + new Object[] { OrePrefixes.foil.get(Materials.AnySyntheticRubber), 64L }, + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.Polybenzimidazole, 64) }, + new FluidStack[] { new FluidStack(solderUEV, 1440 * 4), Materials.Radon.getPlasma(1440L * 4), + Materials.SuperCoolant.getFluid(10_000L * 4), + new FluidStack(FluidRegistry.getFluid("oganesson"), 500 * 4) }, + ItemList.Circuit_OpticalMainframe.get(1L), + 300 * 20, + 8_000_000); + + // Piko Circuit + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Circuit_OpticalMainframe.get(1L), + 384000, + 1024, + 4000000, + 64, + new Object[] { ItemList.Circuit_Board_Optical.get(1L), getItemContainer("PicoWafer").get(4L), + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 2L }, + ItemList.Circuit_Parts_TransistorXSMD.get(48L), ItemList.Circuit_Parts_ResistorXSMD.get(48L), + ItemList.Circuit_Parts_CapacitorXSMD.get(48L), ItemList.Circuit_Parts_DiodeXSMD.get(48L), + ItemList.Circuit_Chip_PPIC.get(64L), GT_OreDictUnificator.get("foilRadoxPoly", 16L), + GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.TranscendentMetal, 32), + GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Neutronium, 16), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Lanthanum, 64) }, + new FluidStack[] { new FluidStack(solderUEV, 3744), Materials.UUMatter.getFluid(8000L), + Materials.Osmium.getMolten(1152L) }, + getItemContainer("PikoCircuit").get(1L), + 10000, + 128_000_000); + + // Quantum Circuit + TT_recipeAdder.addResearchableAssemblylineRecipe( + getItemContainer("PikoCircuit").get(1L), + 720000, + 2048, + 8000000, + 128, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Neutronium, 16), + getItemContainer("PikoCircuit").get(2L), ItemList.Circuit_Parts_CapacitorXSMD.get(64L), + ItemList.Circuit_Parts_DiodeXSMD.get(64L), ItemList.Circuit_Parts_TransistorXSMD.get(64L), + ItemList.Circuit_Parts_ResistorXSMD.get(64L), ItemList.Circuit_Chip_QPIC.get(64L), + GT_OreDictUnificator.get("foilShirabon", 64), + GT_OreDictUnificator.get(OrePrefixes.bolt, Materials.Indium, 64), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 8), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Lanthanum, 16) }, + new FluidStack[] { new FluidStack(solderUEV, 3744), Materials.UUMatter.getFluid(24000L), + Materials.Osmium.getMolten(2304L) }, + getItemContainer("QuantumCircuit").get(1L), + 20000, + (int) TierEU.RECIPE_UMV); + + // Transcendent Plasma Mixer - TPM. + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.eM_energyTunnel7_UV.get(1), + 32_000_000, + 4096, + (int) TierEU.RECIPE_UIV, + 1, + new Object[] { CustomItemList.eM_energyTunnel7_UV.get(32), + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 32L }, ItemList.Electric_Pump_UIV.get(16), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 64), + + GT_OreDictUnificator.get(OrePrefixes.gearGt, MaterialsUEVplus.TranscendentMetal, 16), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.TranscendentMetal, 64), + GT_OreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.TranscendentMetal, 64), + ItemList.EnergisedTesseract.get(32), + + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), }, + new FluidStack[] { MaterialsUEVplus.ExcitedDTCC.getFluid(2_048_000), + MaterialsUEVplus.ExcitedDTPC.getFluid(2_048_000), MaterialsUEVplus.ExcitedDTRC.getFluid(2_048_000), + MaterialsUEVplus.ExcitedDTEC.getFluid(2_048_000), }, + ItemList.Machine_Multi_TranscendentPlasmaMixer.get(1), + 5 * MINUTES, + (int) TierEU.RECIPE_UIV); + + // Stargate Recipes + if (EternalSingularity.isModLoaded() && SGCraft.isModLoaded()) { + + final int baseStargateTime = 125_000 * 20; + + // Stargate shield foil + TT_recipeAdder.addResearchableAssemblylineRecipe( + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1L), + (int) TierEU.RECIPE_MAX, + 32768, + (int) TierEU.RECIPE_UXV, + 64, + new ItemStack[] { ItemList.Casing_Dim_Bridge.get(64), + CustomItemList.StabilisationFieldGeneratorTier8.get(64), + GT_OreDictUnificator.get("blockShirabon", 64L), GT_OreDictUnificator.get("blockShirabon", 64L), + GT_OreDictUnificator.get(OrePrefixes.block, MaterialsUEVplus.SpaceTime, 64L), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Quantum, 16L), + GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.SpaceTime, 8L), + GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.Universium, 8L), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 8L), + GT_OreDictUnificator.get("plateDenseShirabon", 8L), ItemList.Sensor_UXV.get(16L), + ItemList.Emitter_UXV.get(16L), getModItem(EternalSingularity.ID, "eternal_singularity", 16L), + MaterialsUEVplus.Universium.getNanite(16), MaterialsUEVplus.BlackDwarfMatter.getNanite(16), + MaterialsUEVplus.WhiteDwarfMatter.getNanite(16) }, + new FluidStack[] { Materials.Neutronium.getMolten(32_768_000L), + MaterialsUEVplus.SpaceTime.getMolten(4 * 36864L), + Materials.SuperconductorUMVBase.getMolten(4 * 36864L), + MaterialsUEVplus.ExcitedDTEC.getFluid(4 * 36864L) }, + getItemContainer("StargateShieldingFoil").get(1L), + baseStargateTime, + (int) TierEU.RECIPE_UMV); + + // Stargate chevron + TT_recipeAdder.addResearchableAssemblylineRecipe( + getItemContainer("StargateShieldingFoil").get(1L), + (int) TierEU.RECIPE_MAX, + 32_768, + (int) TierEU.RECIPE_UXV, + 64, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.block, MaterialsUEVplus.TranscendentMetal, 64L), + GT_OreDictUnificator.get("blockShirabon", 64), CustomItemList.EOH_Reinforced_Spatial_Casing.get(64), + CustomItemList.EOH_Reinforced_Spatial_Casing.get(64), + + GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 16L), + GT_OreDictUnificator + .get(OrePrefixes.frameGt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16L), + GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Ruby, 16L), + GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Jasper, 16L), + + GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Opal, 16L), + GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Sapphire, 16L), + GT_OreDictUnificator + .get(OrePrefixes.plateDense, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L), + GT_OreDictUnificator.get("plateDenseShirabon", 8), + + ItemList.Electric_Motor_UXV.get(64L), ItemList.Electric_Piston_UXV.get(64L), + ItemList.Field_Generator_UXV.get(16L), getItemContainer("QuantumCircuit").get(1L) + .splitStack(32) }, + new FluidStack[] { Materials.Neutronium.getMolten(32_768_000L), + MaterialsUEVplus.SpaceTime.getMolten(4 * 36864L), + MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(36864L), + MaterialsUEVplus.ExcitedDTEC.getFluid(4 * 36864L) }, + getItemContainer("StargateChevron").get(1L), + baseStargateTime, + (int) TierEU.RECIPE_UMV); + + // Stargate Frame Part + TT_recipeAdder.addResearchableAssemblylineRecipe( + GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 1L), + (int) TierEU.RECIPE_MAX, + 32_768, + 500_000_000, + 64, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.SpaceTime, 64L), + GT_OreDictUnificator + .get(OrePrefixes.stickLong, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L), + GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Neutronium, 64L), + + GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Osmiridium, 64L), + GT_OreDictUnificator.get("stickLongShirabon", 64), + getModItem(BartWorks.ID, "gt.bwMetaGeneratedstickLong", 64L, 39), + getModItem(GTPlusPlus.ID, "itemRodLongQuantum", 64L), + + getModItem(GTPlusPlus.ID, "itemRodLongHypogen", 64L), + getModItem(GTPlusPlus.ID, "itemRodLongCelestialTungsten", 64L), + getModItem(BartWorks.ID, "gt.bwMetaGeneratedstickLong", 64L, 10106), + getModItem(GTPlusPlus.ID, "itemRodLongAstralTitanium", 64L), + + GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.SuperconductorUMVBase, 64L), + GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.Universium, 64L), + getModItem(GTPlusPlus.ID, "itemRodLongAbyssalAlloy", 64L), + GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.TranscendentMetal, 64L), }, + new FluidStack[] { Materials.Neutronium.getMolten(32_768_000L), + MaterialsUEVplus.SpaceTime.getMolten(4 * 36864L), MaterialsUEVplus.Universium.getMolten(4 * 36864L), + MaterialsUEVplus.ExcitedDTEC.getFluid(4 * 36864L) }, + getItemContainer("StargateFramePart").get(1L), + baseStargateTime, + (int) TierEU.RECIPE_UMV); + } + + // Dimensionally Transcendent Plasma Forge (DTPF) + if (EternalSingularity.isModLoaded()) { + + // DTPF Controller. + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Casing_Dim_Bridge.get(1), + 32_000_000, + 4096, + 32_000_000, + 1, + new Object[] { ItemList.Casing_Dim_Bridge.get(4), + getModItem(GregTech.ID, "gt.blockmachines", 16L, 12730), + getItemContainer("Hatch_Energy_UEV").get(4L), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUEV, 6), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + ItemList.Reactor_Coolant_Sp_6.get(1L), ItemList.Reactor_Coolant_Sp_6.get(1L), + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 20L }, + ItemList.Field_Generator_UEV.get(4), getModItem(EternalSingularity.ID, "eternal_singularity", 4L), + getModItem(GTPlusPlus.ID, "MU-metaitem.01", 1L, 32105), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 64L), + ItemList.Electric_Pump_UEV.get(4), ItemList.ZPM3.get(1), + getModItem(IndustrialCraft2.ID, "blockMachine2", 1, 0) }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 128000), + new FluidStack(solderUEV, 36864 * 2), + new FluidStack(FluidRegistry.getFluid("molten.californium"), 36864), + Materials.NaquadahEnriched.getMolten(36864L) }, + ItemList.Machine_Multi_PlasmaForge.get(1), + 5 * MINUTES, + (int) TierEU.RECIPE_UIV); + + // Dimensional bridge. + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Casing_Dim_Injector.get(1), + 8_000_000, + 4096, + 32_000_000, + 1, + new Object[] { ItemList.Casing_Dim_Trans.get(1), ItemList.MicroTransmitter_UV.get(1), + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 2L }, + getModItem(Avaritia.ID, "Singularity", 2L, 0), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 6), + getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 2, 0), ItemList.Field_Generator_UHV.get(1L) }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 8000), + new FluidStack(solderUEV, 1152 * 8), Materials.NaquadahEnriched.getMolten(1296L) }, + ItemList.Casing_Dim_Bridge.get(1), + 240 * 20, + 32_000_000); + + // Dimensional injection casing. + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Casing_Dim_Trans.get(1), + 2_000_000, + 2048, + 32_000_000, + 1, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 4), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Ledox, 1), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.CallistoIce, 1), + ItemList.Reactor_Coolant_Sp_6.get(1L), getModItem(GTPlusPlus.ID, "itemScrewLaurenium", 12, 0), + new Object[] { OrePrefixes.circuit.get(Materials.Elite), 2L }, + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 2), + ItemList.Super_Chest_IV.get(1), ItemList.Super_Tank_IV.get(1), + getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 1, 0), }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 1000), + new FluidStack(solderUEV, 576), Materials.NaquadahEnriched.getMolten(288L) }, + ItemList.Casing_Dim_Injector.get(1), + 20 * 20, + 32_000_000); + + // Dimensionally Transcendent Casing. + TT_recipeAdder.addResearchableAssemblylineRecipe( + getModItem(Avaritia.ID, "Singularity", 1L, 0), + 2_000_000, + 2048, + 32_000_000, + 1, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Osmiridium, 6), + getModItem(GTPlusPlus.ID, "itemScrewLaurenium", 12, 0), ItemList.Reactor_Coolant_Sp_6.get(1L), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 1), }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 500), + new FluidStack(solderUEV, 288), Materials.NaquadahEnriched.getMolten(144L) }, + ItemList.Casing_Dim_Trans.get(1), + 20 * 20, + 32_000_000); + } + + // Deep Dark Portal + if (BartWorks.isModLoaded()) { + TT_recipeAdder.addResearchableAssemblylineRecipe( + getModItem(NewHorizonsCoreMod.ID, "item.HeavyDutyPlateTier8", 1, 0), + 16_777_216, + 2048, + 2_000_000, + 64, + new Object[] { getModItem(ExtraUtilities.ID, "cobblestone_compressed", 1, 7), + getModItem(IndustrialCraft2.ID, "blockMachine2", 1, 0), + GT_OreDictUnificator.get(OrePrefixes.block, Materials.Infinity, 4L), + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, + getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 32, 0), ItemList.Robot_Arm_UMV.get(4), + ItemList.Emitter_UMV.get(4), ItemList.Sensor_UMV.get(4), }, + new FluidStack[] { new FluidStack(FluidRegistry.getFluid("oganesson"), 50000), + Materials.Infinity.getMolten(144L * 512), Materials.Cheese.getMolten(232000L), }, + ItemList.Block_BedrockiumCompressed.get(1), + 10000, + 5000000); + } + + // Batteries + { + + // Ultimate Battery + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Energy_Cluster.get(1L), + 12000, + 16, + 100000, + 3, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Tritanium, 64L), + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L }, ItemList.Energy_Cluster.get(8L), + ItemList.Field_Generator_UV.get(2), ItemList.Circuit_Wafer_HPIC.get(64), + ItemList.Circuit_Wafer_HPIC.get(64), ItemList.Circuit_Parts_DiodeASMD.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, Materials.SuperconductorUHV, 32), }, + new FluidStack[] { new FluidStack(solderIndalloy, 2880), + new FluidStack(FluidRegistry.getFluid("ic2coolant"), 16000) }, + ItemList.ZPM2.get(1), + 3000, + 400000); + + // Really Ultimate Battery + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.ZPM2.get(1L), + 24000, + 64, + 200000, + 6, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Neutronium, 32L), + GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.Neutronium, 32L), + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, ItemList.ZPM2.get(8), + ItemList.Field_Generator_UHV.get(4), ItemList.Circuit_Wafer_UHPIC.get(64), + ItemList.Circuit_Wafer_UHPIC.get(64), ItemList.Circuit_Wafer_SoC2.get(32), + ItemList.Circuit_Parts_DiodeASMD.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt02, Materials.SuperconductorUHV, 64), }, + new FluidStack[] { new FluidStack(solderUEV, 4608), Materials.Naquadria.getMolten(9216), + new FluidStack(FluidRegistry.getFluid("ic2coolant"), 32000) }, + ItemList.ZPM3.get(1), + 4000, + 1600000); + + // Extremely Ultimate Battery + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.ZPM3.get(1L), + 1_200_000, + 128, + 8_000_000, + 16, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.InfinityCatalyst, 32L), + GT_OreDictUnificator.get(OrePrefixes.plateDouble, Materials.InfinityCatalyst, 32L), + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, ItemList.ZPM3.get(8), + ItemList.Field_Generator_UEV.get(4), ItemList.Circuit_Wafer_PPIC.get(64), + ItemList.Circuit_Wafer_PPIC.get(64), ItemList.Circuit_Wafer_SoC2.get(64), + ItemList.Circuit_Parts_DiodeXSMD.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUEV, 64), }, + new FluidStack[] { new FluidStack(solderUEV, 9216), Materials.Quantium.getMolten(18_432), + Materials.Naquadria.getMolten(9_216 * 2), Materials.SuperCoolant.getFluid(64_000) }, + ItemList.ZPM4.get(1), + 250 * 20, + 6_400_000); + + if (GTPlusPlusEverglades.isModLoaded()) { + // Insanely Ultimate Battery + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.ZPM4.get(1), + 24_000_000, + 1_280, + 32_000_000, + 32, + new Object[] { ELEMENT.STANDALONE.HYPOGEN.getPlateDouble(32), + ELEMENT.STANDALONE.HYPOGEN.getPlateDouble(32), + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 }, ItemList.ZPM4.get(8L), + ItemList.Field_Generator_UIV.get(4), ItemList.Circuit_Wafer_QPIC.get(64), + ItemList.Circuit_Wafer_QPIC.get(64), + GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.RawPicoWafer", 64), + ItemList.Circuit_Parts_DiodeXSMD.get(64), ItemList.Circuit_Parts_InductorXSMD.get(32), + GT_OreDictUnificator.get(OrePrefixes.wireGt08, Materials.SuperconductorUIV, 64) }, + new FluidStack[] { new FluidStack(solderUEV, 18_432), + ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getFluidStack(18_432), + Materials.Quantium.getMolten(18_432), Materials.SuperCoolant.getFluid(128_000) }, + ItemList.ZPM5.get(1), + 300 * 20, + (int) TierEU.RECIPE_UIV); + + // Mega Ultimate Battery + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.ZPM5.get(1L), + 480_000_000, + 12_288, + 128_000_000, + 64, + new Object[] { ELEMENT.STANDALONE.DRAGON_METAL.getPlateDouble(32), + ELEMENT.STANDALONE.DRAGON_METAL.getPlateDouble(32), + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1 }, ItemList.ZPM5.get(8L), + ItemList.Field_Generator_UMV.get(4), ItemList.Circuit_Wafer_QPIC.get(64), + ItemList.Circuit_Wafer_QPIC.get(64), + GT_ModHandler.getModItem(NewHorizonsCoreMod.ID, "item.PicoWafer", 64), + ItemList.Circuit_Parts_DiodeXSMD.get(64), ItemList.Circuit_Parts_InductorXSMD.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 64) }, + new FluidStack[] { new FluidStack(solderUEV, 36_864), + ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(36_864), + ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getFluidStack(36_864), + Materials.SuperCoolant.getFluid(256_000) }, + ItemList.ZPM6.get(1), + 350 * 20, + (int) TierEU.RECIPE_UMV); + } + } + + if (GTPlusPlus.isModLoaded()) { + // MK4 Computer + TT_recipeAdder.addResearchableAssemblylineRecipe( + GregtechItemList.Compressed_Fusion_Reactor.get(1), + 320000, + 512, + 2000000, + 1, + new Object[] { GregtechItemList.Casing_Fusion_Internal.get(1), + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Neutronium, 4), + ItemList.Field_Generator_UHV.get(2), ItemList.Circuit_Wafer_QPIC.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUHV, 32) }, + new FluidStack[] { Materials.UUMatter.getFluid(50000), ALLOY.CINOBITE.getFluidStack(9216), + ALLOY.OCTIRON.getFluidStack(9216), ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(9216), }, + GregtechItemList.FusionComputer_UV2.get(1), + 6000, + 2000000); + + // MK4 Coils + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Casing_Fusion_Coil.get(1L), + 160000, + 512, + 2000000, + 1, + new Object[] { ItemList.Energy_LapotronicOrb2.get(16L), + new Object[] { OrePrefixes.circuit.get(Materials.Master), 16L }, + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 8L }, + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8), ItemList.Emitter_UHV.get(1), + ItemList.Sensor_UHV.get(1), ItemList.Casing_Fusion_Coil.get(1L), }, + new FluidStack[] { Materials.UUMatter.getFluid(8000L), ALLOY.CINOBITE.getFluidStack(2304), + ALLOY.OCTIRON.getFluidStack(2304), ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(2304), }, + GregtechItemList.Casing_Fusion_Internal.get(1), + 1200, + 2000000); + + // MK4 Casing + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Casing_Fusion2.get(1L), + 80000, + 512, + 2000000, + 1, + new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Data), 16L }, + new Object[] { OrePrefixes.circuit.get(Materials.Elite), 8L }, + GT_OreDictUnificator.get(OrePrefixes.block, Materials.TungstenCarbide, 8), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 8), + ItemList.Electric_Motor_UHV.get(2), ItemList.Electric_Piston_UHV.get(1), + ItemList.Casing_Fusion2.get(1L), }, + new FluidStack[] { Materials.UUMatter.getFluid(1000L), ALLOY.CINOBITE.getFluidStack(576), + ALLOY.OCTIRON.getFluidStack(576), ELEMENT.STANDALONE.ASTRAL_TITANIUM.getFluidStack(576), }, + GregtechItemList.Casing_Fusion_External.get(1), + 300, + 2000000); + + // MK5 Computer + TT_recipeAdder.addResearchableAssemblylineRecipe( + GregtechItemList.FusionComputer_UV2.get(1), + 2560000, + 4096, + (int) TierEU.RECIPE_UEV, + 8, + new Object[] { GregtechItemList.Casing_Fusion_Internal2.get(1), + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, + GT_OreDictUnificator.get("plateDenseMetastableOganesson", 4), ItemList.Field_Generator_UEV.get(2), + getItemContainer("PicoWafer").get(64L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.SuperconductorUEV, 32) }, + new FluidStack[] { ELEMENT.getInstance().CURIUM.getFluidStack(9216), + ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(9216), ALLOY.ABYSSAL.getFluidStack(9216), + ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(9216) }, + GregtechItemList.FusionComputer_UV3.get(1), + 6000, + (int) TierEU.RECIPE_UEV); + + // MK5 Coils + TT_recipeAdder.addResearchableAssemblylineRecipe( + GregtechItemList.Casing_Fusion_Internal.get(1), + 2560000, + 4096, + (int) TierEU.RECIPE_UEV, + 8, + new Object[] { ItemList.Energy_Module.get(16), + new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 16L }, + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 8L }, + ELEMENT.STANDALONE.RHUGNOR.getPlate(8), ItemList.Emitter_UEV.get(1), ItemList.Sensor_UEV.get(1), + getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 2) }, + new FluidStack[] { ELEMENT.getInstance().NEPTUNIUM.getFluidStack(2304), + ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(2304), ALLOY.ABYSSAL.getFluidStack(2304), + ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(2304) }, + GregtechItemList.Casing_Fusion_Internal2.get(1), + 1200, + (int) TierEU.RECIPE_UEV); + + // MK5 Casing + TT_recipeAdder.addResearchableAssemblylineRecipe( + GregtechItemList.Casing_Fusion_External.get(1L), + 2560000, + 4096, + (int) TierEU.RECIPE_UEV, + 8, + new Object[] { new Object[] { OrePrefixes.circuit.get(Materials.Elite), 16L }, + new Object[] { OrePrefixes.circuit.get(Materials.Master), 8L }, + GT_OreDictUnificator.get(OrePrefixes.block, Materials.NaquadahAlloy, 8), + ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getPlate(8), ItemList.Electric_Motor_UEV.get(2), + ItemList.Electric_Piston_UEV.get(1), GregtechItemList.Casing_Fusion_External.get(1L) }, + new FluidStack[] { ELEMENT.getInstance().FERMIUM.getFluidStack(1152), + ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(1152), ALLOY.ABYSSAL.getFluidStack(1152), + ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(1152) }, + GregtechItemList.Casing_Fusion_External2.get(1), + 300, + (int) TierEU.RECIPE_UEV); + } + + if (BloodMagic.isModLoaded() && KubaTech.isModLoaded() && DraconicEvolution.isModLoaded()) { + // Draconic Evolution Fusion Crafter Controller + TT_recipeAdder.addResearchableAssemblylineRecipe( + getModItem(KubaTech.ID, "defc.casing", 1, 8), + 16_777_216, + 1024, + 2_000_000, + 8, + new Object[] { getModItem(GregTech.ID, "gt.blockmachines", 1, 10783), + getModItem(KubaTech.ID, "defc.casing", 1, 8), + GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsBotania.GaiaSpirit, 1L), + ItemList.Casing_Coil_AwakenedDraconium.get(8L), ItemList.Electric_Motor_UHV.get(8L), + ItemList.Robot_Arm_UHV.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4 }, + ItemList.Gravistar.get(4, new Object() {}), getModItem(Thaumcraft.ID, "ItemEldritchObject", 1, 3), + getModItem(BloodMagic.ID, "bloodMagicBaseItems", 8, 29), + getModItem(BloodMagic.ID, "bloodMagicBaseItems", 8, 28), }, + new FluidStack[] { new FluidStack(solderIndalloy, 2880), Materials.Void.getMolten(2880L), + Materials.DraconiumAwakened.getMolten(1440), }, + getModItem(GregTech.ID, "gt.blockmachines", 1, 5001), + 1500, + 8_000_000); + // DE Schematics Cores Tier 1 + TT_recipeAdder.addResearchableAssemblylineRecipe( + getModItem(KubaTech.ID, "defc.casing", 1, 9), + 5_000_000, + 512, + 1_000_000, + 4, + new Object[] { getModItem(DraconicEvolution.ID, "draconicCore", 1, 0), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Draconium, 1L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Ichorium, 1L), + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1 }, }, + new FluidStack[] { Materials.Sunnarium.getMolten(14400L), Materials.Void.getMolten(28800L), }, + getModItem(KubaTech.ID, "kubaitems", 1, 38), + 6000, + 500_000); + + // DE Schematics Cores Tier 2 + TT_recipeAdder.addResearchableAssemblylineRecipe( + getModItem(DraconicEvolution.ID, "draconicCore", 1, 0), + 10_000_000, + 1024, + 4_000_000, + 8, + new Object[] { getModItem(DraconicEvolution.ID, "draconicCore", 4, 0), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Draconium, 1L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Neutronium, 1L), + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1 }, }, + new FluidStack[] { Materials.Neutronium.getMolten(14400L), Materials.Void.getMolten(57600L), }, + getModItem(KubaTech.ID, "kubaitems", 1, 39), + 12000, + 2_000_000); + + // DE Schematics Cores Tier 3 + TT_recipeAdder.addResearchableAssemblylineRecipe( + getModItem(DraconicEvolution.ID, "wyvernCore", 1, 0), + 20_000_000, + 2048, + 16_000_000, + 16, + new Object[] { getModItem(DraconicEvolution.ID, "wyvernCore", 4, 0), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.DraconiumAwakened, 1L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 1L), + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L } }, + new FluidStack[] { Materials.Infinity.getMolten(14400L), Materials.Void.getMolten(115200L), }, + getModItem(KubaTech.ID, "kubaitems", 1, 40), + 24000, + 8_000_000); + + // DE Schematics Cores Tier 4 + TT_recipeAdder.addResearchableAssemblylineRecipe( + getModItem(DraconicEvolution.ID, "awakenedCore", 1, 0), + 40_000_000, + 4096, + 64_000_000, + 64, + new Object[] { getModItem(DraconicEvolution.ID, "awakenedCore", 8, 0), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.DraconiumAwakened, 4L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 1L), + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1 }, }, + new FluidStack[] { MaterialsUEVplus.SpaceTime.getMolten(14400L), Materials.Void.getMolten(230400L), }, + getModItem(KubaTech.ID, "kubaitems", 1, 41), + 36000, + 32_000_000); + } + + // Debug maintenance hatch + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Hatch_AutoMaintenance.get(1L), + 2764800, + 128, + 500000, + 6, + new Object[] { ItemList.Hatch_AutoMaintenance.get(1L), ItemList.Robot_Arm_UV.get(1L), + ItemList.Electric_Pump_UV.get(1L), ItemList.Conveyor_Module_UV.get(1L), + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4L }, + ItemList.Energy_LapotronicOrb2.get(1L), ItemList.Duct_Tape.get(64L), ItemList.Duct_Tape.get(64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Americium, 64L), }, + new FluidStack[] { Materials.Lubricant.getFluid(256000), new FluidStack(solderIndalloy, 1296), }, + CustomItemList.hatch_CreativeMaintenance.get(1), + 6000, + 500000); + + if (GTPlusPlus.isModLoaded()) { + // Debug uncertainty resolver + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.UncertaintyX_Hatch.get(1L), + 72_000_000, + 5_120, + 16_000_000, + 6, + new Object[] { CustomItemList.eM_Computer_Bus.get(1), CustomItemList.hatch_CreativeMaintenance.get(1), + ItemList.Field_Generator_UIV.get(1L), GregtechItemList.Laser_Lens_Special.get(4), + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 2 }, CustomItemList.DATApipe.get(64), + CustomItemList.DATApipe.get(64), ItemList.Cover_Screen.get(1) }, + new FluidStack[] { Materials.Iridium.getMolten(INGOTS * 100), new FluidStack(solderUEV, 2592), + new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 20000), + new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 20000) }, + CustomItemList.hatch_CreativeUncertainty.get(1), + 200 * 20, + (int) TierEU.RECIPE_UIV); + } + } + + private void itemPartsUHVAsslineRecipes() { + + // ---------------------------------------------------------------------- + // ------------------------- Set up information ------------------------- + // ---------------------------------------------------------------------- + + Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null + ? FluidRegistry.getFluid("molten.indalloy140") + : FluidRegistry.getFluid("molten.solderingalloy"); + + int total_computation = 24000; + int comp_per_second = 32; + int research_eu_per_tick = 500_000; + int research_amperage = 1; + + FluidStack fluid_0 = Materials.Naquadria.getMolten(2592); + FluidStack fluid_1 = new FluidStack(solderIndalloy, 2592); + FluidStack fluid_2 = Materials.Lubricant.getFluid(4000); + + int crafting_time_in_ticks = 1000; + int crafting_eu_per_tick = 500_000; + + // ------------------------------------------------------------- + + // ------------------------- UHV Motor ------------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Motor_UV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.SamariumMagnetic, 4L), + GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.CosmicNeutronium, 8L), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.CosmicNeutronium, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, Materials.CosmicNeutronium, 32L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 2L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Motor_UHV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // --------------------- UHV Electric Pump --------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Pump_UV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { ItemList.Electric_Motor_UHV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Neutronium, 2L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 4L), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.CosmicNeutronium, 16L), + new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 32L }, + GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.CosmicNeutronium, 4L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 2L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Pump_UHV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ----------------------- UHV Conveyor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Conveyor_Module_UV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { ItemList.Electric_Motor_UHV.get(2L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 2L), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.CosmicNeutronium, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 2L), + new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 40L } }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Conveyor_Module_UHV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // -------------------- UHV Robot Arm -------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Robot_Arm_UV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.CosmicNeutronium, 8L), + GT_OreDictUnificator.get(OrePrefixes.gear, Materials.CosmicNeutronium, 2L), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.CosmicNeutronium, 6L), + ItemList.Electric_Motor_UHV.get(2L), ItemList.Electric_Piston_UHV.get(1L), + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 2L }, + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 4L }, + new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 8L }, + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 6L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Robot_Arm_UHV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // -------------------- UHV Electric Piston -------------------- + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Piston_UV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new ItemStack[] { ItemList.Electric_Motor_UHV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 6L), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.CosmicNeutronium, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.stick, Materials.CosmicNeutronium, 8L), + GT_OreDictUnificator.get(OrePrefixes.gear, Materials.CosmicNeutronium, 2L), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.CosmicNeutronium, 4L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 4L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Piston_UHV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ------------------------ UHV Emitter ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Emitter_UV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.CosmicNeutronium, 1L), + ItemList.Electric_Motor_UHV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.stick, Materials.CosmicNeutronium, 8L), ItemList.Gravistar.get(8L), + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4L }, + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 7L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Emitter_UHV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ------------------------ UHV Sensor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Sensor_UV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.CosmicNeutronium, 1L), + ItemList.Electric_Motor_UHV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 8L), ItemList.Gravistar.get(8L), + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4L }, + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.ElectrumFlux, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 7L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Sensor_UHV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // --------------------------------------------------------------------- + + // ------------------------ UHV Field Generator ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Field_Generator_UV.get(1), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.CosmicNeutronium, 1L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CosmicNeutronium, 6L), ItemList.Gravistar.get(4L), + ItemList.Emitter_UHV.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4L }, + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Neutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Bedrockium, 8L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Field_Generator_UHV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + } + + private void itemPartsUEVAsslineRecipes() { + + // ---------------------------------------------------------------------- + // ------------------------- Set up information ------------------------- + // ---------------------------------------------------------------------- + + Fluid mutated_living_solder = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null + ? FluidRegistry.getFluid("molten.mutatedlivingsolder") + : FluidRegistry.getFluid("molten.solderingalloy"); + + int total_computation = 48_000; + int comp_per_second = 64; + int research_eu_per_tick = 2_000_000; + int research_amperage = 1; + + FluidStack fluid_0 = Materials.Quantium.getMolten(2592); + FluidStack fluid_1 = new FluidStack(mutated_living_solder, 2592); + FluidStack fluid_2 = Materials.Lubricant.getFluid(4000); + + int crafting_time_in_ticks = 1000; + int crafting_eu_per_tick = 2_000_000; + + // ------------------------------------------------------------- + + // ------------------------- UEV Motor ------------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Motor_UHV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TengamAttuned, 8L), + GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Infinity, 16L), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Infinity, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, Materials.Infinity, 32L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.CosmicNeutronium, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 2L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Motor_UEV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // --------------------- UEV Electric Pump --------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Pump_UHV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { ItemList.Electric_Motor_UEV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.NetherStar, 2L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 4L), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Infinity, 16L), + new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 64L }, + GT_OreDictUnificator.get(OrePrefixes.rotor, Materials.Infinity, 4L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 2L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Pump_UEV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ----------------------- UEV Conveyor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Conveyor_Module_UHV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { ItemList.Electric_Motor_UEV.get(2L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 2L), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Infinity, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 2L), + new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 64L }, + new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 16L } }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Conveyor_Module_UEV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // -------------------- UEV Robot Arm -------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Robot_Arm_UHV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.Infinity, 8L), + GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Infinity, 2L), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Infinity, 6L), + ItemList.Electric_Motor_UEV.get(2L), ItemList.Electric_Piston_UEV.get(1L), + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 2L }, + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 4L }, + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 8L }, + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 6L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Robot_Arm_UEV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // -------------------- UEV Electric Piston -------------------- + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Piston_UHV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new ItemStack[] { ItemList.Electric_Motor_UEV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 6L), + GT_OreDictUnificator.get(OrePrefixes.ring, Materials.Infinity, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Infinity, 8L), + GT_OreDictUnificator.get(OrePrefixes.gear, Materials.Infinity, 2L), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, Materials.Infinity, 4L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 4L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Piston_UEV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ------------------------ UEV Emitter ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Emitter_UHV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1L), + ItemList.Electric_Motor_UEV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.stick, Materials.Infinity, 16L), ItemList.Gravistar.get(16L), + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4L }, + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 7L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Emitter_UEV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ------------------------ UEV Sensor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Sensor_UHV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1L), + ItemList.Electric_Motor_UEV.get(1), GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 8L), + ItemList.Gravistar.get(16), new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4L }, + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L), + GT_OreDictUnificator.get(OrePrefixes.foil, Materials.InfinityCatalyst, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 7L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Sensor_UEV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // --------------------------------------------------------------------- + + // ------------------------ UEV Field Generator ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Field_Generator_UHV.get(1), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Infinity, 1L), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Infinity, 6L), ItemList.Gravistar.get(8L), + ItemList.Emitter_UEV.get(4L), new Object[] { OrePrefixes.circuit.get(Materials.Optical), 4L }, + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Tritanium, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Draconium, 8L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Field_Generator_UEV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + } + + private void itemPartsUIVAsslineRecipes() { + + // ---------------------------------------------------------------------- + // ------------------------- Set up information ------------------------- + // ---------------------------------------------------------------------- + + Fluid mutated_living_solder = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null + ? FluidRegistry.getFluid("molten.mutatedlivingsolder") + : FluidRegistry.getFluid("molten.solderingalloy"); + Fluid celestialTungsten = FluidRegistry.getFluid("molten.celestialtungsten"); + + int total_computation = 96_000; + int comp_per_second = 128; + int research_eu_per_tick = 8_000_000; + int research_amperage = 1; + + FluidStack fluid_0 = celestialTungsten != null ? new FluidStack(celestialTungsten, 576) : null; + FluidStack fluid_1 = new FluidStack(mutated_living_solder, 2592); + FluidStack fluid_2 = Materials.Lubricant.getFluid(4000); + + int crafting_time_in_ticks = 1000; + int crafting_eu_per_tick = 8_000_000; + + // ------------------------------------------------------------- + + // ------------------------- UIV Motor ------------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Motor_UEV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TengamAttuned, 16L), + GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.TranscendentMetal, 16L), + GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.TranscendentMetal, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.TranscendentMetal, 32L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 2L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Motor_UIV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // --------------------- UIV Electric Pump --------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Pump_UEV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { ItemList.Electric_Motor_UIV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.DraconiumAwakened, 2L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 4L), + GT_OreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.TranscendentMetal, 16L), + new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 64L }, + GT_OreDictUnificator.get(OrePrefixes.rotor, MaterialsUEVplus.TranscendentMetal, 4L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 2L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Pump_UIV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ----------------------- UIV Conveyor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Conveyor_Module_UEV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { ItemList.Electric_Motor_UIV.get(2L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 2L), + GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.TranscendentMetal, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.TranscendentMetal, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 2L), + new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 64L }, + new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 16L } }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Conveyor_Module_UIV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // -------------------- UIV Robot Arm -------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Robot_Arm_UEV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.TranscendentMetal, 8L), + GT_OreDictUnificator.get(OrePrefixes.gear, MaterialsUEVplus.TranscendentMetal, 2L), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.TranscendentMetal, 6L), + ItemList.Electric_Motor_UIV.get(2L), ItemList.Electric_Piston_UIV.get(1L), + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 2L }, + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 4L }, + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 8L }, + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 6L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Robot_Arm_UIV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // -------------------- UIV Electric Piston -------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Piston_UEV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new ItemStack[] { ItemList.Electric_Motor_UIV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 6L), + GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.TranscendentMetal, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.TranscendentMetal, 64L), + GT_OreDictUnificator.get(OrePrefixes.stick, MaterialsUEVplus.TranscendentMetal, 8L), + GT_OreDictUnificator.get(OrePrefixes.gear, MaterialsUEVplus.TranscendentMetal, 2L), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.TranscendentMetal, 4L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 4L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Electric_Piston_UIV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ------------------------ UIV Emitter ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Emitter_UEV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.TranscendentMetal, 1L), + ItemList.Electric_Motor_UIV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.stick, MaterialsUEVplus.TranscendentMetal, 16L), + ItemList.Gravistar.get(32L), new Object[] { OrePrefixes.circuit.get(Materials.Optical), 4L }, + getModItem(GTPlusPlus.ID, "itemFoilArceusAlloy2B", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilLafiumCompound", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilCinobiteA243", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilPikyonium64B", 64, 0), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 7L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Emitter_UIV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ------------------------ UIV Sensor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Sensor_UEV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.TranscendentMetal, 1L), + ItemList.Electric_Motor_UIV.get(1), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 8L), + ItemList.Gravistar.get(32), new Object[] { OrePrefixes.circuit.get(Materials.Optical), 4L }, + getModItem(GTPlusPlus.ID, "itemFoilArceusAlloy2B", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilLafiumCompound", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilCinobiteA243", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilPikyonium64B", 64, 0), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 7L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Sensor_UIV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // --------------------------------------------------------------------- + + // ------------------------ UIV Field Generator ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Field_Generator_UEV.get(1), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.TranscendentMetal, 1L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.TranscendentMetal, 6L), + ItemList.Gravistar.get(16L), ItemList.Emitter_UIV.get(4L), + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 4 }, + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.Infinity, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.NetherStar, 8L) }, + new FluidStack[] { fluid_0, fluid_1 }, + ItemList.Field_Generator_UIV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // --------------------------------------------------------------------- + + } + + private void itemPartsUMVAsslineRecipes() { + + // ---------------------------------------------------------------------- + // ------------------------- Set up information ------------------------- + // ---------------------------------------------------------------------- + + Fluid mutated_living_solder = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null + ? FluidRegistry.getFluid("molten.mutatedlivingsolder") + : FluidRegistry.getFluid("molten.solderingalloy"); + Fluid hypogen = FluidRegistry.getFluid("molten.hypogen"); + Fluid celestialTungsten = FluidRegistry.getFluid("molten.celestialtungsten"); + + int total_computation = 192_000; + int comp_per_second = 256; + int research_eu_per_tick = 32_000_000; + int research_amperage = 1; + + FluidStack fluid_0 = hypogen != null ? new FluidStack(hypogen, 576) : null; + FluidStack fluid_1 = celestialTungsten != null ? new FluidStack(celestialTungsten, 576) : null; + FluidStack fluid_2 = new FluidStack(mutated_living_solder, 2592); + FluidStack fluid_3 = Materials.Lubricant.getFluid(4000); + + int crafting_time_in_ticks = 1000; + int crafting_eu_per_tick = 32_000_000; + + // ------------------------------------------------------------- + + // ------------------------- UMV Motor ------------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Motor_UIV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new ItemStack[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, Materials.TengamAttuned, 32L), + GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.SpaceTime, 16L), + GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.SpaceTime, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.SpaceTime, 32L), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 2L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 }, + ItemList.Electric_Motor_UMV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // --------------------- UMV Electric Pump --------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Pump_UIV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { ItemList.Electric_Motor_UMV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.pipeLarge, Materials.Infinity, 2L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 4L), + GT_OreDictUnificator.get(OrePrefixes.screw, MaterialsUEVplus.SpaceTime, 16L), + new Object[] { OrePrefixes.ring.get(Materials.AnySyntheticRubber), 64L }, + GT_OreDictUnificator.get(OrePrefixes.rotor, MaterialsUEVplus.SpaceTime, 4L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 2L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 }, + ItemList.Electric_Pump_UMV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ----------------------- UMV Conveyor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Conveyor_Module_UIV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { ItemList.Electric_Motor_UMV.get(2L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 2L), + GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.SpaceTime, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.SpaceTime, 64L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 2L), + new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 64L }, + new Object[] { OrePrefixes.plate.get(Materials.AnySyntheticRubber), 16L } }, + new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 }, + ItemList.Conveyor_Module_UMV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // -------------------- UMV Robot Arm -------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Robot_Arm_UIV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.stickLong, MaterialsUEVplus.SpaceTime, 8L), + GT_OreDictUnificator.get(OrePrefixes.gear, MaterialsUEVplus.SpaceTime, 2L), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.SpaceTime, 6L), + ItemList.Electric_Motor_UMV.get(2L), ItemList.Electric_Piston_UMV.get(1L), + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 2L }, + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 4L }, + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 8L }, + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 6L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 }, + ItemList.Robot_Arm_UMV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // -------------------- UMV Electric Piston -------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Piston_UIV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new ItemStack[] { ItemList.Electric_Motor_UMV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 6L), + GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsUEVplus.SpaceTime, 8L), + GT_OreDictUnificator.get(OrePrefixes.round, MaterialsUEVplus.SpaceTime, 64L), + GT_OreDictUnificator.get(OrePrefixes.stick, MaterialsUEVplus.SpaceTime, 8L), + GT_OreDictUnificator.get(OrePrefixes.gear, MaterialsUEVplus.SpaceTime, 2L), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.SpaceTime, 4L), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 4L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2, fluid_3 }, + ItemList.Electric_Piston_UMV.get(1), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ------------------------ UMV Emitter ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Emitter_UIV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 1L), + ItemList.Electric_Motor_UMV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.stick, MaterialsUEVplus.SpaceTime, 16L), + ItemList.Gravistar.get(64), new Object[] { OrePrefixes.circuit.get(Materials.Piko), 4L }, + getModItem(GTPlusPlus.ID, "itemFoilCelestialTungsten", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilQuantum", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilAstralTitanium", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilTitansteel", 64, 0), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 7L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Emitter_UMV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // ------------------------------------------------------------- + + // ------------------------ UMV Sensor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Sensor_UIV.get(1L), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 1L), + ItemList.Electric_Motor_UMV.get(1), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 8L), ItemList.Gravistar.get(64), + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 4L }, + getModItem(GTPlusPlus.ID, "itemFoilCelestialTungsten", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilQuantum", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilAstralTitanium", 64, 0), + getModItem(GTPlusPlus.ID, "itemFoilTitansteel", 64, 0), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 7L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Sensor_UMV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // --------------------------------------------------------------------- + + // ------------------------ UMV Field Generator ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Field_Generator_UIV.get(1), + total_computation, + comp_per_second, + research_eu_per_tick, + research_amperage, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 1L), + GT_OreDictUnificator.get(OrePrefixes.plate, MaterialsUEVplus.SpaceTime, 6L), + ItemList.Gravistar.get(32L), ItemList.Emitter_UMV.get(4L), + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 4 }, + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + getModItem(GTPlusPlus.ID, "itemFineWireHypogen", 64, 0), + GT_OreDictUnificator.get(OrePrefixes.cableGt04, Materials.Quantium, 8L) }, + new FluidStack[] { fluid_0, fluid_1, fluid_2 }, + ItemList.Field_Generator_UMV.get(1L), + crafting_time_in_ticks, + crafting_eu_per_tick); + + // --------------------------------------------------------------------- + + } + + private void itemPartsUXVAsslineRecipes() { + + // ---------------------------------------------------------------------- + // ------------------------- Set up information ------------------------- + // ---------------------------------------------------------------------- + + Fluid mutatedLivingSolder = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null + ? FluidRegistry.getFluid("molten.mutatedlivingsolder") + : FluidRegistry.getFluid("molten.solderingalloy"); + + FluidStack moltenMHDCSM_576 = MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(576); + FluidStack moltenSpaceTime_576 = MaterialsUEVplus.SpaceTime.getMolten(576); + FluidStack moltenUniversium_576 = MaterialsUEVplus.Universium.getMolten(576); + FluidStack lubricantFluid_8000 = Materials.Lubricant.getFluid(8000); + FluidStack solderingAlloy_14_400 = new FluidStack(mutatedLivingSolder, 14_400); + + int totalComputation = 384_000; + int compPerSecond = 512; + int researchEuPerTick = 64_000_000; + int researchAmperage = 2; + + int craftingTimeInTicks = 1000; + int craftingEuPerTick = (int) TierEU.RECIPE_UMV; + + // ------------------------------------------------------------- + + // ------------------------- UXV Motor ------------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Motor_UMV.get(1L), + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new ItemStack[] { ItemList.EnergisedTesseract.get(1), + GT_OreDictUnificator + .get(OrePrefixes.stickLong, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16L), + GT_OreDictUnificator + .get(OrePrefixes.ring, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L), + GT_OreDictUnificator + .get(OrePrefixes.round, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 32L), + + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.SuperconductorUMVBase, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.SuperconductorUMVBase, 64L), + + GT_OreDictUnificator + .get(OrePrefixes.wireFine, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L), + GT_OreDictUnificator + .get(OrePrefixes.wireFine, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L), + + GT_OreDictUnificator.get(OrePrefixes.wireFine, MaterialsUEVplus.Universium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, MaterialsUEVplus.Universium, 64L), + + GT_OreDictUnificator.get("wireFineShirabon", 64L), GT_OreDictUnificator.get("wireFineShirabon", 64L), + + GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 2L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 2L), + Materials.Neutronium.getNanite(4) }, + new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 }, + ItemList.Electric_Motor_UXV.get(1L), + craftingTimeInTicks, + craftingEuPerTick); + + // ------------------------------------------------------------- + + // --------------------- UXV Electric Pump --------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Pump_UMV.get(1L), + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new Object[] { ItemList.Electric_Motor_UXV.get(1L), + GT_OreDictUnificator.get(OrePrefixes.pipeLarge, MaterialsUEVplus.SpaceTime, 2L), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 4L), + GT_OreDictUnificator + .get(OrePrefixes.screw, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16L), + GT_OreDictUnificator.get(OrePrefixes.ring, MaterialsKevlar.Kevlar, 64L), + GT_OreDictUnificator.get("ringRadoxPoly", 64L), + GT_OreDictUnificator + .get(OrePrefixes.rotor, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 4L), + GT_OreDictUnificator.get("rotorShirabon", 4), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 2L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 2L), + Materials.Neutronium.getNanite(4) }, + new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 }, + ItemList.Electric_Pump_UXV.get(1), + craftingTimeInTicks, + craftingEuPerTick); + + // ------------------------------------------------------------- + + // ----------------------- UXV Conveyor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Conveyor_Module_UMV.get(1L), + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new Object[] { ItemList.Electric_Motor_UXV.get(2L), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2L), + GT_OreDictUnificator + .get(OrePrefixes.ring, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L), + GT_OreDictUnificator + .get(OrePrefixes.round, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 2L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 2L), + MaterialsKevlar.Kevlar.getPlates(64), MaterialsKevlar.Kevlar.getPlates(16), + GT_OreDictUnificator.get("plateRadoxPoly", 64L), GT_OreDictUnificator.get("plateRadoxPoly", 16L), + Materials.Neutronium.getNanite(4) }, + new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 }, + ItemList.Conveyor_Module_UXV.get(1), + craftingTimeInTicks, + craftingEuPerTick); + + // ------------------------------------------------------------- + + // -------------------- UXV Robot Arm -------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Robot_Arm_UMV.get(1L), + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new Object[] { + GT_OreDictUnificator + .get(OrePrefixes.stickLong, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L), + GT_OreDictUnificator + .get(OrePrefixes.gear, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2L), + GT_OreDictUnificator.get("gearGtShirabon", 2L), + GT_OreDictUnificator + .get(OrePrefixes.gearGtSmall, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 6L), + GT_OreDictUnificator.get("gearGtSmallShirabon", 6L), ItemList.Electric_Motor_UXV.get(2L), + ItemList.Electric_Piston_UXV.get(1L), new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 2L }, + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 4L }, + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 8L }, + GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 6L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 6L), + Materials.Neutronium.getNanite(8) }, + new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 }, + ItemList.Robot_Arm_UXV.get(1L), + craftingTimeInTicks, + craftingEuPerTick); + + // ------------------------------------------------------------- + + // -------------------- UXV Electric Piston -------------------- + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Electric_Piston_UMV.get(1L), + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new ItemStack[] { ItemList.Electric_Motor_UXV.get(1L), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 6L), + GT_OreDictUnificator + .get(OrePrefixes.ring, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L), + GT_OreDictUnificator + .get(OrePrefixes.round, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L), + GT_OreDictUnificator + .get(OrePrefixes.stick, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L), + GT_OreDictUnificator + .get(OrePrefixes.gear, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2L), + GT_OreDictUnificator.get("gearGtShirabon", 2L), + GT_OreDictUnificator + .get(OrePrefixes.gearGtSmall, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 4L), + GT_OreDictUnificator.get("gearGtSmallShirabon", 4L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 4L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 4L), + Materials.Neutronium.getNanite(4) }, + new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, lubricantFluid_8000 }, + ItemList.Electric_Piston_UXV.get(1), + craftingTimeInTicks, + craftingEuPerTick); + + // ------------------------------------------------------------- + + // ------------------------ UXV Emitter ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Emitter_UMV.get(1L), + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new Object[] { + GT_OreDictUnificator + .get(OrePrefixes.frameGt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1L), + ItemList.Electric_Motor_UXV.get(1L), + GT_OreDictUnificator + .get(OrePrefixes.stick, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16L), + ItemList.NuclearStar.get(16), new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 4L }, + GT_OreDictUnificator + .get(OrePrefixes.foil, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64), + GT_OreDictUnificator.get("foilShirabon", 64), + GT_OreDictUnificator.get(OrePrefixes.foil, MaterialsUEVplus.SpaceTime, 64), + GT_OreDictUnificator.get(OrePrefixes.foil, MaterialsUEVplus.Universium, 64), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 7L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 7L), + Materials.Neutronium.getNanite(8) + + }, + new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, solderingAlloy_14_400 }, + ItemList.Emitter_UXV.get(1L), + craftingTimeInTicks, + craftingEuPerTick); + + // ------------------------------------------------------------- + + // ------------------------ UXV Sensor ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Sensor_UMV.get(1L), + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new Object[] { + GT_OreDictUnificator + .get(OrePrefixes.frameGt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1L), + ItemList.Electric_Motor_UXV.get(1L), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8L), + ItemList.NuclearStar.get(16), new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 4L }, + GT_OreDictUnificator + .get(OrePrefixes.foil, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64), + GT_OreDictUnificator.get("foilShirabon", 64), + GT_OreDictUnificator.get(OrePrefixes.foil, MaterialsUEVplus.SpaceTime, 64), + GT_OreDictUnificator.get(OrePrefixes.foil, MaterialsUEVplus.Universium, 64), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 7L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 7L), + Materials.Neutronium.getNanite(8) }, + new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, solderingAlloy_14_400 }, + ItemList.Sensor_UXV.get(1L), + craftingTimeInTicks, + craftingEuPerTick); + + // --------------------------------------------------------------------- + + // ------------------------ UXV Field Generator ------------------------ + + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Field_Generator_UMV.get(1), + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new Object[] { + GT_OreDictUnificator + .get(OrePrefixes.frameGt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 1L), + GT_OreDictUnificator + .get(OrePrefixes.plate, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 6L), + ItemList.NuclearStar.get(64L), ItemList.Emitter_UXV.get(4L), + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 8 }, + + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.SuperconductorUMVBase, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, Materials.SuperconductorUMVBase, 64L), + GT_OreDictUnificator + .get(OrePrefixes.wireFine, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L), + GT_OreDictUnificator + .get(OrePrefixes.wireFine, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, MaterialsUEVplus.Universium, 64L), + GT_OreDictUnificator.get(OrePrefixes.wireFine, MaterialsUEVplus.Universium, 64L), + GT_OreDictUnificator.get("wireFineShirabon", 64L), GT_OreDictUnificator.get("wireFineShirabon", 64L), + + GT_OreDictUnificator.get(OrePrefixes.wireGt04, MaterialsUEVplus.SpaceTime, 8L), + GT_OreDictUnificator.get(OrePrefixes.wireGt04, Materials.Infinity, 8L), + Materials.Neutronium.getNanite(12) }, + new FluidStack[] { moltenMHDCSM_576, moltenSpaceTime_576, moltenUniversium_576, solderingAlloy_14_400 }, + ItemList.Field_Generator_UXV.get(1L), + craftingTimeInTicks, + craftingEuPerTick); + + // --------------------------------------------------------------------- + + } + + private void addEOHRecipes() { + Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null + ? FluidRegistry.getFluid("molten.mutatedlivingsolder") + : FluidRegistry.getFluid("molten.solderingalloy"); + ItemStack largeShirabonPlate = TGregUtils.newItemStack(Materials.get("Shirabon"), PartTypes.LargePlate, 1); + ItemStack largeInfinityPlate = new ItemStack(TinkerTools.largePlate, 1, Tonkers.infinityMetalId); + ItemStack largeBedrockiumPlate = new ItemStack(TinkerTools.largePlate, 1, ExtraUtils.tcon_bedrock_material_id); + ItemStack largeCosmicNeutroniumPlate = new ItemStack(TinkerTools.largePlate, 1, Tonkers.neutroniumId); + + final FluidStack[] specialFluid = new FluidStack[] { MaterialsUEVplus.SpaceTime.getMolten(1_440), + MaterialsUEVplus.SpaceTime.getMolten(1_440), MaterialsUEVplus.SpaceTime.getMolten(1_440), + MaterialsUEVplus.SpaceTime.getMolten(1_440), MaterialsUEVplus.SpaceTime.getMolten(1_440), + MaterialsUEVplus.SpaceTime.getMolten(1_440), MaterialsUEVplus.SpaceTime.getMolten(1_440), + MaterialsUEVplus.SpaceTime.getMolten(1_440), MaterialsUEVplus.SpaceTime.getMolten(1_440) }; + + final ItemStack[] plateList = new ItemStack[] { + // Dense Shirabon plate. + GT_OreDictUnificator.get("boltShirabon", 2), + GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.WhiteDwarfMatter, 2), + GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.WhiteDwarfMatter, 8), + GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.WhiteDwarfMatter, 32), + GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.BlackDwarfMatter, 2), + GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.BlackDwarfMatter, 8), + GT_OreDictUnificator.get(OrePrefixes.bolt, MaterialsUEVplus.BlackDwarfMatter, 32), + GT_OreDictUnificator + .get(OrePrefixes.bolt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 2), + GT_OreDictUnificator + .get(OrePrefixes.bolt, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 8) }; + + // EOH Controller Recipe. + { + TT_recipeAdder.addResearchableAssemblylineRecipe( + ItemList.Machine_Multi_PlasmaForge.get(1), + 512_000_000, // total comp + 2 * 16_384, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + 64, // amperage + new Object[] { + // Space elevator controller. + getModItem(GregTech.ID, "gt.blockmachines", 16, 14003), ItemList.Machine_Multi_PlasmaForge.get(4), + + CustomItemList.EOH_Infinite_Energy_Casing.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier0.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier0.get(1), + CustomItemList.StabilisationFieldGeneratorTier0.get(1), + + CustomItemList.Machine_Multi_Computer.get(64), + // Ultimate Time Anomaly. + getModItem(GregTech.ID, "gt.blockmachines", 64, 11107), ItemList.Quantum_Chest_IV.get(64), + // Void miner III. + getModItem(GregTech.ID, "gt.blockmachines", 64, 12739), + + ItemList.Field_Generator_UMV.get(16), ItemList.Robot_Arm_UMV.get(16), ItemList.ZPM4.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 64) }, + new FluidStack[] { MaterialsUEVplus.Time.getMolten(144_000), MaterialsUEVplus.Space.getMolten(144_000), + FluidUtils.getFluidStack("molten.metastable oganesson", 144 * 256 * 4), + FluidUtils.getFluidStack("molten.shirabon", 144 * 256 * 4), }, + CustomItemList.Machine_Multi_EyeOfHarmony.get(1), + 400 * MINUTES, + (int) TierEU.RECIPE_UMV); + } + + // EOH Spatial Individual Casing + { + TT_recipeAdder.addResearchableAssemblylineRecipe( + // Dyson Swarm Module Deployment Unit Base Casing + getModItem(GalaxySpace.ID, "dysonswarmparts", 1, 2), + 256_000_000, // total comp + 16_384, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + 32, // amperage + new Object[] { + // Space elevator blocks. + getModItem(GTNHIntergalactic.ID, "gt.blockcasingsSE", 64, 0), + // Cosmic neutronium block. + getModItem(Avaritia.ID, "Resource_Block", 64, 0), + GT_OreDictUnificator.get(OrePrefixes.block, Materials.Neutronium, 64), + GT_OreDictUnificator.get(OrePrefixes.nanite, Materials.Neutronium, 48), largeBedrockiumPlate, + largeCosmicNeutroniumPlate, largeShirabonPlate, largeInfinityPlate, + // UV Solar panel + getModItem(SuperSolarPanels.ID, "PhotonicSolarPanel", 1, 0), ItemList.Quantum_Chest_IV.get(1), + // Gravitation Engine + getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3), ItemList.EnergisedTesseract.get(1) }, + + new FluidStack[] { Materials.Neutronium.getMolten(144 * 256 * 4), + Materials.CosmicNeutronium.getMolten(144 * 256 * 4), new FluidStack(solderUEV, 144 * 256 * 2), + MaterialsUEVplus.Space.getMolten(1_440) }, + CustomItemList.EOH_Reinforced_Spatial_Casing.get(4), + 10_000, + (int) TierEU.RECIPE_UMV); + } + + // EOH Spacetime Compression + { + // ME Digital singularity. + final ItemStack ME_Singularity = getModItem( + "appliedenergistics2", + "item.ItemExtremeStorageCell.Singularity", + 1); + final ItemStack baseCasing = CustomItemList.EOH_Reinforced_Spatial_Casing.get(1); + + int baseCompPerSec = 16_384; + + int set; + int tier; + int absoluteTier; + + // T0 - Shirabon + // T1 - White Dwarf Matter + // T2 - White Dwarf Matter + // T3 - White Dwarf Matter + // T4 - Black Dwarf Matter + // T5 - Black Dwarf Matter + // T6 - Black Dwarf Matter + // T7 - Black Dwarf Matter + // T8 - MHDCSM. + + { + tier = 1; + set = 1; + + absoluteTier = 0; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.EOH_Reinforced_Spatial_Casing.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T7 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Cosmic fabric manipulator + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 8), ME_Singularity, + plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier] }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier0.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + + tier++; + absoluteTier = 1; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier0.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T7 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Cosmic fabric manipulator + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 8), ME_Singularity, ME_Singularity, + plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier] }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier1.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + + tier++; + absoluteTier = 2; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier1.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T7 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Cosmic fabric manipulator + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 8), ME_Singularity, ME_Singularity, + ME_Singularity, plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier2.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + } + + { + tier = 1; + set = 2; + absoluteTier = 3; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier2.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T8 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Infinity infused manipulator + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 9), ME_Singularity, ME_Singularity, + ME_Singularity, ME_Singularity, plateList[absoluteTier], + getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier3.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + + tier++; + absoluteTier = 4; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier3.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T8 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Infinity infused manipulator + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 9), ME_Singularity, ME_Singularity, + ME_Singularity, ME_Singularity, ME_Singularity, plateList[absoluteTier], + getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier4.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + + tier++; + absoluteTier = 5; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier4.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T8 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Infinity infused manipulator + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 9), ME_Singularity, ME_Singularity, + ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, plateList[absoluteTier], + getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier5.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + } + + { + tier = 1; + set = 3; + absoluteTier = 6; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier5.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T9 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Spacetime continuum ripper + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 10), ME_Singularity, + ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, + plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier6.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + + tier++; + absoluteTier = 7; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier6.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T9 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Spacetime continuum ripper + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 10), ME_Singularity, + ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, + ME_Singularity, plateList[absoluteTier], getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier7.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + + tier++; + absoluteTier = 8; + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier7.get(1), + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, + // T9 Yotta cell. + getModItem(GoodGenerator.ID, "yottaFluidTankCells", tier, (5 + set)), + // quantum tank V (max tier) + ItemList.Quantum_Tank_IV.get(4 * (1 + absoluteTier)), + // Inf chest + getModItem(AvaritiaAddons.ID, "InfinityChest", absoluteTier + 1), + // Spacetime continuum ripper + getModItem(GTPlusPlus.ID, "gtplusplus.blockcasings.5", tier, 10), ME_Singularity, + ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, ME_Singularity, + ME_Singularity, ME_Singularity, plateList[absoluteTier], + getItemContainer("QuantumCircuit").get(set) }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier], }, + CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(1), + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + } + } + + // EOH Time Dilation Field Generators. + { + final ItemStack baseCasing = CustomItemList.EOH_Reinforced_Temporal_Casing.get(1); + + int baseCompPerSec = 16_384; + + // T0 - Shirabon + // T1 - White Dwarf Matter + // T2 - White Dwarf Matter + // T3 - White Dwarf Matter + // T4 - Black Dwarf Matter + // T5 - Black Dwarf Matter + // T6 - Black Dwarf Matter + // T7 - Black Dwarf Matter + // T8 - MHDCSM. + + final ItemStack[] fusionReactors = new ItemStack[] { ItemList.FusionComputer_ZPMV.get(1), + ItemList.FusionComputer_ZPMV.get(2), ItemList.FusionComputer_ZPMV.get(3), + ItemList.FusionComputer_UV.get(1), ItemList.FusionComputer_UV.get(2), ItemList.FusionComputer_UV.get(3), + // MK4 Fusion Computer. + getModItem(GregTech.ID, "gt.blockmachines", 1, 965), + getModItem(GregTech.ID, "gt.blockmachines", 2, 965), + getModItem(GregTech.ID, "gt.blockmachines", 3, 965) }; + + final ItemStack[] fusionCoils = new ItemStack[] { getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 1), + getModItem(GoodGenerator.ID, "compactFusionCoil", 2, 1), + getModItem(GoodGenerator.ID, "compactFusionCoil", 3, 1), + getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 2), + getModItem(GoodGenerator.ID, "compactFusionCoil", 2, 2), + getModItem(GoodGenerator.ID, "compactFusionCoil", 3, 2), + getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 3), + getModItem(GoodGenerator.ID, "compactFusionCoil", 2, 3), + getModItem(GoodGenerator.ID, "compactFusionCoil", 3, 3) }; + + final ItemStack[] researchStuff = new ItemStack[] { baseCasing, + CustomItemList.TimeAccelerationFieldGeneratorTier0.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier1.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier2.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier3.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier4.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier5.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier6.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier7.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier8.get(1) }; + + // Spectral Components + // Cycling should fix issues with conflicting recipes for T1-T2, T4-T5 & T7-T8 + final ItemStack[] spectralComponents = new ItemStack[] { + // Red Spectral Component + getModItem(SuperSolarPanels.ID, "redcomponent", 64), + // Green Spectral Component + getModItem(SuperSolarPanels.ID, "greencomponent", 64), + // Blue Spectral Component + getModItem(SuperSolarPanels.ID, "bluecomponent", 64) }; + + for (int absoluteTier = 0; absoluteTier < 9; absoluteTier++) { + + TT_recipeAdder.addResearchableAssemblylineRecipe( + researchStuff[absoluteTier], + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { baseCasing, fusionReactors[absoluteTier], fusionCoils[absoluteTier], + // UV Solar panel + getModItem(SuperSolarPanels.ID, "PhotonicSolarPanel", absoluteTier + 1, 0), + + getItemContainer("QuantumCircuit").get(absoluteTier + 1), + // Red Spectral Component + spectralComponents[absoluteTier % spectralComponents.length], + // Green Spectral Component + spectralComponents[(absoluteTier + 1) % spectralComponents.length], + // Blue Spectral Component + spectralComponents[(absoluteTier + 2) % spectralComponents.length], + + plateList[absoluteTier], + // Dyson Swarm Module Deployment Unit Base Casing + getModItem(GalaxySpace.ID, "dysonswarmparts", (absoluteTier + 1) * 4, 2), + // Dyson Swarm Energy Receiver Dish Block + getModItem(GalaxySpace.ID, "dysonswarmparts", (absoluteTier + 1) * 4, 1), + // Ultimate Time Anomaly. + getModItem(GregTech.ID, "gt.blockmachines", (absoluteTier + 1) * 4, 11107), + + ItemList.Energy_Module.get(absoluteTier + 1), GT_OreDictUnificator + .get(OrePrefixes.wireGt01, Materials.SuperconductorUMV, (absoluteTier + 1) * 4), + + }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Time.getMolten(1_440 * (absoluteTier + 1)), specialFluid[absoluteTier] }, + researchStuff[absoluteTier + 1], + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + } + + } + + // EOH Stabilisation Field Generators. + { + final ItemStack baseCasing = CustomItemList.EOH_Infinite_Energy_Casing.get(1); + + int baseCompPerSec = 16_384; + + // T0 - Shirabon + // T1 - White Dwarf Matter + // T2 - White Dwarf Matter + // T3 - White Dwarf Matter + // T4 - Black Dwarf Matter + // T5 - Black Dwarf Matter + // T6 - Black Dwarf Matter + // T7 - Black Dwarf Matter + // T8 - MHDCSM. + + final ItemStack[] researchStuff = new ItemStack[] { baseCasing, + CustomItemList.StabilisationFieldGeneratorTier0.get(1), + CustomItemList.StabilisationFieldGeneratorTier1.get(1), + CustomItemList.StabilisationFieldGeneratorTier2.get(1), + CustomItemList.StabilisationFieldGeneratorTier3.get(1), + CustomItemList.StabilisationFieldGeneratorTier4.get(1), + CustomItemList.StabilisationFieldGeneratorTier5.get(1), + CustomItemList.StabilisationFieldGeneratorTier6.get(1), + CustomItemList.StabilisationFieldGeneratorTier7.get(1), + CustomItemList.StabilisationFieldGeneratorTier8.get(1) }; + + final ItemStack[] timeCasings = new ItemStack[] { CustomItemList.TimeAccelerationFieldGeneratorTier0.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier1.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier2.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier3.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier4.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier5.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier6.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier7.get(1), + CustomItemList.TimeAccelerationFieldGeneratorTier8.get(1) }; + + final ItemStack[] spatialCasings = new ItemStack[] { + CustomItemList.SpacetimeCompressionFieldGeneratorTier0.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier1.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier2.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier3.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier4.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier5.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier6.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier7.get(1), + CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(1) }; + + for (int absoluteTier = 0; absoluteTier < 9; absoluteTier++) { + + // spotless:off + TT_recipeAdder.addResearchableAssemblylineRecipe( + researchStuff[absoluteTier], + (absoluteTier + 1) * 48_000_000, // total comp + (absoluteTier + 1) * baseCompPerSec, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + (absoluteTier + 1) * 8, // amperage + new Object[] { + timeCasings[absoluteTier], + spatialCasings[absoluteTier], + baseCasing, + // Dyson Swarm Module. + getModItem(GalaxySpace.ID, "item.DysonSwarmParts", 4 * (absoluteTier + 1), 0), + + GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUMVBase, 4 * (absoluteTier + 1)), + GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUIVBase, 4 * (absoluteTier + 1)), + GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUEVBase, 4 * (absoluteTier + 1)), + GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Longasssuperconductornameforuhvwire, 4 * (absoluteTier + 1)), + + // Gravitation Engine + getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3), + getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3), + getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3), + getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3), + + plateList[absoluteTier], + getItemContainer("QuantumCircuit").get(2 * (absoluteTier + 1)), + GT_OreDictUnificator.get(OrePrefixes.gearGt, MaterialsUEVplus.SpaceTime, absoluteTier + 1), + GT_OreDictUnificator.get(OrePrefixes.gearGtSmall, MaterialsUEVplus.SpaceTime, absoluteTier + 1) + + + }, + new FluidStack[] { new FluidStack(solderUEV, (int) (2_880 * pow(2L, absoluteTier))), + MaterialsUEVplus.Time.getMolten(1_440 * (absoluteTier + 1)), + MaterialsUEVplus.Space.getMolten(1_440 * (absoluteTier + 1)), + specialFluid[absoluteTier] }, + researchStuff[absoluteTier + 1], + (absoluteTier + 1) * 4_000 * 20, + (int) TierEU.RECIPE_UMV); + // spotless:on + } + + } + + // EOH Reinforced Temporal casings + { + TT_recipeAdder.addResearchableAssemblylineRecipe( + // Ultimate Time Anomaly. + getModItem(GregTech.ID, "gt.blockmachines", 1, 11107), + 256_000_000, // total comp + 16_384, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + 32, // amperage + new Object[] { + // Space elevator blocks. + getModItem(GTNHIntergalactic.ID, "gt.blockcasingsSE", 64, 0), + // Cosmic neutronium block. + getModItem(Avaritia.ID, "Resource_Block", 64, 0), + GT_OreDictUnificator.get(OrePrefixes.block, Materials.Neutronium, 64), + GT_OreDictUnificator.get(OrePrefixes.nanite, Materials.Neutronium, 48), + // Large Bedrockium Plate + largeBedrockiumPlate, largeCosmicNeutroniumPlate, largeShirabonPlate, largeInfinityPlate, + // UV Solar panel + getModItem(SuperSolarPanels.ID, "PhotonicSolarPanel", 1, 0), + // Ultimate Time Anomaly. + getModItem(GregTech.ID, "gt.blockmachines", 4, 11107), + // Gravitation Engine. + getModItem(GraviSuite.ID, "itemSimpleItem", 64, 3), ItemList.EnergisedTesseract.get(1) }, + + new FluidStack[] { Materials.Neutronium.getMolten(144 * 256 * 4), + Materials.CosmicNeutronium.getMolten(144 * 256 * 4), new FluidStack(solderUEV, 144 * 256 * 2), + MaterialsUEVplus.Time.getMolten(1_440) }, + CustomItemList.EOH_Reinforced_Temporal_Casing.get(4), + 10_000, + (int) TierEU.RECIPE_UMV); + } + + // EOH Infinite Spacetime Energy Boundary Casing + { + TT_recipeAdder.addResearchableAssemblylineRecipe( + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 1), + 256_000_000, // total comp + 16_384, // comp/s + (int) TierEU.RECIPE_MAX, // eu/t + 32, // amperage + new Object[] { getModItem(GregTech.ID, "gt.blockmachines", 1, 13106), + // UV Solar panel + getModItem(SuperSolarPanels.ID, "PhotonicSolarPanel", 1, 0), + // UHV Capacitor block + getModItem(KekzTech.ID, "kekztech_lapotronicenergyunit_block", 1, 5), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, Materials.SuperconductorUMV, 4), + + CustomItemList.Machine_Multi_Transformer.get(16), ItemList.Wireless_Hatch_Energy_UMV.get(4), + CustomItemList.eM_energyTunnel5_UMV.get(1), + // High Energy Flow Circuit. + getModItem(NewHorizonsCoreMod.ID, "item.HighEnergyFlowCircuit", 64, 0), + + // Metastable Oganesson Plate. + GT_OreDictUnificator.get("plateMetastableOganesson", 6), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.BlueTopaz, 6), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.CallistoIce, 6), + GT_OreDictUnificator.get(OrePrefixes.plate, Materials.Ledox, 6), + + // Metastable Oganesson Screw. + GT_OreDictUnificator.get("screwMetastableOganesson", 6), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.BlueTopaz, 6), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.CallistoIce, 6), + GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Ledox, 6), }, + + new FluidStack[] { Materials.Neutronium.getMolten(144 * 256 * 16), + Materials.CosmicNeutronium.getMolten(144 * 256 * 16), new FluidStack(solderUEV, 144 * 256 * 8), + MaterialsUEVplus.SpaceTime.getMolten(16_000) }, + CustomItemList.EOH_Infinite_Energy_Casing.get(1), + 10_000, + (int) TierEU.RECIPE_UMV); + } + + // Astral Array Fabricator + TT_recipeAdder.addResearchableAssemblylineRecipe( + CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(1), + 480_000_000, + 32_768, + (int) TierEU.RECIPE_MAX, + 64, + new Object[] { GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.WhiteDwarfMatter, 8), + GT_OreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.BlackDwarfMatter, 8), + ItemList.EnergisedTesseract.get(32), + GT_OreDictUnificator.get(OrePrefixes.nanite, MaterialsUEVplus.Eternity, 16), + CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(64), + CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(64), + CustomItemList.SpacetimeCompressionFieldGeneratorTier8.get(10), + CustomItemList.TimeAccelerationFieldGeneratorTier8.get(64), + CustomItemList.TimeAccelerationFieldGeneratorTier8.get(64), + CustomItemList.TimeAccelerationFieldGeneratorTier8.get(40), + CustomItemList.StabilisationFieldGeneratorTier8.get(48), + CustomItemList.EOH_Infinite_Energy_Casing.get(32), + CustomItemList.EOH_Reinforced_Temporal_Casing.get(64), + CustomItemList.EOH_Reinforced_Spatial_Casing.get(64), ItemList.Field_Generator_UMV.get(16) }, + new FluidStack[] { MaterialsUEVplus.Space.getMolten(32_768L * 64), + MaterialsUEVplus.Eternity.getMolten(16_384L * 64), MaterialsUEVplus.ExcitedDTSC.getFluid(8_192L * 64) }, + CustomItemList.astralArrayFabricator.get(1), + 300 * SECONDS, + (int) TierEU.RECIPE_UXV); + + } + + private void addWirelessEnergyRecipes() { + + Fluid solderUEV = FluidRegistry.getFluid("molten.mutatedlivingsolder") != null + ? FluidRegistry.getFluid("molten.mutatedlivingsolder") + : FluidRegistry.getFluid("molten.solderingalloy"); + + int recipeDurationTicks = 20 * 20; + int recipeEuPerTick = 128_000_000; + + int researchEuPerTick = 128_000_000; + int researchAmperage = 4; + int compPerSecond = 2000; + int totalComputation = 500_000; + + ItemStack[] energyHatches = { ItemList.Hatch_Energy_ULV.get(1), ItemList.Hatch_Energy_LV.get(1), + ItemList.Hatch_Energy_MV.get(1), ItemList.Hatch_Energy_HV.get(1), ItemList.Hatch_Energy_EV.get(1), + ItemList.Hatch_Energy_IV.get(1), ItemList.Hatch_Energy_LuV.get(1), ItemList.Hatch_Energy_ZPM.get(1), + ItemList.Hatch_Energy_UV.get(1), ItemList.Hatch_Energy_MAX.get(1), + getItemContainer("Hatch_Energy_UEV").get(1L), getItemContainer("Hatch_Energy_UIV").get(1L), + getItemContainer("Hatch_Energy_UMV").get(1L), getItemContainer("Hatch_Energy_UXV").get(1L) }; + + ItemStack[] energyHatches_4A = { CustomItemList.eM_energyMulti4_EV.get(1), + CustomItemList.eM_energyMulti4_IV.get(1), CustomItemList.eM_energyMulti4_LuV.get(1), + CustomItemList.eM_energyMulti4_ZPM.get(1), CustomItemList.eM_energyMulti4_UV.get(1), + CustomItemList.eM_energyMulti4_UHV.get(1), CustomItemList.eM_energyMulti4_UEV.get(1), + CustomItemList.eM_energyMulti4_UIV.get(1), CustomItemList.eM_energyMulti4_UMV.get(1), + CustomItemList.eM_energyMulti4_UXV.get(1) }; + + ItemStack[] energyHatches_16A = { CustomItemList.eM_energyMulti16_EV.get(1), + CustomItemList.eM_energyMulti16_IV.get(1), CustomItemList.eM_energyMulti16_LuV.get(1), + CustomItemList.eM_energyMulti16_ZPM.get(1), CustomItemList.eM_energyMulti16_UV.get(1), + CustomItemList.eM_energyMulti16_UHV.get(1), CustomItemList.eM_energyMulti16_UEV.get(1), + CustomItemList.eM_energyMulti16_UIV.get(1), CustomItemList.eM_energyMulti16_UMV.get(1), + CustomItemList.eM_energyMulti16_UXV.get(1) }; + + ItemStack[] energyHatches_64A = { CustomItemList.eM_energyMulti64_EV.get(1), + CustomItemList.eM_energyMulti64_IV.get(1), CustomItemList.eM_energyMulti64_LuV.get(1), + CustomItemList.eM_energyMulti64_ZPM.get(1), CustomItemList.eM_energyMulti64_UV.get(1), + CustomItemList.eM_energyMulti64_UHV.get(1), CustomItemList.eM_energyMulti64_UEV.get(1), + CustomItemList.eM_energyMulti64_UIV.get(1), CustomItemList.eM_energyMulti64_UMV.get(1), + CustomItemList.eM_energyMulti64_UXV.get(1) }; + + ItemStack[] laserTargets_UXV = { CustomItemList.eM_energyTunnel1_UXV.get(1), + CustomItemList.eM_energyTunnel2_UXV.get(1), CustomItemList.eM_energyTunnel3_UXV.get(1), + CustomItemList.eM_energyTunnel4_UXV.get(1), CustomItemList.eM_energyTunnel5_UXV.get(1), + CustomItemList.eM_energyTunnel6_UXV.get(1), CustomItemList.eM_energyTunnel7_UXV.get(1) }; + + ItemStack[] dynamoHatches = { ItemList.Hatch_Dynamo_ULV.get(1), ItemList.Hatch_Dynamo_LV.get(1), + ItemList.Hatch_Dynamo_MV.get(1), ItemList.Hatch_Dynamo_HV.get(1), ItemList.Hatch_Dynamo_EV.get(1), + ItemList.Hatch_Dynamo_IV.get(1), ItemList.Hatch_Dynamo_LuV.get(1), ItemList.Hatch_Dynamo_ZPM.get(1), + ItemList.Hatch_Dynamo_UV.get(1), ItemList.Hatch_Dynamo_MAX.get(1), + getItemContainer("Hatch_Dynamo_UEV").get(1L), getItemContainer("Hatch_Dynamo_UIV").get(1L), + getItemContainer("Hatch_Dynamo_UMV").get(1L), getItemContainer("Hatch_Dynamo_UXV").get(1L) }; + + Object[] circuitsTierPlusTwo = { new Object[] { OrePrefixes.circuit.get(Materials.Good), 1L }, // MV + new Object[] { OrePrefixes.circuit.get(Materials.Advanced), 1L }, // HV + new Object[] { OrePrefixes.circuit.get(Materials.Data), 1L }, // EV + new Object[] { OrePrefixes.circuit.get(Materials.Elite), 1L }, // IV + new Object[] { OrePrefixes.circuit.get(Materials.Master), 1L }, // LuV + new Object[] { OrePrefixes.circuit.get(Materials.Ultimate), 1L }, // ZPM + new Object[] { OrePrefixes.circuit.get(Materials.SuperconductorUHV), 1L }, // UV + new Object[] { OrePrefixes.circuit.get(Materials.Infinite), 1L }, // UHV + new Object[] { OrePrefixes.circuit.get(Materials.Bio), 1L }, // UEV + new Object[] { OrePrefixes.circuit.get(Materials.Optical), 1L }, // UIV + new Object[] { OrePrefixes.circuit.get(Materials.Piko), 1L }, // UMV + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 1L }, // UXV + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 4L }, // MAX (Technically not MAX, can be + // changed once MAX circuits become + // craftable) + new Object[] { OrePrefixes.circuit.get(Materials.Quantum), 16L } // MAX (Technically not MAX, can be + // changed once MAX circuits become + // craftable) + }; + + ItemStack[] wirelessHatches = { ItemList.Wireless_Hatch_Energy_ULV.get(1), + ItemList.Wireless_Hatch_Energy_LV.get(1), ItemList.Wireless_Hatch_Energy_MV.get(1), + ItemList.Wireless_Hatch_Energy_HV.get(1), ItemList.Wireless_Hatch_Energy_EV.get(1), + ItemList.Wireless_Hatch_Energy_IV.get(1), ItemList.Wireless_Hatch_Energy_LuV.get(1), + ItemList.Wireless_Hatch_Energy_ZPM.get(1), ItemList.Wireless_Hatch_Energy_UV.get(1), + ItemList.Wireless_Hatch_Energy_UHV.get(1), ItemList.Wireless_Hatch_Energy_UEV.get(1), + ItemList.Wireless_Hatch_Energy_UIV.get(1), ItemList.Wireless_Hatch_Energy_UMV.get(1), + ItemList.Wireless_Hatch_Energy_UXV.get(1) }; + + ItemStack[] wirelessHatches_4A = { CustomItemList.eM_energyWirelessMulti4_EV.get(1), + CustomItemList.eM_energyWirelessMulti4_IV.get(1), CustomItemList.eM_energyWirelessMulti4_LuV.get(1), + CustomItemList.eM_energyWirelessMulti4_ZPM.get(1), CustomItemList.eM_energyWirelessMulti4_UV.get(1), + CustomItemList.eM_energyWirelessMulti4_UHV.get(1), CustomItemList.eM_energyWirelessMulti4_UEV.get(1), + CustomItemList.eM_energyWirelessMulti4_UIV.get(1), CustomItemList.eM_energyWirelessMulti4_UMV.get(1), + CustomItemList.eM_energyWirelessMulti4_UXV.get(1) }; + + ItemStack[] wirelessHatches_16A = { CustomItemList.eM_energyWirelessMulti16_EV.get(1), + CustomItemList.eM_energyWirelessMulti16_IV.get(1), CustomItemList.eM_energyWirelessMulti16_LuV.get(1), + CustomItemList.eM_energyWirelessMulti16_ZPM.get(1), CustomItemList.eM_energyWirelessMulti16_UV.get(1), + CustomItemList.eM_energyWirelessMulti16_UHV.get(1), CustomItemList.eM_energyWirelessMulti16_UEV.get(1), + CustomItemList.eM_energyWirelessMulti16_UIV.get(1), CustomItemList.eM_energyWirelessMulti16_UMV.get(1), + CustomItemList.eM_energyWirelessMulti16_UXV.get(1) }; + + ItemStack[] wirelessHatches_64A = { CustomItemList.eM_energyWirelessMulti64_EV.get(1), + CustomItemList.eM_energyWirelessMulti64_IV.get(1), CustomItemList.eM_energyWirelessMulti64_LuV.get(1), + CustomItemList.eM_energyWirelessMulti64_ZPM.get(1), CustomItemList.eM_energyWirelessMulti64_UV.get(1), + CustomItemList.eM_energyWirelessMulti64_UHV.get(1), CustomItemList.eM_energyWirelessMulti64_UEV.get(1), + CustomItemList.eM_energyWirelessMulti64_UIV.get(1), CustomItemList.eM_energyWirelessMulti64_UMV.get(1), + CustomItemList.eM_energyWirelessMulti64_UXV.get(1) }; + + ItemStack[] wirelessLasers = { CustomItemList.eM_energyWirelessTunnel1_UXV.get(1), + CustomItemList.eM_energyWirelessTunnel2_UXV.get(1), CustomItemList.eM_energyWirelessTunnel3_UXV.get(1), + CustomItemList.eM_energyWirelessTunnel4_UXV.get(1), CustomItemList.eM_energyWirelessTunnel5_UXV.get(1), + CustomItemList.eM_energyWirelessTunnel6_UXV.get(1), CustomItemList.eM_energyWirelessTunnel7_UXV.get(1) }; + + ItemStack[] wirelessDynamos = { ItemList.Wireless_Dynamo_Energy_ULV.get(1), + ItemList.Wireless_Dynamo_Energy_LV.get(1), ItemList.Wireless_Dynamo_Energy_MV.get(1), + ItemList.Wireless_Dynamo_Energy_HV.get(1), ItemList.Wireless_Dynamo_Energy_EV.get(1), + ItemList.Wireless_Dynamo_Energy_IV.get(1), ItemList.Wireless_Dynamo_Energy_LuV.get(1), + ItemList.Wireless_Dynamo_Energy_ZPM.get(1), ItemList.Wireless_Dynamo_Energy_UV.get(1), + ItemList.Wireless_Dynamo_Energy_UHV.get(1), ItemList.Wireless_Dynamo_Energy_UEV.get(1), + ItemList.Wireless_Dynamo_Energy_UIV.get(1), ItemList.Wireless_Dynamo_Energy_UMV.get(1), + ItemList.Wireless_Dynamo_Energy_UXV.get(1) }; + + // ------------------------ Wireless EU hatches ------------------------ + + for (int i = 0; i < wirelessHatches.length; i++) { + + TT_recipeAdder.addResearchableAssemblylineRecipe( + (i == 0) ? ItemList.Tesseract.get(1) : wirelessHatches[i - 1], + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new Object[] { energyHatches[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1), + ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1), + CustomItemList.eM_Power.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 2), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 1), circuitsTierPlusTwo[i], + ItemList.EnergisedTesseract.get(1) }, + new FluidStack[] { new FluidStack(solderUEV, 1296), MaterialsUEVplus.ExcitedDTEC.getFluid(500L) }, + wirelessHatches[i], + recipeDurationTicks, + recipeEuPerTick); + } + + // ------------------------ 4A Wireless EU hatches ------------------------ + + for (int i = 0; i < wirelessHatches_4A.length; i++) { + + TT_recipeAdder.addResearchableAssemblylineRecipe( + energyHatches_4A[i], + totalComputation * 4, + compPerSecond * 4, + researchEuPerTick, + researchAmperage * 2, + new Object[] { energyHatches_4A[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 1), + ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1), + CustomItemList.eM_Power.get(4), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 4), + GT_OreDictUnificator.get("plateTripleShirabon", 4L), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Flerovium, 4), + circuitsTierPlusTwo[i + 4], ItemList.EnergisedTesseract.get(1) }, + new FluidStack[] { new FluidStack(solderUEV, 1_296 * 4), + MaterialsUEVplus.ExcitedDTEC.getFluid(500L * 4) }, + wirelessHatches_4A[i], + recipeDurationTicks, + recipeEuPerTick); + } + + // ------------------------ 16A Wireless EU hatches ------------------------ + + for (int i = 0; i < wirelessHatches_16A.length; i++) { + + TT_recipeAdder.addResearchableAssemblylineRecipe( + energyHatches_16A[i], + totalComputation * 16, + compPerSecond * 16, + researchEuPerTick, + researchAmperage * 4, + new Object[] { energyHatches_16A[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 2), + ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1), + CustomItemList.eM_Power.get(16), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 16), + GT_OreDictUnificator.get("plateTripleShirabon", 16L), + GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.TranscendentMetal, 4), + circuitsTierPlusTwo[i + 4], ItemList.EnergisedTesseract.get(1) }, + new FluidStack[] { new FluidStack(solderUEV, 1_296 * 16), + MaterialsUEVplus.ExcitedDTEC.getFluid(500L * 16) }, + wirelessHatches_16A[i], + recipeDurationTicks, + recipeEuPerTick); + } + + // ------------------------ 64A Wireless EU hatches ------------------------ + + for (int i = 0; i < wirelessHatches_64A.length; i++) { + + TT_recipeAdder.addResearchableAssemblylineRecipe( + energyHatches_64A[i], + totalComputation * 64, + compPerSecond * 64, + researchEuPerTick, + researchAmperage * 8, + new Object[] { energyHatches_64A[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 3), + ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1), + CustomItemList.eM_Power.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 64), + GT_OreDictUnificator.get("plateTripleShirabon", 64L), + GT_OreDictUnificator.get("plateDenseMetastableOganesson", 4), circuitsTierPlusTwo[i + 4], + ItemList.EnergisedTesseract.get(1) }, + new FluidStack[] { new FluidStack(solderUEV, 1_296 * 64), + MaterialsUEVplus.ExcitedDTEC.getFluid(500L * 64) }, + wirelessHatches_64A[i], + recipeDurationTicks, + recipeEuPerTick); + } + + // ------------------------ Wireless UXV Lasers ------------------------ + + for (int i = 0; i < wirelessLasers.length; i++) { + + TT_recipeAdder.addResearchableAssemblylineRecipe( + laserTargets_UXV[i], + totalComputation * 64, + compPerSecond * 64, + researchEuPerTick * 4, + researchAmperage * 16, + new Object[] { laserTargets_UXV[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1, 4), + // Dyson Swarm Module Deployment Unit Superconducting Magnet + getModItem(GalaxySpace.ID, "dysonswarmparts", 1, 4), + CustomItemList.Machine_Multi_Transformer.get(1), CustomItemList.eM_Power.get(64), + GT_OreDictUnificator.get(OrePrefixes.wireGt16, MaterialsUEVplus.SpaceTime, 64), + GT_OreDictUnificator.get(OrePrefixes.plateDense, MaterialsUEVplus.Eternity, 32), + GT_OreDictUnificator + .get(OrePrefixes.plateDense, MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter, 16), + GT_OreDictUnificator.get(OrePrefixes.circuit, Materials.Quantum, 16L), + ItemList.EnergisedTesseract.get(1) }, + new FluidStack[] { new FluidStack(solderUEV, 1_296 * 64 * 4), + MaterialsUEVplus.ExcitedDTSC.getFluid(500L * 64) }, + wirelessLasers[i], + recipeDurationTicks, + recipeEuPerTick); + } + + // ------------------------ Wireless EU dynamos ------------------------ + + for (int i = 0; i < wirelessHatches.length; i++) { + + TT_recipeAdder.addResearchableAssemblylineRecipe( + (i == 0) ? ItemList.EnergisedTesseract.get(1) : wirelessDynamos[i - 1], + totalComputation, + compPerSecond, + researchEuPerTick, + researchAmperage, + new Object[] { dynamoHatches[i], getModItem(GoodGenerator.ID, "compactFusionCoil", 1), + ItemList.Casing_Coil_Superconductor.get(1), CustomItemList.Machine_Multi_Transformer.get(1), + CustomItemList.eM_Power.get(2), + GT_OreDictUnificator.get(OrePrefixes.wireGt01, MaterialsUEVplus.SpaceTime, 2), + GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Infinity, 1), circuitsTierPlusTwo[i], + ItemList.EnergisedTesseract.get(1) }, + new FluidStack[] { new FluidStack(solderUEV, 1296), MaterialsUEVplus.ExcitedDTEC.getFluid(500L) }, + wirelessDynamos[i], + recipeDurationTicks, + recipeEuPerTick); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java b/tectech/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java new file mode 100644 index 0000000000..e410eec6b4 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/thing/CoverLoader.java @@ -0,0 +1,48 @@ +package com.github.technus.tectech.loader.thing; + +import net.minecraft.item.ItemStack; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.cover.GT_Cover_TM_EnderFluidLink; +import com.github.technus.tectech.thing.cover.GT_Cover_TM_PowerPassUpgrade; +import com.github.technus.tectech.thing.cover.GT_Cover_TM_TeslaCoil; +import com.github.technus.tectech.thing.cover.GT_Cover_TM_TeslaCoil_Ultimate; +import com.github.technus.tectech.thing.item.EnderFluidLinkCover; +import com.github.technus.tectech.thing.item.PowerPassUpgradeCover; +import com.github.technus.tectech.thing.item.TeslaCoilCover; + +import gregtech.api.GregTech_API; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.objects.GT_RenderedTexture; + +public class CoverLoader implements Runnable { + + public void run() { + final IIconContainer TESLA_OVERLAY = new Textures.BlockIcons.CustomIcon("iconsets/TESLA_OVERLAY"); + final IIconContainer TESLA_OVERLAY_ULTIMATE = new Textures.BlockIcons.CustomIcon( + "iconsets/TESLA_OVERLAY_ULTIMATE"); + final IIconContainer ENDERFLUIDLINK_OVERLAY = new Textures.BlockIcons.CustomIcon( + "iconsets/ENDERFLUIDLINK_OVERLAY"); + final IIconContainer POWERPASSUPGRADE_OVERLAY = new Textures.BlockIcons.CustomIcon( + "iconsets/POWERPASSUPGRADE_OVERLAY"); + + GregTech_API.registerCover( + new ItemStack(TeslaCoilCover.INSTANCE, 1, 0), + new GT_RenderedTexture(TESLA_OVERLAY), + new GT_Cover_TM_TeslaCoil()); + GregTech_API.registerCover( + new ItemStack(TeslaCoilCover.INSTANCE, 1, 1), + new GT_RenderedTexture(TESLA_OVERLAY_ULTIMATE), + new GT_Cover_TM_TeslaCoil_Ultimate()); + GregTech_API.registerCover( + new ItemStack(EnderFluidLinkCover.INSTANCE, 1, 0), + new GT_RenderedTexture(ENDERFLUIDLINK_OVERLAY), + new GT_Cover_TM_EnderFluidLink()); + GregTech_API.registerCover( + new ItemStack(PowerPassUpgradeCover.INSTANCE, 1, 0), + new GT_RenderedTexture(POWERPASSUPGRADE_OVERLAY), + new GT_Cover_TM_PowerPassUpgrade()); + TecTech.LOGGER.info("Cover functionality registered"); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java b/tectech/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java new file mode 100644 index 0000000000..13681d2637 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java @@ -0,0 +1,2101 @@ +package com.github.technus.tectech.loader.thing; + +import static com.github.technus.tectech.thing.CustomItemList.DATApipe; +import static com.github.technus.tectech.thing.CustomItemList.DATApipeBlock; +import static com.github.technus.tectech.thing.CustomItemList.LASERpipe; +import static com.github.technus.tectech.thing.CustomItemList.LASERpipeBlock; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_IV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_LuV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UEV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UHV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UIV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UMV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_UXV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_BuckConverter_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.Machine_DebugGenny; +import static com.github.technus.tectech.thing.CustomItemList.Machine_DebugPollutor; +import static com.github.technus.tectech.thing.CustomItemList.Machine_DebugWriter; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Computer; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_DataBank; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_EyeOfHarmony; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_ForgeOfGods; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Infuser; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Microwave; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_MoltenModule; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_PlasmaModule; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_QuarkGluonPlasmaModule; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Research; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_SmeltingModule; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Switch; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_TeslaCoil; +import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Transformer; +import static com.github.technus.tectech.thing.CustomItemList.Machine_OwnerDetector; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_EV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_HV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_IV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_LV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_1by1_MV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_EV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_HV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_IV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_LV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_2by2_MV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_EV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_HV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_IV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_LV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_3by3_MV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_EV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_HV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_IV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_LV; +import static com.github.technus.tectech.thing.CustomItemList.Machine_TeslaCoil_4by4_MV; +import static com.github.technus.tectech.thing.CustomItemList.ParametrizerTXT_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.ParametrizerX_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.Parametrizer_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.UncertaintyX_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.Uncertainty_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.UnusedStuff; +import static com.github.technus.tectech.thing.CustomItemList.capacitor_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.dataInAss_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.dataIn_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.dataOutAss_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.dataOut_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti16_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti4_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoMulti64_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel1_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel2_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel3_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel4_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel5_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel6_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel7_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_dynamoTunnel9001; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti16_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti4_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyMulti64_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel1_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel2_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel3_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel4_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel5_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel6_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel7_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyTunnel9001; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_MAX; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti16_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_MAX; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti4_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_EV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_IV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_LuV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_MAX; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UEV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UHV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UIV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UMV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessMulti64_ZPM; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel1_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel2_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel3_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel4_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel5_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel6_UXV; +import static com.github.technus.tectech.thing.CustomItemList.eM_energyWirelessTunnel7_UXV; +import static com.github.technus.tectech.thing.CustomItemList.hatch_CreativeData; +import static com.github.technus.tectech.thing.CustomItemList.hatch_CreativeMaintenance; +import static com.github.technus.tectech.thing.CustomItemList.hatch_CreativeUncertainty; +import static com.github.technus.tectech.thing.CustomItemList.holder_Hatch; +import static com.github.technus.tectech.thing.CustomItemList.rack_Hatch; +import static com.github.technus.tectech.util.CommonValues.V; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; + +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Capacitor; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_CreativeData; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_CreativeMaintenance; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_CreativeUncertainty; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoTunnel; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyTunnel; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Holder; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputData; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputDataItems; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputData; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputDataItems; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Param; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_ParamText; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Rack; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Uncertainty; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_WirelessMulti; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_EyeOfHarmony; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_ForgeOfGods; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_computer; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_dataBank; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_infuser; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_research; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_switch; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_transformer; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_TM_microwave; +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_TM_teslaCoil; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_PipeBlock_Data; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_PipeBlock_Energy; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Energy; +import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_BuckConverter; +import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_DebugPollutor; +import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_DebugPowerGenerator; +import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_DebugStructureWriter; +import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_OwnerDetector; +import com.github.technus.tectech.thing.metaTileEntity.single.GT_MetaTileEntity_TeslaCoil; + +/** + * Created by danie_000 on 16.11.2016. + */ +public class MachineLoader implements Runnable { + + @Override + public void run() { + + // =================================================================================================== + // Multi AMP Power INPUTS + // =================================================================================================== + eM_energyMulti4_EV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15109, "hatch.energymulti04.tier.04", "EV 4A Energy Hatch", 4, 4) + .getStackForm(1L)); + eM_energyMulti16_EV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15119, "hatch.energymulti16.tier.04", "EV 16A Energy Hatch", 4, 16) + .getStackForm(1L)); + eM_energyMulti64_EV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15129, "hatch.energymulti64.tier.04", "EV 64A Energy Hatch", 4, 64) + .getStackForm(1L)); + + eM_energyMulti4_IV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15100, "hatch.energymulti04.tier.05", "IV 4A Energy Hatch", 5, 4) + .getStackForm(1L)); + eM_energyMulti16_IV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15110, "hatch.energymulti16.tier.05", "IV 16A Energy Hatch", 5, 16) + .getStackForm(1L)); + eM_energyMulti64_IV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15120, "hatch.energymulti64.tier.05", "IV 64A Energy Hatch", 5, 64) + .getStackForm(1L)); + + eM_energyMulti4_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15101, "hatch.energymulti04.tier.06", "LuV 4A Energy Hatch", 6, 4) + .getStackForm(1L)); + eM_energyMulti16_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15111, "hatch.energymulti16.tier.06", "LuV 16A Energy Hatch", 6, 16) + .getStackForm(1L)); + eM_energyMulti64_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15121, "hatch.energymulti64.tier.06", "LuV 64A Energy Hatch", 6, 64) + .getStackForm(1L)); + + eM_energyMulti4_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15102, "hatch.energymulti04.tier.07", "ZPM 4A Energy Hatch", 7, 4) + .getStackForm(1L)); + eM_energyMulti16_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15112, "hatch.energymulti16.tier.07", "ZPM 16A Energy Hatch", 7, 16) + .getStackForm(1L)); + eM_energyMulti64_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15122, "hatch.energymulti64.tier.07", "ZPM 64A Energy Hatch", 7, 64) + .getStackForm(1L)); + + eM_energyMulti4_UV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15103, "hatch.energymulti04.tier.08", "UV 4A Energy Hatch", 8, 4) + .getStackForm(1L)); + eM_energyMulti16_UV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15113, "hatch.energymulti16.tier.08", "UV 16A Energy Hatch", 8, 16) + .getStackForm(1L)); + eM_energyMulti64_UV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15123, "hatch.energymulti64.tier.08", "UV 64A Energy Hatch", 8, 64) + .getStackForm(1L)); + + eM_energyMulti4_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15104, "hatch.energymulti04.tier.09", "UHV 4A Energy Hatch", 9, 4) + .getStackForm(1L)); + eM_energyMulti16_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15114, "hatch.energymulti16.tier.09", "UHV 16A Energy Hatch", 9, 16) + .getStackForm(1L)); + eM_energyMulti64_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15124, "hatch.energymulti64.tier.09", "UHV 64A Energy Hatch", 9, 64) + .getStackForm(1L)); + + eM_energyMulti4_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15105, "hatch.energymulti04.tier.10", "UEV 4A Energy Hatch", 10, 4) + .getStackForm(1L)); + eM_energyMulti16_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti( + 15115, + "hatch.energymulti16.tier.10", + "UEV 16A Energy Hatch", + 10, + 16).getStackForm(1L)); + eM_energyMulti64_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti( + 15125, + "hatch.energymulti64.tier.10", + "UEV 64A Energy Hatch", + 10, + 64).getStackForm(1L)); + + eM_energyMulti4_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15106, "hatch.energymulti04.tier.11", "UIV 4A Energy Hatch", 11, 4) + .getStackForm(1L)); + eM_energyMulti16_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti( + 15116, + "hatch.energymulti16.tier.11", + "UIV 16A Energy Hatch", + 11, + 16).getStackForm(1L)); + eM_energyMulti64_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti( + 15126, + "hatch.energymulti64.tier.11", + "UIV 64A Energy Hatch", + 11, + 64).getStackForm(1L)); + + eM_energyMulti4_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15107, "hatch.energymulti04.tier.12", "UMV 4A Energy Hatch", 12, 4) + .getStackForm(1L)); + eM_energyMulti16_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti( + 15117, + "hatch.energymulti16.tier.12", + "UMV 16A Energy Hatch", + 12, + 16).getStackForm(1L)); + eM_energyMulti64_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti( + 15127, + "hatch.energymulti64.tier.12", + "UMV 64A Energy Hatch", + 12, + 64).getStackForm(1L)); + + eM_energyMulti4_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti(15108, "hatch.energymulti04.tier.13", "UXV 4A Energy Hatch", 13, 4) + .getStackForm(1L)); + eM_energyMulti16_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti( + 15118, + "hatch.energymulti16.tier.13", + "UXV 16A Energy Hatch", + 13, + 16).getStackForm(1L)); + eM_energyMulti64_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyMulti( + 15128, + "hatch.energymulti64.tier.13", + "UXV 64A Energy Hatch", + 13, + 64).getStackForm(1L)); + // =================================================================================================== + // Multi AMP Wireless INPUTS + // =================================================================================================== + eM_energyWirelessMulti4_EV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15065, + "hatch.energywirelessmulti04.tier.04", + "EV 4A Wireless Energy Hatch", + 4, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_EV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15066, + "hatch.energywirelessmulti16.tier.04", + "EV 16A Wireless Energy Hatch", + 4, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_EV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15067, + "hatch.energywirelessmulti64.tier.04", + "EV 64A Wireless Energy Hatch", + 4, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_IV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15068, + "hatch.energywirelessmulti04.tier.05", + "IV 4A Wireless Energy Hatch", + 5, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_IV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15069, + "hatch.energywirelessmulti16.tier.05", + "IV 16A Wireless Energy Hatch", + 5, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_IV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15070, + "hatch.energywirelessmulti64.tier.05", + "IV 64A Wireless Energy Hatch", + 5, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_LuV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15071, + "hatch.energywirelessmulti04.tier.06", + "LuV 4A Wireless Energy Hatch", + 6, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_LuV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15072, + "hatch.energywirelessmulti16.tier.06", + "LuV 16A Wireless Energy Hatch", + 6, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_LuV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15073, + "hatch.energywirelessmulti64.tier.06", + "LuV 64A Wireless Energy Hatch", + 6, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_ZPM.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15074, + "hatch.energywirelessmulti04.tier.07", + "ZPM 4A Wireless Energy Hatch", + 7, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_ZPM.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15075, + "hatch.energywirelessmulti16.tier.07", + "ZPM 16A Wireless Energy Hatch", + 7, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_ZPM.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15076, + "hatch.energywirelessmulti64.tier.07", + "ZPM 64A Wireless Energy Hatch", + 7, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_UV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15077, + "hatch.energywirelessmulti04.tier.08", + "UV 4A Wireless Energy Hatch", + 8, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_UV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15078, + "hatch.energywirelessmulti16.tier.08", + "UV 16A Wireless Energy Hatch", + 8, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_UV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15079, + "hatch.energywirelessmulti64.tier.08", + "UV 64A Wireless Energy Hatch", + 8, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_UHV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15080, + "hatch.energywirelessmulti04.tier.09", + "UHV 4A Wireless Energy Hatch", + 9, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_UHV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15081, + "hatch.energywirelessmulti16.tier.09", + "UHV 16A Wireless Energy Hatch", + 9, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_UHV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15082, + "hatch.energywirelessmulti64.tier.09", + "UHV 64A Wireless Energy Hatch", + 9, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_UEV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15083, + "hatch.energywirelessmulti04.tier.10", + "UEV 4A Wireless Energy Hatch", + 10, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_UEV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15084, + "hatch.energywirelessmulti16.tier.10", + "UEV 16A Wireless Energy Hatch", + 10, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_UEV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15085, + "hatch.energywirelessmulti64.tier.10", + "UEV 64A Wireless Energy Hatch", + 10, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_UIV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15086, + "hatch.energywirelessmulti04.tier.11", + "UIV 4A Wireless Energy Hatch", + 11, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_UIV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15087, + "hatch.energywirelessmulti16.tier.11", + "UIV 16A Wireless Energy Hatch", + 11, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_UIV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15088, + "hatch.energywirelessmulti64.tier.11", + "UIV 64A Wireless Energy Hatch", + 11, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_UMV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15089, + "hatch.energywirelessmulti04.tier.12", + "UMV 4A Wireless Energy Hatch", + 12, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_UMV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15090, + "hatch.energywirelessmulti16.tier.12", + "UMV 16A Wireless Energy Hatch", + 12, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_UMV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15091, + "hatch.energywirelessmulti64.tier.12", + "UMV 64A Wireless Energy Hatch", + 12, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15092, + "hatch.energywirelessmulti04.tier.13", + "UXV 4A Wireless Energy Hatch", + 13, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15093, + "hatch.energywirelessmulti16.tier.13", + "UXV 16A Wireless Energy Hatch", + 13, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15094, + "hatch.energywirelessmulti64.tier.13", + "UXV 64A Wireless Energy Hatch", + 13, + 64).getStackForm(1L)); + eM_energyWirelessMulti4_MAX.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15095, + "hatch.energywirelessmulti04.tier.14", + "MAX 4A Wireless Energy Hatch", + 14, + 4).getStackForm(1L)); + eM_energyWirelessMulti16_MAX.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15096, + "hatch.energywirelessmulti16.tier.14", + "MAX 16A Wireless Energy Hatch", + 14, + 16).getStackForm(1L)); + eM_energyWirelessMulti64_MAX.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15097, + "hatch.energywirelessmulti64.tier.14", + "MAX 64A Wireless Energy Hatch", + 14, + 64).getStackForm(1L)); + + eM_energyWirelessTunnel1_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15500, + "hatch.energywirelesstunnel1.tier.13", + "UXV 256A Wireless Energy Hatch", + 13, + 256).getStackForm(1L)); + eM_energyWirelessTunnel2_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15501, + "hatch.energywirelesstunnel2.tier.13", + "UXV 1,024A Wireless Energy Hatch", + 13, + 1024).getStackForm(1L)); + eM_energyWirelessTunnel3_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15502, + "hatch.energywirelesstunnel3.tier.13", + "UXV 4,096A Wireless Energy Hatch", + 13, + 4096).getStackForm(1L)); + eM_energyWirelessTunnel4_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15503, + "hatch.energywirelesstunnel4.tier.13", + "UXV 16,384A Wireless Energy Hatch", + 13, + 16384).getStackForm(1L)); + eM_energyWirelessTunnel5_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15504, + "hatch.energywirelesstunnel5.tier.13", + "UXV 65,536A Wireless Energy Hatch", + 13, + 65536).getStackForm(1L)); + eM_energyWirelessTunnel6_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15505, + "hatch.energywirelesstunnel6.tier.13", + "UXV 262,144A Wireless Energy Hatch", + 13, + 262144).getStackForm(1L)); + eM_energyWirelessTunnel7_UXV.set( + new GT_MetaTileEntity_Hatch_WirelessMulti( + 15506, + "hatch.energywirelesstunnel7.tier.13", + "UXV 1,048,576A Wireless Energy Hatch", + 13, + 1048576).getStackForm(1L)); + // =================================================================================================== + // Multi AMP Laser INPUTS + // =================================================================================================== + + eM_energyTunnel1_IV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15130, + "hatch.energytunnel1.tier.05", + "IV 256A/t Laser Target Hatch", + 5, + 256).getStackForm(1L)); + eM_energyTunnel2_IV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15140, + "hatch.energytunnel2.tier.05", + "IV 1,024A/t Laser Target Hatch", + 5, + 1024).getStackForm(1L)); + eM_energyTunnel3_IV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15150, + "hatch.energytunnel3.tier.05", + "IV 4,096A/t Laser Target Hatch", + 5, + 4096).getStackForm(1L)); + eM_energyTunnel4_IV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15160, + "hatch.energytunnel4.tier.05", + "IV 16,384A/t Laser Target Hatch", + 5, + 16384).getStackForm(1L)); + eM_energyTunnel5_IV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15170, + "hatch.energytunnel5.tier.05", + "IV 65,536A/t Laser Target Hatch", + 5, + 65536).getStackForm(1L)); + eM_energyTunnel6_IV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15180, + "hatch.energytunnel6.tier.05", + "IV 262,144A/t Laser Target Hatch", + 5, + 262144).getStackForm(1L)); + eM_energyTunnel7_IV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15190, + "hatch.energytunnel7.tier.05", + "IV 1,048,576A/t Laser Target Hatch", + 5, + 1048576).getStackForm(1L)); + + eM_energyTunnel1_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15131, + "hatch.energytunnel1.tier.06", + "LuV 256A/t Laser Target Hatch", + 6, + 256).getStackForm(1L)); + eM_energyTunnel2_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15141, + "hatch.energytunnel2.tier.06", + "LuV 1,024A/t Laser Target Hatch", + 6, + 1024).getStackForm(1L)); + eM_energyTunnel3_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15151, + "hatch.energytunnel3.tier.06", + "LuV 4,096A/t Laser Target Hatch", + 6, + 4096).getStackForm(1L)); + eM_energyTunnel4_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15161, + "hatch.energytunnel4.tier.06", + "LuV 16,384A/t Laser Target Hatch", + 6, + 16384).getStackForm(1L)); + eM_energyTunnel5_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15171, + "hatch.energytunnel5.tier.06", + "LuV 65,536A/t Laser Target Hatch", + 6, + 65536).getStackForm(1L)); + eM_energyTunnel6_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15181, + "hatch.energytunnel6.tier.06", + "LuV 262,144A/t Laser Target Hatch", + 6, + 262144).getStackForm(1L)); + eM_energyTunnel7_LuV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15191, + "hatch.energytunnel7.tier.06", + "LuV 1,048,576A/t Laser Target Hatch", + 6, + 1048576).getStackForm(1L)); + + eM_energyTunnel1_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15132, + "hatch.energytunnel1.tier.07", + "ZPM 256A/t Laser Target Hatch", + 7, + 256).getStackForm(1L)); + eM_energyTunnel2_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15142, + "hatch.energytunnel2.tier.07", + "ZPM 1,024A/t Laser Target Hatch", + 7, + 1024).getStackForm(1L)); + eM_energyTunnel3_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15152, + "hatch.energytunnel3.tier.07", + "ZPM 4,096A/t Laser Target Hatch", + 7, + 4096).getStackForm(1L)); + eM_energyTunnel4_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15162, + "hatch.energytunnel4.tier.07", + "ZPM 16,384A/t Laser Target Hatch", + 7, + 16384).getStackForm(1L)); + eM_energyTunnel5_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15172, + "hatch.energytunnel5.tier.07", + "ZPM 65,536A/t Laser Target Hatch", + 7, + 65536).getStackForm(1L)); + eM_energyTunnel6_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15182, + "hatch.energytunnel6.tier.07", + "ZPM 262,144A/t Laser Target Hatch", + 7, + 262144).getStackForm(1L)); + eM_energyTunnel7_ZPM.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15192, + "hatch.energytunnel7.tier.07", + "ZPM 1,048,576A/t Laser Target Hatch", + 7, + 1048576).getStackForm(1L)); + + eM_energyTunnel1_UV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15133, + "hatch.energytunnel1.tier.08", + "UV 256A/t Laser Target Hatch", + 8, + 256).getStackForm(1L)); + eM_energyTunnel2_UV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15143, + "hatch.energytunnel2.tier.08", + "UV 1,024A/t Laser Target Hatch", + 8, + 1024).getStackForm(1L)); + eM_energyTunnel3_UV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15153, + "hatch.energytunnel3.tier.08", + "UV 4,096A/t Laser Target Hatch", + 8, + 4096).getStackForm(1L)); + eM_energyTunnel4_UV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15163, + "hatch.energytunnel4.tier.08", + "UV 16,384A/t Laser Target Hatch", + 8, + 16384).getStackForm(1L)); + eM_energyTunnel5_UV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15173, + "hatch.energytunnel5.tier.08", + "UV 65,536A/t Laser Target Hatch", + 8, + 65536).getStackForm(1L)); + eM_energyTunnel6_UV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15183, + "hatch.energytunnel6.tier.08", + "UV 262,144A/t Laser Target Hatch", + 8, + 262144).getStackForm(1L)); + eM_energyTunnel7_UV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15193, + "hatch.energytunnel7.tier.08", + "UV 1,048,576A/t Laser Target Hatch", + 8, + 1048576).getStackForm(1L)); + + eM_energyTunnel1_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15134, + "hatch.energytunnel1.tier.09", + "UHV 256A/t Laser Target Hatch", + 9, + 256).getStackForm(1L)); + eM_energyTunnel2_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15144, + "hatch.energytunnel2.tier.09", + "UHV 1,024A/t Laser Target Hatch", + 9, + 1024).getStackForm(1L)); + eM_energyTunnel3_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15154, + "hatch.energytunnel3.tier.09", + "UHV 4,096A/t Laser Target Hatch", + 9, + 4096).getStackForm(1L)); + eM_energyTunnel4_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15164, + "hatch.energytunnel4.tier.09", + "UHV 16,384A/t Laser Target Hatch", + 9, + 16384).getStackForm(1L)); + eM_energyTunnel5_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15174, + "hatch.energytunnel5.tier.09", + "UHV 65,536A/t Laser Target Hatch", + 9, + 65536).getStackForm(1L)); + eM_energyTunnel6_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15184, + "hatch.energytunnel6.tier.09", + "UHV 262,144A/t Laser Target Hatch", + 9, + 262144).getStackForm(1L)); + eM_energyTunnel7_UHV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15194, + "hatch.energytunnel7.tier.09", + "UHV 1,048,576A/t Laser Target Hatch", + 9, + 1048576).getStackForm(1L)); + + eM_energyTunnel1_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15135, + "hatch.energytunnel1.tier.10", + "UEV 256A/t Laser Target Hatch", + 10, + 256).getStackForm(1L)); + eM_energyTunnel2_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15145, + "hatch.energytunnel2.tier.10", + "UEV 1,024A/t Laser Target Hatch", + 10, + 1024).getStackForm(1L)); + eM_energyTunnel3_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15155, + "hatch.energytunnel3.tier.10", + "UEV 4,096A/t Laser Target Hatch", + 10, + 4096).getStackForm(1L)); + eM_energyTunnel4_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15165, + "hatch.energytunnel4.tier.10", + "UEV 16,384A/t Laser Target Hatch", + 10, + 16384).getStackForm(1L)); + eM_energyTunnel5_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15175, + "hatch.energytunnel5.tier.10", + "UEV 65,536A/t Laser Target Hatch", + 10, + 65536).getStackForm(1L)); + eM_energyTunnel6_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15185, + "hatch.energytunnel6.tier.10", + "UEV 262,144A/t Laser Target Hatch", + 10, + 262144).getStackForm(1L)); + eM_energyTunnel7_UEV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15195, + "hatch.energytunnel7.tier.10", + "UEV 1,048,576A/t Laser Target Hatch", + 10, + 1048576).getStackForm(1L)); + + eM_energyTunnel1_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15136, + "hatch.energytunnel1.tier.11", + "UIV 256A/t Laser Target Hatch", + 11, + 256).getStackForm(1L)); + eM_energyTunnel2_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15146, + "hatch.energytunnel2.tier.11", + "UIV 1,024A/t Laser Target Hatch", + 11, + 1024).getStackForm(1L)); + eM_energyTunnel3_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15156, + "hatch.energytunnel3.tier.11", + "UIV 4,096A/t Laser Target Hatch", + 11, + 4096).getStackForm(1L)); + eM_energyTunnel4_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15166, + "hatch.energytunnel4.tier.11", + "UIV 16,384A/t Laser Target Hatch", + 11, + 16384).getStackForm(1L)); + eM_energyTunnel5_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15176, + "hatch.energytunnel5.tier.11", + "UIV 65,536A/t Laser Target Hatch", + 11, + 65536).getStackForm(1L)); + eM_energyTunnel6_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15186, + "hatch.energytunnel6.tier.11", + "UIV 262,144A/t Laser Target Hatch", + 11, + 262144).getStackForm(1L)); + eM_energyTunnel7_UIV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15196, + "hatch.energytunnel7.tier.11", + "UIV 1,048,576A/t Laser Target Hatch", + 11, + 1048576).getStackForm(1L)); + + eM_energyTunnel1_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15137, + "hatch.energytunnel1.tier.12", + "UMV 256A/t Laser Target Hatch", + 12, + 256).getStackForm(1L)); + eM_energyTunnel2_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15147, + "hatch.energytunnel2.tier.12", + "UMV 1,024A/t Laser Target Hatch", + 12, + 1024).getStackForm(1L)); + eM_energyTunnel3_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15157, + "hatch.energytunnel3.tier.12", + "UMV 4,096A/t Laser Target Hatch", + 12, + 4096).getStackForm(1L)); + eM_energyTunnel4_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15167, + "hatch.energytunnel4.tier.12", + "UMV 16,384A/t Laser Target Hatch", + 12, + 16384).getStackForm(1L)); + eM_energyTunnel5_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15177, + "hatch.energytunnel5.tier.12", + "UMV 65,536A/t Laser Target Hatch", + 12, + 65536).getStackForm(1L)); + eM_energyTunnel6_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15187, + "hatch.energytunnel6.tier.12", + "UMV 262,144A/t Laser Target Hatch", + 12, + 262144).getStackForm(1L)); + eM_energyTunnel7_UMV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15197, + "hatch.energytunnel7.tier.12", + "UMV 1,048,576A/t Laser Target Hatch", + 12, + 1048576).getStackForm(1L)); + + eM_energyTunnel1_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15138, + "hatch.energytunnel1.tier.13", + "UXV 256A/t Laser Target Hatch", + 13, + 256).getStackForm(1L)); + eM_energyTunnel2_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15148, + "hatch.energytunnel2.tier.13", + "UXV 1,024A/t Laser Target Hatch", + 13, + 1024).getStackForm(1L)); + eM_energyTunnel3_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15158, + "hatch.energytunnel3.tier.13", + "UXV 4,096A/t Laser Target Hatch", + 13, + 4096).getStackForm(1L)); + eM_energyTunnel4_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15168, + "hatch.energytunnel4.tier.13", + "UXV 16,384A/t Laser Target Hatch", + 13, + 16384).getStackForm(1L)); + eM_energyTunnel5_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15178, + "hatch.energytunnel5.tier.13", + "UXV 65,536A/t Laser Target Hatch", + 13, + 65536).getStackForm(1L)); + eM_energyTunnel6_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15188, + "hatch.energytunnel6.tier.13", + "UXV 262,144A/t Laser Target Hatch", + 13, + 262144).getStackForm(1L)); + eM_energyTunnel7_UXV.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15198, + "hatch.energytunnel7.tier.13", + "UXV 1,048,576A/t Laser Target Hatch", + 13, + 1048576).getStackForm(1L)); + eM_energyTunnel9001.set( + new GT_MetaTileEntity_Hatch_EnergyTunnel( + 15199, + "hatch.energytunnel.tier.14", + "Legendary Laser Target Hatch", + 13, + (int) V[13]).getStackForm(1L)); + + // =================================================================================================== + // Multi AMP Power OUTPUTS + // =================================================================================================== + eM_dynamoMulti4_EV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15209, "hatch.dynamomulti04.tier.04", "EV 4A Dynamo Hatch", 4, 4) + .getStackForm(1L)); + eM_dynamoMulti16_EV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15219, "hatch.dynamomulti16.tier.04", "EV 16A Dynamo Hatch", 4, 16) + .getStackForm(1L)); + eM_dynamoMulti64_EV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15229, "hatch.dynamomulti64.tier.04", "EV 64A Dynamo Hatch", 4, 64) + .getStackForm(1L)); + + eM_dynamoMulti4_IV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15200, "hatch.dynamomulti04.tier.05", "IV 4A Dynamo Hatch", 5, 4) + .getStackForm(1L)); + eM_dynamoMulti16_IV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15210, "hatch.dynamomulti16.tier.05", "IV 16A Dynamo Hatch", 5, 16) + .getStackForm(1L)); + eM_dynamoMulti64_IV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15220, "hatch.dynamomulti64.tier.05", "IV 64A Dynamo Hatch", 5, 64) + .getStackForm(1L)); + + eM_dynamoMulti4_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15201, "hatch.dynamomulti04.tier.06", "LuV 4A Dynamo Hatch", 6, 4) + .getStackForm(1L)); + eM_dynamoMulti16_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15211, "hatch.dynamomulti16.tier.06", "LuV 16A Dynamo Hatch", 6, 16) + .getStackForm(1L)); + eM_dynamoMulti64_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15221, "hatch.dynamomulti64.tier.06", "LuV 64A Dynamo Hatch", 6, 64) + .getStackForm(1L)); + + eM_dynamoMulti4_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15202, "hatch.dynamomulti04.tier.07", "ZPM 4A Dynamo Hatch", 7, 4) + .getStackForm(1L)); + eM_dynamoMulti16_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15212, "hatch.dynamomulti16.tier.07", "ZPM 16A Dynamo Hatch", 7, 16) + .getStackForm(1L)); + eM_dynamoMulti64_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15222, "hatch.dynamomulti64.tier.07", "ZPM 64A Dynamo Hatch", 7, 64) + .getStackForm(1L)); + + eM_dynamoMulti4_UV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15203, "hatch.dynamomulti04.tier.08", "UV 4A Dynamo Hatch", 8, 4) + .getStackForm(1L)); + eM_dynamoMulti16_UV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15213, "hatch.dynamomulti16.tier.08", "UV 16A Dynamo Hatch", 8, 16) + .getStackForm(1L)); + eM_dynamoMulti64_UV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15223, "hatch.dynamomulti64.tier.08", "UV 64A Dynamo Hatch", 8, 64) + .getStackForm(1L)); + + eM_dynamoMulti4_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15204, "hatch.dynamomulti04.tier.09", "UHV 4A Dynamo Hatch", 9, 4) + .getStackForm(1L)); + eM_dynamoMulti16_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15214, "hatch.dynamomulti16.tier.09", "UHV 16A Dynamo Hatch", 9, 16) + .getStackForm(1L)); + eM_dynamoMulti64_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15224, "hatch.dynamomulti64.tier.09", "UHV 64A Dynamo Hatch", 9, 64) + .getStackForm(1L)); + + eM_dynamoMulti4_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15205, "hatch.dynamomulti04.tier.10", "UEV 4A Dynamo Hatch", 10, 4) + .getStackForm(1L)); + eM_dynamoMulti16_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti( + 15215, + "hatch.dynamomulti16.tier.10", + "UEV 16A Dynamo Hatch", + 10, + 16).getStackForm(1L)); + eM_dynamoMulti64_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti( + 15225, + "hatch.dynamomulti64.tier.10", + "UEV 64A Dynamo Hatch", + 10, + 64).getStackForm(1L)); + + eM_dynamoMulti4_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15206, "hatch.dynamomulti04.tier.11", "UIV 4A Dynamo Hatch", 11, 4) + .getStackForm(1L)); + eM_dynamoMulti16_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti( + 15216, + "hatch.dynamomulti16.tier.11", + "UIV 16A Dynamo Hatch", + 11, + 16).getStackForm(1L)); + eM_dynamoMulti64_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti( + 15226, + "hatch.dynamomulti64.tier.11", + "UIV 64A Dynamo Hatch", + 11, + 64).getStackForm(1L)); + + eM_dynamoMulti4_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15207, "hatch.dynamomulti04.tier.12", "UMV 4A Dynamo Hatch", 12, 4) + .getStackForm(1L)); + eM_dynamoMulti16_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti( + 15217, + "hatch.dynamomulti16.tier.12", + "UMV 16A Dynamo Hatch", + 12, + 16).getStackForm(1L)); + eM_dynamoMulti64_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti( + 15227, + "hatch.dynamomulti64.tier.12", + "UMV 64A Dynamo Hatch", + 12, + 64).getStackForm(1L)); + + eM_dynamoMulti4_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti(15208, "hatch.dynamomulti04.tier.13", "UXV 4A Dynamo Hatch", 13, 4) + .getStackForm(1L)); + eM_dynamoMulti16_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti( + 15218, + "hatch.dynamomulti16.tier.13", + "UXV 16A Dynamo Hatch", + 13, + 16).getStackForm(1L)); + eM_dynamoMulti64_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoMulti( + 15228, + "hatch.dynamomulti64.tier.13", + "UXV 64A Dynamo Hatch", + 13, + 64).getStackForm(1L)); + + // =================================================================================================== + // Multi AMP Laser OUTPUTS + // =================================================================================================== + + eM_dynamoTunnel1_IV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15230, + "hatch.dynamotunnel1.tier.05", + "IV 256A/t Laser Source Hatch", + 5, + 256).getStackForm(1L)); + eM_dynamoTunnel2_IV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15240, + "hatch.dynamotunnel2.tier.05", + "IV 1,024A/t Laser Source Hatch", + 5, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_IV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15250, + "hatch.dynamotunnel3.tier.05", + "IV 4,096A/t Laser Source Hatch", + 5, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_IV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15260, + "hatch.dynamotunnel4.tier.05", + "IV 16,384A/t Laser Source Hatch", + 5, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_IV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15270, + "hatch.dynamotunnel5.tier.05", + "IV 65,536A/t Laser Source Hatch", + 5, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_IV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15280, + "hatch.dynamotunnel6.tier.05", + "IV 262,144A/t Laser Source Hatch", + 5, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_IV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15290, + "hatch.dynamotunnel7.tier.05", + "IV 1,048,576A/t Laser Source Hatch", + 5, + 1048576).getStackForm(1L)); + + eM_dynamoTunnel1_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15231, + "hatch.dynamotunnel1.tier.06", + "LuV 256A/t Laser Source Hatch", + 6, + 256).getStackForm(1L)); + eM_dynamoTunnel2_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15241, + "hatch.dynamotunnel2.tier.06", + "LuV 1,024A/t Laser Source Hatch", + 6, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15251, + "hatch.dynamotunnel3.tier.06", + "LuV 4,096A/t Laser Source Hatch", + 6, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15261, + "hatch.dynamotunnel4.tier.06", + "LuV 16,384A/t Laser Source Hatch", + 6, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15271, + "hatch.dynamotunnel5.tier.06", + "LuV 65,536A/t Laser Source Hatch", + 6, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15281, + "hatch.dynamotunnel6.tier.06", + "LuV 262,144A/t Laser Source Hatch", + 6, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_LuV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15291, + "hatch.dynamotunnel7.tier.06", + "LuV 1,048,576A/t Laser Source Hatch", + 6, + 1048576).getStackForm(1L)); + + eM_dynamoTunnel1_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15232, + "hatch.dynamotunnel1.tier.07", + "ZPM 256A/t Laser Source Hatch", + 7, + 256).getStackForm(1L)); + eM_dynamoTunnel2_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15242, + "hatch.dynamotunnel2.tier.07", + "ZPM 1,024A/t Laser Source Hatch", + 7, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15252, + "hatch.dynamotunnel3.tier.07", + "ZPM 4,096A/t Laser Source Hatch", + 7, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15262, + "hatch.dynamotunnel4.tier.07", + "ZPM 16,384A/t Laser Source Hatch", + 7, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15272, + "hatch.dynamotunnel5.tier.07", + "ZPM 65,536A/t Laser Source Hatch", + 7, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15282, + "hatch.dynamotunnel6.tier.07", + "ZPM 262,144A/t Laser Source Hatch", + 7, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_ZPM.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15292, + "hatch.dynamotunnel7.tier.07", + "ZPM 1,048,576A/t Laser Source Hatch", + 7, + 1048576).getStackForm(1L)); + + eM_dynamoTunnel1_UV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15233, + "hatch.dynamotunnel1.tier.08", + "UV 256A/t Laser Source Hatch", + 8, + 256).getStackForm(1L)); + eM_dynamoTunnel2_UV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15243, + "hatch.dynamotunnel2.tier.08", + "UV 1,024A/t Laser Source Hatch", + 8, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_UV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15253, + "hatch.dynamotunnel3.tier.08", + "UV 4,096A/t Laser Source Hatch", + 8, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_UV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15263, + "hatch.dynamotunnel4.tier.08", + "UV 16,384A/t Laser Source Hatch", + 8, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_UV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15273, + "hatch.dynamotunnel5.tier.08", + "UV 65,536A/t Laser Source Hatch", + 8, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_UV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15283, + "hatch.dynamotunnel6.tier.08", + "UV 262,144A/t Laser Source Hatch", + 8, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_UV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15293, + "hatch.dynamotunnel7.tier.08", + "UV 1,048,576A/t Laser Source Hatch", + 8, + 1048576).getStackForm(1L)); + + eM_dynamoTunnel1_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15234, + "hatch.dynamotunnel1.tier.09", + "UHV 256A/t Laser Source Hatch", + 9, + 256).getStackForm(1L)); + eM_dynamoTunnel2_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15244, + "hatch.dynamotunnel2.tier.09", + "UHV 1,024A/t Laser Source Hatch", + 9, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15254, + "hatch.dynamotunnel3.tier.09", + "UHV 4,096A/t Laser Source Hatch", + 9, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15264, + "hatch.dynamotunnel4.tier.09", + "UHV 16,384A/t Laser Source Hatch", + 9, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15274, + "hatch.dynamotunnel5.tier.09", + "UHV 65,536A/t Laser Source Hatch", + 9, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15284, + "hatch.dynamotunnel6.tier.09", + "UHV 262,144A/t Laser Source Hatch", + 9, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_UHV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15294, + "hatch.dynamotunnel7.tier.09", + "UHV 1,048,576A/t Laser Source Hatch", + 9, + 1048576).getStackForm(1L)); + + eM_dynamoTunnel1_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15235, + "hatch.dynamotunnel1.tier.10", + "UEV 256A/t Laser Source Hatch", + 10, + 256).getStackForm(1L)); + eM_dynamoTunnel2_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15245, + "hatch.dynamotunnel2.tier.10", + "UEV 1,024A/t Laser Source Hatch", + 10, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15255, + "hatch.dynamotunnel3.tier.10", + "UEV 4,096A/t Laser Source Hatch", + 10, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15265, + "hatch.dynamotunnel4.tier.10", + "UEV 16,384A/t Laser Source Hatch", + 10, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15275, + "hatch.dynamotunnel5.tier.10", + "UEV 65,536A/t Laser Source Hatch", + 10, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15285, + "hatch.dynamotunnel6.tier.10", + "UEV 262,144A/t Laser Source Hatch", + 10, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_UEV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15295, + "hatch.dynamotunnel7.tier.10", + "UEV 1,048,576A/t Laser Source Hatch", + 10, + 1048576).getStackForm(1L)); + + eM_dynamoTunnel1_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15236, + "hatch.dynamotunnel1.tier.11", + "UIV 256A/t Laser Source Hatch", + 11, + 256).getStackForm(1L)); + eM_dynamoTunnel2_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15246, + "hatch.dynamotunnel2.tier.11", + "UIV 1,024A/t Laser Source Hatch", + 11, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15256, + "hatch.dynamotunnel3.tier.11", + "UIV 4,096A/t Laser Source Hatch", + 11, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15266, + "hatch.dynamotunnel4.tier.11", + "UIV 16,384A/t Laser Source Hatch", + 11, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15276, + "hatch.dynamotunnel5.tier.11", + "UIV 65,536A/t Laser Source Hatch", + 11, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15286, + "hatch.dynamotunnel6.tier.11", + "UIV 262,144A/t Laser Source Hatch", + 11, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_UIV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15296, + "hatch.dynamotunnel7.tier.11", + "UIV 1,048,576A/t Laser Source Hatch", + 11, + 1048576).getStackForm(1L)); + + eM_dynamoTunnel1_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15237, + "hatch.dynamotunnel1.tier.12", + "UMV 256A/t Laser Source Hatch", + 12, + 256).getStackForm(1L)); + eM_dynamoTunnel2_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15247, + "hatch.dynamotunnel2.tier.12", + "UMV 1,024A/t Laser Source Hatch", + 12, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15257, + "hatch.dynamotunnel3.tier.12", + "UMV 4,096A/t Laser Source Hatch", + 12, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15267, + "hatch.dynamotunnel4.tier.12", + "UMV 16,384A/t Laser Source Hatch", + 12, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15277, + "hatch.dynamotunnel5.tier.12", + "UMV 65,536A/t Laser Source Hatch", + 12, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15287, + "hatch.dynamotunnel6.tier.12", + "UMV 262,144A/t Laser Source Hatch", + 12, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_UMV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15297, + "hatch.dynamotunnel7.tier.12", + "UMV 1,048,576A/t Laser Source Hatch", + 12, + 1048576).getStackForm(1L)); + + eM_dynamoTunnel1_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15238, + "hatch.dynamotunnel1.tier.13", + "UXV 256A/t Laser Source Hatch", + 13, + 256).getStackForm(1L)); + eM_dynamoTunnel2_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15248, + "hatch.dynamotunnel2.tier.13", + "UXV 1,024A/t Laser Source Hatch", + 13, + 1024).getStackForm(1L)); + eM_dynamoTunnel3_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15258, + "hatch.dynamotunnel3.tier.13", + "UXV 4,096A/t Laser Source Hatch", + 13, + 4096).getStackForm(1L)); + eM_dynamoTunnel4_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15268, + "hatch.dynamotunnel4.tier.13", + "UXV 16,384A/t Laser Source Hatch", + 13, + 16384).getStackForm(1L)); + eM_dynamoTunnel5_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15278, + "hatch.dynamotunnel5.tier.13", + "UXV 65,536A/t Laser Source Hatch", + 13, + 65536).getStackForm(1L)); + eM_dynamoTunnel6_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15288, + "hatch.dynamotunnel6.tier.13", + "UXV 262,144A/t Laser Source Hatch", + 13, + 262144).getStackForm(1L)); + eM_dynamoTunnel7_UXV.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15298, + "hatch.dynamotunnel7.tier.13", + "UXV 1,048,576A/t Laser Source Hatch", + 13, + 1048576).getStackForm(1L)); + eM_dynamoTunnel9001.set( + new GT_MetaTileEntity_Hatch_DynamoTunnel( + 15299, + "hatch.dynamotunnel.tier.14", + "Legendary Laser Source Hatch", + 13, + (int) V[13]).getStackForm(1L)); + + // =================================================================================================== + // MULTIBLOCKS + // =================================================================================================== + + Machine_Multi_Transformer.set( + new GT_MetaTileEntity_EM_transformer(15300, "multimachine.em.transformer", "Active Transformer") + .getStackForm(1L)); + Machine_Multi_Microwave.set( + new GT_MetaTileEntity_TM_microwave(15312, "multimachine.tm.microwave", "Microwave Grinder") + .getStackForm(1L)); + Machine_Multi_TeslaCoil.set( + new GT_MetaTileEntity_TM_teslaCoil(15314, "multimachine.tm.teslaCoil", "Tesla Tower").getStackForm(1L)); + + Machine_Multi_Switch.set( + new GT_MetaTileEntity_EM_switch(15310, "multimachine.em.switch", "Network Switch With QoS") + .getStackForm(1L)); + Machine_Multi_Computer.set( + new GT_MetaTileEntity_EM_computer(15311, "multimachine.em.computer", "Quantum Computer").getStackForm(1L)); + + Machine_Multi_DataBank + .set(new GT_MetaTileEntity_EM_dataBank(15313, "multimachine.em.databank", "Data Bank").getStackForm(1L)); + + Machine_Multi_Research.set( + new GT_MetaTileEntity_EM_research(15331, "multimachine.em.research", "Research station").getStackForm(1L)); + + Machine_Multi_Infuser + .set(new GT_MetaTileEntity_EM_infuser(15350, "multimachine.em.infuser", "Energy Infuser").getStackForm(1)); + + Machine_Multi_EyeOfHarmony.set( + new GT_MetaTileEntity_EM_EyeOfHarmony(15410, "multimachine.em.eye_of_harmony", "Eye of Harmony") + .getStackForm(1L)); + if (!NewHorizonsCoreMod.isModLoaded()) { + Machine_Multi_ForgeOfGods.set( + new GT_MetaTileEntity_EM_ForgeOfGods(15411, "multimachine.em.forge_of_gods", "Forge of the Gods") + .getStackForm(1L)); + Machine_Multi_SmeltingModule.set( + new GT_MetaTileEntity_EM_SmeltingModule( + 15412, + "multimachine.em.smelting_module", + "Helioflare Power Forge").getStackForm(1L)); + Machine_Multi_MoltenModule.set( + new GT_MetaTileEntity_EM_MoltenModule(15413, "multimachine.em.molten_module", "Helioflux Melting Core") + .getStackForm(1L)); + Machine_Multi_PlasmaModule.set( + new GT_MetaTileEntity_EM_PlasmaModule( + 15414, + "multimachine.em.plasma_module", + "Heliothermal Plasma Fabricator").getStackForm(1L)); + Machine_Multi_QuarkGluonPlasmaModule.set( + new GT_MetaTileEntity_EM_ExoticModule(15415, "multimachine.em.exotic_module", "Heliofusion Exoticizer") + .getStackForm(1L)); + } + + // =================================================================================================== + // Hatches + // =================================================================================================== + + Parametrizer_Hatch + .set(new GT_MetaTileEntity_Hatch_Param(15420, "hatch.param.tier.05", "Parametrizer", 5).getStackForm(1L)); // TODO + // refactor + // aName + // to + // hatch.param.tier.04 + // and + // aTier + // to + // 4, + // check + // recipe + // for + // NH + ParametrizerX_Hatch + .set(new GT_MetaTileEntity_Hatch_Param(15421, "hatch.param.tier.07", "Parametrizer X", 7).getStackForm(1L)); + ParametrizerTXT_Hatch.set( + new GT_MetaTileEntity_Hatch_ParamText(15422, "hatch.param.tier.10", "Parametrizer tXt", 10) + .getStackForm(1L)); // TODO check recipe for NH + + Uncertainty_Hatch.set( + new GT_MetaTileEntity_Hatch_Uncertainty(15430, "hatch.certain.tier.07", "Uncertainty Resolver", 7) + .getStackForm(1L)); + UncertaintyX_Hatch.set( + new GT_MetaTileEntity_Hatch_Uncertainty(15431, "hatch.certain.tier.10", "Uncertainty Resolver X", 10) + .getStackForm(1L)); + + dataIn_Hatch.set( + new GT_MetaTileEntity_Hatch_InputData(15440, "hatch.datain.tier.07", "Optical Slave Connector", 7) + .getStackForm(1L)); + dataOut_Hatch.set( + new GT_MetaTileEntity_Hatch_OutputData(15441, "hatch.dataout.tier.07", "Optical Master Connector", 7) + .getStackForm(1L)); + dataInAss_Hatch.set( + new GT_MetaTileEntity_Hatch_InputDataItems( + 15442, + "hatch.datainass.tier.07", + "Assembly line Slave Connector", + 7).getStackForm(1L)); + dataOutAss_Hatch.set( + new GT_MetaTileEntity_Hatch_OutputDataItems( + 15443, + "hatch.dataoutass.tier.07", + "Data Bank Master Connector", + 7).getStackForm(1L)); + + rack_Hatch + .set(new GT_MetaTileEntity_Hatch_Rack(15450, "hatch.rack.tier.08", "Computer Rack", 8).getStackForm(1L)); + holder_Hatch.set( + new GT_MetaTileEntity_Hatch_Holder(15451, "hatch.holder.tier.09", "Object Holder", 8).getStackForm(1L)); + + capacitor_Hatch.set( + new GT_MetaTileEntity_Hatch_Capacitor(15452, "hatch.capacitor.tier.03", "Capacitor Hatch", 3) + .getStackForm(1L)); + + // =================================================================================================== + // Pipes + // =================================================================================================== + + LASERpipe + .set(new GT_MetaTileEntity_Pipe_Energy(15465, "pipe.energystream", "Laser Vacuum Pipe").getStackForm(1L)); + DATApipe.set(new GT_MetaTileEntity_Pipe_Data(15470, "pipe.datastream", "Optical Fiber Cable").getStackForm(1L)); + + LASERpipeBlock.set( + new GT_MetaTileEntity_PipeBlock_Energy(15472, "pipe.energystream.block", "Laser Vacuum Pipe Casing") + .getStackForm(1L)); + DATApipeBlock.set( + new GT_MetaTileEntity_PipeBlock_Data(15473, "pipe.datastream.block", "Optical Fiber Cable Casing") + .getStackForm(1L)); + + // =================================================================================================== + // Single Blocks + // =================================================================================================== + + Machine_OwnerDetector.set( + new GT_MetaTileEntity_OwnerDetector(15480, "machine.tt.ownerdetector", "Owner detector", 3) + .getStackForm(1L)); + + // =================================================================================================== + // Buck Converters + // =================================================================================================== + + Machine_BuckConverter_IV.set( + new GT_MetaTileEntity_BuckConverter(15485, "machine.tt.buck.05", "Insane Buck Converter", 5) + .getStackForm(1L)); + Machine_BuckConverter_LuV.set( + new GT_MetaTileEntity_BuckConverter(15486, "machine.tt.buck.06", "Ludicrous Buck Converter", 6) + .getStackForm(1L)); + Machine_BuckConverter_ZPM.set( + new GT_MetaTileEntity_BuckConverter(15487, "machine.tt.buck.07", "ZPM Voltage Buck Converter", 7) + .getStackForm(1L)); + Machine_BuckConverter_UV.set( + new GT_MetaTileEntity_BuckConverter(15488, "machine.tt.buck.08", "Ultimate Power Buck Converter", 8) + .getStackForm(1L)); + Machine_BuckConverter_UHV.set( + new GT_MetaTileEntity_BuckConverter(15489, "machine.tt.buck.09", "Highly Ultimate Buck Converter", 9) + .getStackForm(1L)); + Machine_BuckConverter_UEV.set( + new GT_MetaTileEntity_BuckConverter(15490, "machine.tt.buck.10", "Extremely Ultimate Buck Converter", 10) + .getStackForm(1L)); + Machine_BuckConverter_UIV.set( + new GT_MetaTileEntity_BuckConverter(15491, "machine.tt.buck.11", "Insanely Ultimate Buck Converter", 11) + .getStackForm(1L)); + Machine_BuckConverter_UMV.set( + new GT_MetaTileEntity_BuckConverter(15492, "machine.tt.buck.12", "Mega Ultimate Buck Converter", 12) + .getStackForm(1L)); + Machine_BuckConverter_UXV.set( + new GT_MetaTileEntity_BuckConverter( + 15493, + "machine.tt.buck.13", + "Extended Mega Ultimate Buck Converter", + 13).getStackForm(1L)); + + // =================================================================================================== + // Tesla Transceiver + // =================================================================================================== + + Machine_TeslaCoil_1by1_LV.set( + new GT_MetaTileEntity_TeslaCoil(16000, "machine.tt.tesla.01", "Basic Tesla Transceiver", 1, 1) + .getStackForm(1L)); + Machine_TeslaCoil_1by1_MV.set( + new GT_MetaTileEntity_TeslaCoil(16001, "machine.tt.tesla.02", "Advanced Tesla Transceiver", 2, 1) + .getStackForm(1L)); + Machine_TeslaCoil_1by1_HV.set( + new GT_MetaTileEntity_TeslaCoil(16002, "machine.tt.tesla.03", "Epyc Tesla Transceiver", 3, 1) + .getStackForm(1L)); + Machine_TeslaCoil_1by1_EV.set( + new GT_MetaTileEntity_TeslaCoil(16003, "machine.tt.tesla.04", "Ultimate Power Tesla Transceiver", 4, 1) + .getStackForm(1L)); + Machine_TeslaCoil_1by1_IV.set( + new GT_MetaTileEntity_TeslaCoil(16004, "machine.tt.tesla.05", "Insane Tesla Transceiver", 5, 1) + .getStackForm(1L)); + + Machine_TeslaCoil_2by2_LV.set( + new GT_MetaTileEntity_TeslaCoil(16005, "machine.tt.tesla.01", "Basic Tesla Transceiver", 1, 4) + .getStackForm(1L)); + Machine_TeslaCoil_2by2_MV.set( + new GT_MetaTileEntity_TeslaCoil(16006, "machine.tt.tesla.02", "Advanced Tesla Transceiver", 2, 4) + .getStackForm(1L)); + Machine_TeslaCoil_2by2_HV.set( + new GT_MetaTileEntity_TeslaCoil(16007, "machine.tt.tesla.03", "Epyc Tesla Transceiver", 3, 4) + .getStackForm(1L)); + Machine_TeslaCoil_2by2_EV.set( + new GT_MetaTileEntity_TeslaCoil(16008, "machine.tt.tesla.04", "Ultimate Power Tesla Transceiver", 4, 4) + .getStackForm(1L)); + Machine_TeslaCoil_2by2_IV.set( + new GT_MetaTileEntity_TeslaCoil(16009, "machine.tt.tesla.05", "Insane Tesla Transceiver", 5, 4) + .getStackForm(1L)); + + Machine_TeslaCoil_3by3_LV.set( + new GT_MetaTileEntity_TeslaCoil(16010, "machine.tt.tesla.01", "Basic Tesla Transceiver", 1, 9) + .getStackForm(1L)); + Machine_TeslaCoil_3by3_MV.set( + new GT_MetaTileEntity_TeslaCoil(16011, "machine.tt.tesla.02", "Advanced Tesla Transceiver", 2, 9) + .getStackForm(1L)); + Machine_TeslaCoil_3by3_HV.set( + new GT_MetaTileEntity_TeslaCoil(16012, "machine.tt.tesla.03", "Epyc Tesla Transceiver", 3, 9) + .getStackForm(1L)); + Machine_TeslaCoil_3by3_EV.set( + new GT_MetaTileEntity_TeslaCoil(16013, "machine.tt.tesla.04", "Ultimate Power Tesla Transceiver", 4, 9) + .getStackForm(1L)); + Machine_TeslaCoil_3by3_IV.set( + new GT_MetaTileEntity_TeslaCoil(16014, "machine.tt.tesla.05", "Insane Tesla Transceiver", 5, 9) + .getStackForm(1L)); + + Machine_TeslaCoil_4by4_LV.set( + new GT_MetaTileEntity_TeslaCoil(16015, "machine.tt.tesla.01", "Basic Tesla Transceiver", 1, 16) + .getStackForm(1L)); + Machine_TeslaCoil_4by4_MV.set( + new GT_MetaTileEntity_TeslaCoil(16016, "machine.tt.tesla.02", "Advanced Tesla Transceiver", 2, 16) + .getStackForm(1L)); + Machine_TeslaCoil_4by4_HV.set( + new GT_MetaTileEntity_TeslaCoil(16017, "machine.tt.tesla.03", "Epyc Tesla Transceiver", 3, 16) + .getStackForm(1L)); + Machine_TeslaCoil_4by4_EV.set( + new GT_MetaTileEntity_TeslaCoil(16018, "machine.tt.tesla.04", "Ultimate Power Tesla Transceiver", 4, 16) + .getStackForm(1L)); + Machine_TeslaCoil_4by4_IV.set( + new GT_MetaTileEntity_TeslaCoil(16019, "machine.tt.tesla.05", "Insane Tesla Transceiver", 5, 16) + .getStackForm(1L)); + + // =================================================================================================== + // Debug Stuff + // =================================================================================================== + Machine_DebugPollutor.set( + new GT_MetaTileEntity_DebugPollutor(15495, "debug.tt.pollutor", "Debug Pollution Generator", 14) + .getStackForm(1)); + hatch_CreativeData.set( + new GT_MetaTileEntity_Hatch_CreativeData(15496, "debug.tt.data", "Debug Data Hatch", 14).getStackForm(1)); + hatch_CreativeMaintenance.set( + new GT_MetaTileEntity_Hatch_CreativeMaintenance( + 15497, + "debug.tt.maintenance", + "Auto-Taping Maintenance Hatch", + 14).getStackForm(1L)); + Machine_DebugGenny.set( + new GT_MetaTileEntity_DebugPowerGenerator(15498, "debug.tt.genny", "Debug Power Generator", 14) + .getStackForm(1L)); + Machine_DebugWriter.set( + new GT_MetaTileEntity_DebugStructureWriter(15499, "debug.tt.writer", "Debug Structure Writer", 14) + .getStackForm(1L)); + UnusedStuff.set(new ItemStack(Blocks.air)); + hatch_CreativeUncertainty.set( + new GT_MetaTileEntity_Hatch_CreativeUncertainty(15510, "debug.tt.certain", "Uncertainty Resolution", 14) + .getStackForm(1)); + + // =================================================================================================== + // MetaTE init + // =================================================================================================== + + GT_MetaTileEntity_Hatch_Rack.run(); + + GT_MetaTileEntity_Hatch_Capacitor.run(); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java b/tectech/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java new file mode 100644 index 0000000000..15ab723e42 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java @@ -0,0 +1,21 @@ +package com.github.technus.tectech.loader.thing; + +import com.github.technus.tectech.TecTech; + +public class MuTeLoader implements Runnable { + + @Override + public void run() { + TecTech.LOGGER.info("TecTech: Registering MultiTileEntities"); + registerMachines(); + registerCasings(); + } + + private static void registerMachines() { + + } + + private static void registerCasings() { + + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java b/tectech/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java new file mode 100644 index 0000000000..11e4415080 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java @@ -0,0 +1,99 @@ +package com.github.technus.tectech.loader.thing; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.TecTech.tectechTexturePage1; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.block.GodforgeGlassBlock; +import com.github.technus.tectech.thing.block.QuantumGlassBlock; +import com.github.technus.tectech.thing.block.ReactorSimBlock; +import com.github.technus.tectech.thing.block.TileEyeOfHarmony; +import com.github.technus.tectech.thing.block.TileForgeOfGods; +import com.github.technus.tectech.thing.casing.GT_Block_CasingsBA0; +import com.github.technus.tectech.thing.casing.GT_Block_CasingsTT; +import com.github.technus.tectech.thing.casing.GodforgeCasings; +import com.github.technus.tectech.thing.casing.SpacetimeCompressionFieldCasing; +import com.github.technus.tectech.thing.casing.StabilisationFieldCasing; +import com.github.technus.tectech.thing.casing.TT_Container_Casings; +import com.github.technus.tectech.thing.casing.TimeAccelerationFieldCasing; +import com.github.technus.tectech.thing.item.AstralArrayFabricator; +import com.github.technus.tectech.thing.item.EnderFluidLinkCover; +import com.github.technus.tectech.thing.item.EuMeterGT; +import com.github.technus.tectech.thing.item.ParametrizerMemoryCard; +import com.github.technus.tectech.thing.item.PowerPassUpgradeCover; +import com.github.technus.tectech.thing.item.TeslaCoilCapacitor; +import com.github.technus.tectech.thing.item.TeslaCoilComponent; +import com.github.technus.tectech.thing.item.TeslaCoilCover; +import com.github.technus.tectech.thing.item.TeslaStaff; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; + +/** + * Created by danie_000 on 16.11.2016. + */ +public class ThingsLoader implements Runnable { + + @Override + public void run() { + + GameRegistry.registerTileEntity(TileEyeOfHarmony.class, MODID + ":EyeOfHarmonyRenderBlock"); + GameRegistry.registerTileEntity(TileForgeOfGods.class, MODID + ":ForgeOfGodsRenderBlock"); + + if (Textures.BlockIcons.casingTexturePages[tectechTexturePage1] == null) { + Textures.BlockIcons.casingTexturePages[tectechTexturePage1] = new ITexture[128]; + } + + if (Textures.BlockIcons.casingTexturePages[7] == null) { + Textures.BlockIcons.casingTexturePages[7] = new ITexture[128]; + } + + TecTech.LOGGER.info("Added texture page if was null"); + + TT_Container_Casings.sBlockCasingsTT = new GT_Block_CasingsTT(); + TecTech.LOGGER.info("Elemental Casing registered"); + TT_Container_Casings.sBlockCasingsBA0 = new GT_Block_CasingsBA0(); + TecTech.LOGGER.info("Nikolai's Casing registered"); + + TT_Container_Casings.SpacetimeCompressionFieldGenerators = new SpacetimeCompressionFieldCasing(); + TecTech.LOGGER.info("Spacetime Compression Field Casings registered."); + + TT_Container_Casings.TimeAccelerationFieldGenerator = new TimeAccelerationFieldCasing(); + TecTech.LOGGER.info("Time Acceleration Field Casings registered."); + + TT_Container_Casings.StabilisationFieldGenerators = new StabilisationFieldCasing(); + + if (!NewHorizonsCoreMod.isModLoaded()) { + + TT_Container_Casings.GodforgeCasings = new GodforgeCasings(); + TecTech.LOGGER.info("Godforge blocks registered."); + + GodforgeGlassBlock.run(); + TecTech.LOGGER.info("Godforge Glass registered"); + + } + + QuantumGlassBlock.run(); + TecTech.LOGGER.info("Quantum Glass registered"); + + ReactorSimBlock.run(); + TecTech.LOGGER.info("Reactor Simulator registered"); + + ParametrizerMemoryCard.run(); + EuMeterGT.run(); + TeslaStaff.run(); + TeslaCoilCover.run(); + TeslaCoilCapacitor.run(); + EnderFluidLinkCover.run(); + PowerPassUpgradeCover.run(); + TecTech.LOGGER.info("Useful Items registered"); + + TeslaCoilComponent.run(); + AstralArrayFabricator.run(); + TecTech.LOGGER.info("Crafting Components registered"); + + TecTech.LOGGER.info("Debug Items registered"); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/DataPacket.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/DataPacket.java new file mode 100644 index 0000000000..01ef4560ee --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/DataPacket.java @@ -0,0 +1,104 @@ +package com.github.technus.tectech.mechanics.dataTransport; + +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +import net.minecraft.nbt.NBTTagCompound; + +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +/** + * Created by Tec on 05.04.2017. + */ +public abstract class DataPacket<T> { + + private static final byte MAX_HISTORY = 64; + private final Set<Vec3Impl> trace = new LinkedHashSet<>(); + + protected T content; + + protected DataPacket(T content) { + this.content = content; + } + + protected DataPacket(NBTTagCompound nbt) { + content = contentFromNBT(nbt.getCompoundTag("qContent")); + for (int i = 0; i < nbt.getByte("qHistory"); i++) { + trace.add(new Vec3Impl(nbt.getInteger("qX" + i), nbt.getInteger("qY" + i), nbt.getInteger("qZ" + i))); + } + } + + public final NBTTagCompound toNbt() { + NBTTagCompound nbt = new NBTTagCompound(); + NBTTagCompound contentTag = contentToNBT(); + if (contentTag != null) { + nbt.setTag("qContent", contentTag); + } + nbt.setByte("qHistory", (byte) trace.size()); + int i = 0; + for (Vec3Impl v : trace) { + nbt.setInteger("qX" + i, v.get0()); + nbt.setInteger("qY" + i, v.get1()); + nbt.setInteger("qZ" + i, v.get2()); + i++; + } + return nbt; + } + + protected abstract NBTTagCompound contentToNBT(); + + protected abstract T contentFromNBT(NBTTagCompound nbt); + + protected abstract T unifyContentWith(T content); + + public final boolean contains(Vec3Impl v) { + return trace.contains(v); + } + + public final boolean check() { + return trace.size() <= MAX_HISTORY; + } + + public abstract boolean extraCheck(); + + protected final DataPacket<T> unifyTrace(Vec3Impl... positions) { + Collections.addAll(trace, positions); + return (check() && extraCheck()) ? this : null; + } + + protected final DataPacket<T> unifyTrace(DataPacket<T> p) { + if (p == null) return this; + trace.addAll(p.trace); + return (check() && extraCheck()) ? this : null; + } + + protected final DataPacket<T> unifyWith(DataPacket<T> p) { + if (p == null) return this; + trace.addAll(p.trace); + if (check() && extraCheck()) { + content = unifyContentWith(p.content); + return this; + } + return null; + } + + public final T contentIfNotInTrace(Vec3Impl pos) { + if (trace.contains(pos)) { + return null; + } + return getContent(); + } + + public T getContent() { + return content; + } + + public String getContentString() { + return content.toString(); + } + + public final int getTraceSize() { + return trace.size(); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/InventoryDataPacket.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/InventoryDataPacket.java new file mode 100644 index 0000000000..e6e24b9ac7 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/InventoryDataPacket.java @@ -0,0 +1,62 @@ +package com.github.technus.tectech.mechanics.dataTransport; + +import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem; + +import java.util.ArrayList; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class InventoryDataPacket extends DataPacket<ItemStack[]> { + + public InventoryDataPacket(ItemStack[] content) { + super(content); + } + + public InventoryDataPacket(NBTTagCompound compound) { + super(compound); + } + + @Override + protected ItemStack[] contentFromNBT(NBTTagCompound nbt) { + int count = nbt.getInteger("count"); + if (count > 0) { + ArrayList<ItemStack> stacks = new ArrayList<>(); + for (int i = 0; i < count; i++) { + ItemStack stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Integer.toString(i))); + if (stack != null) { + stacks.add(stack); + } + } + return stacks.size() > 0 ? stacks.toArray(nullItem) : null; + } + return null; + } + + @Override + protected NBTTagCompound contentToNBT() { + NBTTagCompound compound = new NBTTagCompound(); + if (content != null && content.length > 0) { + compound.setInteger("count", content.length); + for (int i = 0; i < content.length; i++) { + compound.setTag(Integer.toString(i), content[i].writeToNBT(new NBTTagCompound())); + } + } + return compound; + } + + @Override + public boolean extraCheck() { + return true; + } + + @Override + protected ItemStack[] unifyContentWith(ItemStack[] content) { + throw new NoSuchMethodError("Unavailable to unify item stack data packet"); + } + + @Override + public String getContentString() { + return "Stack Count: " + (content == null ? 0 : content.length); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/QuantumDataPacket.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/QuantumDataPacket.java new file mode 100644 index 0000000000..8dff99a42d --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/dataTransport/QuantumDataPacket.java @@ -0,0 +1,50 @@ +package com.github.technus.tectech.mechanics.dataTransport; + +import net.minecraft.nbt.NBTTagCompound; + +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +public class QuantumDataPacket extends DataPacket<Long> { + + public QuantumDataPacket(Long content) { + super(content); + } + + public QuantumDataPacket(NBTTagCompound compound) { + super(compound); + } + + @Override + protected Long contentFromNBT(NBTTagCompound nbt) { + return nbt.getLong("computation"); + } + + @Override + protected NBTTagCompound contentToNBT() { + NBTTagCompound compound = new NBTTagCompound(); + compound.setLong("computation", content); + return compound; + } + + @Override + public boolean extraCheck() { + return true; + } + + @Override + protected Long unifyContentWith(Long content) { + return this.content + content; + } + + public QuantumDataPacket unifyTraceWith(Vec3Impl... positions) { + return (QuantumDataPacket) super.unifyTrace(positions); + } + + public QuantumDataPacket unifyTraceWith(QuantumDataPacket p) { + return (QuantumDataPacket) super.unifyTrace(p); + } + + public QuantumDataPacket unifyPacketWith(QuantumDataPacket p) { + return (QuantumDataPacket) super.unifyWith(p); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java new file mode 100644 index 0000000000..2499ecf596 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderFluidContainer.java @@ -0,0 +1,134 @@ +package com.github.technus.tectech.mechanics.enderStorage; + +import java.io.DataInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; + +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +import com.github.technus.tectech.TecTech; + +public class EnderFluidContainer implements IFluidHandler, Serializable { + + private static final long serialVersionUID = 2L; + private static final int SERIALIZE_TYPE_WITH_NBT = 0; + private static final int SERIALIZE_TYPE_WITHOUT_NBT = 1; + private static final int SERIALIZE_TYPE_NULL = 2; + + private static final int CAPACITY = 64000; + private transient FluidStack fluidStack; + + public EnderFluidContainer() {} + + private FluidStack getFluidStack() { + return fluidStack; + } + + private void setFluidStack(FluidStack fluidStack) { + this.fluidStack = fluidStack; + } + + @Override + public int fill(ForgeDirection side, FluidStack fluidStackIn, boolean doFill) { + int filledFluid = 0; + FluidStack fluidStackStored = getFluidStack(); + if (fluidStackIn != null) { + if (fluidStackStored == null) { + fluidStackStored = fluidStackIn.copy(); + fluidStackStored.amount = 0; + } + if (fluidStackStored.amount < CAPACITY && fluidStackIn.isFluidEqual(fluidStackStored)) { + filledFluid = Math.min(CAPACITY - fluidStackStored.amount, fluidStackIn.amount); + if (doFill) { + fluidStackStored.amount += filledFluid; + setFluidStack(fluidStackStored); + } + } + } + return filledFluid; + } + + @Override + public FluidStack drain(ForgeDirection side, FluidStack fluidStack, boolean doDrain) { + FluidStack fluidStackOutput = null; + if (fluidStack != null && fluidStack.isFluidEqual(getFluidStack())) { + fluidStackOutput = drain(side, fluidStack.amount, doDrain); + } + return fluidStackOutput; + } + + @Override + public FluidStack drain(ForgeDirection side, int amount, boolean doDrain) { + FluidStack fluidStackOutput = null; + FluidStack fluidStackStored = getFluidStack(); + if (fluidStackStored != null && fluidStackStored.amount > 0) { + int drainedFluid = Math.min(fluidStackStored.amount, amount); + fluidStackOutput = fluidStackStored.copy(); + fluidStackOutput.amount = drainedFluid; + if (doDrain) { + fluidStackStored.amount -= drainedFluid; + if (fluidStackStored.amount == 0) { + fluidStackStored = null; + } + setFluidStack(fluidStackStored); + } + } + return fluidStackOutput; + } + + @Override + public boolean canFill(ForgeDirection forgeDirection, Fluid fluid) { + return true; + } + + @Override + public boolean canDrain(ForgeDirection forgeDirection, Fluid fluid) { + return true; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection forgeDirection) { + return new FluidTankInfo[] { new FluidTankInfo(getFluidStack(), CAPACITY) }; + } + + private void writeObject(ObjectOutputStream out) throws IOException { + if (fluidStack != null) { + out.writeByte(fluidStack.tag != null ? SERIALIZE_TYPE_WITH_NBT : SERIALIZE_TYPE_WITHOUT_NBT); + if (fluidStack.tag != null) CompressedStreamTools.write(fluidStack.tag, out); + out.writeUTF( + fluidStack.getFluid() + .getName()); + out.writeInt(fluidStack.amount); + } else { + out.writeByte(SERIALIZE_TYPE_NULL); + } + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + byte type = in.readByte(); + NBTTagCompound tag = null; + switch (type) { + case SERIALIZE_TYPE_WITH_NBT: + tag = CompressedStreamTools.read(new DataInputStream(in)); + case SERIALIZE_TYPE_WITHOUT_NBT: + fluidStack = FluidRegistry.getFluidStack(in.readUTF(), in.readInt()); + break; + case SERIALIZE_TYPE_NULL: + fluidStack = null; + break; + default: + TecTech.LOGGER.error("Something very wrong... got a fluid container with state " + type); + fluidStack = null; + } + if (fluidStack != null) fluidStack.tag = tag; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java new file mode 100644 index 0000000000..e700c54b17 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTag.java @@ -0,0 +1,39 @@ +package com.github.technus.tectech.mechanics.enderStorage; + +import java.io.Serializable; +import java.util.UUID; + +import com.google.common.base.Objects; + +public class EnderLinkTag implements Serializable { + + private static final long serialVersionUID = 6884008436570077863L; + private final String frequency; + private final UUID player; + + public EnderLinkTag(String frequency, UUID player) { + this.frequency = frequency; + this.player = player; + } + + public String getFrequency() { + return frequency; + } + + public UUID getUUID() { + return player; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EnderLinkTag that = (EnderLinkTag) o; + return Objects.equal(frequency, that.frequency) && Objects.equal(player, that.player); + } + + @Override + public int hashCode() { + return Objects.hashCode(frequency, player); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java new file mode 100644 index 0000000000..574f9c2b36 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderLinkTank.java @@ -0,0 +1,47 @@ +package com.github.technus.tectech.mechanics.enderStorage; + +import java.io.Serializable; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.fluids.IFluidHandler; + +import com.google.common.base.Objects; + +public class EnderLinkTank implements Serializable { + + private static final long serialVersionUID = 1030297456736434221L; + private final int X; + private final int Y; + private final int Z; + private final int D; + + public EnderLinkTank(IFluidHandler fluidHandler) { + TileEntity tile = (TileEntity) fluidHandler; + X = tile.xCoord; + Y = tile.yCoord; + Z = tile.zCoord; + D = tile.getWorldObj().provider.dimensionId; + } + + public IFluidHandler getFluidHandler() { + IFluidHandler fluidHandler = null; + TileEntity tile = DimensionManager.getWorld(D) + .getTileEntity(X, Y, Z); + if (tile instanceof IFluidHandler) fluidHandler = (IFluidHandler) tile; + return fluidHandler; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EnderLinkTank that = (EnderLinkTank) o; + return X == that.X && Y == that.Y && Z == that.Z && D == that.D; + } + + @Override + public int hashCode() { + return Objects.hashCode(X, Y, Z, D); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java new file mode 100644 index 0000000000..125ce33304 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/enderStorage/EnderWorldSavedData.java @@ -0,0 +1,145 @@ +package com.github.technus.tectech.mechanics.enderStorage; + +import static com.github.technus.tectech.Reference.MODID; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.WorldSavedData; +import net.minecraft.world.storage.MapStorage; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.fluids.IFluidHandler; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class EnderWorldSavedData extends WorldSavedData { + + private static EnderWorldSavedData INSTANCE; + + private static final String DATA_NAME = MODID + "_EnderWorldSavedData"; + private static final String ENDER_LIQUID_TAG_LINK = DATA_NAME + "_EnderLiquidTagLink"; + private static final String ENDER_LIQUID_TANK_LINK = DATA_NAME + "_EnderLiquidTankLink"; + private static final EnderLinkTag DEFAULT_LINK_TAG = new EnderLinkTag("", null); + + private Map<EnderLinkTag, EnderFluidContainer> EnderLiquidTagLink = new HashMap<>(); + private Map<EnderLinkTank, EnderLinkTag> EnderLiquidTankLink = new HashMap<>(); + + public EnderWorldSavedData() { + super(DATA_NAME); + } + + public EnderWorldSavedData(String s) { + super(s); + } + + @SuppressWarnings("unchecked") + @Override + public void readFromNBT(NBTTagCompound nbtTagCompound) { + try { + byte[] ba = nbtTagCompound.getByteArray(ENDER_LIQUID_TAG_LINK); + InputStream is = new ByteArrayInputStream(ba); + ObjectInputStream ois = new ObjectInputStream(is); + Object data = ois.readObject(); + EnderLiquidTagLink = (Map<EnderLinkTag, EnderFluidContainer>) data; + } catch (IOException | ClassNotFoundException ignored) { + System.out.println("ENDER_LIQUID_TAG_LINK LOAD FAILED"); + System.out.println(ignored); + } + + try { + byte[] ba = nbtTagCompound.getByteArray(ENDER_LIQUID_TANK_LINK); + InputStream is = new ByteArrayInputStream(ba); + ObjectInputStream ois = new ObjectInputStream(is); + Object data = ois.readObject(); + EnderLiquidTankLink = (Map<EnderLinkTank, EnderLinkTag>) data; + } catch (IOException | ClassNotFoundException ignored) { + System.out.println("ENDER_LIQUID_TANK_LINK LOAD FAILED"); + System.out.println(ignored); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbtTagCompound) { + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(EnderLiquidTagLink); + oos.flush(); + byte[] data = bos.toByteArray(); + nbtTagCompound.setByteArray(ENDER_LIQUID_TAG_LINK, data); + } catch (IOException ignored) { + System.out.println("ENDER_LIQUID_TAG_LINK SAVE FAILED"); + System.out.println(ignored); + } + + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(EnderLiquidTankLink); + oos.flush(); + byte[] data = bos.toByteArray(); + nbtTagCompound.setByteArray(ENDER_LIQUID_TANK_LINK, data); + } catch (IOException ignored) { + System.out.println("ENDER_LIQUID_TANK_LINK SAVE FAILED"); + System.out.println(ignored); + } + } + + private static void loadInstance() { + if (INSTANCE == null) { + MapStorage storage = DimensionManager.getWorld(0).mapStorage; + INSTANCE = (EnderWorldSavedData) storage.loadData(EnderWorldSavedData.class, DATA_NAME); + if (INSTANCE == null) { + INSTANCE = new EnderWorldSavedData(); + storage.setData(DATA_NAME, INSTANCE); + } + } + INSTANCE.markDirty(); + } + + private static Map<EnderLinkTag, EnderFluidContainer> getEnderLiquidLink() { + loadInstance(); + return INSTANCE.EnderLiquidTagLink; + } + + private static Map<EnderLinkTank, EnderLinkTag> getEnderLiquidTankLink() { + loadInstance(); + return INSTANCE.EnderLiquidTankLink; + } + + public static EnderFluidContainer getEnderFluidContainer(EnderLinkTag tag) { + if (!getEnderLiquidLink().containsKey(tag)) { + getEnderLiquidLink().put(tag, new EnderFluidContainer()); + } + return getEnderLiquidLink().get(tag); + } + + public static EnderLinkTag getEnderLinkTag(IFluidHandler handler) { + EnderLinkTank tank = new EnderLinkTank(handler); + if (!getEnderLiquidTankLink().containsKey(tank)) { + getEnderLiquidTankLink().put(tank, DEFAULT_LINK_TAG); + } + return getEnderLiquidTankLink().get(tank); + } + + public static void bindEnderLinkTag(IFluidHandler handler, EnderLinkTag tag) { + EnderLinkTank tank = new EnderLinkTank(handler); + getEnderLiquidTankLink().remove(tank); + getEnderLiquidTankLink().put(tank, tag); + } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event) { + if (event.world.provider.dimensionId == 0) { + INSTANCE = null; + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IActivePipe.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IActivePipe.java new file mode 100644 index 0000000000..c1ec11ffc4 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IActivePipe.java @@ -0,0 +1,12 @@ +package com.github.technus.tectech.mechanics.pipe; + +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; + +public interface IActivePipe extends IMetaTileEntity { + + void setActive(boolean active); + + boolean getActive(); + + void markUsed(); +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToDataPipe.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToDataPipe.java new file mode 100644 index 0000000000..cc5f72d12e --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToDataPipe.java @@ -0,0 +1,17 @@ +package com.github.technus.tectech.mechanics.pipe; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Created by Tec on 26.02.2017. + */ +public interface IConnectsToDataPipe { + + boolean canConnectData(ForgeDirection side); + + IConnectsToDataPipe getNext(IConnectsToDataPipe source); + + boolean isDataInputFacing(ForgeDirection side); + + byte getColorization(); +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToEnergyTunnel.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToEnergyTunnel.java new file mode 100644 index 0000000000..e9047d22f0 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/IConnectsToEnergyTunnel.java @@ -0,0 +1,11 @@ +package com.github.technus.tectech.mechanics.pipe; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Created by Tec on 26.02.2017. + */ +public interface IConnectsToEnergyTunnel { + + boolean canConnect(ForgeDirection side); +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/PipeActivityMessage.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/PipeActivityMessage.java new file mode 100644 index 0000000000..549397afa0 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/pipe/PipeActivityMessage.java @@ -0,0 +1,136 @@ +package com.github.technus.tectech.mechanics.pipe; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; + +import cpw.mods.fml.common.network.ByteBufUtils; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import eu.usrv.yamcore.network.client.AbstractClientMessageHandler; +import eu.usrv.yamcore.network.server.AbstractServerMessageHandler; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import io.netty.buffer.ByteBuf; + +public class PipeActivityMessage implements IMessage { + + int mPosX; + int mPosY; + int mPosZ; + int mPosD; + int mActive; + + public PipeActivityMessage() {} + + private PipeActivityMessage(IActivePipe metaTile) { + IGregTechTileEntity base = metaTile.getBaseMetaTileEntity(); + mPosX = base.getXCoord(); + mPosY = base.getYCoord(); + mPosZ = base.getZCoord(); + mPosD = base.getWorld().provider.dimensionId; + mActive = metaTile.getActive() ? 1 : 0; + } + + private PipeActivityMessage(World world, int x, int y, int z, boolean active) { + mPosX = x; + mPosY = y; + mPosZ = z; + mPosD = world.provider.dimensionId; + mActive = active ? 1 : 0; + } + + @Override + public void fromBytes(ByteBuf pBuffer) { + NBTTagCompound tTag = ByteBufUtils.readTag(pBuffer); + mPosX = tTag.getInteger("posx"); + mPosY = tTag.getInteger("posy"); + mPosZ = tTag.getInteger("posz"); + mPosD = tTag.getInteger("posd"); + mActive = tTag.getInteger("active"); + } + + @Override + public void toBytes(ByteBuf pBuffer) { + NBTTagCompound tFXTag = new NBTTagCompound(); + tFXTag.setInteger("posx", mPosX); + tFXTag.setInteger("posy", mPosY); + tFXTag.setInteger("posz", mPosZ); + tFXTag.setInteger("posd", mPosD); + tFXTag.setInteger("active", mActive); + + ByteBufUtils.writeTag(pBuffer, tFXTag); + } + + public static class PipeActivityQuery extends PipeActivityMessage { + + public PipeActivityQuery() {} + + public PipeActivityQuery(IActivePipe metaTile) { + super(metaTile); + } + + public PipeActivityQuery(World world, int x, int y, int z, boolean active) { + super(world, x, y, z, active); + } + } + + public static class PipeActivityData extends PipeActivityMessage { + + public PipeActivityData() {} + + private PipeActivityData(PipeActivityQuery query) { + mPosX = query.mPosX; + mPosY = query.mPosY; + mPosZ = query.mPosZ; + mPosD = query.mPosD; + mActive = query.mActive; + } + + public PipeActivityData(IActivePipe metaTile) { + super(metaTile); + } + + public PipeActivityData(World world, int x, int y, int z, boolean active) { + super(world, x, y, z, active); + } + } + + public static class ClientHandler extends AbstractClientMessageHandler<PipeActivityData> { + + @Override + public IMessage handleClientMessage(EntityPlayer pPlayer, PipeActivityData pMessage, MessageContext pCtx) { + if (pPlayer.worldObj.provider.dimensionId == pMessage.mPosD) { + TileEntity te = pPlayer.worldObj.getTileEntity(pMessage.mPosX, pMessage.mPosY, pMessage.mPosZ); + if (te instanceof IGregTechTileEntity) { + IMetaTileEntity meta = ((IGregTechTileEntity) te).getMetaTileEntity(); + if (meta instanceof IActivePipe) { + ((IActivePipe) meta).setActive(pMessage.mActive == 1); + } + } + } + return null; + } + } + + public static class ServerHandler extends AbstractServerMessageHandler<PipeActivityQuery> { + + @Override + public IMessage handleServerMessage(EntityPlayer pPlayer, PipeActivityQuery pMessage, MessageContext pCtx) { + World world = DimensionManager.getWorld(pMessage.mPosD); + if (world != null) { + TileEntity te = world.getTileEntity(pMessage.mPosX, pMessage.mPosY, pMessage.mPosZ); + if (te instanceof IGregTechTileEntity) { + IMetaTileEntity meta = ((IGregTechTileEntity) te).getMetaTileEntity(); + if (meta instanceof IActivePipe) { + pMessage.mActive = ((IActivePipe) meta).getActive() ? 1 : 0; + return new PipeActivityData(pMessage); + } + } + } + return null; + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/spark/RendererMessage.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/spark/RendererMessage.java new file mode 100644 index 0000000000..d13e8bfb7f --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/spark/RendererMessage.java @@ -0,0 +1,149 @@ +package com.github.technus.tectech.mechanics.spark; + +import static gregtech.api.enums.Mods.Thaumcraft; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamClass; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Random; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import eu.usrv.yamcore.network.client.AbstractClientMessageHandler; +import io.netty.buffer.ByteBuf; +import thaumcraft.client.fx.bolt.FXLightningBolt; + +// TODO Re-work how sparks are distributed +public class RendererMessage implements IMessage { + + HashSet<ThaumSpark> sparkList; + + public RendererMessage() {} + + @SuppressWarnings("unchecked") + @Override + public void fromBytes(ByteBuf pBuffer) { + if (FMLCommonHandler.instance() + .getSide() + .isServer()) return; + try { + // I'd love to know why I need to offset by one byte for this to work + byte[] boop = pBuffer.array(); + boop = Arrays.copyOfRange(boop, 1, boop.length); + InputStream is = new ByteArrayInputStream(boop); + ObjectInputStream ois = new ValidatingObjectInputStream(is); + Object data = ois.readObject(); + sparkList = (HashSet<ThaumSpark>) data; + } catch (IOException | ClassNotFoundException ignored) {} + } + + @Override + public void toBytes(ByteBuf pBuffer) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(sparkList); + oos.flush(); + InputStream is = new ByteArrayInputStream(baos.toByteArray()); + pBuffer.writeBytes(is, baos.toByteArray().length); + } catch (IOException ignore) {} + } + + public static class RendererData extends RendererMessage { + + public RendererData() {} + + public RendererData(HashSet<ThaumSpark> eSparkList) { + sparkList = eSparkList; + } + } + + public static class ClientHandler extends AbstractClientMessageHandler<RendererData> { + + @Override + public IMessage handleClientMessage(EntityPlayer pPlayer, RendererData pMessage, MessageContext pCtx) { + // disgusting + Random localRand = Minecraft.getMinecraft().theWorld.rand; + int[] zapsToUse = new int[4]; + for (int i = 0; i < 3; i++) { + zapsToUse[i] = localRand.nextInt(pMessage.sparkList.size()); + } + int i = 0; + for (ThaumSpark sp : pMessage.sparkList) { + for (int j : zapsToUse) { + if (i == j) { + thaumLightning(sp.x, sp.y, sp.z, sp.xR, sp.yR, sp.zR, sp.wID); + } + } + i++; + } + pMessage.sparkList.clear(); + return null; + } + } + + @SideOnly(Side.CLIENT) + private static void thaumLightning(int tX, int tY, int tZ, int tXN, int tYN, int tZN, int wID) { + // This is enough to check for thaum, since it only ever matters for client side effects (Tested not to crash) + if (Thaumcraft.isModLoaded()) { + World world = Minecraft.getMinecraft().theWorld; + if (world.provider.dimensionId == wID) { + FXLightningBolt bolt = new FXLightningBolt( + world, + tX + 0.5F, + tY + 0.5F, + tZ + 0.5F, + tX + tXN + 0.5F, + tY + tYN + 0.5F, + tZ + tZN + 0.5F, + world.rand.nextLong(), + 6, + 0.5F, + 8); + bolt.defaultFractal(); + bolt.setType(2); + bolt.setWidth(0.125F); + bolt.finalizeBolt(); + } + } + } + + private static class ValidatingObjectInputStream extends ObjectInputStream { + + private static final Logger logger = LogManager.getLogger(); + private static final Marker securityMarker = MarkerManager.getMarker("SuspiciousPackets"); + + private ValidatingObjectInputStream(InputStream in) throws IOException { + super(in); + } + + @Override + protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { + String name = desc.getName(); + if (!name.equals("java.util.HashSet") + && !name.equals("com.github.technus.tectech.mechanics.spark.ThaumSpark")) { + logger.warn(securityMarker, "Received packet containing disallowed class: " + name); + throw new RuntimeException(); + } + return super.resolveClass(desc); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/spark/ThaumSpark.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/spark/ThaumSpark.java new file mode 100644 index 0000000000..8265c2a81b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/spark/ThaumSpark.java @@ -0,0 +1,57 @@ +package com.github.technus.tectech.mechanics.spark; + +import java.io.Serializable; +import java.util.Objects; + +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +public class ThaumSpark implements Serializable { + + // This works regardless of if TC is loaded + private static final long serialVersionUID = -7037856938316679566L; + public int x, y, z, wID; + public byte xR, yR, zR; + + public ThaumSpark(int x, int y, int z, byte xR, byte yR, byte zR, int wID) { + this.x = x; + this.y = y; + this.z = z; + + this.xR = xR; + this.yR = yR; + this.zR = zR; + + this.wID = wID; + } + + public ThaumSpark(Vec3Impl origin, Vec3Impl target, int wID) { + this.x = origin.get0(); + this.y = origin.get1(); + this.z = origin.get2(); + + Vec3Impl offset = target.sub(origin); + this.xR = (byte) offset.get0(); + this.yR = (byte) offset.get1(); + this.zR = (byte) offset.get2(); + + this.wID = wID; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ThaumSpark that = (ThaumSpark) o; + return x == that.x && y == that.y + && z == that.z + && wID == that.wID + && xR == that.xR + && yR == that.yR + && zR == that.zR; + } + + @Override + public int hashCode() { + return Objects.hash(x, y, z, wID, xR, yR, zR); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectable.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectable.java new file mode 100644 index 0000000000..cabacc075b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectable.java @@ -0,0 +1,169 @@ +package com.github.technus.tectech.mechanics.tesla; + +import static java.lang.Math.sqrt; + +import java.util.HashSet; +import java.util.Map; + +import com.github.technus.tectech.mechanics.spark.ThaumSpark; +import com.google.common.collect.Multimap; + +public interface ITeslaConnectable extends ITeslaConnectableSimple { + + // Map with all Teslas in the same dimension and the distance to them //TODO Range + Multimap<Integer, ITeslaConnectableSimple> getTeslaNodeMap(); + + // ThaumCraft lighting coordinate pairs, so we can send them in bursts and save on lag + HashSet<ThaumSpark> getSparkList(); + + // -128 to -1 disables capability + // 0 means any source or target + // 1 to 127 must match on source and target or source/target must be 0 + byte getTeslaTransmissionCapability(); + + // Transmission Range is typically 16+ in blocks + int getTeslaTransmissionRange(); + + boolean isOverdriveEnabled(); + + int getTeslaEnergyLossPerBlock(); + + float getTeslaOverdriveLossCoefficient(); + + long getTeslaOutputVoltage(); + + long getTeslaOutputCurrent(); + + boolean teslaDrainEnergy(long teslaVoltageDrained); + + class TeslaUtil { + + private static final HashSet<ITeslaConnectableSimple> teslaSimpleNodeSet = new HashSet<>(); // Targets for power + // transmission + private static final HashSet<ITeslaConnectable> teslaNodeSet = new HashSet<>(); // Sources of power transmission + + public static void teslaSimpleNodeSetAdd(ITeslaConnectableSimple target) { + if (!teslaSimpleNodeSet.contains(target)) { + teslaSimpleNodeSet.add(target); + teslaNodeSet.forEach(origin -> addTargetToTeslaOrigin(target, origin)); + } + } + + public static void teslaSimpleNodeSetRemove(ITeslaConnectableSimple target) { + teslaSimpleNodeSet.remove(target); + if (target instanceof ITeslaConnectable) teslaNodeSet.remove(target); + teslaNodeSet.forEach(origin -> removeTargetFromTeslaOrigin(target, origin)); + } + + private static void addTargetToTeslaOrigin(ITeslaConnectableSimple target, ITeslaConnectable origin) { + if (origin.equals(target) || !origin.getTeslaDimension() + .equals(target.getTeslaDimension())) { + // Skip if looking at myself and skip if not in the same dimension + // TODO, INTERDIM? + return; + } else if (origin.getTeslaTransmissionCapability() != 0 && origin.getTeslaReceptionCapability() != 0 + && origin.getTeslaTransmissionCapability() != origin.getTeslaReceptionCapability()) { + // Skip if incompatible + return; + } + // Range calc + int distance = (int) sqrt( + origin.getTeslaPosition() + .distanceSq(target.getTeslaPosition())); + if (distance > origin.getTeslaTransmissionRange() * target.getTeslaReceptionCoefficient()) { + // Skip if the range is too vast + return; + } + origin.getTeslaNodeMap() + .put(distance, target); + } + + private static void removeTargetFromTeslaOrigin(ITeslaConnectableSimple target, ITeslaConnectable origin) { + // Range calc TODO Remove duplicate? + int distance = (int) sqrt( + origin.getTeslaPosition() + .distanceSq(target.getTeslaPosition())); + origin.getTeslaNodeMap() + .remove(distance, target); + } + + public static void generateTeslaNodeMap(ITeslaConnectable origin) { + origin.getTeslaNodeMap() + .clear(); + for (ITeslaConnectableSimple target : teslaSimpleNodeSet) { + // Sanity checks + if (target == null) { + // The Tesla Covers do not remove themselves from the list and this is the code that does + teslaSimpleNodeSet.remove(null); + continue; + } + addTargetToTeslaOrigin(target, origin); + } + teslaNodeSet.add(origin); + } + + public static long powerTeslaNodeMap(ITeslaConnectable origin) { + long remainingAmperes = origin.getTeslaOutputCurrent(); + boolean canSendPower = !origin.isTeslaReadyToReceive() && remainingAmperes > 0; + + if (canSendPower) { + for (Map.Entry<Integer, ITeslaConnectableSimple> Rx : origin.getTeslaNodeMap() + .entries()) { + // Do we still have power left to send kind of check + if (origin.getTeslaStoredEnergy() + < (origin.isOverdriveEnabled() ? origin.getTeslaOutputVoltage() * 2 + : origin.getTeslaOutputVoltage())) + break; + // Explicit words for the important fields + ITeslaConnectableSimple target = Rx.getValue(); + int distance = Rx.getKey(); + // Can our target receive energy? + if (!target.isTeslaReadyToReceive()) continue; + + // Calculate the voltage output + long outputVoltageInjectable; + long outputVoltageConsumption; + if (origin.isOverdriveEnabled()) { + outputVoltageInjectable = origin.getTeslaOutputVoltage(); + outputVoltageConsumption = origin.getTeslaOutputVoltage() + + ((long) distance * origin.getTeslaEnergyLossPerBlock()) + + (long) Math + .round(origin.getTeslaOutputVoltage() * origin.getTeslaOverdriveLossCoefficient()); + } else { + outputVoltageInjectable = origin.getTeslaOutputVoltage() + - ((long) distance * origin.getTeslaEnergyLossPerBlock()); + outputVoltageConsumption = origin.getTeslaOutputVoltage(); + } + + // Break out of the loop if the cost is too high + // Since the next target will have an even higher cost, just quit now. + if (origin.getTeslaStoredEnergy() < outputVoltageConsumption) break; + + // Now shove in as many packets as will fit~ + while (canSendPower) { + if (target.teslaInjectEnergy(outputVoltageInjectable)) { + origin.teslaDrainEnergy(outputVoltageConsumption); + origin.getSparkList() + .add( + new ThaumSpark( + origin.getTeslaPosition(), + target.getTeslaPosition(), + origin.getTeslaDimension())); + remainingAmperes--; + // Update the can send power flag each time we send power + canSendPower = (origin.getTeslaStoredEnergy() < outputVoltageConsumption + || remainingAmperes > 0); + } else { + // Breaks out when I can't send anymore power + break; + } + } + + // Break out if we can't send power anymore + if (!canSendPower) break; + } + } + return origin.getTeslaOutputCurrent() - remainingAmperes; + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectableSimple.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectableSimple.java new file mode 100644 index 0000000000..a43b313d28 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/ITeslaConnectableSimple.java @@ -0,0 +1,24 @@ +package com.github.technus.tectech.mechanics.tesla; + +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +public interface ITeslaConnectableSimple { + + // -128 to -1 disables capability + // 0 means any source or target + // 1 to 127 must match on source and target or source/target must be 0 + byte getTeslaReceptionCapability(); + + // Reception Coefficient is a range extension, typical is 1 + float getTeslaReceptionCoefficient(); + + boolean isTeslaReadyToReceive(); + + long getTeslaStoredEnergy(); + + boolean teslaInjectEnergy(long teslaVoltageInjected); + + Vec3Impl getTeslaPosition(); + + Integer getTeslaDimension(); +} diff --git a/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/TeslaCoverConnection.java b/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/TeslaCoverConnection.java new file mode 100644 index 0000000000..95a0fdb3f6 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/mechanics/tesla/TeslaCoverConnection.java @@ -0,0 +1,81 @@ +package com.github.technus.tectech.mechanics.tesla; + +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetRemove; + +import net.minecraftforge.common.util.ForgeDirection; + +import com.google.common.base.Objects; +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class TeslaCoverConnection implements ITeslaConnectableSimple { + + private final IGregTechTileEntity IGT; + private final Vec3Impl pos; + private final byte teslaReceptionCapability; + + public TeslaCoverConnection(IGregTechTileEntity IGT, byte teslaReceptionCapability) { + this.IGT = IGT; + this.pos = new Vec3Impl(IGT.getXCoord(), IGT.getYCoord(), IGT.getZCoord()); + + this.teslaReceptionCapability = teslaReceptionCapability; + } + + @Override + public byte getTeslaReceptionCapability() { + return teslaReceptionCapability; + } + + @Override + public float getTeslaReceptionCoefficient() { + return 1; + } + + @Override + public boolean isTeslaReadyToReceive() { + return true; + } + + @Override + public long getTeslaStoredEnergy() { + return IGT.getStoredEU(); + } + + @Override + public Vec3Impl getTeslaPosition() { + return pos; + } + + @Override + public Integer getTeslaDimension() { + return IGT.getWorld().provider.dimensionId; + } + + @Override + public boolean teslaInjectEnergy(long teslaVoltageInjected) { + // Same as in the microwave transmitters, this does not account for amp limits + boolean output = false; + + if (!IGT.isDead()) { + output = IGT.injectEnergyUnits(ForgeDirection.UP, teslaVoltageInjected, 1L) > 0L; + } else { + teslaSimpleNodeSetRemove(this); + } + + return output; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TeslaCoverConnection that = (TeslaCoverConnection) o; + return Objects.equal(IGT, that.IGT); + } + + @Override + public int hashCode() { + return Objects.hashCode(IGT); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java b/tectech/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java new file mode 100644 index 0000000000..da5f46e002 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java @@ -0,0 +1,182 @@ +package com.github.technus.tectech.proxy; + +import static com.github.technus.tectech.TecTech.RANDOM; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.eyeOfHarmonyRenderBlock; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.forgeOfGodsRenderBlock; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiNewChat; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.rendering.EOH.EOH_ItemRenderer; +import com.github.technus.tectech.rendering.EOH.EOH_TESR; +import com.github.technus.tectech.thing.block.GodforgeGlassBlock; +import com.github.technus.tectech.thing.block.GodforgeGlassRender; +import com.github.technus.tectech.thing.block.QuantumGlassBlock; +import com.github.technus.tectech.thing.block.QuantumGlassRender; +import com.github.technus.tectech.thing.block.RenderForgeOfGods; +import com.github.technus.tectech.thing.block.TileEyeOfHarmony; +import com.github.technus.tectech.thing.block.TileForgeOfGods; +import com.github.technus.tectech.thing.item.RenderForgeOfGodsItem; +import com.gtnewhorizon.structurelib.entity.fx.WeightlessParticleFX; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.RenderingRegistry; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class ClientProxy extends CommonProxy { + + @Override + public void registerRenderInfo() { + QuantumGlassBlock.renderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(QuantumGlassBlock.renderID, new QuantumGlassRender()); + GodforgeGlassBlock.renderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(GodforgeGlassBlock.renderID, new GodforgeGlassRender()); + + MinecraftForgeClient + .registerItemRenderer(Item.getItemFromBlock(eyeOfHarmonyRenderBlock), new EOH_ItemRenderer()); + MinecraftForgeClient + .registerItemRenderer(Item.getItemFromBlock(forgeOfGodsRenderBlock), new RenderForgeOfGodsItem()); + + ClientRegistry.bindTileEntitySpecialRenderer(TileEyeOfHarmony.class, new EOH_TESR()); + ClientRegistry.bindTileEntitySpecialRenderer(TileForgeOfGods.class, new RenderForgeOfGods()); + } + + @Override + public void em_particle(IGregTechTileEntity aMuffler, ForgeDirection facing) { // CUTE! + float xPos = facing.offsetX * 0.76F + aMuffler.getXCoord() + 0.25F; + float yPos = facing.offsetY * 0.76F + aMuffler.getYCoord() + 0.25F; + float zPos = facing.offsetZ * 0.76F + aMuffler.getZCoord() + 0.25F; + + EntityFX particle = new WeightlessParticleFX( + aMuffler.getWorld(), + xPos + RANDOM.nextFloat() * 0.5F, + yPos + RANDOM.nextFloat() * 0.5F, + zPos + RANDOM.nextFloat() * 0.5F, + 0, + 0, + 0); + particle.setRBGColorF(0, 0.6F * RANDOM.nextFloat(), 0.8f); + Minecraft.getMinecraft().effectRenderer.addEffect(particle); + } + + @Override + public void pollutor_particle(IGregTechTileEntity aMuffler, ForgeDirection facing) { + float xPos = facing.offsetX * 0.76F + aMuffler.getXCoord() + 0.25F; + float yPos = facing.offsetY * 0.76F + aMuffler.getYCoord() + 0.25F; + float zPos = facing.offsetZ * 0.76F + aMuffler.getZCoord() + 0.25F; + + float ySpd = facing.offsetY * 0.1F + 0.2F + 0.1F * (float) RANDOM.nextGaussian(); + float xSpd; + float zSpd; + + if (facing.offsetY == -1) { + float temp = RANDOM.nextFloat() * 2 * (float) Math.PI; + xSpd = (float) Math.sin(temp) * 0.1F * (float) RANDOM.nextGaussian(); + zSpd = (float) Math.cos(temp) * 0.1F * (float) RANDOM.nextGaussian(); + } else { + xSpd = facing.offsetX * (0.1F + 0.2F * (float) RANDOM.nextGaussian()); + zSpd = facing.offsetZ * (0.1F + 0.2F * (float) RANDOM.nextGaussian()); + } + aMuffler.getWorld() + .spawnParticle( + "largesmoke", + xPos + RANDOM.nextFloat() * 0.5F, + yPos + RANDOM.nextFloat() * 0.5F, + zPos + RANDOM.nextFloat() * 0.5F, + xSpd, + ySpd, + zSpd); + aMuffler.getWorld() + .spawnParticle( + "largesmoke", + xPos + RANDOM.nextFloat() * 0.5F, + yPos + RANDOM.nextFloat() * 0.5F, + zPos + RANDOM.nextFloat() * 0.5F, + xSpd, + ySpd, + zSpd); + aMuffler.getWorld() + .spawnParticle( + "largesmoke", + xPos + RANDOM.nextFloat() * 0.5F, + yPos + RANDOM.nextFloat() * 0.5F, + zPos + RANDOM.nextFloat() * 0.5F, + xSpd, + ySpd, + zSpd); + } + + @Override + public void em_particle(World w, double x, double y, double z) { // CUTE! + EntityFX particle = new WeightlessParticleFX( + w, + x + RANDOM.nextFloat() * 0.5F, + y + RANDOM.nextFloat() * 0.5F, + z + RANDOM.nextFloat() * 0.5F, + 0, + 0, + 0); + particle.setRBGColorF(0, 0.6F * RANDOM.nextFloat(), 0.8f); + Minecraft.getMinecraft().effectRenderer.addEffect(particle); + } + + @Override + public void pollutor_particle(World w, double x, double y, double z) { + w.spawnParticle( + "largesmoke", + x + RANDOM.nextFloat() * 0.5F, + y + RANDOM.nextFloat() * 0.5F, + z + RANDOM.nextFloat() * 0.5F, + 0, + 0, + 0); + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public World getClientWorld() { + return FMLClientHandler.instance() + .getClient().theWorld; + } + + @Override + public void printInchat(String... strings) { + GuiNewChat chat = Minecraft.getMinecraft().ingameGUI.getChatGUI(); + for (String s : strings) { + chat.printChatMessage(new ChatComponentText(s)); + } + } + + @Override + public void playSound(IGregTechTileEntity base, String name) { + base.getWorld() + .playSoundEffect(base.getXCoord(), base.getYCoord(), base.getZCoord(), Reference.MODID + ':' + name, 1, 1); + } + + @Override + public void renderAABB(World w, AxisAlignedBB box) { + em_particle(w, box.minX, box.minY, box.minZ); + em_particle(w, box.minX, box.minY, box.maxZ); + em_particle(w, box.minX, box.maxY, box.maxZ); + em_particle(w, box.minX, box.maxY, box.minZ); + em_particle(w, box.maxX, box.maxY, box.minZ); + em_particle(w, box.maxX, box.maxY, box.maxZ); + em_particle(w, box.maxX, box.minY, box.maxZ); + em_particle(w, box.maxX, box.minY, box.minZ); + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java b/tectech/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java new file mode 100644 index 0000000000..0c160ffb54 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java @@ -0,0 +1,94 @@ +package com.github.technus.tectech.proxy; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.common.network.IGuiHandler; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class CommonProxy implements IGuiHandler { + + public void registerRenderInfo() {} + + public void em_particle(IGregTechTileEntity aMuffler, ForgeDirection facing) {} // CUTE! + + public void pollutor_particle(IGregTechTileEntity aPollutor, ForgeDirection facing) {} // CUTE! + + public void em_particle(World w, double x, double y, double z) {} + + public void pollutor_particle(World w, double x, double y, double z) {} + + public void renderAABB(World w, AxisAlignedBB box) {} + + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + public World getClientWorld() { + return null; + } + + public void broadcast(String str) { + MinecraftServer.getServer() + .getConfigurationManager() + .sendChatMsg(new ChatComponentText(str)); + } + + public void printInchat(String... strings) {} + + public void playSound(IGregTechTileEntity base, String name) {} + + public String getUUID(String name) { + for (WorldServer worldServer : MinecraftServer.getServer().worldServers) { + for (Object o : worldServer.playerEntities) { + if (o instanceof EntityPlayer && ((EntityPlayer) o).getGameProfile() + .getName() + .equals(name)) { + return ((EntityPlayer) o).getGameProfile() + .getId() + .toString(); + } + } + } + return null; + } + + public boolean isOnlineName(String name) { + for (WorldServer worldServer : MinecraftServer.getServer().worldServers) { + for (Object o : worldServer.playerEntities) { + if (o instanceof EntityPlayer && ((EntityPlayer) o).getGameProfile() + .getName() + .equals(name)) { + return true; + } + } + } + return false; + } + + public boolean isOnlineUUID(String uuid) { + for (WorldServer worldServer : MinecraftServer.getServer().worldServers) { + for (Object o : worldServer.playerEntities) { + if (o instanceof EntityPlayer && ((EntityPlayer) o).getGameProfile() + .getId() + .toString() + .equals(uuid)) { + return true; + } + } + } + return false; + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyFrontend.java b/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyFrontend.java new file mode 100644 index 0000000000..48b48f37e9 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyFrontend.java @@ -0,0 +1,206 @@ +package com.github.technus.tectech.recipe; + +import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES; +import static com.google.common.math.LongMath.pow; +import static gregtech.api.util.GT_Utility.formatNumbers; +import static java.lang.Math.min; +import static net.minecraft.util.EnumChatFormatting.BOLD; +import static net.minecraft.util.EnumChatFormatting.DARK_RED; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.math.Size; + +import appeng.util.ReadableNumberConverter; +import codechicken.nei.PositionedStack; +import gregtech.api.recipe.BasicUIPropertiesBuilder; +import gregtech.api.recipe.NEIRecipePropertiesBuilder; +import gregtech.api.recipe.RecipeMapFrontend; +import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.common.gui.modularui.UIHelper; +import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.nei.RecipeDisplayInfo; +import gregtech.nei.formatter.INEISpecialInfoFormatter; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class EyeOfHarmonyFrontend extends RecipeMapFrontend { + + private static final int xDirMaxCount = 9; + private static final int itemRows = 9, fluidRows = 2; + public static final int maxItemInputs = 1, maxItemOutputs = xDirMaxCount * itemRows, maxFluidInputs = 0, + maxFluidOutputs = xDirMaxCount * fluidRows; + private static final int yOrigin = 8; + private static final long TRILLION = pow(10, 12); + + public EyeOfHarmonyFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, + NEIRecipePropertiesBuilder neiPropertiesBuilder) { + super( + uiPropertiesBuilder.logoPos(new Pos2d(8, yOrigin)), + neiPropertiesBuilder.recipeBackgroundSize(new Size(170, 117 + (itemRows + fluidRows - 4) * 18)) + .neiSpecialInfoFormatter(new EyeOfHarmonySpecialValueFormatter())); + } + + @Override + public List<Pos2d> getItemInputPositions(int itemInputCount) { + return UIHelper.getGridPositions(itemInputCount, 79, yOrigin, 1, 1); + } + + public static final int maxItemsToRender = 80; + + @Override + public List<Pos2d> getItemOutputPositions(int itemOutputCount) { + return UIHelper.getGridPositions(min(itemOutputCount, maxItemsToRender + 1), 7, yOrigin + 36, xDirMaxCount, 12); + } + + @Override + public List<Pos2d> getFluidInputPositions(int fluidInputCount) { + return UIHelper.getGridPositions(fluidInputCount, 0, 0, 0, 0); + } + + @Override + public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) { + return UIHelper.getGridPositions(fluidOutputCount, 7, yOrigin + 13 * 17 - 7 - 16, xDirMaxCount, 3); + } + + @Override + public List<String> handleNEIItemTooltip(ItemStack stack, List<String> currentTip, + GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + super.handleNEIItemTooltip(stack, currentTip, neiCachedRecipe); + EyeOfHarmonyRecipe currentRecipe = (EyeOfHarmonyRecipe) neiCachedRecipe.mRecipe.mSpecialItems; + + // Draw tooltip on planet item. + if (stack.isItemEqual(currentRecipe.getRecipeTriggerItem())) { + currentTip.add( + EnumChatFormatting.GRAY + translateToLocalFormatted( + "tt.nei.eoh.total_items", + formatNumbers(currentRecipe.getSumOfItems()))); + return currentTip; + } + + // Draw tooltip on other items. + double percentage = currentRecipe.getItemStackToProbabilityMap() + .getOrDefault(stack, -1.0); + + if (percentage != -1.0) { + currentTip.add(EnumChatFormatting.GRAY + translateToLocalFormatted("tt.nei.eoh.solid_mass", percentage)); + currentTip.add( + EnumChatFormatting.GRAY + translateToLocalFormatted( + "tt.nei.eoh.item_count", + formatNumbers( + currentRecipe.getItemStackToTrueStackSizeMap() + .get(stack)))); + } + + return currentTip; + } + + @Override + public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + EyeOfHarmonyRecipe EOHRecipe = (EyeOfHarmonyRecipe) neiCachedRecipe.mRecipe.mSpecialItems; + for (PositionedStack stack : neiCachedRecipe.mInputs) { + if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) { + if (stack.item.isItemEqual(EOHRecipe.getRecipeTriggerItem())) { + drawNEIOverlayText(translateToLocal("NC"), stack); + } + } + } + for (PositionedStack stack : neiCachedRecipe.mOutputs) { + if (stack instanceof GT_NEI_DefaultHandler.FixedPositionedStack) { + if (EOHRecipe.getItemStackToTrueStackSizeMap() + .containsKey(stack.item)) { + long stackSize = EOHRecipe.getItemStackToTrueStackSizeMap() + .get(stack.item); + String displayString; + if (stackSize > 9999) { + displayString = ReadableNumberConverter.INSTANCE.toWideReadableForm(stackSize); + } else { + displayString = String.valueOf(stackSize); + } + + drawNEIOverlayText(displayString, stack, 0xffffff, 0.5f, true, Alignment.BottomRight); + } + } + } + } + + private static class EyeOfHarmonySpecialValueFormatter implements INEISpecialInfoFormatter { + + @Override + public List<String> format(RecipeDisplayInfo recipeInfo) { + EyeOfHarmonyRecipe recipe = (EyeOfHarmonyRecipe) recipeInfo.recipe.mSpecialItems; + List<String> result = new ArrayList<>(); + + result.add( + GT_LanguageManager.addStringLocalization("EOH.Recipe.Hydrogen.In", "Hydrogen") + ": " + + formatNumbers(recipe.getHydrogenRequirement()) + + " L"); + result.add( + GT_LanguageManager.addStringLocalization("EOH.Recipe.Helium.In", "Helium") + ": " + + formatNumbers(recipe.getHydrogenRequirement()) + + " L"); + result.add( + GT_LanguageManager.addStringLocalization("EOH.Recipe.SpacetimeTier", "Spacetime Tier") + ": " + + EOH_TIER_FANCY_NAMES[(int) recipe.getSpacetimeCasingTierRequired()]); + + if (recipe.getEUOutput() < TRILLION) { + result.add( + GT_LanguageManager.addStringLocalization("EOH.Recipe.EU.Out", "EU Output") + ": " + + formatNumbers(recipe.getEUOutput()) + + " EU"); + } else { + result.add( + GT_LanguageManager.addStringLocalization("EOH.Recipe.EU.Out", "EU Output") + ": " + + ReadableNumberConverter.INSTANCE.toWideReadableForm(recipe.getEUOutput()) + + " EU"); + } + + if (recipe.getEUOutput() < TRILLION) { + result.add( + GT_LanguageManager.addStringLocalization("EOH.Recipe.EU.In", "EU Input") + ": " + + formatNumbers(recipe.getEUStartCost()) + + " EU"); + } else { + result.add( + GT_LanguageManager.addStringLocalization("EOH.Recipe.EU.In", "EU Input") + ": " + + ReadableNumberConverter.INSTANCE.toWideReadableForm(recipe.getEUStartCost()) + + " EU"); + } + + result.add( + GT_LanguageManager.addStringLocalization("EOH.Recipe.BaseRecipeChance", "Base Recipe Chance") + ": " + + formatNumbers(100 * recipe.getBaseRecipeSuccessChance()) + + "%"); + result.add( + GT_LanguageManager + .addStringLocalization("EOH.Recipe.RecipeEnergyEfficiency", "Recipe Energy Efficiency") + ": " + + formatNumbers(100 * recipe.getRecipeEnergyEfficiency()) + + "%"); + + if (recipe.getOutputItems() + .size() > maxItemsToRender) { + result.add( + "" + DARK_RED + + BOLD + + GT_LanguageManager.addStringLocalization("EOH.Recipe.Warning.0", "Warning") + + RESET + + ": " + + GT_LanguageManager.addStringLocalization("EOH.Recipe.Warning.1", "Not all items displayed.")); + } + + return result; + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java b/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java new file mode 100644 index 0000000000..cc7de26fb6 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipe.java @@ -0,0 +1,499 @@ +package com.github.technus.tectech.recipe; + +import static com.github.technus.tectech.recipe.EyeOfHarmonyRecipeStorage.BILLION; +import static com.google.common.math.IntMath.pow; +import static gregtech.api.GregTech_API.getUnificatedOreDictStack; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; +import static gregtech.api.util.GT_ModHandler.getModItem; +import static gregtech.api.util.GT_Utility.getPlasmaFuelValueInEUPerLiterFromMaterial; +import static java.lang.Math.min; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.tuple.Pair; + +import com.github.technus.tectech.util.FluidStackLong; +import com.github.technus.tectech.util.ItemStackLong; + +import gnu.trove.map.TMap; +import gnu.trove.map.hash.TCustomHashMap; +import gnu.trove.strategy.HashingStrategy; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GT_OreDictUnificator; +import pers.gwyog.gtneioreplugin.plugin.block.BlockDimensionDisplay; +import pers.gwyog.gtneioreplugin.util.GT5OreLayerHelper; +import pers.gwyog.gtneioreplugin.util.GT5OreSmallHelper; + +@SuppressWarnings("SpellCheckingInspection") +public class EyeOfHarmonyRecipe { + + static final FluidStackLong[] SPECIAL_FLUIDS = new FluidStackLong[] { + new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(1_152), 1_152), + new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(1_152), 1_152), + new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(4_608), 4_608), + new FluidStackLong(MaterialsUEVplus.WhiteDwarfMatter.getMolten(18_432), 18_432), + new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(1_152), 1_152), + new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(4_608), 4_608), + new FluidStackLong(MaterialsUEVplus.BlackDwarfMatter.getMolten(18_432), 18_432), + new FluidStackLong(MaterialsUEVplus.Universium.getMolten(1_152), 1_152), + new FluidStackLong(MaterialsUEVplus.Universium.getMolten(4_608), 4_608), + new FluidStackLong(MaterialsUEVplus.Universium.getMolten(18_432), 18_432) }; + + HashingStrategy<ItemStack> itemStackHashingStrategy = new HashingStrategy<>() { + + private static final long serialVersionUID = -3966004160368229212L; + + @Override + public int computeHashCode(ItemStack stack) { + // Not really sure how this works or if it is "unique enough". + int result = stack.getItem() + .hashCode(); + result = 31 * result + stack.getItemDamage(); + return result; + } + + @Override + public boolean equals(ItemStack item1, ItemStack item2) { + return item1.getUnlocalizedName() + .equals(item2.getUnlocalizedName()); + } + }; + + private final TMap<ItemStack, Double> itemStackToProbabilityMap = new TCustomHashMap<>(itemStackHashingStrategy); + private final TMap<ItemStack, Long> itemStackToTrueStackSizeMap = new TCustomHashMap<>(itemStackHashingStrategy); + + private final ArrayList<ItemStackLong> outputItems; + private final ArrayList<FluidStackLong> outputFluids; + + private final long hydrogenRequirement; + private final long heliumRequirement; + + private final long euOutput; + private final long euStartCost; + + private final double baseSuccessChance; + + private final long spacetimeCasingTierRequired; + + private final long miningTimeSeconds; + + private final double recipeEnergyEfficiency; + + private final ItemStack recipeTriggerItem; + + private final long sumOfItems; + private final long rocketTier; + + public TMap<ItemStack, Double> getItemStackToProbabilityMap() { + return itemStackToProbabilityMap; + } + + public TMap<ItemStack, Long> getItemStackToTrueStackSizeMap() { + return itemStackToTrueStackSizeMap; + } + + public double getRecipeEnergyEfficiency() { + return recipeEnergyEfficiency; + } + + @SuppressWarnings("FieldCanBeLocal") + private final long standardRecipeEUOutPerTick = 100 * BILLION; + + public long getSumOfItems() { + return sumOfItems; + } + + public long getRocketTier() { + return rocketTier; + } + + public EyeOfHarmonyRecipe(final ArrayList<Pair<Materials, Long>> materialList, final BlockDimensionDisplay block, + final double recipeEnergyEfficiency, final long hydrogenRequirement, final long heliumRequirement, + final long miningTimeSeconds, final long rocketTierOfRecipe, final double baseSuccessChance) { + + this.rocketTier = rocketTierOfRecipe; + this.spacetimeCasingTierRequired = min(8, rocketTierOfRecipe); + + this.recipeTriggerItem = new ItemStack(block); + + this.outputItems = validDustGenerator(materialList); + + this.sumOfItems = this.outputItems.stream() + .map(ItemStackLong::getStackSize) + .reduce(0L, Long::sum); + + this.outputItems.add(new ItemStackLong(getStoneDustType(block.getDimension()), this.sumOfItems * 3L)); + this.outputItems.sort(Comparator.comparingLong(ItemStackLong::getStackSize)); + Collections.reverse(this.outputItems); + + for (ItemStackLong itemStackLong : outputItems) { + double stackSize = (double) itemStackLong.getStackSize(); + double probability = Math.round(100_000 * stackSize / sumOfItems) / 1000.0; + + itemStackToProbabilityMap.put(itemStackLong.itemStack, probability); + itemStackToTrueStackSizeMap.put(itemStackLong.itemStack, itemStackLong.stackSize); + } + // End item processing. + + // --- Fluid handling --- + ArrayList<FluidStackLong> fluidStackLongArrayList = new ArrayList<>(); + + int plasmaAmount = (int) ((this.spacetimeCasingTierRequired + 1) * 8_000_000L); + + // If DeepDark then it should output all plasmas involved in making exotic catalyst. + if (rocketTier == 9) { + for (Materials material : VALID_PLASMAS) { + fluidStackLongArrayList.add(new FluidStackLong(material.getPlasma(plasmaAmount), plasmaAmount)); + } + } else { + // --- Output and process fluids of the recipe. + ArrayList<FluidStack> fluidStackArrayList = new ArrayList<>(validPlasmaGenerator(materialList)); + for (FluidStack fluidStack : fluidStackArrayList) { + fluidStack = new FluidStack(fluidStack, plasmaAmount); + fluidStackLongArrayList.add(new FluidStackLong(fluidStack, plasmaAmount)); + } + } + + // Add a bonus fluid of compressed star matter. + fluidStackLongArrayList.add( + new FluidStackLong( + MaterialsUEVplus.RawStarMatter.getFluid((this.spacetimeCasingTierRequired + 1) * 100_000), + (this.spacetimeCasingTierRequired + 1) * 100_000)); + + // Tier 0 & 1 - 576 White + // Tier 2 - 2304 White + // Tier 3 - 9216 White + + // Tier 4 - 576 Black + // Tier 5 - 2304 Black + // Tier 6 - 9216 Black + + // Tier 7 - 576 Universium + // Tier 8 - 2304 Universium + // Tier 9 - 9216 Universium + int spacetimeTier = (int) rocketTierOfRecipe; + if (spacetimeTier == 0 || spacetimeTier == 9) { + spacetimeTier -= 1; + } + fluidStackLongArrayList.add(SPECIAL_FLUIDS[spacetimeTier + 1]); + + outputFluids = fluidStackLongArrayList; + // --- End fluid handling ---. + + this.hydrogenRequirement = hydrogenRequirement; + this.heliumRequirement = heliumRequirement; + + this.baseSuccessChance = baseSuccessChance; + + this.miningTimeSeconds = miningTimeSeconds; + this.recipeEnergyEfficiency = recipeEnergyEfficiency; + + long plasmaEU = plasmaCostCalculator(outputFluids); + long VM3EU = miningTimeSeconds * pow(2, 19) * 20; + this.euStartCost = (plasmaEU + VM3EU + standardRecipeEUOutPerTick * 20 * miningTimeSeconds); + this.euOutput = (long) (euStartCost * recipeEnergyEfficiency); + } + + private ItemStack getStoneDustType(String key) { + + switch (key) { + case "Ne": + return GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Netherrack, 1); + case "ED": + case "VA": + case "EA": + return GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Endstone, 1); + case "Mo": + return getModItem(NewHorizonsCoreMod.ID, "item.MoonStoneDust", 1); + case "De": + return getModItem(NewHorizonsCoreMod.ID, "item.DeimosStoneDust", 1); + case "Ma": + return getModItem(NewHorizonsCoreMod.ID, "item.MarsStoneDust", 1); + case "Ph": + return getModItem(NewHorizonsCoreMod.ID, "item.PhobosStoneDust", 1); + case "As": + case "KB": + return getModItem(NewHorizonsCoreMod.ID, "item.AsteroidsStoneDust", 1); + case "Ca": + return getModItem(NewHorizonsCoreMod.ID, "item.CallistoStoneDust", 1); + case "Ce": + return getModItem(NewHorizonsCoreMod.ID, "item.CeresStoneDust", 1); + case "Eu": + return getModItem(NewHorizonsCoreMod.ID, "item.EuropaStoneDust", 1); + case "Ga": + return getModItem(NewHorizonsCoreMod.ID, "item.GanymedeStoneDust", 1); + case "Io": + return getModItem(NewHorizonsCoreMod.ID, "item.IoStoneDust", 1); + case "Me": + return getModItem(NewHorizonsCoreMod.ID, "item.MercuryStoneDust", 1); + case "Ve": + return getModItem(NewHorizonsCoreMod.ID, "item.VenusStoneDust", 1); + case "En": + return getModItem(NewHorizonsCoreMod.ID, "item.EnceladusStoneDust", 1); + case "Mi": + return getModItem(NewHorizonsCoreMod.ID, "item.MirandaStoneDust", 1); + case "Ob": + return getModItem(NewHorizonsCoreMod.ID, "item.OberonStoneDust", 1); + case "Ti": + return getModItem(NewHorizonsCoreMod.ID, "item.TitanStoneDust", 1); + case "Pr": + return getModItem(NewHorizonsCoreMod.ID, "item.ProteusStoneDust", 1); + case "Tr": + return getModItem(NewHorizonsCoreMod.ID, "item.TritonStoneDust", 1); + case "Ha": + return getModItem(NewHorizonsCoreMod.ID, "item.HaumeaStoneDust", 1); + case "MM": + return getModItem(NewHorizonsCoreMod.ID, "item.MakeMakeStoneDust", 1); + case "Pl": + return getModItem(NewHorizonsCoreMod.ID, "item.PlutoStoneDust", 1); + case "BE": + return getModItem(NewHorizonsCoreMod.ID, "item.BarnardaEStoneDust", 1); + case "BF": + return getModItem(NewHorizonsCoreMod.ID, "item.BarnardaFStoneDust", 1); + case "CB": + return getModItem(NewHorizonsCoreMod.ID, "item.CentauriAStoneDust", 1); + case "TE": + return getModItem(NewHorizonsCoreMod.ID, "item.TCetiEStoneDust", 1); + case "VB": + return getModItem(NewHorizonsCoreMod.ID, "item.VegaBStoneDust", 1); + default: + return GT_OreDictUnificator.get(OrePrefixes.dust, Materials.Stone, 1); + } + } + + public EyeOfHarmonyRecipe(final GT5OreLayerHelper.NormalOreDimensionWrapper normalOreDimensionWrapper, + final GT5OreSmallHelper.SmallOreDimensionWrapper smallOreDimensionWrapper, final BlockDimensionDisplay block, + final double recipeEnergyEfficiency, final long hydrogenRequirement, final long heliumRequirement, + final long miningTimeSeconds, final long spacetimeCasingTierRequired, final double baseSuccessChance) { + + // Process recipes output items. + // 6 * 64 = 6 stacks/second for VM tier 3 + Og gas. + this( + processDimension(normalOreDimensionWrapper, smallOreDimensionWrapper, miningTimeSeconds), + block, + recipeEnergyEfficiency, + hydrogenRequirement, + heliumRequirement, + miningTimeSeconds, + spacetimeCasingTierRequired, + baseSuccessChance); + } + + // Return clone of list. Deep copy. Maybe a better way to do this? + public ArrayList<ItemStackLong> getOutputItems() { + ArrayList<ItemStackLong> copyOutputList = new ArrayList<>(); + for (ItemStackLong itemStackLong : outputItems) { + copyOutputList.add(new ItemStackLong(itemStackLong)); + } + + return copyOutputList; + } + + // Deep copy. + public ArrayList<FluidStackLong> getOutputFluids() { + ArrayList<FluidStackLong> copyOutputList = new ArrayList<>(); + + for (FluidStackLong fluidStackLong : outputFluids) { + copyOutputList.add(new FluidStackLong(fluidStackLong)); + } + + return copyOutputList; + } + + public long getHydrogenRequirement() { + return hydrogenRequirement; + } + + public long getHeliumRequirement() { + return heliumRequirement; + } + + public long getEUOutput() { + return euOutput; + } + + public long getEUStartCost() { + return euStartCost; + } + + public long getRecipeTimeInTicks() { + return miningTimeSeconds * 20; + } + + public double getBaseRecipeSuccessChance() { + return baseSuccessChance; + } + + public long getSpacetimeCasingTierRequired() { + return spacetimeCasingTierRequired; + } + + public ItemStack getRecipeTriggerItem() { + return recipeTriggerItem; + } + + private static final double PRIMARY_MULTIPLIER = (0.1 + 1.0 / 9.0); // Byproduct from macerating/washing chance. + private static final double SECONDARY_MULTIPLIER = (1.0 / 9.0); // Thermal centrifuge byproduct chance. + private static final double TERTIARY_MULTIPLIER = (0.1); // Macerating thermal centrifuged byproduct chance. + private static final double QUATERNARY_MULTIPLIER = (0.7); // Mercury/chem bath processing chance. + + private static final double[] ORE_MULTIPLIER = { PRIMARY_MULTIPLIER, SECONDARY_MULTIPLIER, TERTIARY_MULTIPLIER, + QUATERNARY_MULTIPLIER }; + + public static class HashMapHelper extends HashMap<Materials, Double> { + + private static final long serialVersionUID = 2297018142561480614L; + + void add(Materials material, double value) { + + // If key already exists. + if (this.containsKey(material)) { + this.put(material, value + this.get(material)); + return; + } + + // Otherwise, add value to hashmap entry. + this.put(material, value); + } + } + + public static void processHelper(HashMapHelper outputMap, Materials material, double mainMultiplier, + double probability) { + if (material == null) return; + outputMap.add(material.mDirectSmelting, (material.mOreMultiplier * 2) * mainMultiplier * probability); + + int index = 0; + for (Materials byProductMaterial : material.mOreByProducts) { + outputMap + .add(byProductMaterial.mDirectSmelting, mainMultiplier * (ORE_MULTIPLIER[index++] * 2) * probability); + } + } + + private static ArrayList<Pair<Materials, Long>> processDimension( + GT5OreLayerHelper.NormalOreDimensionWrapper normalOreDimWrapper, + GT5OreSmallHelper.SmallOreDimensionWrapper smallOreDimWrapper, long timeInSeconds) { + HashMapHelper outputMap = new HashMapHelper(); + + double mainMultiplier = timeInSeconds * 384.0; + + if (normalOreDimWrapper != null) { + normalOreDimWrapper.oreVeinToProbabilityInDimension.forEach((veinInfo, probability) -> { + processHelper(outputMap, veinInfo.mPrimaryVeinMaterial, mainMultiplier, probability); + processHelper(outputMap, veinInfo.mSecondaryMaterial, mainMultiplier, probability); + // 8.0 to replicate void miner getDropsVanillaVeins method yields. + processHelper(outputMap, veinInfo.mBetweenMaterial, mainMultiplier / 8.0, probability); + processHelper(outputMap, veinInfo.mSporadicMaterial, mainMultiplier / 8.0, probability); + }); + } + + // Iterate over small ores in dimension and add them, kinda hacky but works and is close enough. + if (smallOreDimWrapper != null) { + smallOreDimWrapper.oreVeinToProbabilityInDimension.forEach( + (veinInfo, + probability) -> processHelper(outputMap, veinInfo.getOreMaterial(), mainMultiplier, probability)); + } + + ArrayList<Pair<Materials, Long>> outputList = new ArrayList<>(); + + outputMap.forEach((material, quantity) -> outputList.add(Pair.of(material, (long) Math.floor(quantity)))); + + return outputList; + } + + private static ArrayList<FluidStack> validPlasmaGenerator(final List<Pair<Materials, Long>> planetList) { + + ArrayList<FluidStack> plasmaList = new ArrayList<>(); + + for (Pair<Materials, Long> pair : planetList) { + if (VALID_PLASMAS.contains(pair.getLeft())) { + plasmaList.add( + pair.getLeft() + .getPlasma(1)); + } + } + + return plasmaList; + } + + private static ArrayList<ItemStackLong> validDustGenerator(final ArrayList<Pair<Materials, Long>> planetList) { + + ArrayList<ItemStackLong> dustList = new ArrayList<>(); + + for (Pair<Materials, Long> pair : planetList) { + ItemStack dust = getUnificatedOreDictStack( + pair.getLeft() + .getDust(1)); + if (dust != null) { + dustList.add(new ItemStackLong(dust, pair.getRight())); + } + } + return dustList; + } + + private static long plasmaCostCalculator(ArrayList<FluidStackLong> plasmas) { + long total = 0; + + for (FluidStackLong plasma : plasmas) { + FluidStack plasmaFluid = plasma.getRegularFluidStack(plasma, 1); + try { + String plasmaName = plasmaFluid.getFluid() + .getUnlocalizedName(); + total += plasmaEnergyMap.getOrDefault(plasmaName, 0L) * plasma.amount; + } catch (Exception e) { + e.printStackTrace(); + } + } + + return (long) (total * getMaxPlasmaTurbineEfficiency()); + } + + private static double getMaxPlasmaTurbineEfficiency() { + // I hate Shirabon. + return 3.85; + } + + private static final List<Materials> VALID_PLASMAS = Stream + .of( + Materials.Helium, + Materials.Iron, + Materials.Calcium, + Materials.Niobium, + Materials.Nitrogen, + Materials.Zinc, + Materials.Silver, + Materials.Titanium, + Materials.Radon, + Materials.Nickel, + Materials.Boron, + Materials.Sulfur, + Materials.Americium, + Materials.Bismuth, + Materials.Oxygen, + Materials.Tin) + .collect(Collectors.toList()); + + private static final HashMap<String, Long> plasmaEnergyMap = new HashMap<>() { + + private static final long serialVersionUID = 7933945171103801933L; + + { + VALID_PLASMAS.forEach( + (material -> put( + material.getPlasma(1) + .getFluid() + .getUnlocalizedName(), + (long) (getPlasmaFuelValueInEUPerLiterFromMaterial(material) * getMaxPlasmaTurbineEfficiency())))); + } + }; +} diff --git a/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java b/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java new file mode 100644 index 0000000000..fb2030d52d --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/recipe/EyeOfHarmonyRecipeStorage.java @@ -0,0 +1,184 @@ +package com.github.technus.tectech.recipe; + +import static com.github.technus.tectech.recipe.EyeOfHarmonyRecipe.processHelper; +import static com.github.technus.tectech.recipe.TecTechRecipeMaps.eyeOfHarmonyRecipes; +import static java.lang.Math.pow; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.tuple.Pair; + +import com.github.technus.tectech.util.FluidStackLong; +import com.github.technus.tectech.util.ItemStackLong; +import com.google.common.math.LongMath; + +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.util.GT_OreDictUnificator; +import pers.gwyog.gtneioreplugin.plugin.block.BlockDimensionDisplay; +import pers.gwyog.gtneioreplugin.plugin.block.ModBlocks; +import pers.gwyog.gtneioreplugin.util.DimensionHelper; +import pers.gwyog.gtneioreplugin.util.GT5OreLayerHelper; +import pers.gwyog.gtneioreplugin.util.GT5OreSmallHelper; + +public class EyeOfHarmonyRecipeStorage { + + public static final long BILLION = LongMath.pow(10, 9); + private static final double CHANCE_DECREASE_PER_DIMENSION = 0.05; + + // Map is unique so this is fine. + HashMap<Block, String> blocksMapInverted = new HashMap<>() { + + private static final long serialVersionUID = -1634011860327553337L; + + { + ModBlocks.blocks.forEach((dimString, dimBlock) -> { put(dimBlock, dimString); }); + } + }; + + private final HashMap<String, EyeOfHarmonyRecipe> recipeHashMap = new HashMap<String, EyeOfHarmonyRecipe>() { + + private static final long serialVersionUID = -3501819612517400500L; + + { + for (String dimAbbreviation : DimensionHelper.DimNameDisplayed) { + BlockDimensionDisplay blockDimensionDisplay = (BlockDimensionDisplay) ModBlocks.blocks + .get(dimAbbreviation); + + if (dimAbbreviation.equals("DD")) { + specialDeepDarkRecipe(this, blockDimensionDisplay); + } else { + + GT5OreLayerHelper.NormalOreDimensionWrapper normalOre = GT5OreLayerHelper.dimToOreWrapper + .getOrDefault(dimAbbreviation, null); + GT5OreSmallHelper.SmallOreDimensionWrapper smallOre = GT5OreSmallHelper.dimToSmallOreWrapper + .getOrDefault(dimAbbreviation, null); + if (normalOre == null && smallOre == null) { + // No ores are generated in this dimension. Fail silently. + continue; + } + + long spacetimeTier = blockDimensionDisplay.getDimensionRocketTier(); + if (spacetimeTier == 0) { + spacetimeTier += 1; + } + + put( + dimAbbreviation, + new EyeOfHarmonyRecipe( + normalOre, + smallOre, + blockDimensionDisplay, + 0.6 + blockDimensionDisplay.getDimensionRocketTier() / 10.0, + BILLION * (blockDimensionDisplay.getDimensionRocketTier() + 1), + BILLION * (blockDimensionDisplay.getDimensionRocketTier() + 1), + timeCalculator(blockDimensionDisplay.getDimensionRocketTier()), + spacetimeTier - 1, + 1.0 - CHANCE_DECREASE_PER_DIMENSION * blockDimensionDisplay.getDimensionRocketTier())); + } + } + } + }; + + public EyeOfHarmonyRecipe recipeLookUp(final ItemStack aStack) { + String dimAbbreviation = blocksMapInverted.get(Block.getBlockFromItem(aStack.getItem())); + return recipeHashMap.get(dimAbbreviation); + } + + public EyeOfHarmonyRecipeStorage() { + + for (EyeOfHarmonyRecipe recipe : recipeHashMap.values()) { + + ArrayList<ItemStack> outputItems = new ArrayList<>(); + for (ItemStackLong itemStackLong : recipe.getOutputItems()) { + outputItems.add(itemStackLong.itemStack); + } + + ArrayList<FluidStack> outputFluids = new ArrayList<>(); + for (FluidStackLong fluidStackLong : recipe.getOutputFluids()) { + outputFluids.add(fluidStackLong.fluidStack); + } + + ItemStack planetItem = recipe.getRecipeTriggerItem() + .copy(); + planetItem.stackSize = 0; + + eyeOfHarmonyRecipes.addRecipe( + false, + new ItemStack[] { planetItem }, + outputItems.toArray(new ItemStack[0]), + recipe, + null, + new FluidStack[] { Materials.Hydrogen.getGas(0), Materials.Helium.getGas(0), + MaterialsUEVplus.RawStarMatter.getFluid(0) }, + outputFluids.toArray(new FluidStack[0]), + (int) recipe.getRecipeTimeInTicks(), + 0, + 0); + } + } + + private void specialDeepDarkRecipe(final HashMap<String, EyeOfHarmonyRecipe> hashMap, + final BlockDimensionDisplay planetItem) { + + HashSet<Materials> validMaterialSet = new HashSet<>(); + + for (Materials material : Materials.values()) { + + ItemStack normalOre = GT_OreDictUnificator.get(OrePrefixes.ore, material, 1); + + if ((normalOre != null)) { + validMaterialSet.add(material); + } + + ItemStack smallOre = GT_OreDictUnificator.get(OrePrefixes.oreSmall, material, 1); + + if ((smallOre != null)) { + validMaterialSet.add(material); + } + } + + ArrayList<Materials> validMaterialList = new ArrayList<>(validMaterialSet); + + long rocketTier = 9; + + hashMap.put( + "DD", + new EyeOfHarmonyRecipe( + processDD(validMaterialList), + planetItem, + 0.6 + rocketTier / 10.0, + BILLION * (rocketTier + 1), + BILLION * (rocketTier + 1), + timeCalculator(rocketTier), + rocketTier, // -1 so that we avoid out of bounds exception on NEI render. + 1.0 - rocketTier * CHANCE_DECREASE_PER_DIMENSION)); + } + + private static long timeCalculator(final long rocketTier) { + return (long) (18_000L * pow(1.4, rocketTier)); + } + + private ArrayList<Pair<Materials, Long>> processDD(final ArrayList<Materials> validMaterialList) { + EyeOfHarmonyRecipe.HashMapHelper outputMap = new EyeOfHarmonyRecipe.HashMapHelper(); + + // 10 from rocketTier + 1, 6 * 64 = VM3 + Og, 1.4 = time increase per tier. + double mainMultiplier = (timeCalculator(10) * (6 * 64)); + double probability = 1.0 / validMaterialList.size(); + + validMaterialList.forEach((material) -> { processHelper(outputMap, material, mainMultiplier, probability); }); + + ArrayList<Pair<Materials, Long>> outputList = new ArrayList<>(); + + outputMap.forEach((material, quantity) -> outputList.add(Pair.of(material, (long) Math.floor(quantity)))); + + return outputList; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java b/tectech/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java new file mode 100644 index 0000000000..38c505b89b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java @@ -0,0 +1,82 @@ +package com.github.technus.tectech.recipe; + +import static com.github.technus.tectech.loader.recipe.Godforge.magmatterItemsForNEI; +import static com.github.technus.tectech.loader.recipe.Godforge.magmatterSpaceFluidItemsForNEI; +import static com.github.technus.tectech.loader.recipe.Godforge.magmatterTimeFluidItemsForNEI; +import static com.github.technus.tectech.loader.recipe.Godforge.quarkGluonFluidItemsForNEI; +import static com.github.technus.tectech.loader.recipe.Godforge.quarkGluonItemsForNEI; +import static gregtech.api.util.GT_Utility.trans; + +import java.util.Collections; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; + +import codechicken.nei.PositionedStack; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.recipe.BasicUIPropertiesBuilder; +import gregtech.api.recipe.NEIRecipePropertiesBuilder; +import gregtech.api.recipe.RecipeMapFrontend; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.nei.GT_NEI_DefaultHandler; +import gregtech.nei.RecipeDisplayInfo; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class GodforgeExoticFrontend extends RecipeMapFrontend { + + public GodforgeExoticFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, + NEIRecipePropertiesBuilder neiPropertiesBuilder) { + super(uiPropertiesBuilder, neiPropertiesBuilder); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder, Pos2d windowOffset) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO) + .setSize(18, 18) + .setPos(new Pos2d(151, 63).add(windowOffset))); + } + + @Override + public void drawNEIOverlays(GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe) { + if (neiCachedRecipe.mRecipe.mFluidOutputs[0].equals(MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000))) { + neiCachedRecipe.mInputs.set(0, new PositionedStack(quarkGluonItemsForNEI, 48, 23, true)); + neiCachedRecipe.mInputs.set(1, new PositionedStack(quarkGluonFluidItemsForNEI, 48, 52, true)); + } else { + neiCachedRecipe.mInputs.set(0, new PositionedStack(magmatterItemsForNEI, 48, 23, true)); + neiCachedRecipe.mInputs.set(1, new PositionedStack(magmatterSpaceFluidItemsForNEI, 30, 52, true)); + neiCachedRecipe.mInputs.set(2, new PositionedStack(magmatterTimeFluidItemsForNEI, 48, 52, true)); + } + } + + @Override + public List<Pos2d> getItemInputPositions(int itemInputCount) { + return Collections.singletonList(new Pos2d(52, 33)); + } + + @Override + public List<Pos2d> getItemOutputPositions(int itemOutputCount) { + return Collections.singletonList(new Pos2d(106, 33)); + } + + @Override + protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) { + long eut = recipeInfo.recipe.mEUt; + long duration = recipeInfo.recipe.mDuration; + recipeInfo.drawText(trans("152", "Total: ") + GT_Utility.formatNumbers(eut * duration) + " EU"); + recipeInfo.drawText(trans("153", "Usage: ") + GT_Utility.formatNumbers(eut) + " EU/t"); + recipeInfo.drawText(trans("158", "Time: ") + GT_Utility.formatNumbers(duration / 20) + " secs"); + + } + + @Override + protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {} + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java b/tectech/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java new file mode 100644 index 0000000000..8264c6a169 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java @@ -0,0 +1,76 @@ +package com.github.technus.tectech.recipe; + +import static gregtech.api.util.GT_Utility.trans; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.Collections; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; + +import gregtech.api.recipe.BasicUIPropertiesBuilder; +import gregtech.api.recipe.NEIRecipePropertiesBuilder; +import gregtech.api.recipe.RecipeMapFrontend; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.nei.RecipeDisplayInfo; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class GodforgePlasmaFrontend extends RecipeMapFrontend { + + public GodforgePlasmaFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, + NEIRecipePropertiesBuilder neiPropertiesBuilder) { + super(uiPropertiesBuilder, neiPropertiesBuilder); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder, Pos2d windowOffset) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO) + .setSize(18, 18) + .setPos(new Pos2d(151, 63).add(windowOffset))); + } + + @Override + public List<Pos2d> getItemInputPositions(int itemInputCount) { + return Collections.singletonList(new Pos2d(52, 33)); + } + + @Override + public List<Pos2d> getItemOutputPositions(int itemOutputCount) { + return Collections.singletonList(new Pos2d(106, 33)); + } + + @Override + protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) { + long eut = recipeInfo.recipe.mEUt; + long duration = recipeInfo.recipe.mDuration; + String multistep = "No"; + if (recipeInfo.recipe.mSpecialItems.toString() + .equals("true")) { + multistep = "Yes"; + } + String requiredUpgrade = switch (recipeInfo.recipe.mSpecialValue) { + case 1 -> "T4-T5"; + case 2 -> "Exotic"; + default -> "T1-T3"; + }; + + recipeInfo.drawText(trans("152", "Total: ") + GT_Utility.formatNumbers(eut * duration) + " EU"); + recipeInfo.drawText(trans("153", "Usage: ") + GT_Utility.formatNumbers(eut) + " EU/t"); + recipeInfo.drawText(trans("158", "Time: ") + GT_Utility.formatNumbers(duration / 20) + " secs"); + recipeInfo.drawText(translateToLocal("gt.blockmachines.multimachine.FOG.plasmamultistep") + ": " + multistep); + recipeInfo + .drawText(translateToLocal("gt.blockmachines.multimachine.FOG.plasmarecipetier") + ": " + requiredUpgrade); + } + + @Override + protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {} + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/recipe/ResearchStationFrontend.java b/tectech/src/main/java/com/github/technus/tectech/recipe/ResearchStationFrontend.java new file mode 100644 index 0000000000..2f95652a77 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/recipe/ResearchStationFrontend.java @@ -0,0 +1,101 @@ +package com.github.technus.tectech.recipe; + +import static gregtech.api.util.GT_Utility.trans; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import java.util.Collections; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.ParametersAreNonnullByDefault; + +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.ProgressBar; + +import gregtech.api.recipe.BasicUIPropertiesBuilder; +import gregtech.api.recipe.NEIRecipePropertiesBuilder; +import gregtech.api.recipe.RecipeMapFrontend; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.MethodsReturnNonnullByDefault; +import gregtech.nei.RecipeDisplayInfo; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class ResearchStationFrontend extends RecipeMapFrontend { + + public ResearchStationFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder, + NEIRecipePropertiesBuilder neiPropertiesBuilder) { + super(uiPropertiesBuilder, neiPropertiesBuilder); + } + + @Override + public List<Pos2d> getItemInputPositions(int itemInputCount) { + return Collections.singletonList(new Pos2d(52, 33)); + } + + @Override + public List<Pos2d> getItemOutputPositions(int itemOutputCount) { + return Collections.singletonList(new Pos2d(106, 33)); + } + + @Override + public Pos2d getSpecialItemPosition() { + return new Pos2d(124, 62); + } + + @Override + protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) { + long eut = recipeInfo.recipe.mEUt; + int computation = recipeInfo.recipe.mDuration; + short ampere = (short) (recipeInfo.recipe.mSpecialValue & 0xFFFF); + short minComputationPerSec = (short) (recipeInfo.recipe.mSpecialValue >>> 16); + recipeInfo.drawText( + translateToLocalFormatted( + "tt.nei.research.max_eu", + GT_Utility.formatNumbers( + (1 + (computation - minComputationPerSec) / minComputationPerSec) * eut * ampere * 20))); + recipeInfo.drawText(trans("153", "Usage: ") + GT_Utility.formatNumbers(eut * ampere) + " EU/t"); + recipeInfo.drawText(trans("154", "Voltage: ") + GT_Utility.formatNumbers(eut) + " EU/t"); + recipeInfo.drawText(trans("155", "Amperage: ") + GT_Utility.formatNumbers(ampere)); + recipeInfo + .drawText(translateToLocalFormatted("tt.nei.research.computation", GT_Utility.formatNumbers(computation))); + recipeInfo.drawText( + translateToLocalFormatted( + "tt.nei.research.min_computation", + GT_Utility.formatNumbers(minComputationPerSec))); + } + + @Override + protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {} + + @Override + public void addProgressBar(ModularWindow.Builder builder, Supplier<Float> progressSupplier, Pos2d windowOffset) { + int bar1Width = 25; + int bar2Width = 11; + int bar3Height = 18; + List<Supplier<Float>> splitProgress = splitProgress(progressSupplier, bar1Width, bar2Width, bar3Height); + builder.widget( + new ProgressBar().setTexture(TecTechUITextures.PROGRESSBAR_RESEARCH_STATION_1, bar1Width) + .setDirection(ProgressBar.Direction.RIGHT) + .setProgress(splitProgress.get(0)) + .setSynced(false, false) + .setPos(new Pos2d(81, 40).add(windowOffset)) + .setSize(bar1Width, 5)); + builder.widget( + new ProgressBar().setTexture(TecTechUITextures.PROGRESSBAR_RESEARCH_STATION_2, bar2Width) + .setDirection(ProgressBar.Direction.RIGHT) + .setProgress(splitProgress.get(1)) + .setSynced(false, false) + .setPos(new Pos2d(124, 40).add(windowOffset)) + .setSize(bar2Width, 5)); + builder.widget( + new ProgressBar().setTexture(TecTechUITextures.PROGRESSBAR_RESEARCH_STATION_3, bar3Height) + .setDirection(ProgressBar.Direction.DOWN) + .setProgress(splitProgress.get(2)) + .setSynced(false, false) + .setPos(new Pos2d(128, 44).add(windowOffset)) + .setSize(10, bar3Height)); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java b/tectech/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java new file mode 100644 index 0000000000..1730e81713 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java @@ -0,0 +1,278 @@ +package com.github.technus.tectech.recipe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.CustomItemList; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.enums.ItemList; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Recipe.GT_Recipe_AssemblyLine; +import gregtech.api.util.GT_Utility; +import gregtech.common.GT_RecipeAdder; + +public class TT_recipeAdder extends GT_RecipeAdder { + + public static final ItemStack[] nullItem = new ItemStack[0]; + public static final FluidStack[] nullFluid = new FluidStack[0]; + + public static boolean addResearchableAssemblylineRecipe(ItemStack aResearchItem, int totalComputationRequired, + int computationRequiredPerSec, int researchEUt, int researchAmperage, ItemStack[] aInputs, + FluidStack[] aFluidInputs, ItemStack aOutput, int assDuration, int assEUt) { + if (aInputs == null) { + aInputs = nullItem; + } + if (aFluidInputs == null) { + aFluidInputs = nullFluid; + } + if (aResearchItem == null || totalComputationRequired <= 0 || aOutput == null || aInputs.length > 16) { + return false; + } + for (ItemStack tItem : aInputs) { + if (tItem == null) { + TecTech.LOGGER.error( + "addResearchableAssemblingLineRecipe " + aResearchItem.getDisplayName() + + " --> " + + aOutput.getUnlocalizedName() + + " there is some null item in that recipe"); + } + } + researchAmperage = GT_Utility.clamp(researchAmperage, 1, Short.MAX_VALUE); + computationRequiredPerSec = GT_Utility.clamp(computationRequiredPerSec, 1, Short.MAX_VALUE); + TecTechRecipeMaps.researchStationFakeRecipes.addFakeRecipe( + false, + new ItemStack[] { aResearchItem }, + new ItemStack[] { aOutput }, + new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Writes Research result") }, + null, + null, + totalComputationRequired, + researchEUt, + researchAmperage | computationRequiredPerSec << 16); + RecipeMaps.assemblylineVisualRecipes.addFakeRecipe( + false, + aInputs, + new ItemStack[] { aOutput }, + new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Reads Research result") }, + aFluidInputs, + null, + assDuration, + assEUt, + 0, + false); + GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes.add( + new GT_Recipe.GT_Recipe_AssemblyLine( + CustomItemList.UnusedStuff.get(1), + totalComputationRequired / computationRequiredPerSec, + aInputs, + aFluidInputs, + aOutput, + assDuration, + assEUt)); + TecTechRecipeMaps.researchableALRecipeList.add( + new GT_Recipe.GT_Recipe_AssemblyLine( + aResearchItem, + totalComputationRequired / computationRequiredPerSec, + aInputs, + aFluidInputs, + aOutput, + assDuration, + assEUt)); + return true; + } + + public static boolean addResearchableAssemblylineRecipe(ItemStack aResearchItem, int totalComputationRequired, + int computationRequiredPerSec, int researchEUt, int researchAmperage, Object[] aInputs, + FluidStack[] aFluidInputs, ItemStack aOutput, int assDuration, int assEUt) { + if (aInputs == null) { + aInputs = nullItem; + } + if (aFluidInputs == null) { + aFluidInputs = nullFluid; + } + if (aResearchItem == null || totalComputationRequired <= 0 + || aOutput == null + || aInputs.length > 16 + || aFluidInputs.length > 4 + || assDuration <= 0 + || assEUt <= 0) { + return false; + } + + ItemStack[] tInputs = new ItemStack[aInputs.length]; + ItemStack[][] tAlts = new ItemStack[aInputs.length][]; + int tPersistentHash = 1; + for (int i = 0; i < aInputs.length; i++) { + Object obj = aInputs[i]; + if (obj instanceof ItemStack) { + tInputs[i] = (ItemStack) obj; + tAlts[i] = null; + tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tInputs[i], true, false); + continue; + } else if (obj instanceof ItemStack[]aStacks) { + if (aStacks.length > 0) { + tInputs[i] = aStacks[0]; + tAlts[i] = Arrays.copyOf(aStacks, aStacks.length); + for (ItemStack tAlt : tAlts[i]) { + tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tAlt, true, false); + } + tPersistentHash *= 31; + continue; + } + } else if (obj instanceof Object[]objs) { + List<ItemStack> tList; + if (objs.length >= 2 && !(tList = GT_OreDictUnificator.getOres(objs[0])).isEmpty()) { + try { + // sort the output, so the hash code is stable across launches + tList.sort( + Comparator + .<ItemStack, String>comparing( + s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).modId) + .thenComparing(s -> GameRegistry.findUniqueIdentifierFor(s.getItem()).modId) + .thenComparingInt(Items.feather::getDamage) + .thenComparingInt(s -> s.stackSize)); + int tAmount = ((Number) objs[1]).intValue(); + List<ItemStack> uList = new ArrayList<>(); + for (ItemStack tStack : tList) { + ItemStack uStack = GT_Utility.copyAmount(tAmount, tStack); + if (GT_Utility.isStackValid(uStack)) { + uList.add(uStack); + if (tInputs[i] == null) tInputs[i] = uStack; + } + } + tAlts[i] = uList.toArray(new ItemStack[0]); + tPersistentHash = tPersistentHash * 31 + (objs[0] == null ? "" : objs[0].toString()).hashCode(); + tPersistentHash = tPersistentHash * 31 + tAmount; + continue; + } catch (Exception t) { + TecTech.LOGGER.error( + "addAssemblingLineRecipe " + aResearchItem.getDisplayName() + + " --> there is some ... in that recipe"); + } + } + } + TecTech.LOGGER.error( + "addAssemblingLineRecipe " + aResearchItem.getDisplayName() + + " --> " + + aOutput.getUnlocalizedName() + + " there is some null item in that recipe"); + } + tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aResearchItem, true, false); + tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(aOutput, true, false); + for (FluidStack tFluidInput : aFluidInputs) { + if (tFluidInput == null) continue; + tPersistentHash = tPersistentHash * 31 + GT_Utility.persistentHash(tFluidInput, true, false); + } + researchAmperage = GT_Utility.clamp(researchAmperage, 1, Short.MAX_VALUE); + computationRequiredPerSec = GT_Utility.clamp(computationRequiredPerSec, 1, Short.MAX_VALUE); + tPersistentHash = tPersistentHash * 31 + totalComputationRequired; + tPersistentHash = tPersistentHash * 31 + computationRequiredPerSec; + tPersistentHash = tPersistentHash * 31 + researchAmperage; + tPersistentHash = tPersistentHash * 31 + researchEUt; + tPersistentHash = tPersistentHash * 31 + assDuration; + tPersistentHash = tPersistentHash * 31 + assEUt; + TecTechRecipeMaps.researchStationFakeRecipes.addFakeRecipe( + false, + new ItemStack[] { aResearchItem }, + new ItemStack[] { aOutput }, + new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Writes Research result") }, + null, + null, + totalComputationRequired, + researchEUt, + researchAmperage | computationRequiredPerSec << 16); + RecipeMaps.assemblylineVisualRecipes.addFakeRecipe( + false, + tInputs, + new ItemStack[] { aOutput }, + new ItemStack[] { ItemList.Tool_DataStick.getWithName(1L, "Reads Research result") }, + aFluidInputs, + null, + assDuration, + assEUt, + 0, + tAlts, + false); + GT_Recipe_AssemblyLine recipeGT = new GT_Recipe_AssemblyLine( + CustomItemList.UnusedStuff.get(1), + totalComputationRequired / computationRequiredPerSec, + tInputs, + aFluidInputs, + aOutput, + assDuration, + assEUt, + tAlts); + recipeGT.setPersistentHash(tPersistentHash); + GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes.add(recipeGT); + GT_Recipe_AssemblyLine recipeTT = new GT_Recipe_AssemblyLine( + aResearchItem, + totalComputationRequired / computationRequiredPerSec, + tInputs, + aFluidInputs, + aOutput, + assDuration, + assEUt, + tAlts); + recipeTT.setPersistentHash(tPersistentHash); + TecTechRecipeMaps.researchableALRecipeList.add(recipeTT); + return true; + } + + public static boolean addFOGPlasmaRecipe(ItemStack[] itemInputs, FluidStack[] fluidOutputs, int machineDuration, + int machineEUt, boolean multiStep, int recipeTier) { + if (itemInputs == null) { + itemInputs = nullItem; + } + + TecTechRecipeMaps.godforgePlasmaRecipes + .addRecipe(false, itemInputs, null, multiStep, null, fluidOutputs, machineDuration, machineEUt, recipeTier); + return true; + } + + public static boolean addFOGPlasmaRecipe(FluidStack[] fluidInputs, FluidStack[] fluidOutputs, int machineDuration, + int machineEUt, boolean multiStep, int recipeTier) { + + if (fluidInputs == null) { + fluidInputs = nullFluid; + } + + TecTechRecipeMaps.godforgePlasmaRecipes.addRecipe( + false, + null, + null, + multiStep, + fluidInputs, + fluidOutputs, + machineDuration, + machineEUt, + recipeTier); + return true; + } + + public static boolean addFOGExoticFakeRecipe(ItemStack[] itemInputs, FluidStack[] fluidInputs, + FluidStack[] fluidOutputs, int machineDuration, int machineEUt, int recipeTier) { + + TecTechRecipeMaps.godforgeExoticMatterRecipes.addFakeRecipe( + false, + itemInputs, + null, + null, + fluidInputs, + fluidOutputs, + machineDuration, + machineEUt, + recipeTier, + false); + return true; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java b/tectech/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java new file mode 100644 index 0000000000..1626ac3252 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java @@ -0,0 +1,77 @@ +package com.github.technus.tectech.recipe; + +import java.util.ArrayList; +import java.util.List; + +import com.github.technus.tectech.thing.CustomItemList; +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.gtnewhorizons.modularui.common.widget.ProgressBar; + +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMapBackend; +import gregtech.api.recipe.RecipeMapBuilder; +import gregtech.api.util.GT_Recipe; + +public class TecTechRecipeMaps { + + public static void init() {} + + public static final List<GT_Recipe.GT_Recipe_AssemblyLine> researchableALRecipeList = new ArrayList<>(); + + public static final RecipeMap<RecipeMapBackend> eyeOfHarmonyRecipes = RecipeMapBuilder.of("gt.recipe.eyeofharmony") + .maxIO( + EyeOfHarmonyFrontend.maxItemInputs, + EyeOfHarmonyFrontend.maxItemOutputs, + EyeOfHarmonyFrontend.maxFluidInputs, + EyeOfHarmonyFrontend.maxFluidOutputs) + .minInputs(1, 0) + .progressBar(GT_UITextures.PROGRESSBAR_HAMMER, ProgressBar.Direction.DOWN) + .progressBarPos(78, 24 + 2) + .logoPos(10, 10) + .neiHandlerInfo( + builder -> builder.setDisplayStack(CustomItemList.Machine_Multi_EyeOfHarmony.get(1)) + .setMaxRecipesPerPage(1)) + .frontend(EyeOfHarmonyFrontend::new) + .build(); + public static final RecipeMap<RecipeMapBackend> researchStationFakeRecipes = RecipeMapBuilder + .of("gt.recipe.researchStation") + .maxIO(1, 1, 0, 0) + .useSpecialSlot() + .slotOverlays((index, isFluid, isOutput, isSpecial) -> { + if (isSpecial) { + return GT_UITextures.OVERLAY_SLOT_DATA_ORB; + } + if (isOutput) { + return TecTechUITextures.OVERLAY_SLOT_MESH; + } + return GT_UITextures.OVERLAY_SLOT_MICROSCOPE; + }) + .addSpecialTexture(19, 12, 84, 60, TecTechUITextures.PICTURE_HEAT_SINK) + .addSpecialTexture(41, 22, 40, 40, TecTechUITextures.PICTURE_RACK_LARGE) + .logo(TecTechUITextures.PICTURE_TECTECH_LOGO) + .logoSize(18, 18) + .logoPos(151, 63) + .neiTransferRect(81, 33, 25, 18) + .neiTransferRect(124, 33, 18, 29) + .frontend(ResearchStationFrontend::new) + .neiHandlerInfo(builder -> builder.setDisplayStack(CustomItemList.Machine_Multi_Research.get(1))) + .build(); + + public static final RecipeMap<RecipeMapBackend> godforgePlasmaRecipes = RecipeMapBuilder.of("gt.recipe.fog_plasma") + .maxIO(1, 1, 1, 1) + .progressBar(TecTechUITextures.PROGRESSBAR_GODFORGE_PLASMA, ProgressBar.Direction.RIGHT) + .progressBarPos(78, 33) + .neiTransferRect(78, 33, 20, 20) + .frontend(GodforgePlasmaFrontend::new) + .build(); + public static final RecipeMap<RecipeMapBackend> godforgeExoticMatterRecipes = RecipeMapBuilder + .of("gt.recipe.fog_exotic") + .maxIO(1, 1, 2, 1) + .progressBar(TecTechUITextures.PROGRESSBAR_GODFORGE_PLASMA, ProgressBar.Direction.RIGHT) + .progressBarPos(78, 33) + .neiTransferRect(78, 33, 20, 20) + .frontend(GodforgeExoticFrontend::new) + .build(); + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_ItemRenderer.java b/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_ItemRenderer.java new file mode 100644 index 0000000000..b5d75fdc71 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_ItemRenderer.java @@ -0,0 +1,98 @@ +package com.github.technus.tectech.rendering.EOH; + +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_0; +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_1; +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_2; +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.starModel; +import static java.lang.Math.pow; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.FMLClientHandler; + +public class EOH_ItemRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + + if (type == ItemRenderType.INVENTORY) GL11.glRotated(180, 0, 1, 0); + else if (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + GL11.glTranslated(0.5, 0.5, 0.5); + if (type == ItemRenderType.EQUIPPED) GL11.glRotated(90, 0, 1, 0); + } + + // Render star stuff. + renderStarLayer(0, STAR_LAYER_0, 1.0f); + renderStarLayer(1, STAR_LAYER_1, 0.4f); + renderStarLayer(2, STAR_LAYER_2, 0.2f); + + GL11.glPopMatrix(); + } + + private void renderStarLayer(int layer, ResourceLocation texture, float alpha) { + + // Begin animation. + GL11.glPushMatrix(); + + // OpenGL settings, not sure exactly what these do. + + // Disables lighting, so star is always lit (I think). + GL11.glDisable(GL11.GL_LIGHTING); + // Culls things out of line of sight? + GL11.glEnable(GL11.GL_CULL_FACE); + // Merges colours of the various layers of the star? + GL11.glEnable(GL11.GL_BLEND); + // ??? + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + // Bind animation to layer of star. + FMLClientHandler.instance() + .getClient() + .getTextureManager() + .bindTexture(texture); + + // 0.01f magic number to shrink sphere obj down. + // Size obtained from the multis current recipe. + float scale = 0.01f; + + // Put each subsequent layer further out. + scale *= pow(1.04f, layer); + + // Scale the star up in the x, y and z directions. + GL11.glScalef(scale, scale, scale); + + switch (layer) { + case 0 -> GL11.glRotatef(130 + (System.currentTimeMillis() / 64) % 360, 0F, 1F, 1F); + case 1 -> GL11.glRotatef(-49 + (System.currentTimeMillis() / 64) % 360, 1F, 1F, 0F); + case 2 -> GL11.glRotatef(67 + (System.currentTimeMillis() / 64) % 360, 1F, 0F, 1F); + } + + // Set colour and alpha (transparency) of the star layer. + GL11.glColor4f(1, 1, 1, alpha); + + starModel.renderAll(); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + // Finish animation. + GL11.glPopMatrix(); + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_RenderingUtils.java b/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_RenderingUtils.java new file mode 100644 index 0000000000..3f72cacd77 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_RenderingUtils.java @@ -0,0 +1,270 @@ +package com.github.technus.tectech.rendering.EOH; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_0; +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_1; +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.STAR_LAYER_2; +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.spaceModel; +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.starModel; +import static java.lang.Math.pow; + +import java.awt.Color; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.FMLClientHandler; + +public abstract class EOH_RenderingUtils { + + public static void renderStar(IItemRenderer.ItemRenderType type, Color color) { + GL11.glPushMatrix(); + + if (type == IItemRenderer.ItemRenderType.INVENTORY) GL11.glRotated(180, 0, 1, 0); + else if (type == IItemRenderer.ItemRenderType.EQUIPPED + || type == IItemRenderer.ItemRenderType.EQUIPPED_FIRST_PERSON) { + GL11.glTranslated(0.5, 0.5, 0.5); + if (type == IItemRenderer.ItemRenderType.EQUIPPED) GL11.glRotated(90, 0, 1, 0); + } + + // Render star stuff. + renderStarLayer(0, STAR_LAYER_0, color, 1.0f); + renderStarLayer(1, STAR_LAYER_1, color, 0.4f); + renderStarLayer(2, STAR_LAYER_2, color, 0.2f); + + GL11.glPopMatrix(); + } + + public static void renderStar(IItemRenderer.ItemRenderType type) { + renderStar(type, new Color(1.0f, 0.4f, 0.05f, 1.0f)); + } + + private static void renderStarLayer(int layer, ResourceLocation texture, Color color, float alpha) { + + // Begin animation. + GL11.glPushMatrix(); + + // OpenGL settings, not sure exactly what these do. + + // Disables lighting, so star is always lit (I think). + GL11.glDisable(GL11.GL_LIGHTING); + // Culls triangles/quads facing away from the camera + GL11.glEnable(GL11.GL_CULL_FACE); + // Allows alpha blending to occur (transparency-based color mixing) + GL11.glEnable(GL11.GL_BLEND); + // ??? + if (alpha < 1.0f) { + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + } else { + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + } + + // Bind image to layer of star. + FMLClientHandler.instance() + .getClient() + .getTextureManager() + .bindTexture(texture); + + // 0.01f magic number to shrink sphere obj down. + // Size obtained from the multis current recipe. + float scale = 0.01f; + + // Put each subsequent layer further out. + scale *= pow(1.04f, layer); + + // Scale the star up in the x, y and z directions. + GL11.glScalef(scale, scale, scale); + + switch (layer) { + case 0 -> GL11.glRotatef(130 + (System.currentTimeMillis() / 64) % 360, 0F, 1F, 1F); + case 1 -> GL11.glRotatef(-49 + (System.currentTimeMillis() / 64) % 360, 1F, 1F, 0F); + case 2 -> GL11.glRotatef(67 + (System.currentTimeMillis() / 64) % 360, 1F, 0F, 1F); + } + + // Set colour and alpha (transparency) of the star layer. + final float red = color.getRed() / 255.0f; + final float green = color.getGreen() / 255.0f; + final float blue = color.getBlue() / 255.0f; + + GL11.glColor4f(red, green, blue, alpha); + + starModel.renderAll(); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + // Finish animation. + GL11.glPopMatrix(); + } + + public static void beginRenderingBlocksInWorld(final float blockSize) { + final Tessellator tes = Tessellator.instance; + + GL11.glPushMatrix(); + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + + GL11.glDisable(GL11.GL_LIGHTING); + + tes.setColorOpaque_F(1f, 1f, 1f); + tes.startDrawingQuads(); + + GL11.glScalef(blockSize, blockSize, blockSize); + } + + public static void endRenderingBlocksInWorld() { + Tessellator.instance.draw(); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + + static final double[] BLOCK_X = { -0.5, -0.5, +0.5, +0.5, +0.5, +0.5, -0.5, -0.5 }; + static final double[] BLOCK_Y = { +0.5, -0.5, -0.5, +0.5, +0.5, -0.5, -0.5, +0.5 }; + static final double[] BLOCK_Z = { +0.5, +0.5, +0.5, +0.5, -0.5, -0.5, -0.5, -0.5 }; + + public static void addRenderedBlockInWorld(final Block block, final int meta, final double x, final double y, + final double z) { + final Tessellator tes = Tessellator.instance; + + IIcon texture; + + double minU; + double maxU; + double minV; + double maxV; + + { + texture = block.getIcon(4, meta); + + minU = texture.getMinU(); + maxU = texture.getMaxU(); + minV = texture.getMinV(); + maxV = texture.getMaxV(); + + tes.addVertexWithUV(x + BLOCK_X[1], y + BLOCK_Y[1], z + BLOCK_Z[1], maxU, maxV); + tes.addVertexWithUV(x + BLOCK_X[0], y + BLOCK_Y[0], z + BLOCK_Z[0], maxU, minV); + tes.addVertexWithUV(x + BLOCK_X[7], y + BLOCK_Y[7], z + BLOCK_Z[7], minU, minV); + tes.addVertexWithUV(x + BLOCK_X[6], y + BLOCK_Y[6], z + BLOCK_Z[6], minU, maxV); + } + + { + // Bottom face. + texture = block.getIcon(0, meta); + + minU = texture.getMinU(); + maxU = texture.getMaxU(); + minV = texture.getMinV(); + maxV = texture.getMaxV(); + + tes.addVertexWithUV(x + BLOCK_X[5], y + BLOCK_Y[5], z + BLOCK_Z[5], maxU, minV); + tes.addVertexWithUV(x + BLOCK_X[2], y + BLOCK_Y[2], z + BLOCK_Z[2], maxU, maxV); + tes.addVertexWithUV(x + BLOCK_X[1], y + BLOCK_Y[1], z + BLOCK_Z[1], minU, maxV); + tes.addVertexWithUV(x + BLOCK_X[6], y + BLOCK_Y[6], z + BLOCK_Z[6], minU, minV); + } + + { + texture = block.getIcon(2, meta); + + minU = texture.getMinU(); + maxU = texture.getMaxU(); + minV = texture.getMinV(); + maxV = texture.getMaxV(); + + tes.addVertexWithUV(x + BLOCK_X[6], y + BLOCK_Y[6], z + BLOCK_Z[6], maxU, maxV); + tes.addVertexWithUV(x + BLOCK_X[7], y + BLOCK_Y[7], z + BLOCK_Z[7], maxU, minV); + tes.addVertexWithUV(x + BLOCK_X[4], y + BLOCK_Y[4], z + BLOCK_Z[4], minU, minV); + tes.addVertexWithUV(x + BLOCK_X[5], y + BLOCK_Y[5], z + BLOCK_Z[5], minU, maxV); + } + + { + texture = block.getIcon(5, meta); + + minU = texture.getMinU(); + maxU = texture.getMaxU(); + minV = texture.getMinV(); + maxV = texture.getMaxV(); + + tes.addVertexWithUV(x + BLOCK_X[5], y + BLOCK_Y[5], z + BLOCK_Z[5], maxU, maxV); + tes.addVertexWithUV(x + BLOCK_X[4], y + BLOCK_Y[4], z + BLOCK_Z[4], maxU, minV); + tes.addVertexWithUV(x + BLOCK_X[3], y + BLOCK_Y[3], z + BLOCK_Z[3], minU, minV); + tes.addVertexWithUV(x + BLOCK_X[2], y + BLOCK_Y[2], z + BLOCK_Z[2], minU, maxV); + } + + { + texture = block.getIcon(1, meta); + + minU = texture.getMinU(); + maxU = texture.getMaxU(); + minV = texture.getMinV(); + maxV = texture.getMaxV(); + + tes.addVertexWithUV(x + BLOCK_X[3], y + BLOCK_Y[3], z + BLOCK_Z[3], maxU, maxV); + tes.addVertexWithUV(x + BLOCK_X[4], y + BLOCK_Y[4], z + BLOCK_Z[4], maxU, minV); + tes.addVertexWithUV(x + BLOCK_X[7], y + BLOCK_Y[7], z + BLOCK_Z[7], minU, minV); + tes.addVertexWithUV(x + BLOCK_X[0], y + BLOCK_Y[0], z + BLOCK_Z[0], minU, maxV); + } + + { + texture = block.getIcon(3, meta); + + minU = texture.getMinU(); + maxU = texture.getMaxU(); + minV = texture.getMinV(); + maxV = texture.getMaxV(); + + tes.addVertexWithUV(x + BLOCK_X[2], y + BLOCK_Y[2], z + BLOCK_Z[2], maxU, maxV); + tes.addVertexWithUV(x + BLOCK_X[3], y + BLOCK_Y[3], z + BLOCK_Z[3], maxU, minV); + tes.addVertexWithUV(x + BLOCK_X[0], y + BLOCK_Y[0], z + BLOCK_Z[0], minU, minV); + tes.addVertexWithUV(x + BLOCK_X[1], y + BLOCK_Y[1], z + BLOCK_Z[1], minU, maxV); + } + } + + public static void renderBlockInWorld(final Block block, final int meta, final float blockSize) { + beginRenderingBlocksInWorld(blockSize); + + addRenderedBlockInWorld(block, meta, 0, 0, 0); + + endRenderingBlocksInWorld(); + } + + public static void renderOuterSpaceShell() { + + // Save current OpenGL state. + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + + // Begin animation. + GL11.glPushMatrix(); + + // Disables lighting, so star is always lit. + GL11.glDisable(GL11.GL_LIGHTING); + // Merges colors of the various layers of the star. + // GL11.glEnable(GL11.GL_BLEND); + + // Bind animation to layer of star. + FMLClientHandler.instance() + .getClient() + .getTextureManager() + .bindTexture(new ResourceLocation(MODID, "models/spaceLayer.png")); + + final float scale = 0.01f * 17.5f; + // Scale the star up in the x, y and z directions. + GL11.glScalef(scale, scale, scale); + + GL11.glColor4f(1, 1, 1, 1); + + spaceModel.renderAll(); + + // Finish animation. + GL11.glPopMatrix(); + + // Restore previous OpenGL state. + GL11.glPopAttrib(); + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_TESR.java b/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_TESR.java new file mode 100644 index 0000000000..da704a37ff --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/rendering/EOH/EOH_TESR.java @@ -0,0 +1,91 @@ +package com.github.technus.tectech.rendering.EOH; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.rendering.EOH.EOH_RenderingUtils.renderBlockInWorld; +import static com.github.technus.tectech.rendering.EOH.EOH_RenderingUtils.renderOuterSpaceShell; +import static com.github.technus.tectech.rendering.EOH.EOH_RenderingUtils.renderStar; + +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +import org.lwjgl.opengl.GL11; + +import com.github.technus.tectech.thing.block.TileEyeOfHarmony; + +public class EOH_TESR extends TileEntitySpecialRenderer { + + public static final ResourceLocation STAR_LAYER_0 = new ResourceLocation(MODID, "models/StarLayer0.png"); + public static final ResourceLocation STAR_LAYER_1 = new ResourceLocation(MODID, "models/StarLayer1.png"); + public static final ResourceLocation STAR_LAYER_2 = new ResourceLocation(MODID, "models/StarLayer2.png"); + public static IModelCustom starModel; + public static IModelCustom spaceModel; + + public EOH_TESR() { + starModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Star.obj")); + spaceModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Space.obj")); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { + if (!(tile instanceof TileEyeOfHarmony EOHRenderTile)) return; + + GL11.glPushMatrix(); + // Required to centre the render to the middle of the block. + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + + // Space shell. + renderOuterSpaceShell(); + + // Render the planets. + renderOrbitObjects(EOHRenderTile); + + // Render the star itself. + renderStar(IItemRenderer.ItemRenderType.INVENTORY); + GL11.glPopAttrib(); + + GL11.glPopMatrix(); + } + + private void renderOrbitObjects(final TileEyeOfHarmony EOHRenderTile) { + + if (EOHRenderTile.getOrbitingObjects() != null) { + + if (EOHRenderTile.getOrbitingObjects() + .size() == 0) { + EOHRenderTile.generateImportantInfo(); + } + + for (TileEyeOfHarmony.OrbitingObject t : EOHRenderTile.getOrbitingObjects()) { + renderOrbit(EOHRenderTile, t); + } + } + } + + void renderOrbit(final TileEyeOfHarmony EOHRenderTile, final TileEyeOfHarmony.OrbitingObject orbitingObject) { + // Render orbiting body. + GL11.glPushMatrix(); + + GL11.glRotatef(orbitingObject.zAngle, 0, 0, 1); + GL11.glRotatef(orbitingObject.xAngle, 1, 0, 0); + GL11.glRotatef((orbitingObject.rotationSpeed * 0.1f * EOHRenderTile.angle) % 360.0f, 0F, 1F, 0F); + GL11.glTranslated(-0.2 - orbitingObject.distance - STAR_RESCALE * EOHRenderTile.getSize(), 0, 0); + GL11.glRotatef((orbitingObject.orbitSpeed * 0.1f * EOHRenderTile.angle) % 360.0f, 0F, 1F, 0F); + + this.bindTexture(TextureMap.locationBlocksTexture); + renderBlockInWorld(orbitingObject.block, 0, orbitingObject.scale); + + GL11.glPopMatrix(); + } + + private static final float STAR_RESCALE = 0.2f; + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/CustomItemList.java b/tectech/src/main/java/com/github/technus/tectech/thing/CustomItemList.java new file mode 100644 index 0000000000..a45e342050 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/CustomItemList.java @@ -0,0 +1,609 @@ +package com.github.technus.tectech.thing; + +import static gregtech.api.enums.GT_Values.W; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import gregtech.api.interfaces.IItemContainer; +import gregtech.api.util.GT_ModHandler; +import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.GT_Utility; + +public enum CustomItemList implements IItemContainer { + + Casing_UEV, + Casing_UIV, + Casing_UMV, + Casing_UXV, + Casing_MAXV, + Hull_UEV, + Hull_UIV, + Hull_UMV, + Hull_UXV, + Hull_MAXV, + Transformer_UEV_UHV, + Transformer_UIV_UEV, + Transformer_UMV_UIV, + Transformer_UXV_UMV, + Transformer_MAXV_UXV, + WetTransformer_LV_ULV, + WetTransformer_MV_LV, + WetTransformer_HV_MV, + WetTransformer_EV_HV, + WetTransformer_IV_EV, + WetTransformer_LuV_IV, + WetTransformer_ZPM_LuV, + WetTransformer_UV_ZPM, + WetTransformer_UHV_UV, + WetTransformer_UEV_UHV, + WetTransformer_UIV_UEV, + WetTransformer_UMV_UIV, + WetTransformer_UXV_UMV, + WetTransformer_MAXV_UXV, + + Transformer_HA_UEV_UHV, + Transformer_HA_UIV_UEV, + Transformer_HA_UMV_UIV, + Transformer_HA_UXV_UMV, + Transformer_HA_MAXV_UXV, + + hatch_CreativeMaintenance, + hatch_CreativeData, + hatch_CreativeUncertainty, + Machine_OwnerDetector, + Machine_BuckConverter_IV, + Machine_BuckConverter_LuV, + Machine_BuckConverter_ZPM, + Machine_BuckConverter_UV, + Machine_BuckConverter_UHV, + Machine_BuckConverter_UEV, + Machine_BuckConverter_UIV, + Machine_BuckConverter_UMV, + Machine_BuckConverter_UXV, + Machine_DebugWriter, + Machine_DebugGenny, + UnusedStuff, + Machine_DebugPollutor, + DATApipe, + LASERpipe, + rack_Hatch, + holder_Hatch, + capacitor_Hatch, + + eM_dynamoMulti4_EV, + eM_dynamoMulti16_EV, + eM_dynamoMulti64_EV, + eM_dynamoMulti4_IV, + eM_dynamoMulti16_IV, + eM_dynamoMulti64_IV, + eM_dynamoMulti4_LuV, + eM_dynamoMulti16_LuV, + eM_dynamoMulti64_LuV, + eM_dynamoMulti4_ZPM, + eM_dynamoMulti16_ZPM, + eM_dynamoMulti64_ZPM, + eM_dynamoMulti4_UV, + eM_dynamoMulti16_UV, + eM_dynamoMulti64_UV, + eM_dynamoMulti4_UHV, + eM_dynamoMulti16_UHV, + eM_dynamoMulti64_UHV, + eM_dynamoMulti4_UEV, + eM_dynamoMulti16_UEV, + eM_dynamoMulti64_UEV, + eM_dynamoMulti4_UIV, + eM_dynamoMulti16_UIV, + eM_dynamoMulti64_UIV, + eM_dynamoMulti4_UMV, + eM_dynamoMulti16_UMV, + eM_dynamoMulti64_UMV, + eM_dynamoMulti4_UXV, + eM_dynamoMulti16_UXV, + eM_dynamoMulti64_UXV, + eM_dynamoTunnel1_IV, + eM_dynamoTunnel2_IV, + eM_dynamoTunnel3_IV, + eM_dynamoTunnel4_IV, + eM_dynamoTunnel5_IV, + eM_dynamoTunnel6_IV, + eM_dynamoTunnel7_IV, + eM_dynamoTunnel1_LuV, + eM_dynamoTunnel2_LuV, + eM_dynamoTunnel3_LuV, + eM_dynamoTunnel4_LuV, + eM_dynamoTunnel5_LuV, + eM_dynamoTunnel6_LuV, + eM_dynamoTunnel7_LuV, + eM_dynamoTunnel1_ZPM, + eM_dynamoTunnel2_ZPM, + eM_dynamoTunnel3_ZPM, + eM_dynamoTunnel4_ZPM, + eM_dynamoTunnel5_ZPM, + eM_dynamoTunnel6_ZPM, + eM_dynamoTunnel7_ZPM, + eM_dynamoTunnel1_UV, + eM_dynamoTunnel2_UV, + eM_dynamoTunnel3_UV, + eM_dynamoTunnel4_UV, + eM_dynamoTunnel5_UV, + eM_dynamoTunnel6_UV, + eM_dynamoTunnel7_UV, + eM_dynamoTunnel1_UHV, + eM_dynamoTunnel2_UHV, + eM_dynamoTunnel3_UHV, + eM_dynamoTunnel4_UHV, + eM_dynamoTunnel5_UHV, + eM_dynamoTunnel6_UHV, + eM_dynamoTunnel7_UHV, + eM_dynamoTunnel1_UEV, + eM_dynamoTunnel2_UEV, + eM_dynamoTunnel3_UEV, + eM_dynamoTunnel4_UEV, + eM_dynamoTunnel5_UEV, + eM_dynamoTunnel6_UEV, + eM_dynamoTunnel7_UEV, + eM_dynamoTunnel1_UIV, + eM_dynamoTunnel2_UIV, + eM_dynamoTunnel3_UIV, + eM_dynamoTunnel4_UIV, + eM_dynamoTunnel5_UIV, + eM_dynamoTunnel6_UIV, + eM_dynamoTunnel7_UIV, + eM_dynamoTunnel1_UMV, + eM_dynamoTunnel2_UMV, + eM_dynamoTunnel3_UMV, + eM_dynamoTunnel4_UMV, + eM_dynamoTunnel5_UMV, + eM_dynamoTunnel6_UMV, + eM_dynamoTunnel7_UMV, + eM_dynamoTunnel1_UXV, + eM_dynamoTunnel2_UXV, + eM_dynamoTunnel3_UXV, + eM_dynamoTunnel4_UXV, + eM_dynamoTunnel5_UXV, + eM_dynamoTunnel6_UXV, + eM_dynamoTunnel7_UXV, + eM_dynamoTunnel9001, + + eM_energyMulti4_EV, + eM_energyMulti16_EV, + eM_energyMulti64_EV, + eM_energyMulti4_IV, + eM_energyMulti16_IV, + eM_energyMulti64_IV, + eM_energyMulti4_LuV, + eM_energyMulti16_LuV, + eM_energyMulti64_LuV, + eM_energyMulti4_ZPM, + eM_energyMulti16_ZPM, + eM_energyMulti64_ZPM, + eM_energyMulti4_UV, + eM_energyMulti16_UV, + eM_energyMulti64_UV, + eM_energyMulti4_UHV, + eM_energyMulti16_UHV, + eM_energyMulti64_UHV, + eM_energyMulti4_UEV, + eM_energyMulti16_UEV, + eM_energyMulti64_UEV, + eM_energyMulti4_UIV, + eM_energyMulti16_UIV, + eM_energyMulti64_UIV, + eM_energyMulti4_UMV, + eM_energyMulti16_UMV, + eM_energyMulti64_UMV, + eM_energyMulti4_UXV, + eM_energyMulti16_UXV, + eM_energyMulti64_UXV, + eM_energyWirelessMulti4_EV, + eM_energyWirelessMulti16_EV, + eM_energyWirelessMulti64_EV, + eM_energyWirelessMulti4_IV, + eM_energyWirelessMulti16_IV, + eM_energyWirelessMulti64_IV, + eM_energyWirelessMulti4_LuV, + eM_energyWirelessMulti16_LuV, + eM_energyWirelessMulti64_LuV, + eM_energyWirelessMulti4_ZPM, + eM_energyWirelessMulti16_ZPM, + eM_energyWirelessMulti64_ZPM, + eM_energyWirelessMulti4_UV, + eM_energyWirelessMulti16_UV, + eM_energyWirelessMulti64_UV, + eM_energyWirelessMulti4_UHV, + eM_energyWirelessMulti16_UHV, + eM_energyWirelessMulti64_UHV, + eM_energyWirelessMulti4_UEV, + eM_energyWirelessMulti16_UEV, + eM_energyWirelessMulti64_UEV, + eM_energyWirelessMulti4_UIV, + eM_energyWirelessMulti16_UIV, + eM_energyWirelessMulti64_UIV, + eM_energyWirelessMulti4_UMV, + eM_energyWirelessMulti16_UMV, + eM_energyWirelessMulti64_UMV, + eM_energyWirelessMulti4_UXV, + eM_energyWirelessMulti16_UXV, + eM_energyWirelessMulti64_UXV, + eM_energyWirelessMulti4_MAX, + eM_energyWirelessMulti16_MAX, + eM_energyWirelessMulti64_MAX, + eM_energyTunnel1_IV, + eM_energyTunnel2_IV, + eM_energyTunnel3_IV, + eM_energyTunnel4_IV, + eM_energyTunnel5_IV, + eM_energyTunnel6_IV, + eM_energyTunnel7_IV, + eM_energyTunnel1_LuV, + eM_energyTunnel2_LuV, + eM_energyTunnel3_LuV, + eM_energyTunnel4_LuV, + eM_energyTunnel5_LuV, + eM_energyTunnel6_LuV, + eM_energyTunnel7_LuV, + eM_energyTunnel1_ZPM, + eM_energyTunnel2_ZPM, + eM_energyTunnel3_ZPM, + eM_energyTunnel4_ZPM, + eM_energyTunnel5_ZPM, + eM_energyTunnel6_ZPM, + eM_energyTunnel7_ZPM, + eM_energyTunnel1_UV, + eM_energyTunnel2_UV, + eM_energyTunnel3_UV, + eM_energyTunnel4_UV, + eM_energyTunnel5_UV, + eM_energyTunnel6_UV, + eM_energyTunnel7_UV, + eM_energyTunnel1_UHV, + eM_energyTunnel2_UHV, + eM_energyTunnel3_UHV, + eM_energyTunnel4_UHV, + eM_energyTunnel5_UHV, + eM_energyTunnel6_UHV, + eM_energyTunnel7_UHV, + eM_energyTunnel1_UEV, + eM_energyTunnel2_UEV, + eM_energyTunnel3_UEV, + eM_energyTunnel4_UEV, + eM_energyTunnel5_UEV, + eM_energyTunnel6_UEV, + eM_energyTunnel7_UEV, + eM_energyTunnel1_UIV, + eM_energyTunnel2_UIV, + eM_energyTunnel3_UIV, + eM_energyTunnel4_UIV, + eM_energyTunnel5_UIV, + eM_energyTunnel6_UIV, + eM_energyTunnel7_UIV, + eM_energyTunnel1_UMV, + eM_energyTunnel2_UMV, + eM_energyTunnel3_UMV, + eM_energyTunnel4_UMV, + eM_energyTunnel5_UMV, + eM_energyTunnel6_UMV, + eM_energyTunnel7_UMV, + eM_energyTunnel1_UXV, + eM_energyTunnel2_UXV, + eM_energyTunnel3_UXV, + eM_energyTunnel4_UXV, + eM_energyTunnel5_UXV, + eM_energyTunnel6_UXV, + eM_energyTunnel7_UXV, + eM_energyTunnel9001, + eM_energyWirelessTunnel1_UXV, + eM_energyWirelessTunnel2_UXV, + eM_energyWirelessTunnel3_UXV, + eM_energyWirelessTunnel4_UXV, + eM_energyWirelessTunnel5_UXV, + eM_energyWirelessTunnel6_UXV, + eM_energyWirelessTunnel7_UXV, + + Parametrizer_Hatch, + ParametrizerX_Hatch, + ParametrizerTXT_Hatch, + Uncertainty_Hatch, + UncertaintyX_Hatch, + dataIn_Hatch, + dataOut_Hatch, + dataInAss_Hatch, + dataOutAss_Hatch, + eM_Containment, + eM_Containment_Field, + eM_Containment_Advanced, + eM_Coil, + eM_Teleportation, + eM_Dimensional, + eM_Ultimate_Containment, + eM_Ultimate_Containment_Advanced, + eM_Ultimate_Containment_Field, + eM_Spacetime, + eM_Computer_Casing, + eM_Computer_Bus, + eM_Computer_Vent, + eM_Hollow, + eM_Power, + debugBlock, + + tM_TeslaBase, + tM_TeslaToroid, + EOH_Reinforced_Temporal_Casing, + EOH_Reinforced_Spatial_Casing, + EOH_Infinite_Energy_Casing, + tM_TeslaSecondary, + tM_TeslaPrimary_0, + tM_TeslaPrimary_1, + tM_TeslaPrimary_2, + tM_TeslaPrimary_3, + tM_TeslaPrimary_4, + tM_TeslaPrimary_5, + tM_TeslaPrimary_6, + + Machine_Multi_Microwave, + Machine_Multi_TeslaCoil, + Machine_Multi_Transformer, + Machine_Multi_Computer, + Machine_Multi_Switch, + Machine_Multi_Research, + Machine_Multi_DataBank, + Machine_Multi_Infuser, + Machine_Multi_Decay, + Machine_Multi_Annihilation, + Machine_Multi_EyeOfHarmony, + Machine_Multi_ForgeOfGods, + Machine_Multi_SmeltingModule, + Machine_Multi_MoltenModule, + Machine_Multi_PlasmaModule, + Machine_Multi_QuarkGluonPlasmaModule, + + hint_0, + hint_1, + hint_2, + hint_3, + hint_4, + hint_5, + hint_6, + hint_7, + hint_8, + hint_9, + hint_10, + hint_11, + hint_general, + hint_air, + hint_noAir, + hint_error, + + scanContainer, + parametrizerMemory, + teslaCapacitor, + teslaCover, + teslaComponent, + teslaStaff, + enderLinkFluidCover, + powerPassUpgradeCover, + + Machine_TeslaCoil_1by1_LV, + Machine_TeslaCoil_1by1_MV, + Machine_TeslaCoil_1by1_HV, + Machine_TeslaCoil_1by1_EV, + Machine_TeslaCoil_1by1_IV, + Machine_TeslaCoil_2by2_LV, + Machine_TeslaCoil_2by2_MV, + Machine_TeslaCoil_2by2_HV, + Machine_TeslaCoil_2by2_EV, + Machine_TeslaCoil_2by2_IV, + Machine_TeslaCoil_3by3_LV, + Machine_TeslaCoil_3by3_MV, + Machine_TeslaCoil_3by3_HV, + Machine_TeslaCoil_3by3_EV, + Machine_TeslaCoil_3by3_IV, + Machine_TeslaCoil_4by4_LV, + Machine_TeslaCoil_4by4_MV, + Machine_TeslaCoil_4by4_HV, + Machine_TeslaCoil_4by4_EV, + Machine_TeslaCoil_4by4_IV, + DATApipeBlock, + LASERpipeBlock, + + SpacetimeCompressionFieldGeneratorTier0, + SpacetimeCompressionFieldGeneratorTier1, + SpacetimeCompressionFieldGeneratorTier2, + SpacetimeCompressionFieldGeneratorTier3, + SpacetimeCompressionFieldGeneratorTier4, + SpacetimeCompressionFieldGeneratorTier5, + SpacetimeCompressionFieldGeneratorTier6, + SpacetimeCompressionFieldGeneratorTier7, + SpacetimeCompressionFieldGeneratorTier8, + + TimeAccelerationFieldGeneratorTier0, + TimeAccelerationFieldGeneratorTier1, + TimeAccelerationFieldGeneratorTier2, + TimeAccelerationFieldGeneratorTier3, + TimeAccelerationFieldGeneratorTier4, + TimeAccelerationFieldGeneratorTier5, + TimeAccelerationFieldGeneratorTier6, + TimeAccelerationFieldGeneratorTier7, + TimeAccelerationFieldGeneratorTier8, + + StabilisationFieldGeneratorTier0, + StabilisationFieldGeneratorTier1, + StabilisationFieldGeneratorTier2, + StabilisationFieldGeneratorTier3, + StabilisationFieldGeneratorTier4, + StabilisationFieldGeneratorTier5, + StabilisationFieldGeneratorTier6, + StabilisationFieldGeneratorTier7, + StabilisationFieldGeneratorTier8, + + Godforge_Gravitational_Lens, + Godforge_Singularity_Shielding_Casing, + Godforge_Guidance_Casing, + Godforge_Boundless_Structure_Casing, + Godforge_Magnetic_Confinement_Casing, + Godforge_Stellar_Energy_Siphon_Casing, + Godforge_GravitonFlowModulatorTier1, + Godforge_GravitonFlowModulatorTier2, + Godforge_GravitonFlowModulatorTier3, + + astralArrayFabricator; + + private ItemStack mStack; + private boolean mHasNotBeenSet = true; + + // public static Fluid sOilExtraHeavy, sOilHeavy, sOilMedium, sOilLight, sNaturalGas; + + @Override + public IItemContainer set(Item aItem) { + mHasNotBeenSet = false; + if (aItem == null) { + return this; + } + ItemStack aStack = new ItemStack(aItem, 1, 0); + mStack = GT_Utility.copyAmount(1, aStack); + return this; + } + + @Override + public IItemContainer set(ItemStack aStack) { + mHasNotBeenSet = false; + mStack = GT_Utility.copyAmount(1, aStack); + return this; + } + + @Override + public Item getItem() { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + if (GT_Utility.isStackInvalid(mStack)) { + return null; + } + return mStack.getItem(); + } + + @Override + public Block getBlock() { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + return GT_Utility.getBlockFromStack(new ItemStack(getItem())); + } + + @Override + public final boolean hasBeenSet() { + return !mHasNotBeenSet; + } + + @Override + public boolean isStackEqual(Object aStack) { + return isStackEqual(aStack, false, false); + } + + @Override + public boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT) { + if (GT_Utility.isStackInvalid(aStack)) { + return false; + } + return GT_Utility.areUnificationsEqual((ItemStack) aStack, aWildcard ? getWildcard(1) : get(1), aIgnoreNBT); + } + + @Override + public ItemStack get(long aAmount, Object... aReplacements) { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + if (GT_Utility.isStackInvalid(mStack)) { + return GT_Utility.copyAmount(aAmount, aReplacements); + } + return GT_Utility.copyAmount(aAmount, GT_OreDictUnificator.get(mStack)); + } + + @Override + public ItemStack getWildcard(long aAmount, Object... aReplacements) { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + if (GT_Utility.isStackInvalid(mStack)) { + return GT_Utility.copyAmount(aAmount, aReplacements); + } + return GT_Utility.copyAmountAndMetaData(aAmount, W, GT_OreDictUnificator.get(mStack)); + } + + @Override + public ItemStack getUndamaged(long aAmount, Object... aReplacements) { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + if (GT_Utility.isStackInvalid(mStack)) { + return GT_Utility.copyAmount(aAmount, aReplacements); + } + return GT_Utility.copyAmountAndMetaData(aAmount, 0, GT_OreDictUnificator.get(mStack)); + } + + @Override + public ItemStack getAlmostBroken(long aAmount, Object... aReplacements) { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + if (GT_Utility.isStackInvalid(mStack)) { + return GT_Utility.copyAmount(aAmount, aReplacements); + } + return GT_Utility.copyAmountAndMetaData(aAmount, mStack.getMaxDamage() - 1, GT_OreDictUnificator.get(mStack)); + } + + @Override + public ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements) { + ItemStack rStack = get(1, aReplacements); + if (GT_Utility.isStackInvalid(rStack)) { + return null; + } + rStack.setStackDisplayName(aDisplayName); + return GT_Utility.copyAmount(aAmount, rStack); + } + + @Override + public ItemStack getWithCharge(long aAmount, int aEnergy, Object... aReplacements) { + ItemStack rStack = get(1, aReplacements); + if (GT_Utility.isStackInvalid(rStack)) { + return null; + } + GT_ModHandler.chargeElectricItem(rStack, aEnergy, Integer.MAX_VALUE, true, false); + return GT_Utility.copyAmount(aAmount, rStack); + } + + @Override + public ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements) { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + if (GT_Utility.isStackInvalid(mStack)) { + return GT_Utility.copyAmount(aAmount, aReplacements); + } + return GT_Utility.copyAmountAndMetaData(aAmount, aMetaValue, GT_OreDictUnificator.get(mStack)); + } + + @Override + public IItemContainer registerOre(Object... aOreNames) { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + for (Object tOreName : aOreNames) { + GT_OreDictUnificator.registerOre(tOreName, get(1)); + } + return this; + } + + @Override + public IItemContainer registerWildcardAsOre(Object... aOreNames) { + if (mHasNotBeenSet) { + throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!"); + } + for (Object tOreName : aOreNames) { + GT_OreDictUnificator.registerOre(tOreName, getWildcard(1)); + } + return this; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/EOH_RenderBlock.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/EOH_RenderBlock.java new file mode 100644 index 0000000000..110dc83015 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/EOH_RenderBlock.java @@ -0,0 +1,79 @@ +package com.github.technus.tectech.thing.block; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.github.technus.tectech.TecTech; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EOH_RenderBlock extends Block { + + public EOH_RenderBlock() { + super(Material.iron); + this.setResistance(20f); + this.setHardness(-1.0f); + this.setCreativeTab(TecTech.creativeTabTecTech); + this.setBlockName("Eye of Harmony Renderer"); + this.setLightLevel(100.0f); + registerOther(this); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT"); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean canRenderInPass(int a) { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int metadata) { + return new TileEyeOfHarmony(); + } + + public static void registerOther(Block block) { + String name = block.getUnlocalizedName() + .substring( + block.getUnlocalizedName() + .indexOf(".") + 1); + GameRegistry.registerBlock(block, name.substring(name.indexOf(":") + 1)); + } + + @Override + public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int meta, int fortune) { + return new ArrayList<>(); + } + + @Override + public boolean isCollidable() { + return false; + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java new file mode 100644 index 0000000000..02be399bb0 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java @@ -0,0 +1,70 @@ +package com.github.technus.tectech.thing.block; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.github.technus.tectech.TecTech; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ForgeOfGodsBlock extends Block { + + public ForgeOfGodsBlock() { + super(Material.iron); + this.setResistance(20f); + this.setHardness(-1.0f); + this.setCreativeTab(TecTech.creativeTabTecTech); + this.setBlockName("Forge of the Gods Renderer"); + this.setLightLevel(100.0f); + registerOther(this); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT"); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean canRenderInPass(int a) { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int metadata) { + return new TileForgeOfGods(); + } + + public static void registerOther(Block block) { + GameRegistry.registerBlock(block, "ForgeOfGodsRenderBlock"); + } + + @Override + public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int meta, int fortune) { + return new ArrayList<>(); + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java new file mode 100644 index 0000000000..67c77f5ac4 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java @@ -0,0 +1,107 @@ +package com.github.technus.tectech.thing.block; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.TecTech.creativeTabTecTech; + +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 cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import eu.usrv.yamcore.blocks.BlockBase; +import gregtech.api.GregTech_API; + +public class GodforgeGlassBlock extends BlockBase { + + public static IIcon Icon; + public static int renderID; + public static GodforgeGlassBlock INSTANCE; + + public GodforgeGlassBlock() { + super(Material.iron); + setBlockBounds(0, 0, 0, 1, 1, 1); + setBlockName("spatiallyTranscendentGravitationalLens"); + setHarvestLevel("wrench", 3); + setHardness(50); + setResistance(30); + setLightOpacity(0); + setStepSound(Block.soundTypeGlass); + setBlockTextureName(MODID + ":blockSpatiallyTranscendentGravitationalLens"); + setCreativeTab(creativeTabTecTech); + } + + @Override + public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) { + return true; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean getCanBlockGrass() { + return false; + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { + Block block = worldIn.getBlock(x, y, z); + return block != this; + } + + @Override + public int getRenderType() { + return renderID; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + Icon = blockIcon; + } + + public static void run() { + INSTANCE = new GodforgeGlassBlock(); + GameRegistry.registerBlock(INSTANCE, GodforgeGlassItem.class, INSTANCE.getUnlocalizedName()); + GregTech_API.registerMachineBlock(INSTANCE, -1); + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMeta) { + if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { + if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java new file mode 100644 index 0000000000..bd7d58a4da --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java @@ -0,0 +1,30 @@ +package com.github.technus.tectech.thing.block; + +import static com.github.technus.tectech.util.CommonValues.GODFORGE_MARK; +import static net.minecraft.util.StatCollector.translateToLocal; + +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.EnumChatFormatting; + +public class GodforgeGlassItem extends ItemBlock { + + public static GodforgeGlassItem INSTANCE; + + public GodforgeGlassItem(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { + aList.add(GODFORGE_MARK); + aList.add(translateToLocal("tile.godforgeGlass.desc.0")); + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("tile.godforgeGlass.desc.1")); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java new file mode 100644 index 0000000000..51c909c83d --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java @@ -0,0 +1,122 @@ +package com.github.technus.tectech.thing.block; + +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 cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; + +public class GodforgeGlassRender implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + Tessellator tessellator = Tessellator.instance; + GL11.glPushMatrix(); + // Get icons from custom register (useful for renderers and fluids) + IIcon side = GodforgeGlassBlock.Icon; + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, -1.0F, 0.0F); + renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, -1.0F); + renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(-1.0F, 0.0F, 0.0F); + renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + + renderer.renderStandardBlock(block, x, y, z); + Tessellator tes = Tessellator.instance; + tes.setNormal(0F, 1F, 0F); + tes.setBrightness(15728880); + tes.setColorOpaque_F(0F, 1F, 1F); + IIcon side = GodforgeGlassBlock.Icon; + + // South + if (world.getBlock(x, y, z + 1) + .getClass() != GodforgeGlassBlock.class) { + tes.addVertexWithUV(x, y, z + 0.999, side.getMinU(), side.getMaxV()); // 0.999 instead of 1 for fighting + // (textures overlapping) + tes.addVertexWithUV(x, y + 1, z + 0.999, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 1, z + 0.999, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y, z + 0.999, side.getMaxU(), side.getMaxV()); + } + // East + if (world.getBlock(x + 1, y, z) + .getClass() != GodforgeGlassBlock.class) { + tes.addVertexWithUV(x + 0.999, y, z + 1, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x + 0.999, y + 1, z + 1, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 0.999, y + 1, z, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 0.999, y, z, side.getMaxU(), side.getMaxV()); + } + // North + if (world.getBlock(x, y, z - 1) + .getClass() != GodforgeGlassBlock.class) { + tes.addVertexWithUV(x + 1, y, z + 0.001, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x + 1, y + 1, z + 0.001, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x, y + 1, z + 0.001, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x, y, z + 0.001, side.getMaxU(), side.getMaxV()); + } + // West + if (world.getBlock(x - 1, y, z) + .getClass() != GodforgeGlassBlock.class) { + tes.addVertexWithUV(x + 0.001, y, z, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x + 0.001, y + 1, z, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 0.001, y + 1, z + 1, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 0.001, y, z + 1, side.getMaxU(), side.getMaxV()); + } + // Top + if (world.getBlock(x, y + 1, z) + .getClass() != GodforgeGlassBlock.class) { + tes.addVertexWithUV(x, y + 0.999, z + 1, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x, y + 0.999, z, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 0.999, z, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 0.999, z + 1, side.getMaxU(), side.getMaxV()); + } + // Bottom + if (world.getBlock(x, y - 1, z) + .getClass() != GodforgeGlassBlock.class) { + tes.addVertexWithUV(x, y + 0.001, z, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x, y + 0.001, z + 1, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 0.001, z + 1, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 0.001, z, side.getMaxU(), side.getMaxV()); + } + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return GodforgeGlassBlock.renderID; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassBlock.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassBlock.java new file mode 100644 index 0000000000..790b4f390b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassBlock.java @@ -0,0 +1,111 @@ +package com.github.technus.tectech.thing.block; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.TecTech.creativeTabTecTech; + +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 cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import eu.usrv.yamcore.blocks.BlockBase; +import gregtech.api.GregTech_API; + +/** + * Created by danie_000 on 17.12.2016. + */ +public final class QuantumGlassBlock extends BlockBase { + + public static IIcon stuff; + public static int renderID; + public static QuantumGlassBlock INSTANCE; + + public QuantumGlassBlock() { + super(Material.iron); + setBlockBounds(0, 0, 0, 1, 1, 1); + setBlockName("quantumGlass"); + setHarvestLevel("wrench", 3); + setHardness(50); + setResistance(30); + setLightOpacity(0); + setStepSound(Block.soundTypeMetal); + setBlockTextureName(MODID + ":blockQuantumGlass"); + setCreativeTab(creativeTabTecTech); + } + + @Override + public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) { + return true; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean getCanBlockGrass() { + return false; + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { + Block block = worldIn.getBlock(x, y, z); + return block != this; // && super.shouldSideBeRendered(worldIn, x, y, z, + // side); + } + + @Override + public int getRenderType() { + return renderID; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + stuff = blockIcon; + } + + public static void run() { + INSTANCE = new QuantumGlassBlock(); + GameRegistry.registerBlock(INSTANCE, QuantumGlassItem.class, INSTANCE.getUnlocalizedName()); + GregTech_API.registerMachineBlock(INSTANCE, -1); + } + + @Override + public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMeta) { + if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } + + @Override + public void onBlockAdded(World aWorld, int aX, int aY, int aZ) { + if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) { + GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassItem.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassItem.java new file mode 100644 index 0000000000..43c41735b8 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassItem.java @@ -0,0 +1,33 @@ +package com.github.technus.tectech.thing.block; + +import static com.github.technus.tectech.util.CommonValues.TEC_MARK_EM; +import static net.minecraft.util.StatCollector.translateToLocal; + +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.EnumChatFormatting; + +/** + * Created by Tec on 11.04.2017. + */ +public class QuantumGlassItem extends ItemBlock { + + public static QuantumGlassItem INSTANCE; + + public QuantumGlassItem(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { + aList.add(TEC_MARK_EM); + aList.add(translateToLocal("tile.quantumGlass.desc.0")); // Dense yet transparent + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("tile.quantumGlass.desc.1")); // Glassy & Classy + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassRender.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassRender.java new file mode 100644 index 0000000000..f45e54f4ec --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumGlassRender.java @@ -0,0 +1,129 @@ +package com.github.technus.tectech.thing.block; + +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 cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; + +/** + * Created by danie_000 on 19.12.2016. + */ +public final class QuantumGlassRender implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + Tessellator tessellator = Tessellator.instance; + GL11.glPushMatrix(); + // Get icons from custom register (useful for renderers and fluids) + IIcon side = QuantumGlassBlock.stuff; + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, -1.0F, 0.0F); + renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, -1.0F); + renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(-1.0F, 0.0F, 0.0F); + renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, side); + tessellator.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + + renderer.renderStandardBlock(block, x, y, z); + Tessellator tes = Tessellator.instance; + GL11.glPushMatrix(); + tes.setNormal(0F, 1F, 0F); + tes.setBrightness(15728880); + tes.setColorOpaque_F(0F, 1F, 1F); + IIcon side = QuantumGlassBlock.stuff; + GL11.glDisable(GL11.GL_CULL_FACE); + + // South + if (world.getBlock(x, y, z + 1) + .getClass() != QuantumGlassBlock.class) { + tes.addVertexWithUV(x, y, z + 0.999, side.getMinU(), side.getMaxV()); // 0.999 instead of 1 for fighting + // (textures overlapping) + tes.addVertexWithUV(x, y + 1, z + 0.999, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 1, z + 0.999, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y, z + 0.999, side.getMaxU(), side.getMaxV()); + } + // East + if (world.getBlock(x + 1, y, z) + .getClass() != QuantumGlassBlock.class) { + tes.addVertexWithUV(x + 0.999, y, z + 1, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x + 0.999, y + 1, z + 1, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 0.999, y + 1, z, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 0.999, y, z, side.getMaxU(), side.getMaxV()); + } + // North + if (world.getBlock(x, y, z - 1) + .getClass() != QuantumGlassBlock.class) { + tes.addVertexWithUV(x + 1, y, z + 0.001, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x + 1, y + 1, z + 0.001, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x, y + 1, z + 0.001, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x, y, z + 0.001, side.getMaxU(), side.getMaxV()); + } + // West + if (world.getBlock(x - 1, y, z) + .getClass() != QuantumGlassBlock.class) { + tes.addVertexWithUV(x + 0.001, y, z, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x + 0.001, y + 1, z, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 0.001, y + 1, z + 1, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 0.001, y, z + 1, side.getMaxU(), side.getMaxV()); + } + // Top + if (world.getBlock(x, y + 1, z) + .getClass() != QuantumGlassBlock.class) { + tes.addVertexWithUV(x, y + 0.999, z + 1, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x, y + 0.999, z, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 0.999, z, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 0.999, z + 1, side.getMaxU(), side.getMaxV()); + } + // Bottom + if (world.getBlock(x, y - 1, z) + .getClass() != QuantumGlassBlock.class) { + tes.addVertexWithUV(x, y + 0.001, z, side.getMinU(), side.getMaxV()); + tes.addVertexWithUV(x, y + 0.001, z + 1, side.getMinU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 0.001, z + 1, side.getMaxU(), side.getMinV()); + tes.addVertexWithUV(x + 1, y + 0.001, z, side.getMaxU(), side.getMaxV()); + } + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return QuantumGlassBlock.renderID; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffBlock.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffBlock.java new file mode 100644 index 0000000000..db8d064f6f --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffBlock.java @@ -0,0 +1,104 @@ +package com.github.technus.tectech.thing.block; + +import static com.github.technus.tectech.Reference.MODID; + +import java.util.ArrayList; +import java.util.Random; + +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.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import eu.usrv.yamcore.blocks.BlockBase; + +/** + * Created by danie_000 on 17.12.2016. + */ +public final class QuantumStuffBlock extends BlockBase { + + public static IIcon stuff; + public static int renderID; + public static QuantumStuffBlock INSTANCE; + + public QuantumStuffBlock() { + super(Material.iron); + setBlockBounds(0, 0, 0, 1, 1, 1); + setBlockName("quantumStuff"); + setHarvestLevel("wrench", 0); + setHardness(500); + setResistance(1); + setLightOpacity(0); + setBlockTextureName(MODID + ":blockQuantumStuff"); + } + + @Override + public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + stuff = blockIcon; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean getCanBlockGrass() { + return false; + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { + return false; + } + + @Override + public int getRenderType() { + return renderID; + } + + public static void run() { + INSTANCE = new QuantumStuffBlock(); + GameRegistry.registerBlock(INSTANCE, INSTANCE.getUnlocalizedName()); + } + + @Override + public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return new ArrayList<>(); + } + + @Override + public Item getItemDropped(int meta, Random random, int fortune) { + return null; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffRender.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffRender.java new file mode 100644 index 0000000000..4230dff43f --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/QuantumStuffRender.java @@ -0,0 +1,104 @@ +package com.github.technus.tectech.thing.block; + +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.util.Vec3; +import net.minecraft.world.IBlockAccess; + +import org.lwjgl.opengl.GL11; + +import com.github.technus.tectech.TecTech; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; + +/** + * Created by danie_000 on 19.12.2016. + */ +public final class QuantumStuffRender implements ISimpleBlockRenderingHandler { + + private static final Tessellator tes = Tessellator.instance; + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + GL11.glPushMatrix(); + // Get icons from custom register (useful for renderers and fluids) + IIcon side = QuantumStuffBlock.stuff; + tes.startDrawingQuads(); + tes.setNormal(0.0F, -1.0F, 0.0F); + renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, side); + tes.draw(); + tes.startDrawingQuads(); + tes.setNormal(0.0F, 0.0F, -1.0F); + renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, side); + tes.draw(); + tes.startDrawingQuads(); + tes.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, side); + tes.draw(); + tes.startDrawingQuads(); + tes.setNormal(-1.0F, 0.0F, 0.0F); + renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, side); + tes.draw(); + tes.startDrawingQuads(); + tes.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, side); + tes.draw(); + tes.startDrawingQuads(); + tes.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, side); + tes.draw(); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + // renderer.renderStandardBlock(block, x, y, z); + GL11.glPushMatrix(); + tes.setNormal(0F, 1F, 0F); + tes.setBrightness(15728880); + IIcon side = QuantumStuffBlock.stuff; + for (int i = 0; i < 6; i++) { + float f = 1 - TecTech.RANDOM.nextFloat() / 4f, g = f - TecTech.RANDOM.nextFloat() / 4f, + r = g - TecTech.RANDOM.nextFloat() / 4f - 0.25f; + tes.setColorOpaque_F(r, g, f); + float rotX = TecTech.RANDOM.nextFloat() * 2 * (float) Math.PI, + rotY = TecTech.RANDOM.nextFloat() * 2 * (float) Math.PI, + rotZ = TecTech.RANDOM.nextFloat() * 2 * (float) Math.PI; + tesAbuse(x, y, z, -1.425f, -1.425f, .1f, rotX, rotY, rotZ, side.getMinU(), side.getMaxV()); + tesAbuse(x, y, z, -1.425f, 1.425f, .1f, rotX, rotY, rotZ, side.getMinU(), side.getMinV()); + tesAbuse(x, y, z, 1.425f, 1.425f, .1f, rotX, rotY, rotZ, side.getMaxU(), side.getMinV()); + tesAbuse(x, y, z, 1.425f, -1.425f, .1f, rotX, rotY, rotZ, side.getMaxU(), side.getMaxV()); + + tesAbuse(x, y, z, 1.425f, -1.425f, -.1f, rotX, rotY, rotZ, side.getMaxU(), side.getMaxV()); + tesAbuse(x, y, z, 1.425f, 1.425f, -.1f, rotX, rotY, rotZ, side.getMaxU(), side.getMinV()); + tesAbuse(x, y, z, -1.425f, 1.425f, -.1f, rotX, rotY, rotZ, side.getMinU(), side.getMinV()); + tesAbuse(x, y, z, -1.425f, -1.425f, -.1f, rotX, rotY, rotZ, side.getMinU(), side.getMaxV()); + } + GL11.glPopMatrix(); + return true; + } + + private void tesAbuse(int x, int y, int z, float sx, float sy, float sz, float rotX, float rotY, float rotZ, + float sideU, float sideV) { + Vec3 pos = Vec3.createVectorHelper(sx, sy, sz); + pos.rotateAroundX(rotX); + pos.rotateAroundY(rotY); + pos.rotateAroundZ(rotZ); + tes.addVertexWithUV(pos.xCoord + x + .5f, pos.yCoord + y + .5f, pos.zCoord + z + .5f, sideU, sideV); + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return QuantumStuffBlock.renderID; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/ReactorSimBlock.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/ReactorSimBlock.java new file mode 100644 index 0000000000..80eca10cad --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/ReactorSimBlock.java @@ -0,0 +1,96 @@ +package com.github.technus.tectech.thing.block; + +import static com.github.technus.tectech.Reference.MODID; + +import net.minecraft.block.Block; +import net.minecraft.block.ITileEntityProvider; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.github.technus.tectech.thing.tileEntity.ReactorSimTileEntity; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ic2.core.IC2; +import ic2.core.IHasGui; +import ic2.core.block.TileEntityBlock; + +/** + * Created by danie_000 on 30.09.2017. + */ +public class ReactorSimBlock extends Block implements ITileEntityProvider { + + public static ReactorSimBlock INSTANCE; + public static IIcon stuff; + + public ReactorSimBlock() { + super(Material.iron); + setBlockBounds(0, 0, 0, 1, 1, 1); + setBlockName("reactorSim"); + setHarvestLevel("wrench", 3); + setHardness(50); + setResistance(30); + setLightOpacity(0); + setStepSound(Block.soundTypeMetal); + setBlockTextureName(MODID + ":blockReactorSimulator"); + } + + @Override + public boolean isOpaqueCube() { + return true; + } + + @Override + public boolean getCanBlockGrass() { + return true; + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + stuff = blockIcon; + } + + public static void run() { + INSTANCE = new ReactorSimBlock(); + GameRegistry.registerBlock(INSTANCE, ReactorSimItem.class, INSTANCE.getUnlocalizedName()); + GameRegistry.registerTileEntity(ReactorSimTileEntity.class, MODID + "_reactorSim"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new ReactorSimTileEntity(); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float a, + float b, float c) { + if (entityPlayer.isSneaking()) { + return false; + } else { + TileEntity te = world.getTileEntity(x, y, z); + return te instanceof IHasGui + && (!IC2.platform.isSimulating() || IC2.platform.launchGui(entityPlayer, (IHasGui) te)); + } + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block srcBlock) { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof TileEntityBlock) { + ((TileEntityBlock) te).onNeighborUpdate(srcBlock); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/ReactorSimItem.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/ReactorSimItem.java new file mode 100644 index 0000000000..01ed6b54ad --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/ReactorSimItem.java @@ -0,0 +1,36 @@ +package com.github.technus.tectech.thing.block; + +import static com.github.technus.tectech.util.CommonValues.TEC_MARK_GENERAL; +import static net.minecraft.util.StatCollector.translateToLocal; + +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.EnumChatFormatting; + +/** + * Created by danie_000 on 30.09.2017. + */ +public class ReactorSimItem extends ItemBlock { + + public static QuantumGlassItem INSTANCE; + + public ReactorSimItem(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { + aList.add(TEC_MARK_GENERAL); + aList.add(translateToLocal("tile.reactorSim.desc.0")); // Fission Reaction Uncertainty Resolver 9001 + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("tile.reactorSim.desc.1")); // Explodes, + // but + // not + // as + // much... + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java new file mode 100644 index 0000000000..70314927f4 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java @@ -0,0 +1,130 @@ +package com.github.technus.tectech.thing.block; + +import static com.github.technus.tectech.Reference.MODID; +import static java.lang.Math.pow; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderForgeOfGods extends TileEntitySpecialRenderer { + + public static final ResourceLocation STAR_LAYER_0 = new ResourceLocation(MODID, "models/StarLayer0.png"); + public static final ResourceLocation STAR_LAYER_1 = new ResourceLocation(MODID, "models/StarLayer1.png"); + public static final ResourceLocation STAR_LAYER_2 = new ResourceLocation(MODID, "models/StarLayer2.png"); + public static IModelCustom starModel; + private static IModelCustom spaceModel; + private static final float RED = 180 / 255f; + private static final float GREEN = 180 / 255f; + private static final float BLUE = 255 / 255f; + + public RenderForgeOfGods() { + starModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Star.obj")); + spaceModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Space.obj")); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { + if (!(tile instanceof TileForgeOfGods)) return; + + TileForgeOfGods FOGRenderTile = (TileForgeOfGods) tile; + + // Render outer space layer. + + { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + renderOuterSpaceShell(); + + // Render star stuff. + renderStarLayer(FOGRenderTile, 0, STAR_LAYER_0, 1.0f); + renderStarLayer(FOGRenderTile, 1, STAR_LAYER_1, 0.4f); + renderStarLayer(FOGRenderTile, 2, STAR_LAYER_2, 0.2f); + + GL11.glPopMatrix(); + } + } + + public static void renderOuterSpaceShell() { + + GL11.glPushMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_BLEND); + + FMLClientHandler.instance() + .getClient() + .getTextureManager() + .bindTexture(new ResourceLocation(MODID, "models/spaceLayer.png")); + + final float scale = 0.01f * 17.5f; + GL11.glScalef(scale, scale, scale); + + GL11.glColor4f(222 / 255f, 243 / 255f, 250 / 255f, 255 / 255f); + + spaceModel.renderAll(); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glPopMatrix(); + } + + private static final float STAR_RESCALE = 0.2f; + + private void renderStarLayer(TileForgeOfGods FOGRenderTile, int layer, ResourceLocation texture, float alpha) { + + GL11.glPushMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + FMLClientHandler.instance() + .getClient() + .getTextureManager() + .bindTexture(texture); + + // 0.01f magic number to shrink sphere obj down + float scale = 0.01f * STAR_RESCALE * FOGRenderTile.getRenderSize(); + + // Put each layer further out + scale *= pow(1.04f, layer); + + // Scale the star up in the x, y and z directions + GL11.glScalef(scale, scale, scale); + + switch (layer) { + case 0: + GL11.glRotatef(130, 0F, 1F, 1F); + break; + case 1: + GL11.glRotatef(-49, 1F, 1F, 0F); + break; + case 2: + GL11.glRotatef(67, 1F, 0F, 1F); + break; + } + + // Set color and alpha of the star layer + GL11.glColor4f(RED, GREEN, BLUE, alpha); + + // Spin the star + GL11.glRotatef((0.03f * FOGRenderTile.angle * FOGRenderTile.getRenderRotationSpeed()) % 360.0f, 0F, 0F, 1F); + + starModel.renderAll(); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glPopMatrix(); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/TileEyeOfHarmony.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/TileEyeOfHarmony.java new file mode 100644 index 0000000000..4c9d51a175 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/TileEyeOfHarmony.java @@ -0,0 +1,200 @@ +package com.github.technus.tectech.thing.block; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.stream.IntStream; + +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; + +import pers.gwyog.gtneioreplugin.plugin.block.ModBlocks; + +public class TileEyeOfHarmony extends TileEntity { + + private static final double EOH_STAR_FIELD_RADIUS = 13; + + // Prevent culling when block is out of frame so model can remain active. + @Override + public AxisAlignedBB getRenderBoundingBox() { + + // Assuming your block is at (x, y, z) + double x = this.xCoord; + double y = this.yCoord; + double z = this.zCoord; + + // Create a bounding box that extends 'size' blocks in all directions from the block. + return AxisAlignedBB.getBoundingBox( + x - EOH_STAR_FIELD_RADIUS, + y - EOH_STAR_FIELD_RADIUS, + z - EOH_STAR_FIELD_RADIUS, + x + EOH_STAR_FIELD_RADIUS + 1, + y + EOH_STAR_FIELD_RADIUS + 1, + z + EOH_STAR_FIELD_RADIUS + 1); + } + + public void setSize(float size) { + this.size = size; + } + + public void setRotationSpeed(float rotationSpeed) { + this.rotationSpeed = rotationSpeed; + } + + private float size = 10; + private float rotationSpeed = 10; + + // Fun fact, these methods were entirely written by ChatGPT3... Take that as you will. + public static <T> ArrayList<T> selectNRandomElements(Collection<T> inputList, long n) { + ArrayList<T> randomElements = new ArrayList<>((int) n); + ArrayList<T> inputArray = new ArrayList<>(inputList); + Random rand = new Random(); + IntStream.range(0, (int) n) + .forEach(i -> { + int randomIndex = rand.nextInt(inputArray.size()); + randomElements.add(inputArray.get(randomIndex)); + inputArray.remove(randomIndex); + }); + return randomElements; + } + + public static float generateRandomFloat(float a, float b) { + Random rand = new Random(); + return rand.nextFloat() * (b - a) + a; + } + + public long getTier() { + return tier; + } + + public void setTier(long tier) { + this.tier = tier; + } + + private long tier = 9; + + public float getSize() { + return size; + } + + public float getRotationSpeed() { + return rotationSpeed; + } + + @Override + public void updateEntity() { + angle += 10.0f; + } + + public static class OrbitingObject { + + public OrbitingObject(Block block, float distance, float rotationSpeed, float orbitSpeed, float xAngle, + float zAngle, float scale) { + this.block = block; + this.distance = distance; + this.rotationSpeed = rotationSpeed; + this.orbitSpeed = orbitSpeed; + this.xAngle = xAngle; + this.zAngle = zAngle; + this.scale = scale; + } + + public final Block block; + public final float distance; + public final float rotationSpeed; + public final float orbitSpeed; + public final float xAngle; + public final float zAngle; + public final float scale; + } + + public ArrayList<OrbitingObject> getOrbitingObjects() { + return orbitingObjects; + } + + private final ArrayList<OrbitingObject> orbitingObjects = new ArrayList<>(); + private static final Set<String> BLACKLISTED_BLOCKS = Collections + .unmodifiableSet(new HashSet<>(Arrays.asList("Tf", "Ow", "ED", "EA", "VA"))); + // Map of strings to blocks + private static final Map<String, Block> BLOCKS = new HashMap<>(); + + static { + // Initialize the map of blocks + ModBlocks.blocks.forEach((dimString, dimBlock) -> { + if (!BLACKLISTED_BLOCKS.contains(dimString)) { + BLOCKS.put(dimString, dimBlock); + } + }); + } + + private static final float MAX_ANGLE = 30; + + // This must be set last. + public void generateImportantInfo() { + + int index = 0; + for (Block block : selectNRandomElements(BLOCKS.values(), tier + 1)) { + + float xAngle = generateRandomFloat(-MAX_ANGLE, MAX_ANGLE); + float zAngle = generateRandomFloat(-MAX_ANGLE, MAX_ANGLE); + index += 1.0; + float distance = index + generateRandomFloat(-0.2f, 0.2f); + float scale = generateRandomFloat(0.2f, 0.9f); + float rotationSpeed = generateRandomFloat(0.5f, 1.5f); + float orbitSpeed = generateRandomFloat(0.5f, 1.5f); + orbitingObjects.add(new OrbitingObject(block, distance, rotationSpeed, orbitSpeed, xAngle, zAngle, scale)); + } + } + + // Used to track the rotation of the star/planets. + public float angle; + + private static final String EOH_NBT_TAG = "EOH:"; + private static final String ROTATION_SPEED_NBT_TAG = EOH_NBT_TAG + "rotationSpeed"; + private static final String SIZE_NBT_TAG = EOH_NBT_TAG + "size"; + private static final String TIER_NBT_TAG = EOH_NBT_TAG + "tier"; + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + + // Save other stats. + compound.setFloat(ROTATION_SPEED_NBT_TAG, rotationSpeed); + compound.setFloat(SIZE_NBT_TAG, size); + compound.setLong(TIER_NBT_TAG, tier); + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + + // Load other stats. + rotationSpeed = compound.getFloat(ROTATION_SPEED_NBT_TAG); + size = compound.getFloat(SIZE_NBT_TAG); + tier = compound.getLong(TIER_NBT_TAG); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbttagcompound = new NBTTagCompound(); + writeToNBT(nbttagcompound); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbttagcompound); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + readFromNBT(pkt.func_148857_g()); + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java b/tectech/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java new file mode 100644 index 0000000000..0e0b536046 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java @@ -0,0 +1,77 @@ +package com.github.technus.tectech.thing.block; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; + +public class TileForgeOfGods extends TileEntity { + + private float size = 10; + private float rotationSpeed = 10; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return INFINITE_EXTENT_AABB; + } + + public void setRenderSize(float size) { + this.size = size; + } + + public void setRenderRotationSpeed(float rotationSpeed) { + this.rotationSpeed = rotationSpeed; + } + + public float getRenderSize() { + return size; + } + + public float getRenderRotationSpeed() { + return rotationSpeed; + } + + @Override + public void updateEntity() { + angle += 10.0f; + } + + // Used to track the rotation of the star + public float angle; + + private static final String FOG_NBT_TAG = "FOG:"; + private static final String ROTATION_SPEED_NBT_TAG = FOG_NBT_TAG + "renderRotationSpeed"; + private static final String SIZE_NBT_TAG = FOG_NBT_TAG + "renderSize"; + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + + // Save stats + compound.setFloat(ROTATION_SPEED_NBT_TAG, rotationSpeed); + compound.setFloat(SIZE_NBT_TAG, size); + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + + // Load stats + rotationSpeed = compound.getFloat(ROTATION_SPEED_NBT_TAG); + size = compound.getFloat(SIZE_NBT_TAG); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbttagcompound = new NBTTagCompound(); + writeToNBT(nbttagcompound); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbttagcompound); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + readFromNBT(pkt.func_148857_g()); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsBA0.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsBA0.java new file mode 100644 index 0000000000..1c6524934c --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsBA0.java @@ -0,0 +1,227 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; + +import java.util.List; + +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 com.github.technus.tectech.thing.CustomItemList; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.objects.GT_CopiedBlockTexture; +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Block_Casings_Abstract; +import gregtech.common.blocks.GT_Material_Casings; + +/** + * Created by danie_000 on 03.10.2016. + */ +// Mostly tesla coils, also 2 eye of harmony casings. +public class GT_Block_CasingsBA0 extends GT_Block_Casings_Abstract { + + private static final IIcon[] tM0 = new IIcon[2]; + private static final IIcon[] tM1 = new IIcon[2]; + private static final IIcon[] tM2 = new IIcon[2]; + private static final IIcon[] tM3 = new IIcon[2]; + private static final IIcon[] tM4 = new IIcon[2]; + private static final IIcon[] tM5 = new IIcon[2]; + private static final IIcon[] tM6 = new IIcon[2]; + private static IIcon tM7; + private static final IIcon[] tM8 = new IIcon[2]; + private static final IIcon[] tM9 = new IIcon[2]; + + private static IIcon EOH_INNER; + private static IIcon EOH_OUTER; + private static IIcon EOH_INFINITE; + + private static final byte START_INDEX = 16; + + public GT_Block_CasingsBA0() { + super(GT_Item_CasingsBA0.class, "gt.blockcasingsBA0", GT_Material_Casings.INSTANCE); + for (byte b = 0; b < 16; b = (byte) (b + 1)) { + Textures.BlockIcons.casingTexturePages[texturePage][b + + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b); + /* IMPORTANT for block recoloring **/ + } + + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".0.name", "Redstone Alloy Primary Tesla Windings"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".1.name", "MV Superconductor Primary Tesla Windings"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".2.name", "HV Superconductor Primary Tesla Windings"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".3.name", "EV Superconductor Primary Tesla Windings"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".4.name", "IV Superconductor Primary Tesla Windings"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".5.name", "LuV Superconductor Primary Tesla Windings"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".9.name", "ZPM Superconductor Primary Tesla Windings"); + + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Tesla Base Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Tesla Toroid Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Tesla Secondary Windings"); + + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".10.name", "Reinforced Temporal Structure Casing"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".11.name", "Reinforced Spatial Structure Casing"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".12.name", "Infinite Spacetime Energy Boundary Casing"); + + CustomItemList.tM_TeslaPrimary_0.set(new ItemStack(this, 1, 0)); + CustomItemList.tM_TeslaPrimary_1.set(new ItemStack(this, 1, 1)); + CustomItemList.tM_TeslaPrimary_2.set(new ItemStack(this, 1, 2)); + CustomItemList.tM_TeslaPrimary_3.set(new ItemStack(this, 1, 3)); + CustomItemList.tM_TeslaPrimary_4.set(new ItemStack(this, 1, 4)); + CustomItemList.tM_TeslaPrimary_5.set(new ItemStack(this, 1, 5)); + CustomItemList.tM_TeslaPrimary_6.set(new ItemStack(this, 1, 9)); + + CustomItemList.tM_TeslaBase.set(new ItemStack(this, 1, 6)); + CustomItemList.tM_TeslaToroid.set(new ItemStack(this, 1, 7)); + CustomItemList.tM_TeslaSecondary.set(new ItemStack(this, 1, 8)); + + CustomItemList.EOH_Reinforced_Temporal_Casing.set(new ItemStack(this, 1, 10)); + CustomItemList.EOH_Reinforced_Spatial_Casing.set(new ItemStack(this, 1, 11)); + CustomItemList.EOH_Infinite_Energy_Casing.set(new ItemStack(this, 1, 12)); + } + + @Override + public void registerBlockIcons(IIconRegister aIconRegister) { + tM0[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0"); + tM0[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0"); + tM1[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1"); + tM1[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1"); + tM2[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2"); + tM2[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2"); + tM3[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3"); + tM3[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3"); + tM4[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4"); + tM4[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4"); + tM5[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5"); + tM5[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5"); + tM9[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6"); + tM9[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6"); + + tM6[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_BASE_TOP_BOTTOM"); + tM6[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_BASE_SIDES"); + tM7 = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_TOROID"); + tM8[0] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM"); + tM8[1] = aIconRegister.registerIcon("gregtech:iconsets/TM_TESLA_WINDING_SECONDARY_SIDES"); + + EOH_INNER = aIconRegister.registerIcon("gregtech:iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING"); + EOH_OUTER = aIconRegister.registerIcon("gregtech:iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING"); + EOH_INFINITE = aIconRegister.registerIcon("gregtech:iconsets/EM_POWER_INFINITE"); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + switch (aMeta) { + case 0: + switch (ordinalSide) { + case 0: + case 1: + return tM0[0]; + default: + return tM0[1]; + } + case 1: + switch (ordinalSide) { + case 0: + case 1: + return tM1[0]; + default: + return tM1[1]; + } + case 2: + switch (ordinalSide) { + case 0: + case 1: + return tM2[0]; + default: + return tM2[1]; + } + case 3: + switch (ordinalSide) { + case 0: + case 1: + return tM3[0]; + default: + return tM3[1]; + } + case 4: + switch (ordinalSide) { + case 0: + case 1: + return tM4[0]; + default: + return tM4[1]; + } + case 5: + switch (ordinalSide) { + case 0: + case 1: + return tM5[0]; + default: + return tM5[1]; + } + case 6: + switch (ordinalSide) { + case 0: + case 1: + return tM6[0]; + default: + return tM6[1]; + } + case 7: + return tM7; + case 8: + switch (ordinalSide) { + case 0: + case 1: + return tM8[0]; + default: + return tM8[1]; + } + case 9: + switch (ordinalSide) { + case 0: + case 1: + return tM9[0]; + default: + return tM9[1]; + } + case 10: + return EOH_INNER; + case 11: + return EOH_OUTER; + case 12: + return EOH_INFINITE; + default: + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { + int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); + return getIcon(ordinalSide, tMeta); + } + + @Override + public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) { + for (int i = 0; i <= 12; i++) { + aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsNH.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsNH.java new file mode 100644 index 0000000000..00021154f4 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsNH.java @@ -0,0 +1,64 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.TecTech.creativeTabTecTech; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINECASINGS_BOTTOM_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINECASINGS_SIDE_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINECASINGS_TOP_TT; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import com.github.technus.tectech.thing.CustomItemList; + +import gregtech.api.enums.Textures; +import gregtech.api.objects.GT_CopiedBlockTexture; +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Block_Casings_Abstract; +import gregtech.common.blocks.GT_Material_Casings; + +/** + * Created by danie_000 on 03.10.2016. + */ +public class GT_Block_CasingsNH extends GT_Block_Casings_Abstract { + + public static boolean mConnectedMachineTextures = true; + + public GT_Block_CasingsNH() { + super(GT_Item_CasingsNH.class, "gt.blockcasingsNH", GT_Material_Casings.INSTANCE); + setCreativeTab(creativeTabTecTech); + + for (byte b = 0; b < 16; b = (byte) (b + 1)) { + Textures.BlockIcons.casingTexturePages[8][b + 64] = new GT_CopiedBlockTexture(this, 6, b); + /* IMPORTANT for block recoloring */ + } + + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "UEV Machine Casing"); // adding + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "UIV Machine Casing"); // adding + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "UMV Machine Casing"); // adding + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".13.name", "UXV Machine Casing"); // adding + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".14.name", "MAX Machine Casing"); // adding + + CustomItemList.Casing_UEV.set(new ItemStack(this, 1, 10)); + CustomItemList.Casing_UIV.set(new ItemStack(this, 1, 11)); + CustomItemList.Casing_UMV.set(new ItemStack(this, 1, 12)); + CustomItemList.Casing_UXV.set(new ItemStack(this, 1, 13)); + CustomItemList.Casing_MAXV.set(new ItemStack(this, 1, 14)); + } + + @Override + public void registerBlockIcons(IIconRegister aIconRegister) { + // super.registerBlockIcons(aIconRegister); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + if (ordinalSide == 0) { + return MACHINECASINGS_BOTTOM_TT[aMeta].getIcon(); + } + if (ordinalSide == 1) { + return MACHINECASINGS_TOP_TT[aMeta].getIcon(); + } + return MACHINECASINGS_SIDE_TT[aMeta].getIcon(); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsTT.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsTT.java new file mode 100644 index 0000000000..dc15b87f95 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Block_CasingsTT.java @@ -0,0 +1,196 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.TecTech.creativeTabTecTech; +import static com.github.technus.tectech.TecTech.tectechTexturePage1; + +import java.util.List; + +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 com.github.technus.tectech.thing.CustomItemList; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.objects.GT_CopiedBlockTexture; +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Block_Casings_Abstract; +import gregtech.common.blocks.GT_Material_Casings; + +/** + * Created by danie_000 on 03.10.2016. + */ +public class GT_Block_CasingsTT extends GT_Block_Casings_Abstract { + + public static final byte texturePage = tectechTexturePage1; + public static final short textureOffset = texturePage << 7; // Start of PAGE 8 (which is the 9th page) (8*128) + private static IIcon eM0, eM1, eM1s, eM2, eM2s, eM3, eM3s, eM4, eM5, eM6, eM7, eM7s, eM8, eM9, eM10, eM11, eM12, + eM13, eM14; + private static final IIcon[] debug = new IIcon[6]; + + public GT_Block_CasingsTT() { + super(GT_Item_CasingsTT.class, "gt.blockcasingsTT", GT_Material_Casings.INSTANCE); + setCreativeTab(creativeTabTecTech); + + for (byte b = 0; b < 16; b = (byte) (b + 1)) { + Textures.BlockIcons.casingTexturePages[texturePage][b] = new GT_CopiedBlockTexture(this, 6, b); + /* IMPORTANT for block recoloring **/ + } + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "High Power Casing"); + + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Computer Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".2.name", "Computer Heat Vent"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".3.name", "Advanced Computer Casing"); + + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Molecular Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Advanced Molecular Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Containment Field Generator"); + + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Molecular Coil"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".8.name", "Hollow Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".9.name", "Spacetime Altering Casing"); + + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".10.name", "Teleportation Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".11.name", "Dimensional Bridge Generator"); + + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".12.name", "Ultimate Molecular Casing"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".13.name", "Ultimate Advanced Molecular Casing"); + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".14.name", "Ultimate Containment Field Generator"); + + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".15.name", "Debug Sides"); // NOT REGISTER AS + // TEXTURE FOR + // HATCHES! + + CustomItemList.eM_Power.set(new ItemStack(this, 1, 0)); + + CustomItemList.eM_Computer_Casing.set(new ItemStack(this, 1, 1)); + CustomItemList.eM_Computer_Vent.set(new ItemStack(this, 1, 2)); + CustomItemList.eM_Computer_Bus.set(new ItemStack(this, 1, 3)); + + CustomItemList.eM_Containment.set(new ItemStack(this, 1, 4)); + CustomItemList.eM_Containment_Advanced.set(new ItemStack(this, 1, 5)); + CustomItemList.eM_Containment_Field.set(new ItemStack(this, 1, 6)); + + CustomItemList.eM_Coil.set(new ItemStack(this, 1, 7)); + CustomItemList.eM_Hollow.set(new ItemStack(this, 1, 8)); + CustomItemList.eM_Spacetime.set(new ItemStack(this, 1, 9)); + + CustomItemList.eM_Teleportation.set(new ItemStack(this, 1, 10)); + CustomItemList.eM_Dimensional.set(new ItemStack(this, 1, 11)); + + CustomItemList.eM_Ultimate_Containment.set(new ItemStack(this, 1, 12)); + CustomItemList.eM_Ultimate_Containment_Advanced.set(new ItemStack(this, 1, 13)); + CustomItemList.eM_Ultimate_Containment_Field.set(new ItemStack(this, 1, 14)); + + CustomItemList.debugBlock.set(new ItemStack(this, 1, 15)); + } + + @Override + public void registerBlockIcons(IIconRegister aIconRegister) { + // super.registerBlockIcons(aIconRegister); + eM0 = aIconRegister.registerIcon("gregtech:iconsets/EM_POWER"); + + eM1 = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_NONSIDE"); + eM1s = aIconRegister.registerIcon("gregtech:iconsets/EM_PC"); + eM2 = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_VENT_NONSIDE"); + eM2s = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_VENT"); + eM3 = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_ADV_NONSIDE"); + eM3s = aIconRegister.registerIcon("gregtech:iconsets/EM_PC_ADV"); + + eM4 = aIconRegister.registerIcon("gregtech:iconsets/EM_CASING"); + eM5 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_CASING"); + eM6 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD"); + + eM7 = aIconRegister.registerIcon("gregtech:iconsets/EM_COIL_NONSIDE"); + eM7s = aIconRegister.registerIcon("gregtech:iconsets/EM_COIL"); + eM8 = aIconRegister.registerIcon("gregtech:iconsets/EM_HOLLOW"); + eM9 = aIconRegister.registerIcon("gregtech:iconsets/EM_TIMESPACE"); + + eM10 = aIconRegister.registerIcon("gregtech:iconsets/EM_TELE"); + eM11 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM"); + + eM12 = aIconRegister.registerIcon("gregtech:iconsets/EM_ULTIMATE_CASING"); + eM13 = aIconRegister.registerIcon("gregtech:iconsets/EM_ULTIMATE_FIELD_CASING"); + eM14 = aIconRegister.registerIcon("gregtech:iconsets/EM_ULTIMATE_FIELD"); + + debug[0] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_0"); + debug[1] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_1"); + debug[2] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_2"); + debug[3] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_3"); + debug[4] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_4"); + debug[5] = aIconRegister.registerIcon("gregtech:iconsets/DEBUG_5"); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + switch (aMeta) { + case 0: + return eM0; + case 1: + if (ordinalSide < 2) { + return eM1; + } + return eM1s; + case 2: + if (ordinalSide < 2) { + return eM2; + } + return eM2s; + case 3: + if (ordinalSide < 2) { + return eM3; + } + return eM3s; + case 4: + return eM4; + case 5: + return eM5; + case 6: + return eM6; + case 7: + if (ordinalSide < 2) { + return eM7; + } + return eM7s; + case 8: + return eM8; + case 9: + return eM9; + case 10: + return eM10; + case 11: + return eM11; + case 12: + return eM12; + case 13: + return eM13; + case 14: + return eM14; + case 15: + return debug[ordinalSide]; + default: + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { + int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); + return getIcon(ordinalSide, tMeta); + } + + @Override + public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) { + for (int i = 0; i <= 15; i++) { + aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsBA0.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsBA0.java new file mode 100644 index 0000000000..de6336ed60 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsBA0.java @@ -0,0 +1,111 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.util.CommonValues.COSMIC_MARK; +import static com.github.technus.tectech.util.CommonValues.THETA_MOVEMENT; +import static com.github.technus.tectech.util.CommonValues.V; +import static gregtech.api.util.GT_Utility.formatNumbers; +import static net.minecraft.util.EnumChatFormatting.AQUA; +import static net.minecraft.util.EnumChatFormatting.GRAY; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.enums.TierEU; +import gregtech.common.blocks.GT_Item_Casings_Abstract; + +public class GT_Item_CasingsBA0 extends GT_Item_Casings_Abstract { + + public GT_Item_CasingsBA0(Block par1) { + super(par1); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { + if (aStack.getItemDamage() < 15) { + aList.add(THETA_MOVEMENT); + } else { + aList.add(COSMIC_MARK); + } + switch (aStack.getItemDamage()) { + case 0: // "Redstone Alloy Primary Tesla Windings" + case 1: // "MV Superconductor Primary Tesla Windings" + case 2: // "HV Superconductor Primary Tesla Windings" + case 3: // "EV Superconductor Primary Tesla Windings" + case 4: // "IV Superconductor Primary Tesla Windings" + case 5: // "LuV Superconductor Primary Tesla Windings" + aList.add( + translateToLocal("gt.blockcasingsBA0.0.desc.0") + " " + + formatNumbers(V[aStack.getItemDamage() + 1]) + + " EU/t"); // Handles up to + aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.0.desc.1")); // What + // one + // man + // calls + // God, + // another + // calls + // the + // laws of physics. + break; + case 6: // "Tesla Base Casing" + aList.add(translateToLocal("gt.blockcasingsBA0.6.desc.0")); // The base of a wondrous contraption + aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.6.desc.1")); // it's + // alive, + // IT'S + // ALIVE! + break; + case 7: // "Tesla Toroid Casing" + aList.add(translateToLocal("gt.blockcasingsBA0.7.desc.0")); // Made out of the finest tin foil! + aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.7.desc.1")); // Faraday + // suits + // might + // come + // later + break; + case 8: // "Tesla Secondary Windings" + aList.add(translateToLocal("gt.blockcasingsBA0.8.desc.0")); // Picks up power from a primary coil + aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.8.desc.1")); // Who + // wouldn't + // want + // a + // 32k + // epoxy + // multi? + break; + case 9: // "ZPM Superconductor Primary Tesla Windings" + aList.add(translateToLocal("gt.blockcasingsBA0.0.desc.0") + " " + formatNumbers(TierEU.ZPM) + " EU/t"); // Handles + // up + // to + aList.add(AQUA.toString() + EnumChatFormatting.BOLD + translateToLocal("gt.blockcasingsBA0.0.desc.1")); // What + // one + // man + // calls + // God, + // another + case 10: // Reinforced Temporal Structure Casing + aList.add(AQUA + translateToLocal("gt.blockcasingsBA0.10.desc.0")); + aList.add(GRAY + translateToLocal("gt.blockcasingsBA0.10.desc.1")); + // Designed to resist spatial shearing from internal volume expansion. + // Can survive at least one big bang, maybe two... + break; + case 11: // Reinforced Temporal Structure Casing + aList.add(AQUA + translateToLocal("gt.blockcasingsBA0.11.desc.0")); + aList.add(GRAY + translateToLocal("gt.blockcasingsBA0.11.desc.1")); + // Resistant to temporal shearing from time dilation differences. + // This block can last an eternity without any decay. + break; + case 12: // Infinite Spacetime Energy Boundary Casing + aList.add(AQUA + translateToLocal("gt.blockcasingsBA0.12.desc.0")); + // Provides a stable bridge between spacetime regions. + break; + default: + aList.add("Damn son where did you get that!?"); + aList.add(EnumChatFormatting.BLUE + "From outer space... I guess..."); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsNH.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsNH.java new file mode 100644 index 0000000000..b69abca128 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsNH.java @@ -0,0 +1,15 @@ +package com.github.technus.tectech.thing.casing; + +import net.minecraft.block.Block; + +import gregtech.common.blocks.GT_Item_Casings_Abstract; + +/** + * Created by danie_000 on 03.10.2016. + */ +public class GT_Item_CasingsNH extends GT_Item_Casings_Abstract { + + public GT_Item_CasingsNH(Block par1) { + super(par1); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsTT.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsTT.java new file mode 100644 index 0000000000..3c2f349b03 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_CasingsTT.java @@ -0,0 +1,133 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.util.CommonValues.COSMIC_MARK; +import static com.github.technus.tectech.util.CommonValues.TEC_MARK_EM; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import gregtech.common.blocks.GT_Item_Casings_Abstract; + +/** + * Created by danie_000 on 03.10.2016. + */ +public class GT_Item_CasingsTT extends GT_Item_Casings_Abstract { + + public GT_Item_CasingsTT(Block par1) { + super(par1); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { + if (aStack.getItemDamage() < 15) { + aList.add(TEC_MARK_EM); + } else { + aList.add(COSMIC_MARK); + } + switch (aStack.getItemDamage()) { + case 0: // "High Power Casing" + aList.add(translateToLocal("gt.blockcasingsTT.0.desc.0")); // Well suited for high power applications. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.0.desc.1")); // The power levels are rising! + break; + case 1: // "Computer Casing" + aList.add(translateToLocal("gt.blockcasingsTT.1.desc.0")); // Nice and clean casing. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.1.desc.1")); // Dust can break it!? + break; + case 2: // "Computer Heat Vent" + aList.add(translateToLocal("gt.blockcasingsTT.2.desc.0")); // Air vent with a filter. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.2.desc.1")); // Perfectly muffled sound! + break; + case 3: // "Advanced Computer Casing" + aList.add(translateToLocal("gt.blockcasingsTT.3.desc.0")); // Contains high bandwidth bus + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.3.desc.1")); // couple thousand qubits wide. + break; + case 4: // "Molecular Casing" + aList.add(translateToLocal("gt.blockcasingsTT.4.desc.0")); // Stops elemental things. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.4.desc.1")); // Radiation and emotions too... + break; + case 5: // "Advanced Molecular Casing" + aList.add(translateToLocal("gt.blockcasingsTT.5.desc.0")); // Cooling and stabilization. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.5.desc.1")); // A comfortable machine bed. + break; + case 6: // "Containment Field Generator" + aList.add(translateToLocal("gt.blockcasingsTT.6.desc.0")); // Creates a field that... + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.6.desc.1")); // can stop even force carriers. + break; + case 7: // "Molecular Coil" + aList.add(translateToLocal("gt.blockcasingsTT.7.desc.0")); // Well it does things too... + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.7.desc.1")); // [Use this coil!] + break; + case 8: // "Collider Hollow Casing" + aList.add(translateToLocal("gt.blockcasingsTT.8.desc.0")); // Reinforced accelerator tunnel. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.8.desc.1")); // Most advanced pipe ever. + break; + case 9: // "Spacetime Altering Casing" + aList.add(translateToLocal("gt.blockcasingsTT.9.desc.0")); // c is no longer the limit. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.9.desc.1")); // Wibbly wobbly timey wimey stuff. + break; + case 10: // "Teleportation Casing" + aList.add(translateToLocal("gt.blockcasingsTT.10.desc.0")); // Remote connection. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.10.desc.1")); // Better touch with a stick. + break; + case 11: // "Dimensional Bridge Generator" + aList.add(translateToLocal("gt.blockcasingsTT.11.desc.0")); // Interdimensional Operations. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.11.desc.1")); // Around the universe and other + // places too. + break; + case 12: // "Ultimate Molecular Casing" + aList.add(translateToLocal("gt.blockcasingsTT.12.desc.0")); // Ultimate in every way. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.12.desc.1")); // I don't know what it can't do. + break; + case 13: // "Ultimate Advanced Molecular Casing" + aList.add(translateToLocal("gt.blockcasingsTT.13.desc.0")); // More Ultimate in every way. + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.13.desc.1")); // I don't know what I am doing! + break; + case 14: // "Ultimate Containment Field Generator" + aList.add(translateToLocal("gt.blockcasingsTT.14.desc.0")); // Black Hole... + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockcasingsTT.14.desc.1")); // Meh... + break; + case 15: // "Debug Sides" + aList.add(translateToLocal("gt.blockcasingsTT.15.desc.0")); // Lazy man way of determining sides. + aList.add(EnumChatFormatting.BLUE + translateToLocal("gt.blockcasingsTT.15.desc.1")); + break; + default: // WTF? + aList.add("Damn son where did you get that!?"); + aList.add(EnumChatFormatting.BLUE + "From outer space... I guess..."); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java new file mode 100644 index 0000000000..e527fc552d --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java @@ -0,0 +1,114 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.util.CommonValues.GODFORGE_MARK; +import static net.minecraft.util.EnumChatFormatting.AQUA; +import static net.minecraft.util.EnumChatFormatting.BOLD; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Item_Casings_Abstract; + +public class GT_Item_Casings_Godforge extends GT_Item_Casings_Abstract { + + public GT_Item_Casings_Godforge(Block par1) { + super(par1); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + aList.add(GODFORGE_MARK); + switch (aStack.getItemDamage()) { + case 0: + aList.add( + GT_LanguageManager.addStringLocalization( + "godforge.casings.0.Tooltip.0", + "Shielded by the event horizon of a singularity")); + aList.add( + AQUA.toString() + BOLD + + GT_LanguageManager + .addStringLocalization("godforge.casings.0.Tooltip.1", "Don't get too close...")); + break; + case 1: + aList.add( + GT_LanguageManager.addStringLocalization( + "godforge.casings.1.Tooltip.0", + "Designed to route stellar matter using spacetime distortion")); + aList.add( + AQUA.toString() + BOLD + + GT_LanguageManager + .addStringLocalization("godforge.casings.1.Tooltip.1", "Reality Distortion")); + break; + case 2: + aList.add( + GT_LanguageManager + .addStringLocalization("godforge.casings.2.Tooltip.0", "Unaffected by gravitational forces")); + aList.add( + AQUA.toString() + BOLD + + GT_LanguageManager.addStringLocalization( + "godforge.casings.2.Tooltip.1", + "Not even a black hole could tear it apart.")); + break; + case 3: + aList.add( + GT_LanguageManager.addStringLocalization( + "godforge.casings.3.Tooltip.0", + "Creates enormous magnetic fields capable of constraining entire stars")); + aList.add( + AQUA.toString() + BOLD + + GT_LanguageManager + .addStringLocalization("godforge.casings.3.Tooltip.1", "It's super effective!")); + break; + case 4: + aList.add( + GT_LanguageManager.addStringLocalization( + "godforge.casings.4.Tooltip.0", + "Taps into streams of stellar matter to harness their heat energy")); + aList.add( + AQUA.toString() + BOLD + + GT_LanguageManager + .addStringLocalization("godforge.casings.4.Tooltip.1", "Turn up the heat!")); + break; + case 5: + aList.add( + GT_LanguageManager.addStringLocalization( + "godforge.casings.5.Tooltip.0", + "Controls the flow of gravitons to manipulate gravity")); + aList.add( + AQUA.toString() + BOLD + + GT_LanguageManager.addStringLocalization( + "godforge.casings.5.Tooltip.1", + "Exponential scaling past 800 Galaxies")); + break; + case 6: + aList.add( + GT_LanguageManager.addStringLocalization( + "godforge.casings.6.Tooltip.0", + "Controls the flow of gravitons to manipulate gravity")); + aList.add( + AQUA.toString() + BOLD + + GT_LanguageManager + .addStringLocalization("godforge.casings.6.Tooltip.1", "Getting closer...")); + break; + case 7: + aList.add( + GT_LanguageManager.addStringLocalization( + "godforge.casings.7.Tooltip.0", + "Controls the flow of gravitons to manipulate gravity")); + aList.add( + AQUA.toString() + BOLD + + GT_LanguageManager.addStringLocalization("godforge.casings.7.Tooltip.1", "Gravity Central")); + break; + default: + aList.add( + EnumChatFormatting.RED.toString() + BOLD + + GT_LanguageManager + .addStringLocalization("godforge.casings.Error.Tooltip", "Error, report to GTNH team")); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Spacetime.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Spacetime.java new file mode 100644 index 0000000000..f966d85695 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Spacetime.java @@ -0,0 +1,56 @@ +package com.github.technus.tectech.thing.casing; + +import static com.google.common.math.LongMath.pow; +import static gregtech.api.enums.GT_Values.AuthorColen; +import static gregtech.api.util.GT_Utility.formatNumbers; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Item_Casings_Abstract; + +public class GT_Item_Casings_Spacetime extends GT_Item_Casings_Abstract { + + public GT_Item_Casings_Spacetime(Block par1) { + super(par1); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { + switch (aStack.getItemDamage()) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + aList.add( + GT_LanguageManager.addStringLocalization( + "EOH.Spacetime.Standard.Tooltip.0", + "Supports an internal spacetime volume of up to ") + + formatNumbers(pow(10, 5 + aStack.getItemDamage())) + + "km³."); + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + GT_LanguageManager.addStringLocalization( + "EOH.Spacetime.Standard.Tooltip.1", + "Capable of running recipes up to tier ") + + (aStack.getItemDamage() + 1)); + break; + default: + aList.add( + EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD + + GT_LanguageManager + .addStringLocalization("EOH.TimeDilation.Error.Tooltip", "Error, report to GTNH team")); + } + aList.add(AuthorColen); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Stabilisation.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Stabilisation.java new file mode 100644 index 0000000000..6bd86524a1 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Stabilisation.java @@ -0,0 +1,47 @@ +package com.github.technus.tectech.thing.casing; + +import static gregtech.api.enums.GT_Values.AuthorColen; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Item_Casings_Abstract; + +public class GT_Item_Casings_Stabilisation extends GT_Item_Casings_Abstract { + + public GT_Item_Casings_Stabilisation(Block par1) { + super(par1); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { + switch (aStack.getItemDamage()) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + GT_LanguageManager.addStringLocalization( + "EOH.Stability.Tooltip.0", + "Increases stability of spacetime field.")); + break; + default: + aList.add( + EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD + + GT_LanguageManager + .addStringLocalization("EOH.TimeDilation.Error.Tooltip", "Error, report to GTNH team")); + } + aList.add(AuthorColen); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_TimeAcceleration.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_TimeAcceleration.java new file mode 100644 index 0000000000..994f40b9e7 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_TimeAcceleration.java @@ -0,0 +1,46 @@ +package com.github.technus.tectech.thing.casing; + +import static gregtech.api.enums.GT_Values.AuthorColen; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Item_Casings_Abstract; + +public class GT_Item_Casings_TimeAcceleration extends GT_Item_Casings_Abstract { + + public GT_Item_Casings_TimeAcceleration(Block par1) { + super(par1); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { + switch (aStack.getItemDamage()) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + GT_LanguageManager + .addStringLocalization("EOH.TimeDilation.Standard.Tooltip", "Time dilation in a box.")); + break; + default: + aList.add( + EnumChatFormatting.RED.toString() + EnumChatFormatting.BOLD + + GT_LanguageManager + .addStringLocalization("EOH.TimeDilation.Error.Tooltip", "Error, report to GTNH team")); + } + aList.add(AuthorColen); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java new file mode 100644 index 0000000000..809e6bbff1 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java @@ -0,0 +1,124 @@ +package com.github.technus.tectech.thing.casing; + +import java.util.List; + +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 com.github.technus.tectech.thing.CustomItemList; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.objects.GT_CopiedBlockTexture; +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Block_Casings_Abstract; +import gregtech.common.blocks.GT_Material_Casings; + +public class GodforgeCasings extends GT_Block_Casings_Abstract { + + private static IIcon GodforgeTrim; + private static IIcon GodforgeInner; + private static IIcon GodforgeSupport; + private static IIcon GodforgeOuter; + private static IIcon GodforgeEnergy; + private static IIcon GravitonModulatorT1; + private static IIcon GravitonModulatorT2; + private static IIcon GravitonModulatorT3; + + private static final byte START_INDEX = 64; + + public GodforgeCasings() { + super(GT_Item_Casings_Godforge.class, "gt.godforgecasing", GT_Material_Casings.INSTANCE); + for (byte b = 0; b < 16; b = (byte) (b + 1)) { + Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b); + } + + GT_LanguageManager + .addStringLocalization(getUnlocalizedName() + ".0.name", "Singularity Reinforced Stellar Shielding Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Celestial Matter Guidance Casing"); + GT_LanguageManager.addStringLocalization( + getUnlocalizedName() + ".2.name", + "Boundless Gravitationally Severed Structure Casing"); + GT_LanguageManager.addStringLocalization( + getUnlocalizedName() + ".3.name", + "Transcendentally Amplified Magnetic Confinement Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Stellar Energy Siphon Casing"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Remote Graviton Flow Modulator"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Medial Graviton Flow Modulator"); + GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Central Graviton Flow Modulator"); + + CustomItemList.Godforge_Singularity_Shielding_Casing.set(new ItemStack(this, 1, 0)); + CustomItemList.Godforge_Guidance_Casing.set(new ItemStack(this, 1, 1)); + CustomItemList.Godforge_Boundless_Structure_Casing.set(new ItemStack(this, 1, 2)); + CustomItemList.Godforge_Magnetic_Confinement_Casing.set(new ItemStack(this, 1, 3)); + CustomItemList.Godforge_Stellar_Energy_Siphon_Casing.set(new ItemStack(this, 1, 4)); + CustomItemList.Godforge_GravitonFlowModulatorTier1.set(new ItemStack(this, 1, 5)); + CustomItemList.Godforge_GravitonFlowModulatorTier2.set(new ItemStack(this, 1, 6)); + CustomItemList.Godforge_GravitonFlowModulatorTier3.set(new ItemStack(this, 1, 7)); + } + + @Override + public void registerBlockIcons(IIconRegister aIconRegister) { + GodforgeTrim = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_TRIM"); + GodforgeInner = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_INNER"); + GodforgeSupport = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_SUPPORT"); + GodforgeOuter = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_TOP_BOTTOM"); + GodforgeEnergy = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_ENERGY"); + GravitonModulatorT1 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_2"); + GravitonModulatorT2 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_1"); + GravitonModulatorT3 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_0"); + } + + @Override + public IIcon getIcon(int aSide, int aMeta) { + switch (aMeta) { + case 0: + return GodforgeTrim; + case 1: + return GodforgeInner; + case 2: + return GodforgeSupport; + case 3: + return GodforgeOuter; + case 4: + return GodforgeEnergy; + case 5: + if (aSide < 2) { + return GodforgeOuter; + } + return GravitonModulatorT1; + case 6: + if (aSide < 2) { + return GodforgeOuter; + } + return GravitonModulatorT2; + case 7: + if (aSide < 2) { + return GodforgeOuter; + } + return GravitonModulatorT3; + default: + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int aSide) { + int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); + return getIcon(aSide, tMeta); + } + + @SuppressWarnings("unchecked") + @Override + public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) { + for (int i = 0; i <= 7; i++) { + aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/SpacetimeCompressionFieldCasing.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/SpacetimeCompressionFieldCasing.java new file mode 100644 index 0000000000..6d00822c19 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/SpacetimeCompressionFieldCasing.java @@ -0,0 +1,120 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.WHITE; + +import java.util.List; + +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 com.github.technus.tectech.thing.CustomItemList; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.objects.GT_CopiedBlockTexture; +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Block_Casings_Abstract; +import gregtech.common.blocks.GT_Material_Casings; + +@SuppressWarnings("SpellCheckingInspection") +public class SpacetimeCompressionFieldCasing extends GT_Block_Casings_Abstract { + + private static IIcon textureTier0; + private static IIcon textureTier1; + private static IIcon textureTier2; + private static IIcon textureTier3; + private static IIcon textureTier4; + private static IIcon textureTier5; + private static IIcon textureTier6; + private static IIcon textureTier7; + private static IIcon textureTier8; + private static final int MAX_BLOCK_TIER = 9; + + private static final byte START_INDEX = 16; + + public SpacetimeCompressionFieldCasing() { + super( + GT_Item_Casings_Spacetime.class, + "gt.spacetime_compression_field_generator", + GT_Material_Casings.INSTANCE); + for (byte b = 0; b < 16; b = (byte) (b + 1)) { + Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b); + } + + for (int i = 0; i < MAX_BLOCK_TIER; i++) { + GT_LanguageManager.addStringLocalization( + getUnlocalizedName() + "." + i + ".name", + WHITE + EOH_TIER_FANCY_NAMES[i] + RESET + " Spacetime Compression Field Generator"); + } + + CustomItemList.SpacetimeCompressionFieldGeneratorTier0.set(new ItemStack(this, 1, 0)); + CustomItemList.SpacetimeCompressionFieldGeneratorTier1.set(new ItemStack(this, 1, 1)); + CustomItemList.SpacetimeCompressionFieldGeneratorTier2.set(new ItemStack(this, 1, 2)); + CustomItemList.SpacetimeCompressionFieldGeneratorTier3.set(new ItemStack(this, 1, 3)); + CustomItemList.SpacetimeCompressionFieldGeneratorTier4.set(new ItemStack(this, 1, 4)); + CustomItemList.SpacetimeCompressionFieldGeneratorTier5.set(new ItemStack(this, 1, 5)); + CustomItemList.SpacetimeCompressionFieldGeneratorTier6.set(new ItemStack(this, 1, 6)); + CustomItemList.SpacetimeCompressionFieldGeneratorTier7.set(new ItemStack(this, 1, 7)); + CustomItemList.SpacetimeCompressionFieldGeneratorTier8.set(new ItemStack(this, 1, 8)); + } + + @Override + public void registerBlockIcons(IIconRegister aIconRegister) { + textureTier0 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_0"); + textureTier1 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_1"); + textureTier2 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_2"); + textureTier3 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_3"); + textureTier4 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_4"); + textureTier5 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_5"); + textureTier6 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_6"); + textureTier7 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_7"); + textureTier8 = aIconRegister.registerIcon("gregtech:iconsets/EM_DIM_8"); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + switch (aMeta) { + case 0: + return textureTier0; + case 1: + return textureTier1; + case 2: + return textureTier2; + case 3: + return textureTier3; + case 4: + return textureTier4; + case 5: + return textureTier5; + case 6: + return textureTier6; + case 7: + return textureTier7; + case 8: + return textureTier8; + default: + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { + int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); + return getIcon(ordinalSide, tMeta); + } + + @Override + public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) { + for (int i = 0; i < MAX_BLOCK_TIER; i++) { + aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/StabilisationFieldCasing.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/StabilisationFieldCasing.java new file mode 100644 index 0000000000..ed35e82b83 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/StabilisationFieldCasing.java @@ -0,0 +1,117 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.WHITE; + +import java.util.List; + +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 com.github.technus.tectech.thing.CustomItemList; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.objects.GT_CopiedBlockTexture; +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Block_Casings_Abstract; +import gregtech.common.blocks.GT_Material_Casings; + +@SuppressWarnings("SpellCheckingInspection") +public class StabilisationFieldCasing extends GT_Block_Casings_Abstract { + + private static IIcon textureTier0; + private static IIcon textureTier1; + private static IIcon textureTier2; + private static IIcon textureTier3; + private static IIcon textureTier4; + private static IIcon textureTier5; + private static IIcon textureTier6; + private static IIcon textureTier7; + private static IIcon textureTier8; + private static final int MAX_BLOCK_TIER = 9; + + private static final byte START_INDEX = 32; + + public StabilisationFieldCasing() { + super(GT_Item_Casings_Stabilisation.class, "gt.stabilisation_field_generator", GT_Material_Casings.INSTANCE); + for (byte b = 0; b < 16; b = (byte) (b + 1)) { + Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b); + } + + for (int i = 0; i < MAX_BLOCK_TIER; i++) { + GT_LanguageManager.addStringLocalization( + getUnlocalizedName() + "." + i + ".name", + WHITE + EOH_TIER_FANCY_NAMES[i] + RESET + " Stabilisation Field Generator"); + } + + CustomItemList.StabilisationFieldGeneratorTier0.set(new ItemStack(this, 1, 0)); + CustomItemList.StabilisationFieldGeneratorTier1.set(new ItemStack(this, 1, 1)); + CustomItemList.StabilisationFieldGeneratorTier2.set(new ItemStack(this, 1, 2)); + CustomItemList.StabilisationFieldGeneratorTier3.set(new ItemStack(this, 1, 3)); + CustomItemList.StabilisationFieldGeneratorTier4.set(new ItemStack(this, 1, 4)); + CustomItemList.StabilisationFieldGeneratorTier5.set(new ItemStack(this, 1, 5)); + CustomItemList.StabilisationFieldGeneratorTier6.set(new ItemStack(this, 1, 6)); + CustomItemList.StabilisationFieldGeneratorTier7.set(new ItemStack(this, 1, 7)); + CustomItemList.StabilisationFieldGeneratorTier8.set(new ItemStack(this, 1, 8)); + } + + @Override + public void registerBlockIcons(IIconRegister aIconRegister) { + textureTier0 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_0"); + textureTier1 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_1"); + textureTier2 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_2"); + textureTier3 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_3"); + textureTier4 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_4"); + textureTier5 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_5"); + textureTier6 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_6"); + textureTier7 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_7"); + textureTier8 = aIconRegister.registerIcon("gregtech:iconsets/STABILITY_CASING_8"); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + switch (aMeta) { + case 0: + return textureTier0; + case 1: + return textureTier1; + case 2: + return textureTier2; + case 3: + return textureTier3; + case 4: + return textureTier4; + case 5: + return textureTier5; + case 6: + return textureTier6; + case 7: + return textureTier7; + case 8: + return textureTier8; + default: + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { + int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); + return getIcon(ordinalSide, tMeta); + } + + @Override + public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) { + for (int i = 0; i < MAX_BLOCK_TIER; i++) { + aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java new file mode 100644 index 0000000000..009a9f4255 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java @@ -0,0 +1,28 @@ +package com.github.technus.tectech.thing.casing; + +import net.minecraft.block.Block; + +import com.github.technus.tectech.thing.block.EOH_RenderBlock; +import com.github.technus.tectech.thing.block.ForgeOfGodsBlock; + +/** + * Created by danie_000 on 03.10.2016. + */ +public final class TT_Container_Casings { + + public static Block sBlockCasingsTT; + + public static Block sBlockCasingsBA0; + + public static Block sBlockCasingsNH; + public static Block TimeAccelerationFieldGenerator; + public static Block SpacetimeCompressionFieldGenerators; + public static Block StabilisationFieldGenerators; + + public static Block eyeOfHarmonyRenderBlock = new EOH_RenderBlock(); + public static Block forgeOfGodsRenderBlock = new ForgeOfGodsBlock(); + + public static Block GodforgeCasings; + + private TT_Container_Casings() {} +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/casing/TimeAccelerationFieldCasing.java b/tectech/src/main/java/com/github/technus/tectech/thing/casing/TimeAccelerationFieldCasing.java new file mode 100644 index 0000000000..739fe300a9 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/casing/TimeAccelerationFieldCasing.java @@ -0,0 +1,120 @@ +package com.github.technus.tectech.thing.casing; + +import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.WHITE; + +import java.util.List; + +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 com.github.technus.tectech.thing.CustomItemList; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.objects.GT_CopiedBlockTexture; +import gregtech.api.util.GT_LanguageManager; +import gregtech.common.blocks.GT_Block_Casings_Abstract; +import gregtech.common.blocks.GT_Material_Casings; + +@SuppressWarnings("SpellCheckingInspection") +public class TimeAccelerationFieldCasing extends GT_Block_Casings_Abstract { + + private static IIcon textureTier0; + private static IIcon textureTier1; + private static IIcon textureTier2; + private static IIcon textureTier3; + private static IIcon textureTier4; + private static IIcon textureTier5; + private static IIcon textureTier6; + private static IIcon textureTier7; + private static IIcon textureTier8; + private static final int MAX_BLOCK_TIER = 9; + + private static final byte START_INDEX = 48; + + public TimeAccelerationFieldCasing() { + super( + GT_Item_Casings_TimeAcceleration.class, + "gt.time_acceleration_field_generator", + GT_Material_Casings.INSTANCE); + for (byte b = 0; b < 16; b = (byte) (b + 1)) { + Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b); + } + + for (int i = 0; i < MAX_BLOCK_TIER; i++) { + GT_LanguageManager.addStringLocalization( + getUnlocalizedName() + "." + i + ".name", + WHITE + EOH_TIER_FANCY_NAMES[i] + RESET + " Time Dilation Field Generator"); + } + + CustomItemList.TimeAccelerationFieldGeneratorTier0.set(new ItemStack(this, 1, 0)); + CustomItemList.TimeAccelerationFieldGeneratorTier1.set(new ItemStack(this, 1, 1)); + CustomItemList.TimeAccelerationFieldGeneratorTier2.set(new ItemStack(this, 1, 2)); + CustomItemList.TimeAccelerationFieldGeneratorTier3.set(new ItemStack(this, 1, 3)); + CustomItemList.TimeAccelerationFieldGeneratorTier4.set(new ItemStack(this, 1, 4)); + CustomItemList.TimeAccelerationFieldGeneratorTier5.set(new ItemStack(this, 1, 5)); + CustomItemList.TimeAccelerationFieldGeneratorTier6.set(new ItemStack(this, 1, 6)); + CustomItemList.TimeAccelerationFieldGeneratorTier7.set(new ItemStack(this, 1, 7)); + CustomItemList.TimeAccelerationFieldGeneratorTier8.set(new ItemStack(this, 1, 8)); + } + + @Override + public void registerBlockIcons(IIconRegister aIconRegister) { + textureTier0 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_0"); + textureTier1 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_1"); + textureTier2 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_2"); + textureTier3 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_3"); + textureTier4 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_4"); + textureTier5 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_5"); + textureTier6 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_6"); + textureTier7 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_7"); + textureTier8 = aIconRegister.registerIcon("gregtech:iconsets/EM_FIELD_8"); + } + + @Override + public IIcon getIcon(int ordinalSide, int aMeta) { + switch (aMeta) { + case 0: + return textureTier0; + case 1: + return textureTier1; + case 2: + return textureTier2; + case 3: + return textureTier3; + case 4: + return textureTier4; + case 5: + return textureTier5; + case 6: + return textureTier6; + case 7: + return textureTier7; + case 8: + return textureTier8; + default: + return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon(); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int ordinalSide) { + int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord); + return getIcon(ordinalSide, tMeta); + } + + @Override + public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) { + for (int i = 0; i < MAX_BLOCK_TIER; i++) { + aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java b/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java new file mode 100644 index 0000000000..b3fe110201 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_EnderFluidLink.java @@ -0,0 +1,252 @@ +package com.github.technus.tectech.thing.cover; + +import static com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData.getEnderFluidContainer; +import static com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData.getEnderLinkTag; + +import java.util.UUID; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import com.github.technus.tectech.mechanics.enderStorage.EnderLinkTag; +import com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; + +import eu.usrv.yamcore.auxiliary.PlayerChatHelper; +import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.util.GT_CoverBehavior; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.ISerializableObject; +import gregtech.common.gui.modularui.widget.CoverDataControllerWidget; +import gregtech.common.gui.modularui.widget.CoverDataFollower_ToggleButtonWidget; + +public class GT_Cover_TM_EnderFluidLink extends GT_CoverBehavior { + + private static final int L_PER_TICK = 8000; + private static final int IMPORT_EXPORT_MASK = 0b0001; + private static final int PUBLIC_PRIVATE_MASK = 0b0010; + + public GT_Cover_TM_EnderFluidLink() {} + + private void transferFluid(IFluidHandler source, ForgeDirection side, IFluidHandler target, ForgeDirection tSide, + int amount) { + FluidStack fluidStack = source.drain(side, amount, false); + + if (fluidStack != null) { + int fluidTransferred = target.fill(tSide, fluidStack, true); + source.drain(side, fluidTransferred, true); + } + } + + private boolean testBit(int aCoverVariable, int bitMask) { + return (aCoverVariable & bitMask) != 0; + } + + private int toggleBit(int aCoverVariable, int bitMask) { + return (aCoverVariable ^ bitMask); + } + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + if ((aTileEntity instanceof IFluidHandler fluidHandlerSelf)) { + IFluidHandler fluidHandlerEnder = getEnderFluidContainer(getEnderLinkTag((IFluidHandler) aTileEntity)); + + if (testBit(aCoverVariable, IMPORT_EXPORT_MASK)) { + transferFluid(fluidHandlerEnder, ForgeDirection.UNKNOWN, fluidHandlerSelf, side, L_PER_TICK); + } else { + transferFluid(fluidHandlerSelf, side, fluidHandlerEnder, ForgeDirection.UNKNOWN, L_PER_TICK); + } + } + return aCoverVariable; + } + + @Override + public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return ""; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + int newCoverVariable = toggleBit(aCoverVariable, IMPORT_EXPORT_MASK); + + if (testBit(aCoverVariable, IMPORT_EXPORT_MASK)) { + PlayerChatHelper.SendInfo(aPlayer, "Ender Suction Engaged!"); // TODO Translation support + } else { + PlayerChatHelper.SendInfo(aPlayer, "Ender Filling Engaged!"); + } + return newCoverVariable; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + // Runs each tick + return 1; + } + + // region GUI + + @Override + public boolean hasCoverGUI() { + return true; + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public ModularWindow createWindow(GT_CoverUIBuildContext buildContext) { + // Only open gui if we're placed on a fluid tank + if (buildContext.getTile() instanceof IFluidHandler) { + return new EnderFluidLinkUIFactory(buildContext).createWindow(); + } + return null; + } + + private class EnderFluidLinkUIFactory extends UIFactory { + + private static final int START_X = 10; + private static final int START_Y = 25; + private static final int SPACE_X = 18; + private static final int SPACE_Y = 18; + private static final int PUBLIC_BUTTON_ID = 0; + private static final int PRIVATE_BUTTON_ID = 1; + private static final int IMPORT_BUTTON_ID = 2; + private static final int EXPORT_BUTTON_ID = 3; + + public EnderFluidLinkUIFactory(GT_CoverUIBuildContext buildContext) { + super(buildContext); + } + + @SuppressWarnings("PointlessArithmeticExpression") + @Override + protected void addUIWidgets(ModularWindow.Builder builder) { + TextFieldWidget frequencyField = new TextFieldWidget(); + builder.widget(frequencyField.setGetter(() -> { + ICoverable te = getUIBuildContext().getTile(); + if (!frequencyField.isClient() && te instanceof IFluidHandler) { + return EnderWorldSavedData.getEnderLinkTag((IFluidHandler) te) + .getFrequency(); + } + return ""; + }) + .setSetter(val -> { + ICoverable te = getUIBuildContext().getTile(); + if (!frequencyField.isClient() && te instanceof IFluidHandler) { + UUID uuid; + if (testBit(convert(getCoverData()), PUBLIC_PRIVATE_MASK)) { + uuid = getUUID(); + if (!(te instanceof IGregTechTileEntity)) return; + if (!uuid.equals(((IGregTechTileEntity) te).getOwnerUuid())) return; + } else { + uuid = null; + } + EnderWorldSavedData.bindEnderLinkTag((IFluidHandler) te, new EnderLinkTag(val, uuid)); + } + }) + .setTextColor(Color.WHITE.dark(1)) + .setTextAlignment(Alignment.CenterLeft) + .setFocusOnGuiOpen(true) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) + .setPos(START_X + SPACE_X * 0, START_Y + SPACE_Y * 0) + .setSize(SPACE_X * 5 - 8, 12)) + .widget( + new CoverDataControllerWidget.CoverDataIndexedControllerWidget_ToggleButtons<>( + this::getCoverData, + this::setCoverData, + GT_Cover_TM_EnderFluidLink.this, + (id, coverData) -> !getClickable(id, convert(coverData)), + (id, coverData) -> new ISerializableObject.LegacyCoverData( + getNewCoverVariable(id, convert(coverData)))) + .addToggleButton( + PUBLIC_BUTTON_ID, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_WHITELIST) + .addTooltip(GT_Utility.trans("326", "Public")) + .setPos(START_X + SPACE_X * 0, START_Y + SPACE_Y * 2)) + .addToggleButton( + PRIVATE_BUTTON_ID, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BLACKLIST) + .addTooltip(GT_Utility.trans("327", "Private")) + .setPos(START_X + SPACE_X * 1, START_Y + SPACE_Y * 2)) + .addToggleButton( + IMPORT_BUTTON_ID, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_IMPORT) + .addTooltip(GT_Utility.trans("007", "Import")) + .setPos(START_X + SPACE_X * 0, START_Y + SPACE_Y * 3)) + .addToggleButton( + EXPORT_BUTTON_ID, + CoverDataFollower_ToggleButtonWidget.ofDisableable(), + widget -> widget.setStaticTexture(GT_UITextures.OVERLAY_BUTTON_EXPORT) + .addTooltip(GT_Utility.trans("006", "Export")) + .setPos(START_X + SPACE_X * 1, START_Y + SPACE_Y * 3))) + .widget( + new TextWidget(GT_Utility.trans("328", "Channel")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(START_X + SPACE_X * 5, 4 + START_Y + SPACE_Y * 0)) + .widget( + new TextWidget(GT_Utility.trans("329", "Public/Private")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(START_X + SPACE_X * 2, 4 + START_Y + SPACE_Y * 2)) + .widget( + new TextWidget(GT_Utility.trans("229", "Import/Export")).setDefaultColor(COLOR_TEXT_GRAY.get()) + .setPos(START_X + SPACE_X * 2, 4 + START_Y + SPACE_Y * 3)); + } + + private int getNewCoverVariable(int id, int coverVariable) { + switch (id) { + case PUBLIC_BUTTON_ID: + case PRIVATE_BUTTON_ID: + return toggleBit(coverVariable, PUBLIC_PRIVATE_MASK); + case IMPORT_BUTTON_ID: + case EXPORT_BUTTON_ID: + return toggleBit(coverVariable, IMPORT_EXPORT_MASK); + } + return coverVariable; + } + + private boolean getClickable(int id, int coverVariable) { + switch (id) { + case PUBLIC_BUTTON_ID: + return testBit(coverVariable, PUBLIC_PRIVATE_MASK); + case PRIVATE_BUTTON_ID: + return !testBit(coverVariable, PUBLIC_PRIVATE_MASK); + case IMPORT_BUTTON_ID: + return testBit(coverVariable, IMPORT_EXPORT_MASK); + case EXPORT_BUTTON_ID: + return !testBit(coverVariable, IMPORT_EXPORT_MASK); + } + return false; + } + + private UUID getUUID() { + return getUIBuildContext().getPlayer() + .getUniqueID(); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_PowerPassUpgrade.java b/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_PowerPassUpgrade.java new file mode 100644 index 0000000000..ef867e9a35 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_PowerPassUpgrade.java @@ -0,0 +1,53 @@ +package com.github.technus.tectech.thing.cover; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; + +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.GT_CoverBehavior; + +public class GT_Cover_TM_PowerPassUpgrade extends GT_CoverBehavior { + + public GT_Cover_TM_PowerPassUpgrade() {} + + @Override + public boolean isCoverPlaceable(ForgeDirection side, ItemStack aStack, ICoverable aTileEntity) { + IMetaTileEntity iGregTechTileEntityOffset = aTileEntity.getIGregTechTileEntityOffset(0, 0, 0) + .getMetaTileEntity(); + if (iGregTechTileEntityOffset instanceof GT_MetaTileEntity_MultiblockBase_EM multi) { + return !multi.ePowerPassCover; + } + return false; + } + + @Override + public void placeCover(ForgeDirection side, ItemStack aCover, ICoverable aTileEntity) { + IMetaTileEntity iGregTechTileEntityOffset = aTileEntity.getIGregTechTileEntityOffset(0, 0, 0) + .getMetaTileEntity(); + if (iGregTechTileEntityOffset instanceof GT_MetaTileEntity_MultiblockBase_EM multi) { + multi.ePowerPassCover = true; + multi.ePowerPass = true; + } + super.placeCover(side, aCover, aTileEntity); + } + + @Override + public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + boolean aForced) { + IMetaTileEntity iGregTechTileEntityOffset = aTileEntity.getIGregTechTileEntityOffset(0, 0, 0) + .getMetaTileEntity(); + if (iGregTechTileEntityOffset instanceof GT_MetaTileEntity_MultiblockBase_EM multi) { + multi.ePowerPassCover = false; + multi.ePowerPass = false; + } + return true; + } + + @Deprecated + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return 0; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil.java b/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil.java new file mode 100644 index 0000000000..e5d2b7acde --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil.java @@ -0,0 +1,71 @@ +package com.github.technus.tectech.thing.cover; + +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetAdd; +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetRemove; +import static ic2.api.info.Info.DMG_ELECTRIC; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.mechanics.tesla.TeslaCoverConnection; + +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.GT_CoverBehavior; +import gregtech.api.util.GT_Utility; + +public class GT_Cover_TM_TeslaCoil extends GT_CoverBehavior { + + public GT_Cover_TM_TeslaCoil() {} + + @Override + public int doCoverThings(ForgeDirection side, byte aInputRedstone, int aCoverID, int aCoverVariable, + ICoverable aTileEntity, long aTimer) { + // Only do stuff if we're on top and have power + if (side == ForgeDirection.UP || aTileEntity.getEUCapacity() > 0) { + // Makes sure we're on the list + teslaSimpleNodeSetAdd( + new TeslaCoverConnection( + aTileEntity.getIGregTechTileEntityOffset(0, 0, 0), + getTeslaReceptionCapability())); + } + return super.doCoverThings(side, aInputRedstone, aCoverID, aCoverVariable, aTileEntity, aTimer); + } + + @Override + public boolean onCoverRemoval(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + boolean aForced) { + teslaSimpleNodeSetRemove( + new TeslaCoverConnection(aTileEntity.getIGregTechTileEntityOffset(0, 0, 0), getTeslaReceptionCapability())); + return super.onCoverRemoval(side, aCoverID, aCoverVariable, aTileEntity, aForced); + } + + @Override + public String getDescription(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return "Do not attempt to use screwdriver!"; // TODO Translation support + } + + @Override + public boolean letsEnergyIn(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public int onCoverScrewdriverclick(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity, + EntityPlayer aPlayer, float aX, float aY, float aZ) { + // Shock a non-hazmat player if they dare stuff a screwdriver into one of these + if (aTileEntity.getStoredEU() > 0 && !GT_Utility.isWearingFullElectroHazmat(aPlayer)) { + aPlayer.attackEntityFrom(DMG_ELECTRIC, 20); + } + return aCoverVariable; + } + + @Override + public int getTickRate(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + // It updates once every 10 ticks, so once every 0.5 second + return 10; + } + + public byte getTeslaReceptionCapability() { + return 2; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil_Ultimate.java b/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil_Ultimate.java new file mode 100644 index 0000000000..7169cb61fb --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/cover/GT_Cover_TM_TeslaCoil_Ultimate.java @@ -0,0 +1,44 @@ +package com.github.technus.tectech.thing.cover; + +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; + +import gregtech.api.interfaces.tileentity.ICoverable; + +public class GT_Cover_TM_TeslaCoil_Ultimate extends GT_Cover_TM_TeslaCoil { + + public GT_Cover_TM_TeslaCoil_Ultimate() {} + + @Override + public boolean letsEnergyOut(ForgeDirection side, int aCoverID, int aCoverVariable, ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsIn(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsItemsOut(ForgeDirection side, int aCoverID, int aCoverVariable, int aSlot, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidIn(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + @Override + public boolean letsFluidOut(ForgeDirection side, int aCoverID, int aCoverVariable, Fluid aFluid, + ICoverable aTileEntity) { + return true; + } + + public byte getTeslaReceptionCapability() { + return 1; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java b/tectech/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java new file mode 100644 index 0000000000..8c0c801363 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java @@ -0,0 +1,184 @@ +package com.github.technus.tectech.thing.gui; + +import static com.github.technus.tectech.Reference.MODID; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import com.gtnewhorizons.modularui.api.drawable.AdaptableUITexture; +import com.gtnewhorizons.modularui.api.drawable.UITexture; + +@SuppressWarnings("SimplifyStreamApiCallChains") +public class TecTechUITextures { + + public static final AdaptableUITexture BACKGROUND_SCREEN_BLUE = AdaptableUITexture + .of(MODID, "gui/background/screen_blue", 90, 72, 2); + public static final UITexture BACKGROUND_SCREEN_BLUE_PARAMETRIZER_TXT = UITexture + .fullImage(MODID, "gui/background/screen_blue_parametrizer_txt"); + public static final UITexture BACKGROUND_SCREEN_BLUE_NO_INVENTORY = UITexture + .fullImage(MODID, "gui/background/screen_blue_no_inventory"); + public static final UITexture BACKGROUND_STAR = UITexture.fullImage(MODID, "gui/background/star"); + public static final UITexture BACKGROUND_GLOW_ORANGE = UITexture.fullImage(MODID, "gui/background/orange_glow"); + public static final UITexture BACKGROUND_GLOW_PURPLE = UITexture.fullImage(MODID, "gui/background/purple_glow"); + public static final UITexture BACKGROUND_GLOW_BLUE = UITexture.fullImage(MODID, "gui/background/blue_glow"); + public static final UITexture BACKGROUND_GLOW_GREEN = UITexture.fullImage(MODID, "gui/background/green_glow"); + public static final UITexture BACKGROUND_GLOW_WHITE = UITexture.fullImage(MODID, "gui/background/white_glow"); + public static final UITexture BACKGROUND_SPACE = UITexture.fullImage(MODID, "gui/background/space"); + + public static final UITexture BUTTON_STANDARD_16x16 = UITexture.fullImage(MODID, "gui/button/standard_16x16"); + public static final UITexture BUTTON_STANDARD_LIGHT_16x16 = UITexture + .fullImage(MODID, "gui/button/standard_light_16x16"); + public static final UITexture BUTTON_CELESTIAL_32x32 = UITexture.fullImage(MODID, "gui/button/celestial"); + + public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_DISABLED = UITexture + .fullImage(MODID, "gui/overlay_button/power_switch_disabled"); + public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_OFF = UITexture + .fullImage(MODID, "gui/overlay_button/power_switch_off"); + public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_ON = UITexture + .fullImage(MODID, "gui/overlay_button/power_switch_on"); + public static final UITexture OVERLAY_BUTTON_HEAT_OFF = UITexture.fullImage(MODID, "gui/overlay_button/heat_off"); + public static final UITexture OVERLAY_BUTTON_HEAT_ON = UITexture.fullImage(MODID, "gui/overlay_button/heat_on"); + public static final UITexture[] OVERLAY_BUTTON_UNCERTAINTY = IntStream.range(0, 16) + .mapToObj(i -> UITexture.fullImage(MODID, "gui/overlay_button/uncertainty/" + i)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + public static final UITexture OVERLAY_BUTTON_SAFE_VOID_DISABLED = UITexture + .fullImage(MODID, "gui/overlay_button/safe_void_disabled"); + public static final UITexture OVERLAY_BUTTON_SAFE_VOID_OFF = UITexture + .fullImage(MODID, "gui/overlay_button/safe_void_off"); + public static final UITexture OVERLAY_BUTTON_SAFE_VOID_ON = UITexture + .fullImage(MODID, "gui/overlay_button/safe_void_on"); + public static final UITexture OVERLAY_BUTTON_POWER_PASS_DISABLED = UITexture + .fullImage(MODID, "gui/overlay_button/power_pass_disabled"); + public static final UITexture OVERLAY_BUTTON_POWER_PASS_OFF = UITexture + .fullImage(MODID, "gui/overlay_button/power_pass_off"); + public static final UITexture OVERLAY_BUTTON_POWER_PASS_ON = UITexture + .fullImage(MODID, "gui/overlay_button/power_pass_on"); + public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_ID = UITexture + .fullImage(MODID, "gui/overlay_button/parametrizer_id"); + public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_0 = UITexture + .fullImage(MODID, "gui/overlay_button/parametrizer_0"); + public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_1 = UITexture + .fullImage(MODID, "gui/overlay_button/parametrizer_1"); + public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_X = UITexture + .fullImage(MODID, "gui/overlay_button/parametrizer_x"); + public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_S = UITexture + .fullImage(MODID, "gui/overlay_button/parametrizer_s"); + public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_T = UITexture + .fullImage(MODID, "gui/overlay_button/parametrizer_t"); + public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_C = UITexture + .fullImage(MODID, "gui/overlay_button/parametrizer_c"); + public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_IF = UITexture + .fullImage(MODID, "gui/overlay_button/parametrizer_if"); + public static final UITexture OVERLAY_BUTTON_ARROW_BLUE_UP = UITexture + .fullImage(MODID, "gui/overlay_button/arrow_blue_up"); + public static final UITexture OVERLAY_BUTTON_BATTERY_ON = UITexture + .fullImage(MODID, "gui/overlay_button/battery_on"); + public static final UITexture OVERLAY_BUTTON_BATTERY_OFF = UITexture + .fullImage(MODID, "gui/overlay_button/battery_off"); + public static final UITexture OVERLAY_BUTTON_FLAG = UITexture.fullImage(MODID, "gui/overlay_button/flag"); + public static final UITexture OVERLAY_CYCLIC_BLUE = UITexture.fullImage(MODID, "gui/overlay_button/cyclic_blue"); + + public static final UITexture OVERLAY_SLOT_RACK = UITexture.fullImage(MODID, "gui/overlay_slot/rack"); + public static final UITexture OVERLAY_SLOT_MESH = UITexture.fullImage(MODID, "gui/overlay_slot/mesh"); + + public static final UITexture PROGRESSBAR_RESEARCH_STATION_1 = UITexture + .fullImage(MODID, "gui/progressbar/research_station_1"); + public static final UITexture PROGRESSBAR_RESEARCH_STATION_2 = UITexture + .fullImage(MODID, "gui/progressbar/research_station_2"); + public static final UITexture PROGRESSBAR_RESEARCH_STATION_3 = UITexture + .fullImage(MODID, "gui/progressbar/research_station_3"); + public static final UITexture PROGRESSBAR_GODFORGE_PLASMA = UITexture + .fullImage(MODID, "gui/progressbar/godforge_plasma"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_background"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BLUE = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_blue"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_red"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_PURPLE = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_purple"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_rainbow"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_BLUE_INVERTED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_blue_inverted"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RED_INVERTED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_red_inverted"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_PURPLE_INVERTED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_purple_inverted"); + public static final UITexture PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW_INVERTED = UITexture + .fullImage(MODID, "gui/progressbar/godforge_progressbar_rainbow_inverted"); + + public static final UITexture PICTURE_TECTECH_LOGO = UITexture.fullImage(MODID, "gui/picture/tectech_logo"); + public static final UITexture PICTURE_TECTECH_LOGO_DARK = UITexture + .fullImage(MODID, "gui/picture/tectech_logo_dark"); + public static final UITexture PICTURE_GODFORGE_LOGO = UITexture.fullImage(MODID, "gui/picture/gorge_logo"); + public static final UITexture PICTURE_RACK_LARGE = UITexture.fullImage(MODID, "gui/picture/rack_large"); + public static final UITexture PICTURE_HEAT_SINK = UITexture.fullImage(MODID, "gui/picture/heat_sink"); + public static final UITexture PICTURE_UNCERTAINTY_MONITOR = UITexture + .fullImage(MODID, "gui/picture/uncertainty/monitor"); + public static final UITexture PICTURE_UNCERTAINTY_INDICATOR = UITexture + .fullImage(MODID, "gui/picture/uncertainty/indicator"); + public static final UITexture PICTURE_UNCERTAINTY_SELECTED = UITexture + .fullImage(MODID, "gui/picture/uncertainty/selected"); + public static final UITexture[] PICTURE_UNCERTAINTY_VALID = IntStream.range(0, 9) + .mapToObj(i -> UITexture.fullImage(MODID, "gui/picture/uncertainty/valid_" + i)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + public static final UITexture[] PICTURE_UNCERTAINTY_INVALID = IntStream.range(0, 9) + .mapToObj(i -> UITexture.fullImage(MODID, "gui/picture/uncertainty/invalid_" + i)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + public static final UITexture PICTURE_HEAT_SINK_SMALL = UITexture.fullImage(MODID, "gui/picture/heat_sink_small"); + public static final UITexture PICTURE_PARAMETER_BLANK = UITexture.fullImage(MODID, "gui/picture/parameter_blank"); + public static final UITexture[] PICTURE_PARAMETER_BLUE = IntStream.range(0, 20) + .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_blue", 158, 4, i * 8, 0, i * 8 + 6, 4)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + public static final UITexture[] PICTURE_PARAMETER_CYAN = IntStream.range(0, 20) + .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_cyan", 158, 4, i * 8, 0, i * 8 + 6, 4)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + public static final UITexture[] PICTURE_PARAMETER_GREEN = IntStream.range(0, 20) + .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_green", 158, 4, i * 8, 0, i * 8 + 6, 4)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + public static final UITexture[] PICTURE_PARAMETER_ORANGE = IntStream.range(0, 20) + .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_orange", 158, 4, i * 8, 0, i * 8 + 6, 4)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + public static final UITexture[] PICTURE_PARAMETER_RED = IntStream.range(0, 20) + .mapToObj(i -> UITexture.partly(MODID, "gui/picture/parameter_red", 158, 4, i * 8, 0, i * 8 + 6, 4)) + .collect(Collectors.toList()) + .toArray(new UITexture[0]); + public static final UITexture PICTURE_PARAMETER_GRAY = UITexture.fullImage(MODID, "gui/picture/parameter_gray"); + public static final UITexture PICTURE_UNCERTAINTY_MONITOR_MULTIMACHINE = UITexture + .fullImage(MODID, "gui/picture/uncertainty/monitor_multimachine"); + public static final UITexture PICTURE_UPGRADE_CONNECTOR_FULL = UITexture.fullImage(MODID, "gui/picture/connector"); + public static final UITexture PICTURE_UPGRADE_CONNECTOR_EMPTY = UITexture + .fullImage(MODID, "gui/picture/connector_empty"); + public static final UITexture PICTURE_UPGRADE_CONNECTOR_SWITCH = UITexture + .fullImage(MODID, "gui/picture/connector_switch"); + public static final UITexture SLOT_OUTLINE_GREEN = UITexture.fullImage(MODID, "gui/picture/green_selector"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CHARGE = UITexture + .fullImage(MODID, "gui/picture/milestone_charge"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CONVERSION = UITexture + .fullImage(MODID, "gui/picture/milestone_conversion"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CATALYST = UITexture + .fullImage(MODID, "gui/picture/milestone_catalyst"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_COMPOSITION = UITexture + .fullImage(MODID, "gui/picture/milestone_composition"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CHARGE_GLOW = UITexture + .fullImage(MODID, "gui/picture/milestone_charge_glow"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CONVERSION_GLOW = UITexture + .fullImage(MODID, "gui/picture/milestone_conversion_glow"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_CATALYST_GLOW = UITexture + .fullImage(MODID, "gui/picture/milestone_catalyst_glow"); + public static final UITexture PICTURE_GODFORGE_MILESTONE_COMPOSITION_GLOW = UITexture + .fullImage(MODID, "gui/picture/milestone_composition_glow"); + public static final UITexture PICTURE_OVERLAY_BLUE = UITexture.fullImage(MODID, "gui/picture/overlay_blue"); + public static final UITexture PICTURE_OVERLAY_ORANGE = UITexture.fullImage(MODID, "gui/picture/overlay_orange"); + public static final UITexture PICTURE_OVERLAY_GREEN = UITexture.fullImage(MODID, "gui/picture/overlay_green"); + public static final UITexture PICTURE_OVERLAY_PURPLE = UITexture.fullImage(MODID, "gui/picture/overlay_purple"); + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java new file mode 100644 index 0000000000..f0d0df6206 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/AstralArrayFabricator.java @@ -0,0 +1,53 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.TecTech.creativeTabTecTech; +import static com.github.technus.tectech.thing.CustomItemList.astralArrayFabricator; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class AstralArrayFabricator extends Item { + + public static AstralArrayFabricator INSTANCE; + + private AstralArrayFabricator() { + setHasSubtypes(false); + setUnlocalizedName("tm.itemAstralArrayFabricator"); + setTextureName(MODID + ":itemAstralArray"); + setCreativeTab(creativeTabTecTech); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc1")); + aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc2")); + aList.add(EnumChatFormatting.GRAY + translateToLocal("item.tm.itemAstralArrayFabricator.desc3")); + aList.add( + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("item.tm.itemAstralArrayFabricator.desc0")); + } + + public static void run() { + INSTANCE = new AstralArrayFabricator(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + astralArrayFabricator.set(INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) { + itemIcon = iconRegister.registerIcon(getIconString()); + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java new file mode 100644 index 0000000000..00a1c29599 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/EnderFluidLinkCover.java @@ -0,0 +1,56 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.thing.CustomItemList.enderLinkFluidCover; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public final class EnderFluidLinkCover extends Item { + + public static EnderFluidLinkCover INSTANCE; + + private EnderFluidLinkCover() { + setHasSubtypes(true); + setUnlocalizedName("tm.enderfluidlinkcover"); + setTextureName(MODID + ":itemEnderFluidLinkCover"); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + aList.add(CommonValues.THETA_MOVEMENT); + aList.add(translateToLocal("item.tm.enderfluidlinkcover.desc.0")); // Ender-Fluid-Enables Machines! + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.enderfluidlinkcover.desc.1")); // Use on any side + // of a fluid tank + // to link it to + // the Ender + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.enderfluidlinkcover.desc.2")); // Ender Tanks so + // are laggy -Bot + // from the Chads + // of NH + } + + public static void run() { + INSTANCE = new EnderFluidLinkCover(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + enderLinkFluidCover.set(INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) { + itemIcon = iconRegister.registerIcon(getIconString()); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/EuMeterGT.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/EuMeterGT.java new file mode 100644 index 0000000000..f293f4178b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/EuMeterGT.java @@ -0,0 +1,169 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.TecTech.creativeTabTecTech; +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; +import gregtech.api.util.GT_Utility; + +public class EuMeterGT extends Item { + + public static EuMeterGT INSTANCE; + + private EuMeterGT() { + setMaxStackSize(1); + setUnlocalizedName("em.EuMeterGT"); + setTextureName(MODID + ":itemEuMeterGT"); + setCreativeTab(creativeTabTecTech); + } + + @Override + public boolean onItemUseFirst(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, + int ordinalSide, float hitX, float hitY, float hitZ) { + final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide); + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity == null || aPlayer instanceof FakePlayer) { + return aPlayer instanceof EntityPlayerMP; + } + if (aPlayer instanceof EntityPlayerMP && !aPlayer.isSneaking() && tTileEntity instanceof IGregTechTileEntity) { + String clientLocale; + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + + if (tTileEntity instanceof BaseMetaTileEntity) { + GT_Utility.sendChatToPlayer( + aPlayer, + EnumChatFormatting.AQUA + "----- X:" + + aX + + " Y:" + + aY + + " Z:" + + aZ + + " D:" + + aWorld.provider.dimensionId + + " S:" + + ordinalSide + + " -----"); + GT_Utility.sendChatToPlayer( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Stored_energy", clientLocale) + ": " + + EnumChatFormatting.YELLOW + + (((BaseMetaTileEntity) tTileEntity).getUniversalEnergyStored()) + + EnumChatFormatting.RESET + + '/' + + EnumChatFormatting.GREEN + + (((BaseMetaTileEntity) tTileEntity).getUniversalEnergyCapacity())); + GT_Utility.sendChatToPlayer( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Stored_EU", clientLocale) + ": " + + EnumChatFormatting.YELLOW + + (((BaseMetaTileEntity) tTileEntity).getStoredEU()) + + EnumChatFormatting.RESET + + '/' + + EnumChatFormatting.GREEN + + (((BaseMetaTileEntity) tTileEntity).getEUCapacity())); + GT_Utility.sendChatToPlayer( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Average_IO", clientLocale) + ": " + + EnumChatFormatting.YELLOW + + (((BaseMetaTileEntity) tTileEntity).getAverageElectricInput()) + + EnumChatFormatting.RESET + + '/' + + EnumChatFormatting.YELLOW + + (((BaseMetaTileEntity) tTileEntity).getAverageElectricOutput())); + GT_Utility.sendChatToPlayer( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Average_IO_(max)", clientLocale) + ": " + + EnumChatFormatting.GOLD + + (((BaseMetaTileEntity) tTileEntity).getInputVoltage()) + + EnumChatFormatting.RESET + + '/' + + EnumChatFormatting.GOLD + + (((BaseMetaTileEntity) tTileEntity).getOutputVoltage())); + GT_Utility.sendChatToPlayer( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Average_IO_max", clientLocale) + ": " + + EnumChatFormatting.RED + + (((BaseMetaTileEntity) tTileEntity).getMaxSafeInput()) + + EnumChatFormatting.RESET + + '/' + + EnumChatFormatting.RED + + (((BaseMetaTileEntity) tTileEntity).getMaxEnergyOutput())); + GT_Utility.sendChatToPlayer( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Amperage_IO_(max)", clientLocale) + ": " + + EnumChatFormatting.GOLD + + (((BaseMetaTileEntity) tTileEntity).getInputAmperage()) + + EnumChatFormatting.RESET + + '/' + + EnumChatFormatting.GOLD + + (((BaseMetaTileEntity) tTileEntity).getOutputAmperage())); + GT_Utility.sendChatToPlayer( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Side_capabilities", clientLocale) + ": " + + (((BaseMetaTileEntity) tTileEntity).inputEnergyFrom(side) + ? translateToLocalFormatted("tt.keyword.input", clientLocale) + " " + : "") + + (((BaseMetaTileEntity) tTileEntity).outputsEnergyTo(side) + ? translateToLocalFormatted("tt.keyword.output", clientLocale) + : "")); + return true; + } else if (tTileEntity instanceof BaseMetaPipeEntity) { + if (((BaseMetaPipeEntity) tTileEntity).getMetaTileEntity() instanceof GT_MetaPipeEntity_Cable) { + ArrayList<String> tList = new ArrayList<>(); + GT_Utility.getCoordinateScan(tList, aPlayer, aWorld, 1, aX, aY, aZ, side, hitX, hitY, hitZ); + for (String str : tList) { + GT_Utility.sendChatToPlayer(aPlayer, str); + } + } + return true; + } + } + if (!(aPlayer instanceof EntityPlayerMP)) { + GT_Utility.doSoundAtClient(new ResourceLocation(Reference.MODID, "fx_scan"), 1, 1.0F, aX, aY, aZ); + } + return false; + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + aList.add(CommonValues.TEC_MARK_GENERAL); + aList.add(translateToLocal("item.em.EuMeterGT.desc.0")); // Measures basic EU related stuff + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.em.EuMeterGT.desc.1")); // Just right click on + // blocks. + } + + public static void run() { + INSTANCE = new EuMeterGT(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/ParametrizerMemoryCard.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/ParametrizerMemoryCard.java new file mode 100644 index 0000000000..753bb691b9 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/ParametrizerMemoryCard.java @@ -0,0 +1,234 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.TecTech.creativeTabTecTech; +import static com.github.technus.tectech.thing.CustomItemList.parametrizerMemory; +import static net.minecraft.util.StatCollector.translateToLocal; + +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.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; + +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Param; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_ParamText; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +/** + * Created by Tec on 15.03.2017. + */ +public final class ParametrizerMemoryCard extends Item { + + public static ParametrizerMemoryCard INSTANCE; + private static IIcon locked, unlocked; + + private ParametrizerMemoryCard() { + setMaxStackSize(1); + setHasSubtypes(true); + setUnlocalizedName("em.parametrizerMemoryCard"); + setTextureName(MODID + ":itemParametrizerMemoryCardUnlocked"); + setCreativeTab(creativeTabTecTech); + } + + @Override + public boolean onItemUseFirst(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, + int ordinalSide, float hitX, float hitY, float hitZ) { + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (!(aPlayer instanceof EntityPlayerMP)) return false; + if (!(tTileEntity instanceof IGregTechTileEntity)) return false; + aStack.stackSize = 1; + IMetaTileEntity metaTE = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity(); + + if (metaTE instanceof GT_MetaTileEntity_Hatch_ParamText parametrizer) { + if (aStack.getTagCompound() == null) { + aStack.setTagCompound(new NBTTagCompound()); + } + NBTTagCompound tNBT = aStack.getTagCompound(); + if (aStack.getItemDamage() == 1) { + // write to parametrizer + parametrizer.param = tNBT.getInteger("param"); + parametrizer.value0D = tNBT.getDouble("value0D"); + parametrizer.value1D = tNBT.getDouble("value1D"); + parametrizer.value0s = tNBT.getString("value0s"); + parametrizer.value1s = tNBT.getString("value1s"); + } else { + // read from parametrizer + NBTTagCompound newTag = new NBTTagCompound(); + newTag.setInteger("param", parametrizer.param); + newTag.setDouble("value0D", parametrizer.value0D); + newTag.setDouble("value1D", parametrizer.value1D); + newTag.setString("value0s", parametrizer.value0s); + newTag.setString("value1s", parametrizer.value1s); + aStack.setTagCompound(newTag); + } + return true; + } else if (metaTE instanceof GT_MetaTileEntity_Hatch_Param parametrizer) { + if (aStack.getTagCompound() == null) { + aStack.setTagCompound(new NBTTagCompound()); + } + NBTTagCompound tNBT = aStack.getTagCompound(); + if (aStack.getItemDamage() == 1) { + // write to parametrizer + parametrizer.param = tNBT.getInteger("param"); + parametrizer.value0D = tNBT.getDouble("value0D"); + parametrizer.value1D = tNBT.getDouble("value1D"); + } else { + // read from parametrizer + NBTTagCompound newTag = new NBTTagCompound(); + tNBT.setInteger("param", parametrizer.param); + tNBT.setDouble("value0D", parametrizer.value0D); + tNBT.setDouble("value1D", parametrizer.value1D); + aStack.setTagCompound(newTag); + } + return true; + } else if (metaTE instanceof GT_MetaTileEntity_MultiblockBase_EM controller) { + if (aStack.getTagCompound() == null) { + aStack.setTagCompound(new NBTTagCompound()); + } + NBTTagCompound tNBT = aStack.getTagCompound(); + if (aStack.getItemDamage() == 1) { + // write to controller + if (tNBT.hasKey("paramList", Constants.NBT.TAG_LIST)) { + // from controller + NBTTagList tagList = tNBT.getTagList("paramList", Constants.NBT.TAG_COMPOUND); + for (int hatch = 0; hatch < 10; hatch++) { + NBTTagCompound tag = tagList.getCompoundTagAt(hatch); + controller.parametrization + .trySetParameters(hatch, tag.getDouble("value0D"), tag.getDouble("value1D")); + } + } else { + // from parametrizer + controller.parametrization.trySetParameters( + tNBT.getInteger("param"), + tNBT.getDouble("value0D"), + tNBT.getDouble("value1D")); + } + } else { + // read from controller + NBTTagCompound newTag = new NBTTagCompound(); + NBTTagList tagList = new NBTTagList(); + for (int hatch = 0; hatch < 10; hatch++) { + NBTTagCompound tagChild = new NBTTagCompound(); + Parameters.Group.ParameterIn[] parameters = controller.parametrization.getGroup(hatch).parameterIn; + if (parameters[0] != null) { + tagChild.setDouble("value0D", parameters[0].get()); + } + if (parameters[1] != null) { + tagChild.setDouble("value1D", parameters[1].get()); + } + tagList.appendTag(tagChild); + } + newTag.setTag("paramList", tagList); + aStack.setTagCompound(newTag); + } + return true; + } + return false; + } + + @Override + public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + if (aPlayer instanceof EntityPlayerMP && aPlayer.isSneaking()) { + aStack.stackSize = 1; + if (aStack.getItemDamage() == 1) { + aStack.setItemDamage(0); + } else { + aStack.setItemDamage(1); + } + return aStack; + } + return aStack; + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + if (stack.getItemDamage() == 1) { + return StatCollector.translateToLocal("item.em.parametrizerMemoryCard.name.paste"); + } else { + return StatCollector.translateToLocal("item.em.parametrizerMemoryCard.name.copy"); + } + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + NBTTagCompound tNBT = aStack.getTagCompound(); + aList.add(CommonValues.THETA_MOVEMENT); + aList.add(translateToLocal("item.em.parametrizerMemoryCard.desc.0")); // Stores Parameters + + if (aStack.getItemDamage() == 1) { + // Use on Multiblock Controller to configure it + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.em.parametrizerMemoryCard.desc.1")); + } else { + // Use on Multiblock Controller to store parameters + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.em.parametrizerMemoryCard.desc.2")); + } + // Sneak right click to lock/unlock + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.em.parametrizerMemoryCard.desc.3")); + + double temp; + if (tNBT != null && tNBT.hasKey("param")) { + aList.add("Hatch ID: " + EnumChatFormatting.AQUA + tNBT.getInteger("param")); + temp = tNBT.getInteger("value0D"); + aList.add("Value 0D: " + EnumChatFormatting.AQUA + temp); + aList.add( + "Value 0B: " + EnumChatFormatting.AQUA + + TT_Utility.longBitsToShortString(Double.doubleToLongBits(temp))); + aList.add("Value 0s: " + EnumChatFormatting.AQUA + tNBT.getString("value0s")); + temp = tNBT.getInteger("value1D"); + aList.add("Value 1D: " + EnumChatFormatting.AQUA + temp); + aList.add( + "Value 1B: " + EnumChatFormatting.AQUA + + TT_Utility.longBitsToShortString(Double.doubleToLongBits(temp))); + aList.add("Value 1s: " + EnumChatFormatting.AQUA + tNBT.getString("value1s")); + } + } + + public static void run() { + INSTANCE = new ParametrizerMemoryCard(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + parametrizerMemory.set(INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) { + locked = iconRegister.registerIcon(MODID + ":itemParametrizerMemoryCardLocked"); + unlocked = itemIcon = iconRegister.registerIcon(getIconString()); + } + + @Override + public IIcon getIconFromDamage(int damage) { + if (damage == 1) { + return locked; + } + return unlocked; + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List<ItemStack> list) { + ItemStack that = new ItemStack(this, 1); + that.setTagCompound(new NBTTagCompound()); + list.add(that); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/PowerPassUpgradeCover.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/PowerPassUpgradeCover.java new file mode 100644 index 0000000000..015d284c4e --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/PowerPassUpgradeCover.java @@ -0,0 +1,55 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.thing.CustomItemList.powerPassUpgradeCover; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public final class PowerPassUpgradeCover extends Item { + + public static PowerPassUpgradeCover INSTANCE; + + private PowerPassUpgradeCover() { + setHasSubtypes(true); + setUnlocalizedName("tm.powerpassupgradecover"); + setTextureName(MODID + ":itemPowerPassUpgradeCover"); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + aList.add(CommonValues.THETA_MOVEMENT); + aList.add(translateToLocal("item.tm.powerpassupgradecover.desc.0")); // Add power pass functionality to TecTech + // Multiblocks + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.powerpassupgradecover.desc.1")); // Active + // transformer in + // a can?? + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.powerpassupgradecover.desc.2")); // Chain them up + // like Christmas + // lights! + } + + public static void run() { + INSTANCE = new PowerPassUpgradeCover(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + powerPassUpgradeCover.set(INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) { + itemIcon = iconRegister.registerIcon(getIconString()); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java new file mode 100644 index 0000000000..35f2199663 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java @@ -0,0 +1,91 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.rendering.EOH.EOH_TESR.*; +import static java.lang.Math.pow; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderForgeOfGodsItem implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, IItemRenderer.ItemRenderType type) { + return true; + } + + @Override + public boolean shouldUseRenderHelper(IItemRenderer.ItemRenderType type, ItemStack item, + IItemRenderer.ItemRendererHelper helper) { + return true; + } + + @Override + public void renderItem(IItemRenderer.ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + + if (type == IItemRenderer.ItemRenderType.INVENTORY) GL11.glRotated(180, 0, 1, 0); + else if (type == IItemRenderer.ItemRenderType.EQUIPPED + || type == IItemRenderer.ItemRenderType.EQUIPPED_FIRST_PERSON) { + GL11.glTranslated(0.5, 0.5, 0.5); + if (type == IItemRenderer.ItemRenderType.EQUIPPED) GL11.glRotated(90, 0, 1, 0); + } + + // Render star stuff + renderStarLayer(0, STAR_LAYER_0, 1.0f); + renderStarLayer(1, STAR_LAYER_1, 0.4f); + renderStarLayer(2, STAR_LAYER_2, 0.2f); + + GL11.glPopMatrix(); + } + + private void renderStarLayer(int layer, ResourceLocation texture, float alpha) { + + GL11.glPushMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + FMLClientHandler.instance() + .getClient() + .getTextureManager() + .bindTexture(texture); + + // 0.01f magic number to shrink sphere obj down + float scale = 0.01f; + + // Put each layer further out + scale *= pow(1.04f, layer); + + // Scale the star up in the x, y and z directions + GL11.glScalef(scale, scale, scale); + + switch (layer) { + case 0: + GL11.glRotatef(130 + (System.currentTimeMillis() / 64) % 360, 0F, 1F, 1F); + break; + case 1: + GL11.glRotatef(-49 + (System.currentTimeMillis() / 64) % 360, 1F, 1F, 0F); + break; + case 2: + GL11.glRotatef(67 + (System.currentTimeMillis() / 64) % 360, 1F, 0F, 1F); + break; + } + + // Set colour and alpha of the star layer + GL11.glColor4f(222, 243, 250, alpha); + + starModel.renderAll(); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_LIGHTING); + + GL11.glPopMatrix(); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCapacitor.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCapacitor.java new file mode 100644 index 0000000000..6e292bc9c7 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCapacitor.java @@ -0,0 +1,108 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.thing.CustomItemList.teslaCapacitor; +import static com.github.technus.tectech.util.CommonValues.V; +import static net.minecraft.util.StatCollector.translateToLocal; + +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.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; + +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public final class TeslaCoilCapacitor extends Item { + + public static TeslaCoilCapacitor INSTANCE; + private static IIcon LVicon, MVicon, HVicon, EVicon, IVicon, LuVicon, ZPMicon; + + private TeslaCoilCapacitor() { + setHasSubtypes(true); + setUnlocalizedName("tm.teslaCoilCapacitor"); + setTextureName(MODID + ":itemCapacitorLV"); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + aList.add(CommonValues.THETA_MOVEMENT); + if (aStack.getItemDamage() >= 0 && aStack.getItemDamage() <= 6) { + aList.add( + translateToLocal("item.tm.teslaCoilCapacitor.desc.0") + " " + + V[aStack.getItemDamage() + 1] * 512 + + " " + + translateToLocal("item.tm.teslaCoilCapacitor.desc.1") + + " " + + V[aStack.getItemDamage() + 1] + + " EU/t"); // Stores 16384 EU in a tesla tower at 32 EU/t + } else { + aList.add(translateToLocal("item.tm.teslaCoilCapacitor.desc.2")); // Yeet this broken item into some spicy + // water! + } + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.teslaCoilCapacitor.desc.3")); // Insert into a + // Capacitor hatch + // of a Tesla Tower + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.teslaCoilCapacitor.desc.4")); // Capacitors are + // the same thing as + // batteries, right? + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return getUnlocalizedName() + "." + getDamage(aStack); + } + + public static void run() { + INSTANCE = new TeslaCoilCapacitor(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + teslaCapacitor.set(INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) { + LVicon = itemIcon = iconRegister.registerIcon(getIconString()); + MVicon = iconRegister.registerIcon(MODID + ":itemCapacitorMV"); + HVicon = iconRegister.registerIcon(MODID + ":itemCapacitorHV"); + EVicon = iconRegister.registerIcon(MODID + ":itemCapacitorEV"); + IVicon = iconRegister.registerIcon(MODID + ":itemCapacitorIV"); + LuVicon = iconRegister.registerIcon(MODID + ":itemCapacitorLuV"); + ZPMicon = iconRegister.registerIcon(MODID + ":itemCapacitorZPM"); + } + + @Override + public IIcon getIconFromDamage(int damage) { + switch (damage) { + case 1: + return MVicon; + case 2: + return HVicon; + case 3: + return EVicon; + case 4: + return IVicon; + case 5: + return LuVicon; + case 6: + return ZPMicon; + default: + return LVicon; + } + } + + @Override + public void getSubItems(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) { + for (int i = 0; i <= 6; i++) { + aList.add(new ItemStack(aItem, 1, i)); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilComponent.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilComponent.java new file mode 100644 index 0000000000..b4f1d33382 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilComponent.java @@ -0,0 +1,72 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.thing.CustomItemList.teslaComponent; +import static net.minecraft.util.StatCollector.translateToLocal; + +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.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; + +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public final class TeslaCoilComponent extends Item { + + public static TeslaCoilComponent INSTANCE; + private static IIcon ultItemIcon; + + private TeslaCoilComponent() { + setHasSubtypes(true); + setUnlocalizedName("tm.itemTeslaComponent"); + setTextureName(MODID + ":itemTeslaComponent"); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + aList.add(CommonValues.THETA_MOVEMENT); + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.itemTeslaComponent.desc")); // Tesla bois need + // these! + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return getUnlocalizedName() + "." + getDamage(aStack); + } + + public static void run() { + INSTANCE = new TeslaCoilComponent(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + teslaComponent.set(INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) { + itemIcon = iconRegister.registerIcon(getIconString()); + ultItemIcon = iconRegister.registerIcon(MODID + ":itemTeslaComponentUltimate"); + } + + @Override + public IIcon getIconFromDamage(int damage) { + if (damage == 1) { + return ultItemIcon; + } + return itemIcon; + } + + @Override + public void getSubItems(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) { + aList.add(new ItemStack(aItem, 1, 0)); + aList.add(new ItemStack(aItem, 1, 1)); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCover.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCover.java new file mode 100644 index 0000000000..3ee7fd3e93 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaCoilCover.java @@ -0,0 +1,87 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.thing.CustomItemList.teslaCover; +import static net.minecraft.util.StatCollector.translateToLocal; + +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.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; + +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public final class TeslaCoilCover extends Item { + + public static TeslaCoilCover INSTANCE; + private static IIcon ultItemIcon; + + private TeslaCoilCover() { + setHasSubtypes(true); + setUnlocalizedName("tm.teslaCover"); + setTextureName(MODID + ":itemTeslaCover"); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + aList.add(CommonValues.THETA_MOVEMENT); + switch (aStack.getItemDamage()) { + case 0: + aList.add(translateToLocal("item.tm.teslaCover.desc.0")); // Tesla-Enables Machines! + break; + case 1: + aList.add(translateToLocal("item.tm.teslaCover.desc.1")); // Tesla-Enables Machines! (BUT LOUDER!!) + break; + default: + aList.add(translateToLocal("item.tm.teslaCover.desc.2")); // Yeet this broken item into some spicy + // water! + break; + } + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.teslaCover.desc.3")); // Use on top of a machine + // to enable Tesla + // capabilities + aList.add(EnumChatFormatting.BLUE + translateToLocal("item.tm.teslaCover.desc.4")); // Who the hell uses cables + // anyway? + } + + @Override + public String getUnlocalizedName(ItemStack aStack) { + return getUnlocalizedName() + "." + getDamage(aStack); + } + + public static void run() { + INSTANCE = new TeslaCoilCover(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + teslaCover.set(INSTANCE); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) { + itemIcon = iconRegister.registerIcon(getIconString()); + ultItemIcon = iconRegister.registerIcon(MODID + ":itemTeslaCoverUltimate"); + } + + @Override + public IIcon getIconFromDamage(int damage) { + if (damage == 1) { + return ultItemIcon; + } + return itemIcon; + } + + @Override + public void getSubItems(Item aItem, CreativeTabs par2CreativeTabs, List<ItemStack> aList) { + aList.add(new ItemStack(aItem, 1, 0)); + aList.add(new ItemStack(aItem, 1, 1)); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaStaff.java b/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaStaff.java new file mode 100644 index 0000000000..88028f910c --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/item/TeslaStaff.java @@ -0,0 +1,54 @@ +package com.github.technus.tectech.thing.item; + +import static com.github.technus.tectech.Reference.MODID; +import static com.github.technus.tectech.thing.CustomItemList.teslaStaff; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.util.GT_Utility; + +public final class TeslaStaff extends Item { + + public static TeslaStaff INSTANCE; + + private TeslaStaff() { + setUnlocalizedName("tm.teslaStaff"); + setTextureName(MODID + ":itemTeslaStaff"); + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer ep, List<String> aList, boolean boo) { + aList.add(CommonValues.THETA_MOVEMENT); + aList.add(translateToLocal("item.tm.teslaStaff.desc")); + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer aPlayer, Entity entity) { + GT_Utility.sendChatToPlayer(aPlayer, "Zapperoni!"); + if (!(aPlayer instanceof EntityPlayerMP)) { + double aX = aPlayer.posX; + double aY = aPlayer.posY; + double aZ = aPlayer.posZ; + GT_Utility.doSoundAtClient(new ResourceLocation(Reference.MODID, "fx_scan"), 1, 1.0F, aX, aY, aZ); + } + return false; + } + + public static void run() { + INSTANCE = new TeslaStaff(); + GameRegistry.registerItem(INSTANCE, INSTANCE.getUnlocalizedName()); + teslaStaff.set(INSTANCE); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/Textures.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/Textures.java new file mode 100644 index 0000000000..cd4d743587 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/Textures.java @@ -0,0 +1,318 @@ +package com.github.technus.tectech.thing.metaTileEntity; + +import static gregtech.api.enums.Dyes.MACHINE_METAL; +import static gregtech.api.enums.Textures.BlockIcons.CustomIcon; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_8V_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_8V_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_8V_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_EV_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_EV_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_EV_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_HV_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_HV_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_HV_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_IV_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_IV_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_IV_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LV_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LV_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LV_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LuV_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LuV_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_LuV_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MAX_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MAX_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MAX_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MV_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MV_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_MV_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_UV_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_UV_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_UV_TOP; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_ZPM_BOTTOM; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_ZPM_SIDE; +import static gregtech.api.enums.Textures.BlockIcons.MACHINE_ZPM_TOP; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_IN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_IN_MULTI; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAYS_ENERGY_OUT_MULTI; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_IN; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_IN_MULTI; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_ON_WIRELESS; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_OUT; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_OUT_MULTI; + +import gregtech.api.enums.Dyes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.api.interfaces.ITexture; +import gregtech.api.objects.GT_RenderedTexture; +import gregtech.api.objects.GT_SidedTexture; +import gregtech.api.render.TextureFactory; + +public class Textures { + + private static final IIconContainer OVERLAY_ENERGY_IN_POWER = new CustomIcon("iconsets/OVERLAY_ENERGY_IN_POWER"); + private static final IIconContainer OVERLAY_ENERGY_OUT_POWER = new CustomIcon("iconsets/OVERLAY_ENERGY_OUT_POWER"); + private static final IIconContainer OVERLAY_ENERGY_IN_LASER = new CustomIcon("iconsets/OVERLAY_ENERGY_IN_LASER"); + private static final IIconContainer OVERLAY_ENERGY_OUT_LASER = new CustomIcon("iconsets/OVERLAY_ENERGY_OUT_LASER"); + private static final IIconContainer OVERLAY_ENERGY_ON_WIRELESS_4A = new CustomIcon( + "iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A"); + private static final IIconContainer OVERLAY_ENERGY_ON_WIRELESS_16A = new CustomIcon( + "iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A"); + private static final IIconContainer OVERLAY_ENERGY_ON_WIRELESS_LASER = new CustomIcon( + "iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER"); + private static final IIconContainer MACHINE_UEV_SIDE = new CustomIcon("iconsets/MACHINE_UEV_SIDE"); + private static final IIconContainer MACHINE_UIV_SIDE = new CustomIcon("iconsets/MACHINE_UIV_SIDE"); + private static final IIconContainer MACHINE_UMV_SIDE = new CustomIcon("iconsets/MACHINE_UMV_SIDE"); + private static final IIconContainer MACHINE_UXV_SIDE = new CustomIcon("iconsets/MACHINE_UXV_SIDE"); + private static final IIconContainer MACHINE_MAXV_SIDE = new CustomIcon("iconsets/MACHINE_MAXV_SIDE"); + private static final IIconContainer MACHINE_UEV_TOP = new CustomIcon("iconsets/MACHINE_UEV_TOP"); + private static final IIconContainer MACHINE_UIV_TOP = new CustomIcon("iconsets/MACHINE_UIV_TOP"); + private static final IIconContainer MACHINE_UMV_TOP = new CustomIcon("iconsets/MACHINE_UMV_TOP"); + private static final IIconContainer MACHINE_UXV_TOP = new CustomIcon("iconsets/MACHINE_UXV_TOP"); + private static final IIconContainer MACHINE_MAXV_TOP = new CustomIcon("iconsets/MACHINE_MAXV_TOP"); + private static final IIconContainer MACHINE_UEV_BOTTOM = new CustomIcon("iconsets/MACHINE_UEV_BOTTOM"); + private static final IIconContainer MACHINE_UIV_BOTTOM = new CustomIcon("iconsets/MACHINE_UIV_BOTTOM"); + private static final IIconContainer MACHINE_UMV_BOTTOM = new CustomIcon("iconsets/MACHINE_UMV_BOTTOM"); + private static final IIconContainer MACHINE_UXV_BOTTOM = new CustomIcon("iconsets/MACHINE_UXV_BOTTOM"); + private static final IIconContainer MACHINE_MAXV_BOTTOM = new CustomIcon("iconsets/MACHINE_MAXV_BOTTOM"); + + private static final IIconContainer TESLA_TRANSCEIVER_TOP = new CustomIcon("iconsets/TESLA_TRANSCEIVER_TOP"); + + public static IIconContainer[] MACHINECASINGS_SIDE_TT = new IIconContainer[] { MACHINE_8V_SIDE, MACHINE_LV_SIDE, + MACHINE_MV_SIDE, MACHINE_HV_SIDE, MACHINE_EV_SIDE, MACHINE_IV_SIDE, MACHINE_LuV_SIDE, MACHINE_ZPM_SIDE, + MACHINE_UV_SIDE, MACHINE_MAX_SIDE, MACHINE_UEV_SIDE, MACHINE_UIV_SIDE, MACHINE_UMV_SIDE, MACHINE_UXV_SIDE, + MACHINE_MAXV_SIDE, }, + MACHINECASINGS_TOP_TT = new IIconContainer[] { MACHINE_8V_TOP, MACHINE_LV_TOP, MACHINE_MV_TOP, MACHINE_HV_TOP, + MACHINE_EV_TOP, MACHINE_IV_TOP, MACHINE_LuV_TOP, MACHINE_ZPM_TOP, MACHINE_UV_TOP, MACHINE_MAX_TOP, + MACHINE_UEV_TOP, MACHINE_UIV_TOP, MACHINE_UMV_TOP, MACHINE_UXV_TOP, MACHINE_MAXV_TOP, }, + MACHINECASINGS_BOTTOM_TT = new IIconContainer[] { MACHINE_8V_BOTTOM, MACHINE_LV_BOTTOM, MACHINE_MV_BOTTOM, + MACHINE_HV_BOTTOM, MACHINE_EV_BOTTOM, MACHINE_IV_BOTTOM, MACHINE_LuV_BOTTOM, MACHINE_ZPM_BOTTOM, + MACHINE_UV_BOTTOM, MACHINE_MAX_BOTTOM, MACHINE_UEV_BOTTOM, MACHINE_UIV_BOTTOM, MACHINE_UMV_BOTTOM, + MACHINE_UXV_BOTTOM, MACHINE_MAXV_BOTTOM, }; + public static ITexture[] OVERLAYS_ENERGY_IN_TT = new ITexture[] { + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 180, 180, 180, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 220, 220, 220, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 255, 100, 0, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 255, 255, 30, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 128, 128, 128, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 240, 240, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 220, 220, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 200, 200, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 180, 180, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 160, 160, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 140, 140, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 120, 120, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 100, 100, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 80, 80, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN, new short[] { 60, 60, 245, 0 }), }, + OVERLAYS_ENERGY_OUT_TT = new ITexture[] { + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 180, 180, 180, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 220, 220, 220, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 255, 100, 0, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 255, 255, 30, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 128, 128, 128, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 240, 240, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 220, 220, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 200, 200, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 180, 180, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 160, 160, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 140, 140, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 120, 120, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 100, 100, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 80, 80, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT, new short[] { 60, 60, 245, 0 }), }, + OVERLAYS_ENERGY_IN_MULTI_TT = new ITexture[] { + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 180, 180, 180, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 220, 220, 220, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 255, 100, 0, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 255, 255, 30, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 128, 128, 128, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 240, 240, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 220, 220, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 200, 200, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 180, 180, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 160, 160, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 140, 140, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 120, 120, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 100, 100, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 80, 80, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_MULTI, new short[] { 60, 60, 245, 0 }), }, + OVERLAYS_ENERGY_OUT_MULTI_TT = new ITexture[] { + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 180, 180, 180, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 220, 220, 220, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 255, 100, 0, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 255, 255, 30, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 128, 128, 128, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 240, 240, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 220, 220, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 200, 200, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 180, 180, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 160, 160, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 140, 140, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 120, 120, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 100, 100, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 80, 80, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_MULTI, new short[] { 60, 60, 245, 0 }), }, + OVERLAYS_ENERGY_IN_POWER_TT = new ITexture[] { + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 180, 180, 180, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 220, 220, 220, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 255, 100, 0, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 255, 255, 30, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 128, 128, 128, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 240, 240, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 220, 220, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 200, 200, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 180, 180, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 160, 160, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 140, 140, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 120, 120, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 100, 100, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 80, 80, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_POWER, new short[] { 60, 60, 245, 0 }), }, + OVERLAYS_ENERGY_OUT_POWER_TT = new ITexture[] { + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 180, 180, 180, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 220, 220, 220, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 255, 100, 0, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 255, 255, 30, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 128, 128, 128, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 240, 240, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 220, 220, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 200, 200, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 180, 180, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 160, 160, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 140, 140, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 120, 120, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 100, 100, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 80, 80, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_POWER, new short[] { 60, 60, 245, 0 }), }, + OVERLAYS_ENERGY_IN_LASER_TT = new ITexture[] { + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 180, 180, 180, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 220, 220, 220, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 255, 100, 0, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 255, 255, 30, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 128, 128, 128, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 240, 240, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 220, 220, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 200, 200, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 180, 180, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 160, 160, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 140, 140, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 120, 120, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 100, 100, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 80, 80, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_IN_LASER, new short[] { 60, 60, 245, 0 }), }, + OVERLAYS_ENERGY_OUT_LASER_TT = new ITexture[] { + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 180, 180, 180, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 220, 220, 220, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 255, 100, 0, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 255, 255, 30, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 128, 128, 128, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 240, 240, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 220, 220, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 200, 200, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 180, 180, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 160, 160, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 140, 140, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 120, 120, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 100, 100, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 80, 80, 245, 0 }), + new GT_RenderedTexture(OVERLAY_ENERGY_OUT_LASER, new short[] { 60, 60, 245, 0 }), }; + public static final ITexture[] OVERLAYS_ENERGY_IN_WIRELESS_MULTI_4A = { + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_4A, new short[] { 255, 255, 255, 0 }) }; + + public static final ITexture[] OVERLAYS_ENERGY_IN_WIRELESS_MULTI_16A = { + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_16A, new short[] { 255, 255, 255, 0 }) }; + + public static final ITexture[] OVERLAYS_ENERGY_IN_WIRELESS_MULTI_64A = { + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS, new short[] { 25, 43, 255, 0 }) }; + + public static final ITexture[] OVERLAYS_ENERGY_IN_WIRELESS_LASER = { + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }), + TextureFactory.of(OVERLAY_ENERGY_ON_WIRELESS_LASER, new short[] { 255, 255, 255, 0 }) }; + + public static ITexture[][] MACHINE_CASINGS_TT = new ITexture[15][17]; + + public static ITexture TESLA_TRANSCEIVER_TOP_BA = new GT_RenderedTexture(TESLA_TRANSCEIVER_TOP); + + public static void run() { + for (byte i = 0; i < MACHINE_CASINGS_TT.length; i++) { + for (byte j = 0; j < MACHINE_CASINGS_TT[i].length; j++) { + MACHINE_CASINGS_TT[i][j] = new GT_SidedTexture( + MACHINECASINGS_BOTTOM_TT[i], + MACHINECASINGS_TOP_TT[i], + MACHINECASINGS_SIDE_TT[i], + Dyes.getModulation(j - 1, MACHINE_METAL.mRGBa)); + } + } + MACHINE_CASINGS = MACHINE_CASINGS_TT; + + // These will throw IndexOutOfBoundsException if one of the arrays are the wrong length + System.arraycopy(OVERLAYS_ENERGY_IN_TT, 0, OVERLAYS_ENERGY_IN, 0, OVERLAYS_ENERGY_IN_TT.length); + System.arraycopy(OVERLAYS_ENERGY_OUT_TT, 0, OVERLAYS_ENERGY_OUT, 0, OVERLAYS_ENERGY_OUT_TT.length); + System + .arraycopy(OVERLAYS_ENERGY_IN_MULTI_TT, 0, OVERLAYS_ENERGY_IN_MULTI, 0, OVERLAYS_ENERGY_IN_MULTI_TT.length); + System.arraycopy( + OVERLAYS_ENERGY_OUT_MULTI_TT, + 0, + OVERLAYS_ENERGY_OUT_MULTI, + 0, + OVERLAYS_ENERGY_OUT_MULTI_TT.length); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Capacitor.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Capacitor.java new file mode 100644 index 0000000000..3cb7a93f77 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Capacitor.java @@ -0,0 +1,268 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE; +import static com.github.technus.tectech.util.CommonValues.V; +import static com.github.technus.tectech.util.TT_Utility.getUniqueIdentifier; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.objects.GT_RenderedTexture; + +/** + * Created by Tec on 03.04.2017. + */ +public class GT_MetaTileEntity_Hatch_Capacitor extends GT_MetaTileEntity_Hatch implements IAddUIWidgets { + + private static Textures.BlockIcons.CustomIcon TM_H; + private static Textures.BlockIcons.CustomIcon TM_H_ACTIVE; + private static final Map<String, GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent> componentBinds = new HashMap<>(); + + public GT_MetaTileEntity_Hatch_Capacitor(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 16, + new String[] { CommonValues.THETA_MOVEMENT, translateToLocal("gt.blockmachines.hatch.capacitor.desc.0"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.capacitor.desc.1") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_Capacitor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 16, aDescription, aTextures); + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + TM_H_ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/TM_TESLA_CAPS_ACTIVE"); + TM_H = new Textures.BlockIcons.CustomIcon("iconsets/TM_TESLA_CAPS"); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TM_H_ACTIVE) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(TM_H) }; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_Capacitor(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing(); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing(); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public int getSizeInventory() { + return getBaseMetaTileEntity().isActive() ? 0 : mInventory.length; + } + + public long[] getCapacitors() { + long tier = -1; + long tCurrent = 0; + long tEnergyMax = 0; + for (int i = 0; i < mInventory.length; i++) { + if (mInventory[i] == null || mInventory[i].stackSize != 1) { + continue; + } + CapacitorComponent cap = componentBinds.get(getUniqueIdentifier(mInventory[i])); + if (cap != null && cap.tier > tier) { + tier = cap.tier; + } + } + if (tier >= 0) { + for (int i = 0; i < mInventory.length; i++) { + if (mInventory[i] == null || mInventory[i].stackSize != 1) { + continue; + } + CapacitorComponent cap = componentBinds.get(getUniqueIdentifier(mInventory[i])); + if (cap == null) { + continue; + } + if (cap.tier < tier) { + if (getBaseMetaTileEntity().isActive()) { + mInventory[i] = null; + getBaseMetaTileEntity().setOnFire(); + } + } else { + tCurrent += cap.current; + tEnergyMax += cap.energyMax; + } + } + } + return new long[] { tier, tCurrent, tEnergyMax }; + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + SlotGroup.ofItemHandler(inventoryHandler, 4) + .startFromSlot(0) + .endAtSlot(15) + .slotCreator(index -> new BaseSlot(inventoryHandler, index) { + + @Override + public int getSlotStackLimit() { + return 1; + } + + @Override + public boolean isEnabled() { + return !getBaseMetaTileEntity().isActive(); + } + }) + .background(getGUITextureSet().getItemSlot()) + .build() + .setPos(52, 7)); + } + + public static void run() { + new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent( + Reference.MODID + ":item.tm.teslaCoilCapacitor.0", + 0, + 1, + V[1] * 512); // LV Capacitor + new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent( + Reference.MODID + ":item.tm.teslaCoilCapacitor.1", + 1, + 1, + V[2] * 512); // MV Capacitor + new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent( + Reference.MODID + ":item.tm.teslaCoilCapacitor.2", + 2, + 1, + V[3] * 512); // HV Capacitor + new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent( + Reference.MODID + ":item.tm.teslaCoilCapacitor.3", + 3, + 1, + V[4] * 512); // EV Capacitor + new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent( + Reference.MODID + ":item.tm.teslaCoilCapacitor.4", + 4, + 1, + V[5] * 512); // IV Capacitor + new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent( + Reference.MODID + ":item.tm.teslaCoilCapacitor.5", + 5, + 1, + V[6] * 512); // LuV Capacitor + new GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent( + Reference.MODID + ":item.tm.teslaCoilCapacitor.6", + 6, + 1, + V[7] * 512); // ZPM Capacitor + } + + public static class CapacitorComponent implements Comparable<GT_MetaTileEntity_Hatch_Capacitor.CapacitorComponent> { + + private final String unlocalizedName; + private final long tier, current, energyMax; + + CapacitorComponent(ItemStack is, long tier, long current, long energyMax) { + this(getUniqueIdentifier(is), tier, current, energyMax); + } + + CapacitorComponent(String is, long tier, long current, long energyMax) { + unlocalizedName = is; + this.tier = tier; + this.current = current; + this.energyMax = energyMax; + componentBinds.put(unlocalizedName, this); + if (DEBUG_MODE) { + TecTech.LOGGER.info("Tesla Capacitor registered: " + unlocalizedName); + } + } + + @Override + public int compareTo(CapacitorComponent o) { + return unlocalizedName.compareTo(o.unlocalizedName); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof CapacitorComponent) { + return compareTo((CapacitorComponent) obj) == 0; + } + return false; + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeData.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeData.java new file mode 100644 index 0000000000..e4b279e46d --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeData.java @@ -0,0 +1,133 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.util.CommonValues.MOVE_AT; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket; +import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +/** + * Created by danie_000 on 27.10.2016. + */ +public class GT_MetaTileEntity_Hatch_CreativeData extends GT_MetaTileEntity_Hatch_DataConnector<QuantumDataPacket> { + + public GT_MetaTileEntity_Hatch_CreativeData(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.debug.tt.data.desc.0"), + translateToLocal("gt.blockmachines.debug.tt.data.desc.1"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.debug.tt.data.desc.2") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_CreativeData(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_CreativeData(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isDataInputFacing(ForgeDirection side) { + return isInputFacing(side); + } + + @Override + protected QuantumDataPacket loadPacketFromNBT(NBTTagCompound nbt) { + return new QuantumDataPacket(nbt); + } + + @Override + public boolean canConnectData(ForgeDirection side) { + return isOutputFacing(side); + } + + @Override + public void moveAround(IGregTechTileEntity aBaseMetaTileEntity) { + IConnectsToDataPipe current = this, source = this, next; + int range = 0; + while ((next = current.getNext(source)) != null && range++ < 1000) { + if (next instanceof GT_MetaTileEntity_Hatch_InputData) { + ((GT_MetaTileEntity_Hatch_InputData) next).setContents(q); + break; + } + source = current; + current = next; + } + q = null; + } + + @Override + public IConnectsToDataPipe getNext(IConnectsToDataPipe source /* ==this */) { + IGregTechTileEntity base = getBaseMetaTileEntity(); + byte color = base.getColorization(); + if (color < 0) { + return null; + } + IGregTechTileEntity next = base.getIGregTechTileEntityAtSide(base.getFrontFacing()); + if (next == null) { + return null; + } + IMetaTileEntity meta = next.getMetaTileEntity(); + if (meta instanceof GT_MetaTileEntity_Pipe_Data) { + ((GT_MetaTileEntity_Pipe_Data) meta).markUsed(); + return (IConnectsToDataPipe) meta; + } else if (meta instanceof GT_MetaTileEntity_Hatch_InputData + && ((GT_MetaTileEntity_Hatch_InputData) meta).getColorization() == color + && ((GT_MetaTileEntity_Hatch_InputData) meta).canConnectData( + base.getFrontFacing() + .getOpposite())) { + return (IConnectsToDataPipe) meta; + } + return null; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if (MOVE_AT == aTick % 20) { + if (aBaseMetaTileEntity.isAllowedToWork()) { + getBaseMetaTileEntity().setActive(true); + if (q == null) q = new QuantumDataPacket(0xFFFFFFFFL); + moveAround(aBaseMetaTileEntity); + } else { + q = null; + getBaseMetaTileEntity().setActive(false); + } + } + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeMaintenance.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeMaintenance.java new file mode 100644 index 0000000000..b62375076b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeMaintenance.java @@ -0,0 +1,96 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance; +import gregtech.api.objects.GT_RenderedTexture; + +public class GT_MetaTileEntity_Hatch_CreativeMaintenance extends GT_MetaTileEntity_Hatch_Maintenance { + + private static Textures.BlockIcons.CustomIcon face; + + public GT_MetaTileEntity_Hatch_CreativeMaintenance(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_CreativeMaintenance(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures, false); + } + + @Override + public String[] getDescription() { + return new String[] { CommonValues.THETA_MOVEMENT, + translateToLocal("gt.blockmachines.debug.tt.maintenance.desc.0"), // For automatically maintaining + // Multiblocks + translateToLocal("gt.blockmachines.debug.tt.maintenance.desc.1"), // Does fix everything but itself. + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.debug.tt.maintenance.desc.2") // Fixing is + // for plebs! + }; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + face = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_FULLAUTOMAINTENANCE"); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(face) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(face) }; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_CreativeMaintenance( + this.mName, + this.mTier, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + this.mWrench = this.mScrewdriver = this.mSoftHammer = this.mHardHammer = this.mCrowbar = this.mSolderingTool = true; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer, ForgeDirection side, + float aX, float aY, float aZ) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeUncertainty.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeUncertainty.java new file mode 100644 index 0000000000..fa295721e5 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_CreativeUncertainty.java @@ -0,0 +1,58 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.util.EnumChatFormatting; + +import com.github.technus.tectech.util.CommonValues; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class GT_MetaTileEntity_Hatch_CreativeUncertainty extends GT_MetaTileEntity_Hatch_Uncertainty { + + public GT_MetaTileEntity_Hatch_CreativeUncertainty(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + } + + public GT_MetaTileEntity_Hatch_CreativeUncertainty(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { + return new GT_MetaTileEntity_Hatch_CreativeUncertainty(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public String[] getDescription() { + return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.debug.tt.certain.desc.0"), // Feeling + // certain, + // for + // sure + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockmachines.debug.tt.certain.desc.1") // Schrödinger's cat escaped the + // box + }; + } + + @Override + public void regenerate() { + // no-op + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && (aTick % 100) == 0) { + if (mode == 0) { + aBaseMetaTileEntity.setActive(false); + status = -128; + } else { + aBaseMetaTileEntity.setActive(true); + compute(); + } + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DataConnector.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DataConnector.java new file mode 100644 index 0000000000..e0ea91f090 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DataConnector.java @@ -0,0 +1,202 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.util.CommonValues.MOVE_AT; +import static gregtech.api.enums.Dyes.MACHINE_METAL; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.mechanics.dataTransport.DataPacket; +import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe; +import com.github.technus.tectech.util.TT_Utility; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.objects.GT_RenderedTexture; + +/** + * Created by danie_000 on 11.12.2016. + */ +public abstract class GT_MetaTileEntity_Hatch_DataConnector<T extends DataPacket> extends GT_MetaTileEntity_Hatch + implements IConnectsToDataPipe { + + public static Textures.BlockIcons.CustomIcon EM_D_SIDES; + public static Textures.BlockIcons.CustomIcon EM_D_ACTIVE; + public static Textures.BlockIcons.CustomIcon EM_D_CONN; + + private String clientLocale = "en_US"; + + public T q; + + public short id = -1; + + protected GT_MetaTileEntity_Hatch_DataConnector(int aID, String aName, String aNameRegional, int aTier, + String[] descr) { + super(aID, aName, aNameRegional, aTier, 0, descr); + TT_Utility.setTier(aTier, this); + } + + protected GT_MetaTileEntity_Hatch_DataConnector(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + EM_D_ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_EM_D_ACTIVE"); + EM_D_SIDES = new Textures.BlockIcons.CustomIcon("iconsets/OVERLAY_EM_D_SIDES"); + EM_D_CONN = new Textures.BlockIcons.CustomIcon("iconsets/EM_DATA_CONN"); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, + new GT_RenderedTexture( + EM_D_ACTIVE, + Dyes.getModulation(getBaseMetaTileEntity().getColorization(), MACHINE_METAL.getRGBA())), + new GT_RenderedTexture(EM_D_CONN) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, + new GT_RenderedTexture( + EM_D_SIDES, + Dyes.getModulation(getBaseMetaTileEntity().getColorization(), MACHINE_METAL.getRGBA())), + new GT_RenderedTexture(EM_D_CONN) }; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setShort("eID", id); + if (q != null) { + aNBT.setTag("eDATA", q.toNbt()); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + id = aNBT.getShort("eID"); + if (aNBT.hasKey("eDATA")) { + q = loadPacketFromNBT(aNBT.getCompoundTag("eDATA")); + } + } + + protected abstract T loadPacketFromNBT(NBTTagCompound nbt); + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if (MOVE_AT == aTick % 20) { + if (q == null) { + getBaseMetaTileEntity().setActive(false); + } else { + getBaseMetaTileEntity().setActive(true); + moveAround(aBaseMetaTileEntity); + } + } + } + } + + public abstract void moveAround(IGregTechTileEntity aBaseMetaTileEntity); + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) { + return true; + } + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return false; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + if (id > 0) { + return new String[] { + translateToLocalFormatted("tt.keyword.ID", clientLocale) + ": " + EnumChatFormatting.AQUA + id, + translateToLocalFormatted("tt.keyword.Content", clientLocale) + ": " + + EnumChatFormatting.AQUA + + (q != null ? q.getContentString() : 0), + translateToLocalFormatted("tt.keyword.PacketHistory", clientLocale) + ": " + + EnumChatFormatting.RED + + (q != null ? q.getTraceSize() : 0), }; + } + return new String[] { + translateToLocalFormatted("tt.keyword.Content", clientLocale) + ": " + + EnumChatFormatting.AQUA + + (q != null ? q.getContentString() : 0), + translateToLocalFormatted("tt.keyword.PacketHistory", clientLocale) + ": " + + EnumChatFormatting.RED + + (q != null ? q.getTraceSize() : 0), }; + } + + @Override + public byte getColorization() { + return getBaseMetaTileEntity().getColorization(); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoMulti.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoMulti.java new file mode 100644 index 0000000000..7664f13f42 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoMulti.java @@ -0,0 +1,128 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT; +import static com.github.technus.tectech.util.CommonValues.V; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; + +/** + * Created by danie_000 on 16.12.2016. + */ +public class GT_MetaTileEntity_Hatch_DynamoMulti extends GT_MetaTileEntity_Hatch { + + public final int Amperes; + + public GT_MetaTileEntity_Hatch_DynamoMulti(int aID, String aName, String aNameRegional, int aTier, int aAmp) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, + translateToLocal("gt.blockmachines.hatch.dynamomulti.desc.0") }); // Multiple Ampere Energy + // Extractor for Multiblocks + Amperes = aAmp; + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_DynamoMulti(String aName, int aTier, int aAmp, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + Amperes = aAmp; + } + + public GT_MetaTileEntity_Hatch_DynamoMulti(int aID, String aName, String aNameRegional, int aTier, int i, + String[] description, int aAmp) { + super(aID, aName, aNameRegional, aTier, 0, description); + Amperes = aAmp; + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_POWER_TT[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_POWER_TT[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 128L * Amperes; + } + + @Override + public long maxEUOutput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return 512L + V[mTier] * 4L * Amperes; + } + + @Override + public long maxAmperesOut() { + return Amperes; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_DynamoMulti(mName, mTier, Amperes, mDescriptionArray, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoTunnel.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoTunnel.java new file mode 100644 index 0000000000..d94370ed97 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_DynamoTunnel.java @@ -0,0 +1,225 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT; +import static com.github.technus.tectech.util.CommonValues.TRANSFER_AT; +import static com.github.technus.tectech.util.CommonValues.V; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.mechanics.pipe.IConnectsToEnergyTunnel; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Energy; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.PowerLogic; +import gregtech.api.logic.interfaces.PowerLogicHost; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.util.GT_Utility; + +/** + * Created by danie_000 on 16.12.2016. + */ +public class GT_MetaTileEntity_Hatch_DynamoTunnel extends GT_MetaTileEntity_Hatch_DynamoMulti + implements IConnectsToEnergyTunnel { + + public GT_MetaTileEntity_Hatch_DynamoTunnel(int ID, String unlocalisedName, String localisedName, int tier, + int amps) { + super( + ID, + unlocalisedName, + localisedName, + tier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, + translateToLocal("gt.blockmachines.hatch.dynamotunnel.desc.0"), + translateToLocal("gt.blockmachines.hatch.dynamotunnel.desc.1") + ": " + + EnumChatFormatting.YELLOW + + GT_Utility.formatNumbers(amps * V[tier]) + + EnumChatFormatting.RESET + + " EU/t" }, + amps); + + TT_Utility.setTier(tier, this); + } + + public GT_MetaTileEntity_Hatch_DynamoTunnel(String aName, int aTier, int aAmp, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aAmp, aDescription, aTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_OUT_LASER_TT[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_OUT_LASER_TT[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier]; + } + + @Override + public long maxEUOutput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return V[mTier] * 24L * Amperes; + } + + @Override + public boolean isEnetOutput() { + return false; + } + + @Override + public boolean isEnetInput() { + return false; + } + + @Override + public ConnectionType getConnectionType() { + return ConnectionType.LASER; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_DynamoTunnel(mName, mTier, Amperes, mDescriptionArray, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + byte Tick = (byte) (aTick % 20); + if (TRANSFER_AT == Tick) { + if (aBaseMetaTileEntity.getStoredEU() > 0) { + setEUVar(aBaseMetaTileEntity.getStoredEU() - Amperes); + if (aBaseMetaTileEntity.getStoredEU() < 0) { + setEUVar(0); + } + } + if (aBaseMetaTileEntity.getStoredEU() > getMinimumStoredEU()) { + moveAround(aBaseMetaTileEntity); + } + } + } + } + + private void moveAround(IGregTechTileEntity aBaseMetaTileEntity) { + byte color = getBaseMetaTileEntity().getColorization(); + if (color < 0) { + return; + } + final ForgeDirection front = aBaseMetaTileEntity.getFrontFacing(); + final ForgeDirection opposite = front.getOpposite(); + for (short dist = 1; dist < 1000; dist++) { + + IGregTechTileEntity tGTTileEntity = aBaseMetaTileEntity + .getIGregTechTileEntityAtSideAndDistance(front, dist); + if (tGTTileEntity != null && tGTTileEntity.getColorization() == color) { + IMetaTileEntity aMetaTileEntity = tGTTileEntity.getMetaTileEntity(); + if (aMetaTileEntity != null) { + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyTunnel + && opposite == tGTTileEntity.getFrontFacing()) { + if (maxEUOutput() > ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUInput()) { + aMetaTileEntity.doExplosion(maxEUOutput()); + setEUVar(aBaseMetaTileEntity.getStoredEU() - maxEUOutput()); + return; + } else if (maxEUOutput() + == ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUInput()) { + long diff = Math.min( + Amperes * 20L * maxEUOutput(), + Math.min( + ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUStore() + - aMetaTileEntity.getBaseMetaTileEntity() + .getStoredEU(), + aBaseMetaTileEntity.getStoredEU())); + + setEUVar(aBaseMetaTileEntity.getStoredEU() - diff); + + ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).setEUVar( + aMetaTileEntity.getBaseMetaTileEntity() + .getStoredEU() + diff); + } + return; + } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Pipe_Energy) { + if (((GT_MetaTileEntity_Pipe_Energy) aMetaTileEntity).connectionCount < 2) { + return; + } else { + ((GT_MetaTileEntity_Pipe_Energy) aMetaTileEntity).markUsed(); + } + } else { + return; + } + } else { + if (tGTTileEntity instanceof PowerLogicHost) { + PowerLogic logic = ((PowerLogicHost) tGTTileEntity).getPowerLogic(opposite); + if (logic == null || !logic.canUseLaser() || opposite != tGTTileEntity.getFrontFacing()) { + return; + } + + long ampsUsed = logic.injectEnergy(maxEUOutput(), Amperes); + setEUVar(aBaseMetaTileEntity.getStoredEU() - ampsUsed * maxEUOutput()); + } + return; + } + } else { + return; + } + } + } + + @Override + public boolean canConnect(ForgeDirection side) { + return isOutputFacing(side); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyMulti.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyMulti.java new file mode 100644 index 0000000000..20c3b993f5 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyMulti.java @@ -0,0 +1,134 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT; +import static com.github.technus.tectech.util.CommonValues.V; +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; + +/** + * Created by danie_000 on 16.12.2016. + */ +public class GT_MetaTileEntity_Hatch_EnergyMulti extends GT_MetaTileEntity_Hatch { + + public final int Amperes; + + public GT_MetaTileEntity_Hatch_EnergyMulti(int aID, String aName, String aNameRegional, int aTier, int aAmp) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.hatch.energymulti.desc.0"), + translateToLocalFormatted("gt.blockmachines.hatch.energymulti.desc.2", aAmp + (aAmp >> 2)), + translateToLocalFormatted("gt.blockmachines.hatch.energymulti.desc.3", aAmp) }); + Amperes = aAmp; + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_EnergyMulti(String aName, int aTier, int aAmp, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + Amperes = aAmp; + } + + public GT_MetaTileEntity_Hatch_EnergyMulti(int aID, String aName, String aNameRegional, int aTier, int i, + String[] description, int aAmp) { + super(aID, aName, aNameRegional, aTier, 0, description); + Amperes = aAmp; + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_POWER_TT[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_POWER_TT[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return 128L * Amperes; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return 512L + V[mTier] * 4L * Amperes; + } + + @Override + public long maxAmperesIn() { + return Amperes + (Amperes >> 2); + } + + @Override + public long maxWorkingAmperesIn() { + return Amperes; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_EnergyMulti(mName, mTier, Amperes, mDescriptionArray, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyTunnel.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyTunnel.java new file mode 100644 index 0000000000..30b8f32685 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_EnergyTunnel.java @@ -0,0 +1,152 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_LASER_TT; +import static com.github.technus.tectech.util.CommonValues.TRANSFER_AT; +import static com.github.technus.tectech.util.CommonValues.V; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.mechanics.pipe.IConnectsToEnergyTunnel; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.util.GT_Utility; + +/** + * Created by danie_000 on 16.12.2016. + */ +public class GT_MetaTileEntity_Hatch_EnergyTunnel extends GT_MetaTileEntity_Hatch_EnergyMulti + implements IConnectsToEnergyTunnel { + + public GT_MetaTileEntity_Hatch_EnergyTunnel(int aID, String aName, String aNameRegional, int aTier, int aAmp) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, + translateToLocal("gt.blockmachines.hatch.energytunnel.desc.0"), + translateToLocal("gt.blockmachines.hatch.energytunnel.desc.1") + ": " + + EnumChatFormatting.YELLOW + + GT_Utility.formatNumbers(aAmp * V[aTier]) + + EnumChatFormatting.RESET + + " EU/t" }, + aAmp); // Energy injecting terminal for Multiblocks + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_EnergyTunnel(String aName, int aTier, int aAmp, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aAmp, aDescription, aTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_LASER_TT[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, OVERLAYS_ENERGY_IN_LASER_TT[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier]; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return V[mTier] * 24L * Amperes; + } + + @Override + public boolean isEnetOutput() { + return false; + } + + @Override + public boolean isEnetInput() { + return false; + } + + @Override + public ConnectionType getConnectionType() { + return ConnectionType.LASER; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_EnergyTunnel(mName, mTier, Amperes, mDescriptionArray, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean canConnect(ForgeDirection side) { + return isInputFacing(side); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + byte Tick = (byte) (aTick % 20); + if (TRANSFER_AT == Tick) { + if (aBaseMetaTileEntity.getStoredEU() > 0) { + setEUVar(aBaseMetaTileEntity.getStoredEU() - Amperes); + if (aBaseMetaTileEntity.getStoredEU() < 0) { + setEUVar(0); + } + } + } + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Holder.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Holder.java new file mode 100644 index 0000000000..38dd876553 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Holder.java @@ -0,0 +1,181 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.objects.GT_RenderedTexture; + +/** + * Created by Tec on 03.04.2017. + */ +public class GT_MetaTileEntity_Hatch_Holder extends GT_MetaTileEntity_Hatch implements IAddGregtechLogo { + + private static Textures.BlockIcons.CustomIcon EM_H; + private static Textures.BlockIcons.CustomIcon EM_H_ACTIVE; + + public GT_MetaTileEntity_Hatch_Holder(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 1, + new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.holder.desc.0"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.holder.desc.1") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_Holder(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 1, aDescription, aTextures); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + EM_H_ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/EM_HOLDER_ACTIVE"); + EM_H = new Textures.BlockIcons.CustomIcon("iconsets/EM_HOLDER"); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(EM_H_ACTIVE) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(EM_H) }; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_Holder(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return facing.offsetY == 0; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing(); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return side == aBaseMetaTileEntity.getFrontFacing(); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) { + return true; + } + // if(aBaseMetaTileEntity.isActive()) + // aPlayer.addChatComponentMessage(new ChatComponentText("It is still active...")); + // else if(heat>0) + // aPlayer.addChatComponentMessage(new ChatComponentText("It is still warm...")); + // else + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO) + .setSize(18, 18) + .setPos(151, 63)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK) + .setPos(46, 17) + .setSize(84, 60)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_RACK_LARGE) + .setPos(68, 27) + .setSize(40, 40)) + .widget(new SlotWidget(new BaseSlot(inventoryHandler, 0) { + + @Override + public int getSlotStackLimit() { + return 1; + } + + @Override + public boolean isEnabled() { + return !getBaseMetaTileEntity().isActive(); + } + }).setPos(79, 38)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.BUTTON_STANDARD_LIGHT_16x16) + .setPos(152, 24) + .setSize(16, 16)) + .widget( + new DrawableWidget() + .setDrawable( + () -> getBaseMetaTileEntity().isActive() ? TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON + : TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED) + .setPos(152, 24) + .setSize(16, 16)) + .widget( + new FakeSyncWidget.BooleanSyncer( + () -> getBaseMetaTileEntity().isActive(), + val -> getBaseMetaTileEntity().setActive(val))); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputData.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputData.java new file mode 100644 index 0000000000..03c9cfbf3c --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputData.java @@ -0,0 +1,102 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket; +import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +/** + * Created by danie_000 on 27.10.2016. + */ +public class GT_MetaTileEntity_Hatch_InputData extends GT_MetaTileEntity_Hatch_DataConnector<QuantumDataPacket> { + + private boolean delDelay = true; + + public GT_MetaTileEntity_Hatch_InputData(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.datain.desc.0"), + translateToLocal("gt.blockmachines.hatch.datain.desc.1"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.datain.desc.2") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_InputData(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_InputData(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + protected QuantumDataPacket loadPacketFromNBT(NBTTagCompound nbt) { + return new QuantumDataPacket(nbt); + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isDataInputFacing(ForgeDirection side) { + return isInputFacing(side); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean canConnectData(ForgeDirection side) { + return isInputFacing(side); + } + + @Override + public IConnectsToDataPipe getNext(IConnectsToDataPipe source) { + return null; + } + + public void setContents(QuantumDataPacket qIn) { + if (qIn == null) { + this.q = null; + } else { + if (qIn.getContent() > 0) { + this.q = qIn; + delDelay = true; + } else { + this.q = null; + } + } + } + + @Override + public void moveAround(IGregTechTileEntity aBaseMetaTileEntity) { + if (delDelay) { + delDelay = false; + } else { + setContents(null); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputDataItems.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputDataItems.java new file mode 100644 index 0000000000..50e9eebd76 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_InputDataItems.java @@ -0,0 +1,246 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem; +import static com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DataConnector.EM_D_ACTIVE; +import static com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DataConnector.EM_D_CONN; +import static com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DataConnector.EM_D_SIDES; +import static com.github.technus.tectech.util.CommonValues.MOVE_AT; +import static gregtech.api.enums.Dyes.MACHINE_METAL; +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import java.util.ArrayList; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.mechanics.dataTransport.InventoryDataPacket; +import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.enums.Dyes; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess; +import gregtech.api.objects.GT_RenderedTexture; + +public class GT_MetaTileEntity_Hatch_InputDataItems extends GT_MetaTileEntity_Hatch_DataAccess + implements IConnectsToDataPipe { + + public boolean delDelay = true; + private ItemStack[] stacks; + + private String clientLocale = "en_US"; + + public GT_MetaTileEntity_Hatch_InputDataItems(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_InputDataItems(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, + new GT_RenderedTexture( + EM_D_ACTIVE, + Dyes.getModulation(getBaseMetaTileEntity().getColorization(), MACHINE_METAL.getRGBA())), + new GT_RenderedTexture(EM_D_CONN) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, + new GT_RenderedTexture( + EM_D_SIDES, + Dyes.getModulation(getBaseMetaTileEntity().getColorization(), MACHINE_METAL.getRGBA())), + new GT_RenderedTexture(EM_D_CONN) }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_InputDataItems(this.mName, this.mTier, mDescriptionArray, this.mTextures); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) { + return true; + } + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isDataInputFacing(ForgeDirection side) { + return isInputFacing(side); + } + + @Override + public boolean canConnectData(ForgeDirection side) { + return isInputFacing(side); + } + + @Override + public IConnectsToDataPipe getNext(IConnectsToDataPipe source) { + return null; + } + + public void setContents(InventoryDataPacket iIn) { + if (iIn == null) { + stacks = null; + } else { + if (iIn.getContent().length > 0) { + stacks = iIn.getContent(); + delDelay = true; + } else { + stacks = null; + } + } + } + + @Override + public void onRemoval() { + stacks = null; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + NBTTagCompound stacksTag = new NBTTagCompound(); + if (stacks != null) { + stacksTag.setInteger("count", stacks.length); + for (int i = 0; i < stacks.length; i++) { + stacksTag.setTag(Integer.toString(i), stacks[i].writeToNBT(new NBTTagCompound())); + } + } + aNBT.setTag("data_stacks", stacksTag); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + NBTTagCompound stacksTag = aNBT.getCompoundTag("data_stacks"); + int count = stacksTag.getInteger("count"); + if (count > 0) { + ArrayList<ItemStack> stacks = new ArrayList<>(); + for (int i = 0; i < count; i++) { + ItemStack stack = ItemStack.loadItemStackFromNBT(stacksTag.getCompoundTag(Integer.toString(i))); + if (stack != null) { + stacks.add(stack); + } + } + if (stacks.size() > 0) { + this.stacks = stacks.toArray(nullItem); + } + } + } + + @Override + public int getSizeInventory() { + return stacks != null ? stacks.length : 0; + } + + @Override + public ItemStack getStackInSlot(int aIndex) { + return stacks != null && aIndex < stacks.length ? stacks[aIndex] : null; + } + + @Override + public boolean shouldDropItemAt(int index) { + return false; + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + if (MOVE_AT == aTick % 20) { + if (stacks == null) { + getBaseMetaTileEntity().setActive(false); + } else { + getBaseMetaTileEntity().setActive(true); + if (delDelay) { + delDelay = false; + } else { + setContents(null); + } + } + } + } + + @Override + public String[] getDescription() { + return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.datainass.desc.0"), + translateToLocal("gt.blockmachines.hatch.datainass.desc.1"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.datainass.desc.2") }; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { translateToLocalFormatted("tt.keyphrase.Content_Stack_Count", clientLocale) + ": " + + (stacks == null ? 0 : stacks.length) }; + } + + @Override + public byte getColorization() { + return getBaseMetaTileEntity().getColorization(); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputData.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputData.java new file mode 100644 index 0000000000..7e769123bc --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputData.java @@ -0,0 +1,116 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket; +import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +/** + * Created by danie_000 on 27.10.2016. + */ +public class GT_MetaTileEntity_Hatch_OutputData extends GT_MetaTileEntity_Hatch_DataConnector<QuantumDataPacket> { + + public GT_MetaTileEntity_Hatch_OutputData(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.dataout.desc.0"), + translateToLocal("gt.blockmachines.hatch.dataout.desc.1"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.dataout.desc.2") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_OutputData(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_OutputData(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isDataInputFacing(ForgeDirection side) { + return isInputFacing(side); + } + + @Override + protected QuantumDataPacket loadPacketFromNBT(NBTTagCompound nbt) { + return new QuantumDataPacket(nbt); + } + + @Override + public boolean canConnectData(ForgeDirection side) { + return isOutputFacing(side); + } + + @Override + public void moveAround(IGregTechTileEntity aBaseMetaTileEntity) { + IConnectsToDataPipe current = this, source = this, next; + int range = 0; + while ((next = current.getNext(source)) != null && range++ < 1000) { + if (next instanceof GT_MetaTileEntity_Hatch_InputData) { + ((GT_MetaTileEntity_Hatch_InputData) next).setContents(q); + break; + } + source = current; + current = next; + } + q = null; + } + + @Override + public IConnectsToDataPipe getNext(IConnectsToDataPipe source /* ==this */) { + IGregTechTileEntity base = getBaseMetaTileEntity(); + byte color = base.getColorization(); + if (color < 0) { + return null; + } + IGregTechTileEntity next = base.getIGregTechTileEntityAtSide(base.getFrontFacing()); + if (next == null) { + return null; + } + IMetaTileEntity meta = next.getMetaTileEntity(); + if (meta instanceof GT_MetaTileEntity_Pipe_Data) { + ((GT_MetaTileEntity_Pipe_Data) meta).markUsed(); + return (IConnectsToDataPipe) meta; + } else if (meta instanceof GT_MetaTileEntity_Hatch_InputData + && ((GT_MetaTileEntity_Hatch_InputData) meta).getColorization() == color + && ((GT_MetaTileEntity_Hatch_InputData) meta).canConnectData( + base.getFrontFacing() + .getOpposite())) { + return (IConnectsToDataPipe) meta; + } + return null; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputDataItems.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputDataItems.java new file mode 100644 index 0000000000..0cdf1b969b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_OutputDataItems.java @@ -0,0 +1,141 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.mechanics.dataTransport.InventoryDataPacket; +import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; + +public class GT_MetaTileEntity_Hatch_OutputDataItems + extends GT_MetaTileEntity_Hatch_DataConnector<InventoryDataPacket> { + + public GT_MetaTileEntity_Hatch_OutputDataItems(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.dataoutass.desc.0"), + translateToLocal("gt.blockmachines.hatch.dataoutass.desc.1"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.dataoutass.desc.2") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_OutputDataItems(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_OutputDataItems( + this.mName, + this.mTier, + this.mDescriptionArray, + this.mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return false; + } + + @Override + protected InventoryDataPacket loadPacketFromNBT(NBTTagCompound nbt) { + return new InventoryDataPacket(nbt); + } + + @Override + public boolean isDataInputFacing(ForgeDirection side) { + return isInputFacing(side); + } + + @Override + public boolean canConnectData(ForgeDirection side) { + return isOutputFacing(side); + } + + @Override + public void moveAround(IGregTechTileEntity aBaseMetaTileEntity) { + IConnectsToDataPipe current = this, source = this, next; + int range = 0; + while ((next = current.getNext(source)) != null && range++ < 1000) { + if (next instanceof GT_MetaTileEntity_Hatch_InputDataItems) { + ((GT_MetaTileEntity_Hatch_InputDataItems) next).setContents(q); + break; + } + source = current; + current = next; + } + q = null; + } + + @Override + public IConnectsToDataPipe getNext(IConnectsToDataPipe source /* ==this */) { + IGregTechTileEntity base = getBaseMetaTileEntity(); + byte color = base.getColorization(); + if (color < 0) { + return null; + } + IGregTechTileEntity next = base.getIGregTechTileEntityAtSide(base.getFrontFacing()); + if (next == null) { + return null; + } + IMetaTileEntity meta = next.getMetaTileEntity(); + if (meta instanceof GT_MetaTileEntity_Pipe_Data) { + ((GT_MetaTileEntity_Pipe_Data) meta).markUsed(); + return (IConnectsToDataPipe) meta; + } else if (meta instanceof GT_MetaTileEntity_Hatch_InputDataItems + && ((GT_MetaTileEntity_Hatch_InputDataItems) meta).getColorization() == color + && ((GT_MetaTileEntity_Hatch_InputDataItems) meta).canConnectData( + base.getFrontFacing() + .getOpposite())) { + return (IConnectsToDataPipe) meta; + } + return null; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Param.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Param.java new file mode 100644 index 0000000000..90f0267695 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Param.java @@ -0,0 +1,559 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.objects.GT_RenderedTexture; + +/** + * Created by danie_000 on 15.12.2016. + */ +public class GT_MetaTileEntity_Hatch_Param extends GT_MetaTileEntity_Hatch implements IAddGregtechLogo, IAddUIWidgets { + + public int pointer = 0; + public int param = -1; + public double value0D = 0; + public double value1D = 0; + public double input0D = 0; + public double input1D = 0; + private static Textures.BlockIcons.CustomIcon ScreenON; + private static Textures.BlockIcons.CustomIcon ScreenOFF; + + private String clientLocale = "en_US"; + + public GT_MetaTileEntity_Hatch_Param(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, + EnumChatFormatting.DARK_RED + + "Deprecated; Now you can set parameter by clicking LED on multiblock GUI.", + EnumChatFormatting.DARK_RED + + "If it doesn't work, try removing Parametrizer from multiblock structure." }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_Param(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/PARAM"); + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/PARAM_ACTIVE"); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(ScreenON) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(ScreenOFF) }; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { + return new GT_MetaTileEntity_Hatch_Param(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { + translateToLocalFormatted("tt.keyword.Parametrizer", clientLocale) + " " + + translateToLocalFormatted("tt.keyword.ID", clientLocale) + + ": " + + EnumChatFormatting.GREEN + + param, + translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 0D: " + EnumChatFormatting.AQUA + value0D, + translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 1D: " + EnumChatFormatting.BLUE + value1D, + translateToLocalFormatted("tt.keyword.Input", clientLocale) + " 0D: " + EnumChatFormatting.GOLD + input0D, + translateToLocalFormatted("tt.keyword.Input", clientLocale) + " 1D: " + + EnumChatFormatting.YELLOW + + input1D, }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("ePointer", pointer); + aNBT.setDouble("eValue0D", value0D); + aNBT.setDouble("eValue1D", value1D); + aNBT.setDouble("eInput0D", input0D); + aNBT.setDouble("eInput1D", input1D); + aNBT.setInteger("eParam", param); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + pointer = aNBT.getInteger("ePointer"); + if (aNBT.hasKey("eFloats") || aNBT.hasKey("eValue0i") + || aNBT.hasKey("eValue1i") + || aNBT.hasKey("eInput0i") + || aNBT.hasKey("eInput1i")) { + boolean usesFloat = aNBT.getBoolean("eFloats"); + if (usesFloat) { + value0D = Double.longBitsToDouble(aNBT.getLong("eValue0i")); + value1D = Double.longBitsToDouble(aNBT.getLong("eValue1i")); + input0D = Double.longBitsToDouble(aNBT.getLong("eInput0i")); + input1D = Double.longBitsToDouble(aNBT.getLong("eInput1i")); + } else { + value0D = aNBT.getLong("eValue0i"); + value1D = aNBT.getLong("eValue1i"); + input0D = aNBT.getLong("eInput0i"); + input1D = aNBT.getLong("eInput1i"); + } + } else { + value0D = aNBT.getDouble("eValue0D"); + value1D = aNBT.getDouble("eValue1D"); + input0D = aNBT.getDouble("eInput0D"); + input1D = aNBT.getDouble("eInput1D"); + } + param = aNBT.getInteger("eParam"); + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return false; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return false; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) { + return true; + } + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO_DARK) + .setSize(18, 18) + .setPos(112, 55)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + final boolean isAdvanced = mTier > 5; + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE) + .setPos(43, 4) + .setSize(90, 72)); + + addChangeParamButton( + builder, + (shift, columnPointer, secondRow) -> param -= shift ? 16 : 4, + 7, + 4, + GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, + TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (secondRow.get()) { + secondRow.set(false); + } else { + columnPointer.addAndGet(shift ? -16 : -4); + } + } else { + value0D -= shift ? 4096 : 256; + } + }, 7, 22, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_0); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (secondRow.get()) { + columnPointer.addAndGet(shift ? -16 : -4); + } else { + secondRow.set(true); + } + } else { + value1D -= shift ? 4096 : 256; + } + }, 7, 40, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_1); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (shift) { + if (secondRow.get()) { + value1D = Double.longBitsToDouble(0xFFFF_FFFF_FFFF_FFFFL); + } else { + value0D = Double.longBitsToDouble(0xFFFF_FFFF_FFFF_FFFFL); + } + } else { + if (secondRow.get()) { + long temp = Double.doubleToLongBits(value1D); + temp |= 1L << (long) columnPointer.get(); + value1D = Double.longBitsToDouble(temp); + } else { + long temp = Double.doubleToLongBits(value0D); + temp |= 1L << (long) columnPointer.get(); + value0D = Double.longBitsToDouble(temp); + } + } + } else { + value0D /= shift ? 4096 : 256; + value1D /= shift ? 4096 : 256; + } + }, + 7, + 58, + isAdvanced ? TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_S : GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, + isAdvanced ? null : TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID); + + addChangeParamButton( + builder, + (shift, columnPointer, secondRow) -> param -= shift ? 2 : 1, + 25, + 4, + GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, + TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (secondRow.get()) { + secondRow.set(false); + } else { + columnPointer.addAndGet(shift ? -2 : -1); + } + } else { + value0D -= shift ? 16 : 1; + } + }, 25, 22, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_0); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (secondRow.get()) { + columnPointer.addAndGet(shift ? -2 : -1); + } else { + secondRow.set(true); + } + } else { + value1D -= shift ? 16 : 1; + } + }, 25, 40, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_1); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (shift) { + if (secondRow.get()) { + value1D = Double.longBitsToDouble(0); + } else { + value0D = Double.longBitsToDouble(0); + } + } else { + if (secondRow.get()) { + long temp = Double.doubleToLongBits(value1D); + temp &= ~(1L << (long) columnPointer.get()); + value1D = Double.longBitsToDouble(temp); + } else { + long temp = Double.doubleToLongBits(value0D); + temp &= ~(1L << (long) columnPointer.get()); + value0D = Double.longBitsToDouble(temp); + } + } + } else { + value0D /= shift ? 16 : 2; + value1D /= shift ? 16 : 2; + } + }, + 25, + 58, + isAdvanced ? TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_C : GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, + isAdvanced ? null : TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_X); + + addChangeParamButton( + builder, + (shift, columnPointer, secondRow) -> param += shift ? 2 : 1, + 133, + 4, + GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, + TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (secondRow.get()) { + secondRow.set(false); + } else { + columnPointer.addAndGet(shift ? 2 : 1); + } + } else { + value0D += shift ? 16 : 1; + } + }, 133, 22, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_0); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (secondRow.get()) { + columnPointer.addAndGet(shift ? 2 : 1); + } else { + secondRow.set(true); + } + } else { + value1D += shift ? 16 : 1; + } + }, 133, 40, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_1); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (shift) { + if (secondRow.get()) { + value1D = Double.longBitsToDouble(~Double.doubleToLongBits(value1D)); + } else { + value0D = Double.longBitsToDouble(~Double.doubleToLongBits(value1D)); + } + } else { + if (secondRow.get()) { + long temp = Double.doubleToLongBits(value1D); + temp ^= 1L << (long) columnPointer.get(); + value1D = Double.longBitsToDouble(temp); + } else { + long temp = Double.doubleToLongBits(value0D); + temp ^= 1L << (long) columnPointer.get(); + value0D = Double.longBitsToDouble(temp); + } + } + } else { + value0D *= shift ? 16 : 2; + value1D *= shift ? 16 : 2; + } + }, + 133, + 58, + isAdvanced ? TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_T : GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, + isAdvanced ? null : TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID); + + addChangeParamButton( + builder, + (shift, columnPointer, secondRow) -> param += shift ? 16 : 4, + 151, + 4, + GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, + TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (secondRow.get()) { + secondRow.set(false); + } else { + columnPointer.addAndGet(shift ? 16 : 4); + } + } else { + value0D += shift ? 4096 : 256; + } + }, 151, 22, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_0); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + if (secondRow.get()) { + columnPointer.addAndGet(shift ? 16 : 4); + } else { + secondRow.set(true); + } + } else { + value1D += shift ? 4096 : 256; + } + }, 151, 40, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_1); + addChangeParamButton(builder, (shift, columnPointer, secondRow) -> { + if (isAdvanced) { + value0D = input0D; + value1D = input1D; + } else { + value0D *= shift ? 4096 : 256; + value1D *= shift ? 4096 : 256; + } + }, + 151, + 58, + isAdvanced ? TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_IF : GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, + isAdvanced ? null : TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID); + + builder.widget(new FakeSyncWidget.IntegerSyncer(() -> pointer, val -> pointer = val)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> param, val -> param = val)) + .widget(new FakeSyncWidget.DoubleSyncer(() -> value0D, val -> value0D = val)) + .widget(new FakeSyncWidget.DoubleSyncer(() -> value1D, val -> value1D = val)) + .widget(new FakeSyncWidget.DoubleSyncer(() -> input0D, val -> input0D = val)) + .widget(new FakeSyncWidget.DoubleSyncer(() -> input1D, val -> input1D = val)); + + final String CIRCLED_0 = "\u24EA"; + final String CIRCLED_1 = "\u2460"; + final String ARROW_DOWN = "\u2b07"; + final String ARROW_UP = "\u2b06"; + builder.widget( + TextWidget.dynamicString(() -> (isAdvanced ? "Parameters X: " : "Parameters: ") + param) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 7)) + .widget( + TextWidget.dynamicString(() -> CIRCLED_0 + ARROW_DOWN + TT_Utility.formatNumberExp(input0D)) + .setSynced(false) + .setDefaultColor(0x22ddff) + .setPos(46, 16)) + .widget( + TextWidget.dynamicString(() -> CIRCLED_1 + ARROW_DOWN + TT_Utility.formatNumberExp(input1D)) + .setSynced(false) + .setDefaultColor(0x00ffff) + .setPos(46, 24)) + .widget( + TextWidget.dynamicString(() -> CIRCLED_0 + ARROW_UP + TT_Utility.formatNumberExp(value0D)) + .setSynced(false) + .setDefaultColor(0x00bbff) + .setPos(46, 33)) + .widget( + TextWidget.dynamicString(() -> CIRCLED_1 + ARROW_UP + TT_Utility.formatNumberExp(value1D)) + .setSynced(false) + .setDefaultColor(0x0077ff) + .setPos(46, 41)) + .widget( + TextWidget + .dynamicString( + () -> CIRCLED_0 + ARROW_UP + TT_Utility.longBitsToShortString(Double.doubleToLongBits(value0D))) + .setSynced(false) + .setDefaultColor(0x00bbff) + .setScale(.5f) + .setTextAlignment(Alignment.CenterLeft) + .setPos(46, 50)) + .widget( + TextWidget + .dynamicString( + () -> CIRCLED_1 + ARROW_UP + TT_Utility.longBitsToShortString(Double.doubleToLongBits(value1D))) + .setSynced(false) + .setDefaultColor(0x0077ff) + .setScale(.5f) + .setTextAlignment(Alignment.CenterLeft) + .setPos(46, 58)); + if (isAdvanced) { + builder.widget( + TextWidget.dynamicString( + () -> "Pointer " + Integer.toHexString(pointer | 0x10000) + .substring(1)) + .setSynced(false) + .setDefaultColor(0x0033ff) + .setPos(46, 66)); + } + } + + private void addChangeParamButton(ModularWindow.Builder builder, OnClick onClick, int xPos, int yPos, + IDrawable overlay1, IDrawable overlay2) { + final boolean isAdvanced = mTier > 5; + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + AtomicInteger columnPointer = new AtomicInteger(pointer & 0xff); + AtomicBoolean secondRow = new AtomicBoolean((pointer & 0x0100) != 0); + onClick.accept(clickData.shift, columnPointer, secondRow); + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + if (isAdvanced) { + if (columnPointer.get() >= 64) { + columnPointer.set(63); + } else if (columnPointer.get() < 0) { + columnPointer.set(0); + } + pointer = secondRow.get() ? columnPointer.get() + 0x100 : columnPointer.get(); + } + if (param > 9) { + param = 9; + } else if (param < -1) { + param = -1; + } + }) + .setPlayClickSound(false) + .setBackground( + overlay2 != null ? new IDrawable[] { GT_UITextures.BUTTON_STANDARD, overlay1, overlay2 } + : new IDrawable[] { GT_UITextures.BUTTON_STANDARD, overlay1 }) + .setSize(18, 18) + .setPos(xPos, yPos)); + } + + @FunctionalInterface + private interface OnClick { + + void accept(boolean shift, AtomicInteger columnPointer, AtomicBoolean secondRow); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ParamText.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ParamText.java new file mode 100644 index 0000000000..42a7e0cd81 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_ParamText.java @@ -0,0 +1,291 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; + +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +/** + * Created by danie_000 on 15.12.2016. + */ +public class GT_MetaTileEntity_Hatch_ParamText extends GT_MetaTileEntity_Hatch_Param { + + public String value0s = ""; + public String value1s = ""; + + private String clientLocale = "en_US"; + + public GT_MetaTileEntity_Hatch_ParamText(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier); + } + + public GT_MetaTileEntity_Hatch_ParamText(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { + return new GT_MetaTileEntity_Hatch_ParamText(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { + translateToLocalFormatted("tt.keyword.Parametrizer", clientLocale) + " " + + translateToLocalFormatted("tt.keyword.ID", clientLocale) + + ": " + + EnumChatFormatting.GREEN + + param, + translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 0S: " + + EnumChatFormatting.DARK_AQUA + + value0s, + translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 1S: " + + EnumChatFormatting.DARK_BLUE + + value1s, + translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 0D: " + EnumChatFormatting.AQUA + value0D, + translateToLocalFormatted("tt.keyword.Value", clientLocale) + " 1D: " + EnumChatFormatting.BLUE + value1D, + translateToLocalFormatted("tt.keyword.Input", clientLocale) + " 0D: " + EnumChatFormatting.GOLD + input0D, + translateToLocalFormatted("tt.keyword.Input", clientLocale) + " 1D: " + + EnumChatFormatting.YELLOW + + input1D, }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setString("eIeValue0S", value0s); + aNBT.setString("eIeValue1S", value1s); + aNBT.removeTag("ePointer"); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + value0s = aNBT.getString("eIeValue0S"); + value1s = aNBT.getString("eIeValue1S"); + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return false; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return false; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) { + return true; + } + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public String[] getDescription() { + return new String[] { CommonValues.TEC_MARK_GENERAL, + EnumChatFormatting.DARK_RED + "Deprecated; Now you can set parameter by clicking LED on multiblock GUI.", + EnumChatFormatting.DARK_RED + "If it doesn't work, try removing Parametrizer from multiblock structure.", }; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO_DARK) + .setSize(18, 18) + .setPos(148, 55)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE_PARAMETRIZER_TXT) + .setPos(7, 4) + .setSize(162, 72)); + + addChangeNumberButton(builder, -16, -4, 7, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE); + addChangeNumberButton(builder, -2, -1, 25, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL); + addChangeNumberButton(builder, 2, 1, 133, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL); + addChangeNumberButton(builder, 16, 4, 151, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE); + + builder.widget(new FakeSyncWidget.IntegerSyncer(() -> param, val -> param = val)) + .widget(new FakeSyncWidget.DoubleSyncer(() -> value0D, val -> value0D = val)) + .widget(new FakeSyncWidget.DoubleSyncer(() -> value1D, val -> value1D = val)) + .widget(new FakeSyncWidget.DoubleSyncer(() -> input0D, val -> input0D = val)) + .widget(new FakeSyncWidget.DoubleSyncer(() -> input1D, val -> input1D = val)); + // .widget(new FakeSyncWidget.StringSyncer(() -> value0s, val -> value0s = val)) + // .widget(new FakeSyncWidget.StringSyncer(() -> value1s, val -> value1s = val)); + + final String CIRCLED_0 = "\u24EA"; + final String CIRCLED_1 = "\u2460"; + final String ARROW_DOWN = "\u2b07"; + final String ARROW_UP = "\u2b06"; + builder.widget( + TextWidget.dynamicString(() -> "Parameters: " + param) + .setSynced(false) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 7)) + .widget( + new TextWidget(CIRCLED_0 + ARROW_UP).setDefaultColor(0x00bbff) + .setPos(10, 29)) + .widget( + new TextWidget(CIRCLED_1 + ARROW_UP).setDefaultColor(0x0077ff) + .setPos(10, 44)) + .widget( + TextWidget.dynamicString(() -> CIRCLED_0 + ARROW_DOWN + TT_Utility.formatNumberExp(input0D)) + .setSynced(false) + .setDefaultColor(0x22ddff) + .setPos(10, 56)) + .widget( + TextWidget.dynamicString(() -> CIRCLED_1 + ARROW_DOWN + TT_Utility.formatNumberExp(input1D)) + .setSynced(false) + .setDefaultColor(0x00ffff) + .setPos(10, 65)); + + addTextField(builder, true); + addTextField(builder, false); + } + + private void addChangeNumberButton(ModularWindow.Builder builder, int changeNumberShift, int changeNumber, int xPos, + IDrawable overlay) { + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + param += clickData.shift ? changeNumberShift : changeNumber; + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + if (param > 9) { + param = 9; + } else if (param < -1) { + param = -1; + } + }) + .setPlayClickSound(false) + .setBackground(GT_UITextures.BUTTON_STANDARD, overlay, TecTechUITextures.OVERLAY_BUTTON_PARAMETRIZER_ID) + .setSize(18, 18) + .setPos(xPos, 4)); + } + + private void addTextField(ModularWindow.Builder builder, boolean isIndex0) { + TextFieldWidget widget = new TextFieldWidget(); + builder.widget( + widget.setGetter(() -> isIndex0 ? value0s : value1s) + .setSetter(str -> { + double val; + try { + val = parse(str); + } catch (Exception e) { + // This shouldn't happen as long as validator works + str = ""; + val = 0; + } + if (isIndex0) { + value0s = str; + value0D = val; + } else { + value1s = str; + value1D = val; + } + }) + .setValidator(str -> { + try { + parse(str); + return str; + } catch (Exception e) { + return widget.getLastText() + .size() > 0 ? widget.getLastText() + .get(0) : ""; + } + }) + .setTextColor(Color.WHITE.dark(1)) + .setTextAlignment(Alignment.CenterLeft) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) + .setPos(26, isIndex0 ? 26 : 41) + .setSize(138, 12)); + } + + private double parse(String str) { + double val; + if (str.contains("b")) { + String[] split = str.split("b"); + val = TT_Utility.bitStringToInt(split[0].replaceAll("[^-]", "") + split[1].replaceAll("_", "")); + } else if (str.contains("x")) { + String[] split = str.split("x"); + val = TT_Utility.hexStringToInt(split[0].replaceAll("[^-]", "") + split[1].replaceAll("_", "")); + } else { + val = TT_Utility.stringToDouble(str); + } + return val; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Rack.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Rack.java new file mode 100644 index 0000000000..2b65ba607e --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Rack.java @@ -0,0 +1,470 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE; +import static com.github.technus.tectech.util.CommonValues.MULTI_CHECK_AT; +import static com.github.technus.tectech.util.TT_Utility.getUniqueIdentifier; +import static gregtech.api.enums.Mods.NewHorizonsCoreMod; +import static gregtech.api.enums.Mods.OpenComputers; +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.objects.GT_RenderedTexture; + +/** + * Created by Tec on 03.04.2017. + */ +public class GT_MetaTileEntity_Hatch_Rack extends GT_MetaTileEntity_Hatch implements IAddGregtechLogo, IAddUIWidgets { + + private static Textures.BlockIcons.CustomIcon EM_R; + private static Textures.BlockIcons.CustomIcon EM_R_ACTIVE; + public int heat = 0; + private float overClock = 1, overVolt = 1; + private static final Map<String, RackComponent> componentBinds = new HashMap<>(); + + private String clientLocale = "en_US"; + + public GT_MetaTileEntity_Hatch_Rack(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 4, + new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.rack.desc.0"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.hatch.rack.desc.1") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_Rack(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 4, aDescription, aTextures); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setInteger("eHeat", heat); + aNBT.setFloat("eOverClock", overClock); + aNBT.setFloat("eOverVolt", overVolt); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + heat = aNBT.getInteger("eHeat"); + overClock = aNBT.getFloat("eOverClock"); + overVolt = aNBT.getFloat("eOverVolt"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + EM_R_ACTIVE = new Textures.BlockIcons.CustomIcon("iconsets/EM_RACK_ACTIVE"); + EM_R = new Textures.BlockIcons.CustomIcon("iconsets/EM_RACK"); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(EM_R_ACTIVE) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(EM_R) }; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_Rack(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return facing.offsetY == 0; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (aBaseMetaTileEntity.isActive() || heat > 500) { + return false; + } + return side == aBaseMetaTileEntity.getFrontFacing(); + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + if (aBaseMetaTileEntity.isActive() || heat > 500) { + return false; + } + return side == aBaseMetaTileEntity.getFrontFacing(); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) { + return true; + } + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + // if(aBaseMetaTileEntity.isActive()) + // aPlayer.addChatComponentMessage(new ChatComponentText("It is still active...")); + // else if(heat>0) + // aPlayer.addChatComponentMessage(new ChatComponentText("It is still warm...")); + // else + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + private int getComputationPower(float overclock, float overvolt, boolean tickingComponents) { + float computation = 0, heat = 0; + for (int i = 0; i < mInventory.length; i++) { + if (mInventory[i] == null || mInventory[i].stackSize != 1) { + continue; + } + RackComponent comp = componentBinds.get(getUniqueIdentifier(mInventory[i])); + if (comp == null) { + continue; + } + if (tickingComponents) { + if (this.heat > comp.maxHeat) { + mInventory[i] = null; + continue; + } else if (comp.subZero || this.heat >= 0) { + heat += (1f + comp.coEff * this.heat / 10000f) + * (comp.heat > 0 ? comp.heat * overclock * overclock * overvolt : comp.heat); + // =MAX(0;MIN(MIN($B4;1*C$3+C$3-0,25);1+RAND()+(C$3-1)-($B4-1)/2)) + if (overvolt * 10f > 7f + TecTech.RANDOM.nextFloat()) { + computation += comp.computation * Math.max( + 0, + Math.min( + Math.min(overclock, overvolt + overvolt - 0.25), + 1 + TecTech.RANDOM.nextFloat() + (overvolt - 1) - (overclock - 1) / 2)); + } + } + } else { + computation += comp.computation * overclock; + } + } + if (tickingComponents) { + this.heat += Math.ceil(heat); + } + return (int) Math.floor(computation); + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + public int tickComponents(float oc, float ov) { + if (oc > 3 + TecTech.RANDOM.nextFloat() || ov > 2 + TecTech.RANDOM.nextFloat()) { + getBaseMetaTileEntity().setToFire(); + } + overClock = oc; + overVolt = ov; + return getComputationPower(overClock, overVolt, true); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if (aTick % 20 == MULTI_CHECK_AT) { + if (heat > 0) { + float heatC = 0; + for (int i = 0; i < mInventory.length; i++) { + if (mInventory[i] == null || mInventory[i].stackSize != 1) { + continue; + } + RackComponent comp = componentBinds.get(getUniqueIdentifier(mInventory[i])); + if (comp == null) { + continue; + } + if (heat > comp.maxHeat) { + mInventory[i] = null; + } else if (comp.heat < 0) { + heatC += comp.heat * (heat / 10000f); + } + } + heat += Math.max(-heat, Math.ceil(heatC)); + } + + if (heat > 0) { + heat -= Math.max(heat / 1000, 1); + } else if (heat < 0) { + heat -= Math.min(heat / 1000, -1); + } + + if (heat > 10000) { + aBaseMetaTileEntity.setToFire(); + } else if (heat > 9000) { + aBaseMetaTileEntity.setOnFire(); + } else if (heat < -10000) { + heat = -10000; + } + } + } + } + + @Override + public int getSizeInventory() { // HACK TO NOT DROP CONTENTS!!! + return heat > 500 || getBaseMetaTileEntity().isActive() ? 0 : mInventory.length; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { + translateToLocalFormatted("tt.keyphrase.Base_computation", clientLocale) + ": " + + EnumChatFormatting.AQUA + + getComputationPower(1, 0, false), + translateToLocalFormatted("tt.keyphrase.After_overclocking", clientLocale) + ": " + + EnumChatFormatting.AQUA + + getComputationPower(overClock, 0, false), + translateToLocalFormatted("tt.keyphrase.Heat_Accumulated", clientLocale) + ": " + + EnumChatFormatting.RED + + (heat + 99) / 100 + + EnumChatFormatting.RESET + + " %" }; + // heat==0? --> ((heat+9)/10) = 0 + // Heat==1-10? --> 1 + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO) + .setSize(18, 18) + .setPos(151, 63)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK) + .setPos(46, 17) + .setSize(84, 60)); + + Pos2d[] positions = new Pos2d[] { new Pos2d(68, 27), new Pos2d(90, 27), new Pos2d(68, 49), new Pos2d(90, 49), }; + for (int i = 0; i < positions.length; i++) { + builder.widget(new SlotWidget(new BaseSlot(inventoryHandler, i) { + + @Override + public int getSlotStackLimit() { + return 1; + } + + @Override + public boolean isEnabled() { + return !getBaseMetaTileEntity().isActive() && heat <= 0; + } + }).setBackground(getGUITextureSet().getItemSlot(), TecTechUITextures.OVERLAY_SLOT_RACK) + .setPos(positions[i])); + + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BUTTON_STANDARD_LIGHT_16x16) + .setPos(152, 24) + .setSize(16, 16)) + .widget( + new DrawableWidget() + .setDrawable( + () -> getBaseMetaTileEntity().isActive() ? TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON + : TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED) + .setPos(152, 24) + .setSize(16, 16)) + .widget( + new FakeSyncWidget.BooleanSyncer( + () -> getBaseMetaTileEntity().isActive(), + val -> getBaseMetaTileEntity().setActive(val))); + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BUTTON_STANDARD_LIGHT_16x16) + .setPos(152, 41) + .setSize(16, 16)) + .widget( + new DrawableWidget() + .setDrawable( + () -> heat > 0 ? TecTechUITextures.OVERLAY_BUTTON_HEAT_ON + : TecTechUITextures.OVERLAY_BUTTON_HEAT_OFF) + .setPos(152, 41) + .setSize(16, 16)) + .widget(new FakeSyncWidget.IntegerSyncer(() -> heat, val -> heat = val)); + } + } + + public static void run() { // 20k heat cap max! + new RackComponent(ItemList.Circuit_Primitive.get(1), 1, 4, 0, 500, true); // Primitive Circuit + new RackComponent(ItemList.Circuit_Basic.get(1), 4, 8, 0, 1000, true); // Basic Circuit + new RackComponent(ItemList.Circuit_Microprocessor.get(1), 6, 8, 0, 1250, true); + new RackComponent(ItemList.Circuit_Good.get(1), 6, 9, -.05f, 1500, true); // Good Circuit + new RackComponent(ItemList.Circuit_Integrated_Good.get(1), 7, 9, -.075f, 1750, true); + new RackComponent(ItemList.Circuit_Processor.get(1), 8, 9, -.07f, 1800, true); + new RackComponent(ItemList.Circuit_Parts_Advanced.get(1), 1, 2, -.05f, 2000, true); + new RackComponent(ItemList.Circuit_Nanoprocessor.get(1), 8, 10, -.09f, 2250, true); // Advanced Circuit + new RackComponent(ItemList.Circuit_Advanced.get(1), 8, 10, -.1f, 2500, true); + new RackComponent(ItemList.Circuit_Data.get(1), 9, 1, -.1f, 3000, true); // EV Circuit + new RackComponent(ItemList.Circuit_Nanocomputer.get(1), 11, 10, -.125f, 3300, true); + new RackComponent(ItemList.Circuit_Quantumprocessor.get(1), 13, 10, -.15f, 3600, true); + new RackComponent(ItemList.Circuit_Elite.get(1), 12, 10, -.15F, 3500, true); // IV Circuit + new RackComponent(ItemList.Circuit_Elitenanocomputer.get(1), 14, 10, -.15F, 4000, true); + new RackComponent(ItemList.Circuit_Quantumcomputer.get(1), 16, 10, -.15F, 4500, true); + new RackComponent(ItemList.Circuit_Crystalprocessor.get(1), 18, 10, -.15F, 5000, true); + new RackComponent(ItemList.Circuit_Master.get(1), 16, 12, -.2F, 5000, true); // LuV Circuit + new RackComponent(ItemList.Circuit_Masterquantumcomputer.get(1), 16, 13, -.2F, 5100, true); + new RackComponent(ItemList.Circuit_Crystalcomputer.get(1), 20, 14, -.25F, 5200, true); + new RackComponent(ItemList.Circuit_Neuroprocessor.get(1), 24, 15, -.3F, 5300, true); + new RackComponent(ItemList.Circuit_Quantummainframe.get(1), 22, 14, -.3F, 5200, true); // ZPM Circuit + new RackComponent(ItemList.Circuit_Ultimatecrystalcomputer.get(1), 26, 16, -.3F, 5400, true); + new RackComponent(ItemList.Circuit_Wetwarecomputer.get(1), 30, 18, -.3F, 5600, true); + new RackComponent(ItemList.Circuit_Crystalmainframe.get(1), 30, 18, -.35F, 5500, true); // UV Circuit + new RackComponent(ItemList.Circuit_Wetwaresupercomputer.get(1), 35, 22, -.3F, 5700, true); + new RackComponent(ItemList.Circuit_Wetwaremainframe.get(1), 38, 25, -.4F, 6000, true); // UHV Circuit + + new RackComponent("IC2:ic2.reactorVent", 0, -1, 10f, 1000, false); + new RackComponent("IC2:ic2.reactorVentCore", 0, -1, 20f, 2500, false); + new RackComponent("IC2:ic2.reactorVentGold", 0, -1, 40f, 5000, false); + new RackComponent("IC2:ic2.reactorVentDiamond", 0, -1, 80f, 10000, false); // 2x oc + + if (NewHorizonsCoreMod.isModLoaded()) { + // GTNH-GT5u circuits + // these components causes crashes when used with the original GT5u + new RackComponent(ItemList.NandChip.get(1), 2, 6, 0, 750, true); // Primitive Circuit + new RackComponent(ItemList.Circuit_Biowarecomputer.get(1), 40, 26, -.35F, 5900, true); + new RackComponent(ItemList.Circuit_Biowaresupercomputer.get(1), 42, 30, -.4F, 6200, true); + new RackComponent(ItemList.Circuit_Biomainframe.get(1), 44, 28, -.4F, 6000, true); // UEV Circuit + new RackComponent(ItemList.Circuit_Bioprocessor.get(1), 34, 20, -.35F, 5800, true); + + new RackComponent("dreamcraft:item.HighEnergyCircuitParts", 3, 2, -.1f, 9001, true); + new RackComponent("dreamcraft:item.HighEnergyFlowCircuit", 24, 16, -.25f, 10000, true); + new RackComponent("dreamcraft:item.NanoCircuit", 50, 35, -.45f, 8000, true); + new RackComponent("dreamcraft:item.PikoCircuit", 64, 40, -.5f, 8500, true); + new RackComponent("dreamcraft:item.QuantumCircuit", 128, 48, -.6f, 9000, true); + } + + if (OpenComputers.isModLoaded()) { + new RackComponent("OpenComputers:item.oc.Transistor", 0, 1, 0f, 100, true); // Transistor + new RackComponent("OpenComputers:item.oc.Microchip0", 7, 12, -.05f, 1500, true); // chip t1 + new RackComponent("OpenComputers:item.oc.Microchip1", 18, 20, -.1f, 3000, true); // chip t2 + new RackComponent("OpenComputers:item.oc.Microchip2", 25, 22, -.15f, 4500, true); // chip t3 + new RackComponent("OpenComputers:item.oc.ALU", 10, 15, -.05f, 3000, true); // alu + new RackComponent("OpenComputers:item.oc.ControlUnit", 25, 18, -.05f, 1500, true); // cu + + new RackComponent("OpenComputers:item.oc.ComponentBus0", 42, 30, -.05f, 1500, true); // bus t1 + new RackComponent("OpenComputers:item.oc.ComponentBus1", 70, 50, -.1f, 3000, true); // bus t2 + new RackComponent("OpenComputers:item.oc.ComponentBus2", 105, 72, -.15f, 4500, true); // bus t3 + + new RackComponent("OpenComputers:item.oc.CPU0", 106, 73, -.1f, 1500, true); // cpu t1 + new RackComponent("OpenComputers:item.oc.CPU1", 226, 153, -.15f, 3000, true); // cpu t2 + new RackComponent("OpenComputers:item.oc.CPU2", 374, 241, -.2f, 4500, true); // cpu t3 + + new RackComponent("OpenComputers:item.oc.GraphicsCard0", 20, 27, -.1f, 1500, true); // gpu t1 + new RackComponent("OpenComputers:item.oc.GraphicsCard1", 62, 67, -.2f, 3000, true); // gpu t2 + new RackComponent("OpenComputers:item.oc.GraphicsCard2", 130, 111, -.3f, 4500, true); // gpu t3 + + new RackComponent("OpenComputers:item.oc.APU0", 350, 234, -.1f, 1500, true); // apu t2 + new RackComponent("OpenComputers:item.oc.APU1", 606, 398, -.2f, 4500, true); // apu t3 + new RackComponent("OpenComputers:item.oc.APU2", 1590, 1006, -.3f, 9000, true); // apu tC + } + } + + public static class RackComponent implements Comparable<RackComponent> { + + private final String unlocalizedName; + private final float heat, coEff, computation, maxHeat; + private final boolean subZero; + + RackComponent(ItemStack is, float computation, float heat, float coEff, float maxHeat, boolean subZero) { + this(getUniqueIdentifier(is), computation, heat, coEff, maxHeat, subZero); + } + + RackComponent(String is, float computation, float heat, float coEff, float maxHeat, boolean subZero) { + unlocalizedName = is; + this.heat = heat; + this.coEff = coEff; + this.computation = computation; + this.maxHeat = maxHeat; + this.subZero = subZero; + componentBinds.put(unlocalizedName, this); + if (DEBUG_MODE) { + TecTech.LOGGER.info("Component registered: " + unlocalizedName); + } + } + + @Override + public int compareTo(RackComponent o) { + return unlocalizedName.compareTo(o.unlocalizedName); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RackComponent) { + return compareTo((RackComponent) obj) == 0; + } + return false; + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Uncertainty.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Uncertainty.java new file mode 100644 index 0000000000..6ecbe67d22 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_Uncertainty.java @@ -0,0 +1,474 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; +import static org.lwjgl.opengl.GL11.GL_BLEND; +import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA; +import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; +import static org.lwjgl.opengl.GL11.glBlendFunc; +import static org.lwjgl.opengl.GL11.glColor4f; +import static org.lwjgl.opengl.GL11.glDisable; +import static org.lwjgl.opengl.GL11.glEnable; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.GlStateManager; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.objects.GT_RenderedTexture; + +/** + * Created by danie_000 on 15.12.2016. + */ +public class GT_MetaTileEntity_Hatch_Uncertainty extends GT_MetaTileEntity_Hatch + implements IAddGregtechLogo, IAddUIWidgets { + + private static Textures.BlockIcons.CustomIcon ScreenON; + private static Textures.BlockIcons.CustomIcon ScreenOFF; + public short[] matrix = new short[] { 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, + 500 }; + public byte selection = -1, mode = 0, status = -128; // all 8 bits set + + private String clientLocale = "en_US"; + + public GT_MetaTileEntity_Hatch_Uncertainty(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 0, ""); + TT_Utility.setTier(aTier, this); + regenerate(); + } + + public GT_MetaTileEntity_Hatch_Uncertainty(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + regenerate(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/UC"); + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/UC_ACTIVE"); + } + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(ScreenON) }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + return new ITexture[] { aBaseTexture, new GT_RenderedTexture(ScreenOFF) }; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && (aTick & 15) == 0) { + if (mode == 0) { + aBaseMetaTileEntity.setActive(false); + status = -128; + } else { + aBaseMetaTileEntity.setActive(true); + shift(); + compute(); + } + } + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { + return new GT_MetaTileEntity_Hatch_Uncertainty(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return new String[] { + translateToLocalFormatted("tt.keyword.Status", clientLocale) + ": " + EnumChatFormatting.GOLD + status }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setByte("mSel", selection); + aNBT.setByte("mMode", mode); + aNBT.setByte("mStatus", status); + NBTTagCompound mat = new NBTTagCompound(); + for (int i = 0; i < 16; i++) { + mat.setShort(Integer.toString(i), matrix[i]); + } + aNBT.setTag("mMat", mat); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + selection = aNBT.getByte("mSel"); + mode = aNBT.getByte("mMode"); + status = aNBT.getByte("mStatus"); + NBTTagCompound mat = aNBT.getCompoundTag("mMat"); + for (int i = 0; i < 16; i++) { + matrix[i] = mat.getShort(Integer.toString(i)); + } + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public boolean isLiquidInput(ForgeDirection side) { + return false; + } + + @Override + public boolean isFluidInputAllowed(FluidStack aFluid) { + return false; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isClientSide()) { + return true; + } + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public String[] getDescription() { + return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.hatch.certain.desc.0"), // Feeling + // certain, + // or + // not? + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockmachines.hatch.certain.desc.1") // Schrödinger equation in a box + }; + } + + private boolean balanceCheck(int sideLenY, short... masses) { + float inequality = 0; + for (int i = 0; i < masses.length >> 1; i++) { + inequality += Math.abs(masses[i] - masses[masses.length - i - 1]); + } + return inequality < masses.length << 7; + } + + public void regenerate() { + for (int i = 0; i < matrix.length; i++) { + matrix[i] = (short) TecTech.RANDOM.nextInt(1000); + } + } + + public byte compute() { + int result = 0; + switch (mode) { + case 1: // ooo oxo ooo + result = balanceCheck(4, matrix) ? 0 : 1; + break; + case 2: // ooo xox ooo + result += balanceCheck( + 4, + matrix[0], + matrix[4], + matrix[1], + matrix[5], + matrix[2], + matrix[6], + matrix[3], + matrix[7]) ? 0 : 1; + result += balanceCheck( + 4, + matrix[8], + matrix[12], + matrix[9], + matrix[13], + matrix[10], + matrix[14], + matrix[11], + matrix[15]) ? 0 : 2; + break; + case 3: // oxo xox oxo + result += balanceCheck( + 2, + matrix[0], + matrix[4], + matrix[8], + matrix[12], + matrix[1], + matrix[5], + matrix[9], + matrix[13]) ? 0 : 1; + result += balanceCheck( + 4, + matrix[0], + matrix[4], + matrix[1], + matrix[5], + matrix[2], + matrix[6], + matrix[3], + matrix[7]) ? 0 : 2; + result += balanceCheck( + 4, + matrix[8], + matrix[12], + matrix[9], + matrix[13], + matrix[10], + matrix[14], + matrix[11], + matrix[15]) ? 0 : 4; + result += balanceCheck( + 2, + matrix[2], + matrix[6], + matrix[10], + matrix[14], + matrix[3], + matrix[7], + matrix[11], + matrix[15]) ? 0 : 8; + break; + case 4: // xox ooo xox + result += balanceCheck(2, matrix[0], matrix[4], matrix[1], matrix[5]) ? 0 : 1; + result += balanceCheck(2, matrix[8], matrix[12], matrix[9], matrix[13]) ? 0 : 2; + result += balanceCheck(2, matrix[2], matrix[6], matrix[3], matrix[7]) ? 0 : 4; + result += balanceCheck(2, matrix[10], matrix[14], matrix[11], matrix[15]) ? 0 : 8; + break; + case 5: // xox oxo xox + result += balanceCheck(2, matrix[0], matrix[4], matrix[1], matrix[5]) ? 0 : 1; + result += balanceCheck(2, matrix[8], matrix[12], matrix[9], matrix[13]) ? 0 : 2; + result += balanceCheck(4, matrix) ? 0 : 4; + result += balanceCheck(2, matrix[2], matrix[6], matrix[3], matrix[7]) ? 0 : 8; + result += balanceCheck(2, matrix[10], matrix[14], matrix[11], matrix[15]) ? 0 : 16; + break; + } + return status = (byte) result; + } + + private void shift() { + int i = TecTech.RANDOM.nextInt(16), j = TecTech.RANDOM.nextInt(128); + matrix[i] += ((matrix[i] & 1) == 0 ? 2 : -2) * j >> 5; + matrix[i] += j == 0 ? 1 : 0; + if (matrix[i] < 0) { + matrix[i] = 0; + } else if (matrix[i] > 1000) { + matrix[i] = 999; + } + } + + public byte update(int newMode) { + if (newMode == mode) { + return status; + } + if (newMode < 0 || newMode > 5) { + newMode = 0; + } + mode = (byte) newMode; + regenerate(); + compute(); + return status; + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO_DARK) + .setSize(18, 18) + .setPos(112, 55)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + final boolean isAdvanced = mTier > 7; + + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE) + .setPos(43, 4) + .setSize(90, 72)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_UNCERTAINTY_MONITOR) + .setPos(46, 27) + .setSize(46, 46)); + + int[] xPositions = new int[] { 7, 25, 133, 151 }; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + final int index = i * 4 + j; + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + if (selection == -1) { + selection = (byte) index; + } else { + short temp = matrix[selection]; + matrix[selection] = matrix[index]; + matrix[index] = temp; + selection = -1; + } + compute(); + }) + .setPlayClickSound(false) + .setBackground(GT_UITextures.BUTTON_STANDARD, TecTechUITextures.OVERLAY_BUTTON_UNCERTAINTY[index]) + .setPos(xPositions[i], 4 + j * 18) + .setSize(18, 18)) + .widget(new FakeSyncWidget.ShortSyncer(() -> matrix[index], val -> matrix[index] = val)); + } + } + builder.widget(new FakeSyncWidget.ByteSyncer(() -> selection, val -> selection = val)) + .widget(new FakeSyncWidget.ByteSyncer(() -> mode, val -> mode = val)) + .widget(new FakeSyncWidget.ByteSyncer(() -> status, val -> status = val)); + + builder.widget( + new TextWidget().setStringSupplier(() -> "Status: " + (status == 0 ? "OK" : "NG")) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 7)); + + for (int i = 0; i < 9; i++) { + final int index = i; + builder.widget(new DrawableWidget().setDrawable(() -> { + UITexture valid = TecTechUITextures.PICTURE_UNCERTAINTY_VALID[index]; + UITexture invalid = TecTechUITextures.PICTURE_UNCERTAINTY_INVALID[index]; + switch (mode) { + case 1: // ooo oxo ooo + if (index == 4) return status == 0 ? valid : invalid; + break; + case 2: // ooo xox ooo + if (index == 3) return (status & 1) == 0 ? valid : invalid; + if (index == 5) return (status & 2) == 0 ? valid : invalid; + break; + case 3: // oxo xox oxo + if (index == 1) return (status & 1) == 0 ? valid : invalid; + if (index == 3) return (status & 2) == 0 ? valid : invalid; + if (index == 5) return (status & 4) == 0 ? valid : invalid; + if (index == 7) return (status & 8) == 0 ? valid : invalid; + break; + case 4: // xox ooo xox + if (index == 0) return (status & 1) == 0 ? valid : invalid; + if (index == 2) return (status & 2) == 0 ? valid : invalid; + if (index == 6) return (status & 4) == 0 ? valid : invalid; + if (index == 8) return (status & 8) == 0 ? valid : invalid; + break; + case 5: // xox oxo xox + if (index == 0) return (status & 1) == 0 ? valid : invalid; + if (index == 2) return (status & 2) == 0 ? valid : invalid; + if (index == 4) return (status & 4) == 0 ? valid : invalid; + if (index == 6) return (status & 8) == 0 ? valid : invalid; + if (index == 8) return (status & 16) == 0 ? valid : invalid; + break; + } + return null; + }) + .setPos(55 + (index % 3) * 12, 36 + (index / 3) * 12) + .setSize(4, 4)); + } + + for (int i = 0; i < 16; i++) { + final int index = i; + builder.widget(new DrawableWidget() { + + @Override + public void draw(float partialTicks) { + if (isAdvanced) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(1f, 1f, 1f, (float) matrix[index] / 1000f); + + // super.draw but without disabling blend + GlStateManager.pushMatrix(); + getDrawable().draw(Pos2d.ZERO, getSize(), partialTicks); + GlStateManager.popMatrix(); + + glDisable(GL_BLEND); + glColor4f(1f, 1f, 1f, 1f); + } else { + if (TecTech.RANDOM.nextInt(1000) < matrix[index]) { + super.draw(partialTicks); + } + } + } + }.setDrawable(TecTechUITextures.PICTURE_UNCERTAINTY_INDICATOR) + .setPos(47 + (i / 4) * 12, 28 + (i % 4) * 12) + .setSize(8, 8)) + .widget( + new DrawableWidget() + .setDrawable(() -> selection == index ? TecTechUITextures.PICTURE_UNCERTAINTY_SELECTED : null) + .setPos(46 + (i / 4) * 12, 27 + (i % 4) * 12) + .setSize(10, 10)); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_WirelessMulti.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_WirelessMulti.java new file mode 100644 index 0000000000..3d3f417b51 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/hatch/GT_MetaTileEntity_Hatch_WirelessMulti.java @@ -0,0 +1,216 @@ +package com.github.technus.tectech.thing.metaTileEntity.hatch; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_WIRELESS_LASER; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_WIRELESS_MULTI_16A; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_WIRELESS_MULTI_4A; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_WIRELESS_MULTI_64A; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BLUE; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.BOLD; +import static com.gtnewhorizon.gtnhlib.util.AnimatedTooltipHandler.GRAY; +import static gregtech.api.enums.GT_Values.AuthorColen; +import static gregtech.api.enums.GT_Values.V; +import static java.lang.Long.min; + +import java.math.BigInteger; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.IGlobalWirelessEnergy; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IWirelessEnergyHatchInformation; +import gregtech.api.metatileentity.MetaTileEntity; + +public class GT_MetaTileEntity_Hatch_WirelessMulti extends GT_MetaTileEntity_Hatch_EnergyMulti + implements IGlobalWirelessEnergy, IWirelessEnergyHatchInformation { + + private final BigInteger eu_transferred_per_operation = BigInteger + .valueOf(Amperes * V[mTier] * ticks_between_energy_addition); + private final long eu_transferred_per_operation_long = eu_transferred_per_operation.longValue(); + + private String owner_uuid; + private String owner_name; + + public GT_MetaTileEntity_Hatch_WirelessMulti(int aID, String aName, String aNameRegional, int aTier, int aAmp) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { GRAY + "Stores energy globally in a network, up to 2^(2^31) EU.", + GRAY + "Does not connect to wires. This block withdraws EU from the network.", + AuthorColen + GRAY + BOLD + " & " + BLUE + BOLD + "Cloud" }, + aAmp); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_Hatch_WirelessMulti(String aName, int aTier, int aAmp, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, aAmp, aDescription, aTextures); + } + + private ITexture[] TEXTURE_OVERLAY; + + @Override + public ITexture[] getTexturesActive(ITexture aBaseTexture) { + switch (Amperes) { + case 4: + TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_4A; + break; + case 16: + TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_16A; + break; + case 64: + TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_64A; + break; + default: + TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_LASER; + break; + } + return new ITexture[] { aBaseTexture, TEXTURE_OVERLAY[mTier] }; + } + + @Override + public ITexture[] getTexturesInactive(ITexture aBaseTexture) { + switch (Amperes) { + case 4: + TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_4A; + break; + case 16: + TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_16A; + break; + case 64: + TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_MULTI_64A; + break; + default: + TEXTURE_OVERLAY = OVERLAYS_ENERGY_IN_WIRELESS_LASER; + break; + } + return new ITexture[] { aBaseTexture, TEXTURE_OVERLAY[mTier] }; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isEnetInput() { + return false; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isValidSlot(int aIndex) { + return false; + } + + @Override + public long getMinimumStoredEU() { + return Amperes * V[mTier]; + } + + @Override + public long maxEUInput() { + return V[mTier]; + } + + @Override + public long maxEUStore() { + return totalStorage(V[mTier]) * Amperes / 2; + } + + @Override + public long maxAmperesIn() { + return Amperes; + } + + @Override + public long maxWorkingAmperesIn() { + return Amperes; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Hatch_WirelessMulti(mName, mTier, Amperes, mDescriptionArray, mTextures); + } + + @Override + public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, + ItemStack aStack) { + return false; + } + + @Override + public ConnectionType getConnectionType() { + return ConnectionType.WIRELESS; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isServerSide()) { + // On first tick find the player name and attempt to add them to the map. + + // UUID and username of the owner. + owner_uuid = aBaseMetaTileEntity.getOwnerUuid() + .toString(); + owner_name = aBaseMetaTileEntity.getOwnerName(); + + strongCheckOrAddUser(owner_uuid, owner_name); + + tryFetchingEnergy(); + } + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + + super.onPreTick(aBaseMetaTileEntity, aTick); + + if (aBaseMetaTileEntity.isServerSide()) { + + // This is set up in a way to be as optimised as possible. If a user has a relatively plentiful energy + // network + // it should make no difference to them. Minimising the number of operations on BigInteger is essential. + + // Every ticks_between_energy_addition add eu_transferred_per_operation to internal EU storage from network. + if (aTick % ticks_between_energy_addition == 0L) { + tryFetchingEnergy(); + } + } + } + + private void tryFetchingEnergy() { + long currentEU = getBaseMetaTileEntity().getStoredEU(); + long maxEU = maxEUStore(); + long euToTransfer = min(maxEU - currentEU, eu_transferred_per_operation_long); + if (euToTransfer <= 0) return; // nothing to transfer + if (!addEUToGlobalEnergyMap(owner_uuid, -euToTransfer)) return; + setEUVar(currentEU + euToTransfer); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java new file mode 100644 index 0000000000..c01a17af86 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsRingsStructureString.java @@ -0,0 +1,5101 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +public abstract class ForgeOfGodsRingsStructureString { + + public static final String[][] SECOND_RING = { { + + " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBEC CEBB ", + " BEEC CEEB ", + " EEC CEE ", + " EC CE ", + " EC CCCCC CE ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " EC CCCCC CE ", + " EC CE ", + " EEC CEE ", + " BEEC CEEB ", + " BBEC CEBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC D CCBB ", + " BBEC D CEBB ", + " BBBEEC DD CEEBBB ", + " EEEEC D CEEEE ", + " EEEC DD CEEE ", + " EEEC CCCCC CEEE ", + " EEC CHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHHHC CEE ", + " EEC CHHHHHC CEE ", + " EEEC CCCCC CEEE ", + " EEEC DD CEEE ", + " EEEEC D CEEEE ", + " BBBEEC DD CEEBBB ", + " BBEC D CEBB ", + " BBCC D CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBEC CEBB ", + " BBBEEC CEEBBB ", + " BBBBEEEEC CEEEEBBBB ", + " EEEEEEEC CEEEEEEE ", + " EEEEEEEC CCCCC CEEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEEC CCCCC CEEEEEEE ", + " EEEEEEEC CEEEEEEE ", + " BBBBEEEEC CEEEEBBBB ", + " BBBEEC CEEBBB ", + " BBEC CEBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " ", + " ", + " ", + " ", + " BBB BBB ", + " BBBBEEE EEEBBBB ", + " BBBEEEEEEE EEEEEEEBBB ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEKKK KKKEEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " BBBEEEEEEE EEEEEEEBBB ", + " BBBBEEE EEEBBBB ", + " BBB BBB ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBBBBEEEE EEEEBBBBB ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " BBBBBEEEE EEEEBBBBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " BBBEEEEE EEEEEBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEKK KKEEEEEE ", + " EEEEEEKK KKEEEEEE ", + " EEEEEEKK KKEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBEEEEE EEEEEBBB ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BBBBBEEE EEEBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEKKK KKKEEEEE ", + " EEEEEKKK KKKEEEEE ", + " EEEEEKKK KKKEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBEEE EEEBBBBB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBEEEE EEEEBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBEEEE EEEEBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BBBBEE EEBBBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBBBEE EEBBBB ", + " BB BB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEKK KKEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BEEEE EEEEB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BEEEE EEEEB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BBEEE EEEBB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BBEEE EEEBB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " BBBBE EBBBB ", + " EEEEE EEEEE ", + " EEEKK KKEEE ", + " EEEEE EEEEE ", + " BBBBE EBBBB ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEK KEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEK KEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEK KEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEKK KKEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEKK KKEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEK KEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEKK KKEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBB BBBBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEKKK KKKEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBBBB BBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBB BBBBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEKK KKEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBBBB BBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBB BBBBBBBBB ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEKKKK KKKKEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " BBBBBBBBB BBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBB BBBBBBBBBBBB ", + " EEEEEEEEEEEE EEEEEEEEEEEE ", + " EEEEEEEKKKKK KKKKKEEEEEEE ", + " EEEEEEEEEEEE EEEEEEEEEEEE ", + " BBBBBBBBBBBB BBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEKKKKKKKKKKKKKKKEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; + + public static final String[][] THIRD_RING = { + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBBEC CEBBB ", + " EEEC CEEE ", + " EEC CEE ", + " EEC CCCCC CEE ", + " EC CC CC CE ", + " EC C C CE ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C C C C ", + " EC C C CE ", + " EC CC CC CE ", + " EEC CCCCC CEE ", + " EEC CEE ", + " EEEC CEEE ", + " BBBEC CEBBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBCCD CCBB ", + " BBBEC DD CEBBB ", + " BBBEEEC D CEEEBBB ", + " EEEEEC DD CEEEEE ", + " EEEEEC DCCCCC CEEEEE ", + " EEEEC CCHHHHHCC CEEEE ", + " EEEEC CHHHHHHHHHC CEEEE ", + " EEEC CHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHHHC CEEE ", + " EEEC CHHHHHHHHHC CEEE ", + " EEEEC CHHHHHHHHHC CEEEE ", + " EEEEC CCHHHHHCC CEEEE ", + " EEEEEC CCCCCD CEEEEE ", + " EEEEEC DD CEEEEE ", + " BBBEEEC D CEEEBBB ", + " BBBEC DD CEBBB ", + " BBCC DCCBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " BBBBBBB ", + " BBCCCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBBEC CEBBB ", + " BBBBEEEC CEEEBBBB ", + " BEEEEEEC CEEEEEEB ", + " EEEEEEEC CCCCC CEEEEEEE ", + " EEEEEEC CC CC CEEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEC C C CEEEEE ", + " EEEEEEC C C CEEEEEE ", + " EEEEEEC CC CC CEEEEEE ", + " EEEEEEEC CCCCC CEEEEEEE ", + " BEEEEEEC CEEEEEEB ", + " BBBBEEEC CEEEBBBB ", + " BBBEC CEBBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCCCBB ", + " BBBBBBB " }, + { " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBBBEEEE EEEEBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEII IIEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBEEEE EEEEBBBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BBBBBEE EEBBBBB ", + " BEEEEEEE EEEEEEEB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEEEE EEEEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BEEEEEEE EEEEEEEB ", + " BBBBBEE EEBBBBB ", + " BB BB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBEEEE EEEEBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBEEEE EEEEBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " BBBBBE EBBBBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBBBBE EBBBBB ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BBEEE EEEBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEII IIEEE ", + " EEEII IIEEE ", + " EEEII IIEEE ", + " EEEII IIEEE ", + " EEEII IIEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBEEE EEEBB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BEEE EEEB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BEEE EEEB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " BBBE EBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBE EBBB ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI EEEE ", + " EEEI IEEE ", + " EEEI EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEI IEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEI IEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEI IEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEII IIEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEI IEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEII IIEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBB BBBBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEIII IIIEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBBBB BBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBB BBBBBBBBB ", + " EEEEEEEEE EEEEEEEEE ", + " EEEEEEIII IIIEEEEEE ", + " EEEEEEEEE EEEEEEEEE ", + " BBBBBBBBB BBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBB BBBBBBBBBBB ", + " EEEEEEEEEEE EEEEEEEEEEE ", + " EEEEEEIIIII IIIIIEEEEEE ", + " EEEEEEEEEEE EEEEEEEEEEE ", + " BBBBBBBBBBB BBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEIIIIIIIIIIIIIEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBB ", + " EEEEEEEEEEEEE ", + " EEEEEEEEEEEEE ", + " EEEEEEEEEEEEE ", + " BBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java new file mode 100644 index 0000000000..bbf9e56f89 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeOfGodsStructureString.java @@ -0,0 +1,5429 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +public abstract class ForgeOfGodsStructureString { + + public static final String[][] MAIN_STRUCTURE = { { + " ", + " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BB BB ", + " B DDD DDD B ", + " DDFD DFDD ", + " DDADD DDADD ", + " DFDD DDFD ", + " DDD DDD ", + " ", + " ", + " ", + " DDD DDD ", + " DFDD DDFD ", + " DDADD DDADD ", + " DDFD DFDD ", + " B DDD DDD B ", + " BB BB ", + " BB BB ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BEEBBBBB BBBBBEEB ", + " BEEEECCCCBCCCCEEEEB ", + " BEEECEE CFC EECEEEB ", + " BECEEE CFC EEECEB ", + " BCEE CFC EECB ", + " BCEE CCCFC EECB ", + " BC CFFCCFC CB ", + " BCCCCFCCFCFCCCCCB ", + " BFFFCCF~FCCFFFB ", + " BCCCCCFCFCCFCCCCB ", + " BC CFCCFFC CB ", + " BCEE CFCCC EECB ", + " BCEE CFC EECB ", + " BECEEE CFC EEECEB ", + " BEEECEE CFC EECEEEB ", + " BEEEECCCCBCCCCEEEEB ", + " BEEBBBBB BBBBBEEB ", + " BB BB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " BB BB ", + " BBEEBBB BBBEEBB ", + " BEEEEEEB BEEEEEEB ", + " BEEDDDDDBBBBBDDDDDEEB ", + " BEEDEE EEDEEB ", + " BEDE EDEB ", + " BED DEB ", + " BED DEB ", + " BB BB ", + " B B ", + " B B ", + " B B ", + " BB BB ", + " BED DEB ", + " BED DEB ", + " BEDE EDEB ", + " BEEDEE EEDEEB ", + " BEEDDDDDBBBBBDDDDDEEB ", + " BEEEEEEB BEEEEEEB ", + " BBEEBBB BBBEEBB ", + " BB BB ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BEEEEB BEEEEB ", + " BEEDDBBB BBBDDEEB ", + " BED DEB ", + " BED DEB ", + " BB BB ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " BB BB ", + " BED DEB ", + " BED DEB ", + " BEEDDBBB BBBDDEEB ", + " BEEEEB BEEEEB ", + " BBBB BBBB ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " BB BB ", + " BEEBB BBEEB ", + " BBB BEB ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " BEB BEB ", + " BEBBB BBEEB ", + " BB BB ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BB BB ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " BB BB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " J ", + " BEEEEEB ", + " EEE EEE ", + " E E ", + " EE EE ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " JE EJ ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " EE EE ", + " E E ", + " EEE EEE ", + " BEEEEEB ", + " J " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " J ", + " BEEEEEB ", + " EEE EEE ", + " E E ", + " EE EE ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " JE EJ ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " EE EE ", + " E E ", + " EEE EEE ", + " BEEEEEB ", + " J " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " J ", + " BEEEEEB ", + " EEEE EEE ", + " E E ", + " EE EE ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " JE EJ ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " EE EE ", + " E E ", + " EEE EEE ", + " BEEEEEB ", + " J " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " J ", + " BEEEEEB ", + " EEE EEE ", + " E E ", + " EE EE ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " JE EJ ", + " E E ", + " E E ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " EE EE ", + " E E ", + " EEE EEE ", + " BEEEEEB ", + " J " }, + { " ", + " BEEEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEEEB ", + " " }, + { " ", + " BEEEB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " E E ", + " E E ", + " E E ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BEEEB ", + " " }, + { " ", + " BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " B B ", + " B B ", + " B B ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BBBBB ", + " BBCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " EEC CEE ", + " EC CE ", + " EC CE ", + " C CCC C ", + " C C C C ", + " C C C C ", + " C C C C ", + " C CCC C ", + " EC CE ", + " EC CE ", + " EEC CEE ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCBB ", + " BBBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BBBBB ", + " BBCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBBEEC CEEBBB ", + " BBEEEEC DDCEEEEBB ", + " EEEEEEC DDD CEEEEEE ", + " EEEEEC CCCDD CEEEEE ", + " EEEEEC CHHHC CEEEEE ", + " EEEEEC CHHHC CEEEEE ", + " EEEEEC CHHHC CEEEEE ", + " EEEEEC DDCCC CEEEEE ", + " EEEEEEC DDD CEEEEEE ", + " BBEEEECDD CEEEEBB ", + " BBBEEC CEEBBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCBB ", + " BBBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " BBBBB ", + " BBCCCCCBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBBEEC CEEBBB ", + " BBBBEEEEC CEEEEBBBB ", + " BBEEEEEEEEC CEEEEEEEEBB ", + " EEEEEEEEEC CCC CEEEEEEEEE ", + " EEEEEEEEEC C C CEEEEEEEEE ", + " EEEEEEEEEC C C CEEEEEEEEE ", + " EEEEEEEEEC C C CEEEEEEEEE ", + " EEEEEEEEEC CCC CEEEEEEEEE ", + " BBEEEEEEEEC CEEEEEEEEBB ", + " BBBBEEEEC CEEEEBBBB ", + " BBBEEC CEEBBB ", + " BBCC CCBB ", + " BBCC CCBB ", + " BBCCCCCBB ", + " BBBBB ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " BBBBEEEE EEEEBBBB ", + " BBBBBEEEEEEEE EEEEEEEEBBBBB ", + " EEEEEEEEEEEEE EEEEEEEEEEEEE ", + " EEEEEEEEEGGGG GGGGEEEEEEEEE ", + " EEEEEEEGGGGGG GGGGGGEEEEEEE ", + " EEEEEEEEEGGGG GGGGEEEEEEEEE ", + " EEEEEEEEEEEEE EEEEEEEEEEEEE ", + " BBBBBEEEEEEEE EEEEEEEEBBBBB ", + " BBBBEEEE EEEEBBBB ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BB BB ", + " BBBBBEE EEBBBBB ", + " BBBEEEEEEE EEEEEEEBBB ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEGGGG GGGGEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " BBBEEEEEEE EEEEEEEBBB ", + " BBBBBEE EEBBBBB ", + " BB BB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " BBBBBEEE EEEBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEGGG GGGEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBEEE EEEBBBBB ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBBB ", + " EEEEEEE EEEEEEE ", + " EEEEEGG GGEEEEE ", + " EEEEEEE EEEEEEE ", + " BBBBBBB BBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBBB ", + " EEEEEEE EEEEEEE ", + " EEEEGGG GGGEEEE ", + " EEEEEEE EEEEEEE ", + " BBBBBBB BBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEGG GGEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEGG GGEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "BBB BBB", + "EEE EEE", + "EEG GEE", + "EEE EEE", + "BBB BBB", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBB BBB ", + " EEE EEE ", + " EEG GEE ", + " EEE EEE ", + " BBB BBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBB BBBB ", + " EEEE EEEE ", + " EEEG GEEE ", + " EEEE EEEE ", + " BBBB BBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEGG GGEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEGG GGEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBB BBBBB ", + " EEEEE EEEEE ", + " EEEEG GEEEE ", + " EEEEE EEEEE ", + " BBBBB BBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBB BBBBBB ", + " EEEEEE EEEEEE ", + " EEEEGG GGEEEE ", + " EEEEEE EEEEEE ", + " BBBBBB BBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBBB ", + " EEEEEEE EEEEEEE ", + " EEEEGGG GGGEEEE ", + " EEEEEEE EEEEEEE ", + " BBBBBBB BBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBB BBBBBBB ", + " EEEEEEE EEEEEEE ", + " EEEEEGG GGEEEEE ", + " EEEEEEE EEEEEEE ", + " BBBBBBB BBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBB BBBBBBBB ", + " EEEEEEEE EEEEEEEE ", + " EEEEEGGG GGGEEEEE ", + " EEEEEEEE EEEEEEEE ", + " BBBBBBBB BBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBB BBBBBBBBBB ", + " EEEEEEEEEE EEEEEEEEEE ", + " EEEEEEGGGG GGGGEEEEEE ", + " EEEEEEEEEE EEEEEEEEEE ", + " BBBBBBBBBB BBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBB BBBBBBBBBBBBB ", + " EEEEEEEEEEEEE EEEEEEEEEEEEE ", + " EEEEEEEGGGGGG GGGGGGEEEEEEE ", + " EEEEEEEEEEEEE EEEEEEEEEEEEE ", + " BBBBBBBBBBBBB BBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEGGGGGGGGGGGGGGGEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " }, + { " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBBBBBB ", + " EEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEE ", + " EEEEEEEEEEEEEEE ", + " BBBBBBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " } }; +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java new file mode 100644 index 0000000000..afa09dd193 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_EyeOfHarmony.java @@ -0,0 +1,1767 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.TecTech.eyeOfHarmonyRecipeStorage; +import static com.github.technus.tectech.thing.CustomItemList.astralArrayFabricator; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.eyeOfHarmonyRenderBlock; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsBA0; +import static com.github.technus.tectech.util.CommonValues.EOH_TIER_FANCY_NAMES; +import static com.github.technus.tectech.util.TT_Utility.toStandardForm; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.withChannel; +import static gregtech.api.enums.GT_HatchElement.InputBus; +import static gregtech.api.enums.GT_HatchElement.InputHatch; +import static gregtech.api.enums.GT_HatchElement.OutputBus; +import static gregtech.api.enums.GT_HatchElement.OutputHatch; +import static gregtech.api.enums.GT_Values.AuthorColen; +import static gregtech.api.util.GT_ParallelHelper.calculateChancedOutputMultiplier; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; +import static gregtech.api.util.GT_Utility.formatNumbers; +import static java.lang.Math.exp; +import static java.lang.Math.max; +import static java.lang.Math.pow; +import static net.minecraft.util.EnumChatFormatting.BLUE; +import static net.minecraft.util.EnumChatFormatting.GOLD; +import static net.minecraft.util.EnumChatFormatting.GRAY; +import static net.minecraft.util.EnumChatFormatting.GREEN; +import static net.minecraft.util.EnumChatFormatting.RED; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.YELLOW; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.recipe.EyeOfHarmonyRecipe; +import com.github.technus.tectech.recipe.TecTechRecipeMaps; +import com.github.technus.tectech.thing.block.TileEyeOfHarmony; +import com.github.technus.tectech.thing.casing.TT_Container_Casings; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.FluidStackLong; +import com.github.technus.tectech.util.ItemStackLong; +import com.google.common.collect.ImmutableList; +import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IGlobalWirelessEnergy; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.shutdown.ShutDownReason; +import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME; +import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME; +import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME; + +@SuppressWarnings("SpellCheckingInspection") +public class GT_MetaTileEntity_EM_EyeOfHarmony extends GT_MetaTileEntity_MultiblockBase_EM + implements IConstructable, IGlobalWirelessEnergy, ISurvivalConstructable { + + public static final boolean EOH_DEBUG_MODE = false; + private static final long MOLTEN_SPACETIME_PER_FAILURE_TIER = 14_400L; + private static final double SPACETIME_FAILURE_BASE = 2; + private static final String TOOLTIP_BAR = GOLD + + "---------------------------------------------------------------------------------------"; + + // Region variables. + private static Textures.BlockIcons.CustomIcon ScreenOFF; + private static Textures.BlockIcons.CustomIcon ScreenON; + + private int spacetimeCompressionFieldMetadata = -1; + private int timeAccelerationFieldMetadata = -1; + private int stabilisationFieldMetadata = -1; + + private static final double SPACETIME_CASING_DIFFERENCE_DISCOUNT_PERCENTAGE = 0.03; + private static final double TIME_ACCEL_DECREASE_CHANCE_PER_TIER = 0.0925; + // % Increase in recipe chance and % decrease in yield per tier. + private static final double STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER = 0.05; + private static final double LOG_CONSTANT = Math.log(1.7); + private static final double PARALLEL_MULTIPLIER_CONSTANT = 1.63; + private static final long POWER_DIVISION_CONSTANT = 9; + private static final int TOTAL_CASING_TIERS_WITH_POWER_PENALTY = 8; + private static final long PRECISION_MULTIPLIER = 1_000_000; + + private String userUUID = ""; + private BigInteger outputEU_BigInt = BigInteger.ZERO; + private long startEU = 0; + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5); // 200 blocks max per + // placement. + return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 16, 16, 0, realBudget, source, actor, false, true); + } + + protected static final String STRUCTURE_PIECE_MAIN = "main"; + + // Multiblock structure. + private static final IStructureDefinition<GT_MetaTileEntity_EM_EyeOfHarmony> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_EM_EyeOfHarmony>builder() + .addShape( + STRUCTURE_PIECE_MAIN, + transpose( + new String[][] { + { " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " C C ", " C C ", + " C C ", " CCCCCCCCC ", + " C C ", " CCCCCCCCC ", + " C C ", " C C ", + " C C ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " C C ", " C C ", + " C C ", " DDDDD ", + " DDCDCDD ", " CCCCDCCDCCDCCCC ", + " DDDDDDD ", " CCCCDCCDCCDCCCC ", + " DDCDCDD ", " DDDDD ", + " C C ", " C C ", + " C C ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " C C ", " C C ", + " D ", " D ", + " DDDDDDD ", " DD DD ", + " D EEE D ", " CCC D EAAAE D CCC ", + " DDD EAAAE DDD ", " CCC D EAAAE D CCC ", + " D EEE D ", " DD DD ", + " DDDDDDD ", " D ", + " D ", " C C ", + " C C ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " ", + " C C ", " C C ", + " D ", " D ", + " ", " ", + " ", " ", + " ", " CC CC ", + " DD DD ", " CC CC ", + " ", " ", + " ", " ", + " ", " D ", + " D ", " C C ", + " C C ", " ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " C C ", + " CCCCC ", " D ", + " A ", " A ", + " ", " ", + " ", " ", + " C C ", " CC CC ", + " CDAA AADC ", " CC CC ", + " C C ", " ", + " ", " ", + " ", " A ", + " A ", " D ", + " CCCCC ", " C C ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " C C ", " C C ", + " D ", " SEEAEES ", + " ", " ", + " ", " ", + " ", " S S ", + " E E ", " CC E E CC ", + " DA AD ", " CC E E CC ", + " E E ", " S S ", + " ", " ", + " ", " ", + " ", " SEEAEES ", + " D ", " C C ", + " C C ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " C C ", + " CCCCC ", " D ", + " A ", " ", + " ", " ", + " ", " ", + " ", " ", + " C C ", " CC CC ", + " CDA ADC ", " CC CC ", + " C C ", " ", + " ", " ", + " ", " ", + " ", " ", + " A ", " D ", + " CCCCC ", " C C ", + " ", " ", + " " }, + { " ", " ", + " C C ", " C C ", + " D ", " SEEAEES ", + " ", " ", + " ", " ", + " ", " ", + " ", " S S ", + " E E ", " CC E E CC ", + " DA AD ", " CC E E CC ", + " E E ", " S S ", + " ", " ", + " ", " ", + " ", " ", + " ", " SEEAEES ", + " D ", " C C ", + " C C ", " ", + " " }, + { " ", " ", + " C C ", " D ", + " A ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " DA AD ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " A ", " D ", + " C C ", " ", + " " }, + { " ", " C C ", + " C C ", " D ", + " A ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " CC CC ", + " DA AD ", " CC CC ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " A ", " D ", + " C C ", " C C ", + " " }, + { " ", " C C ", + " D ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " D D ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " D ", " C C ", + " " }, + { " ", " C C ", + " D ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " D D ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " D ", " C C ", + " " }, + { " CCCCCCC ", " C C ", + " DDDDDDD ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " D D ", + " D D ", "CCD DCC", + " D D ", "CCD DCC", + " D D ", " D D ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " DDDDDDD ", " C C ", + " C C " }, + { " CCHHHHHCC ", " DDDDD ", + " DD DD ", " ", + " ", " S S ", + " ", " S S ", + " ", " ", + " ", " ", + " D D ", " D D ", + " D D ", "CD DC", + " D D ", "CD DC", + " D D ", " D D ", + " D D ", " ", + " ", " ", + " ", " S S ", + " ", " S S ", + " ", " ", + " DD DD ", " DDDDD ", + " C C " }, + { " CHHHHHHHC ", " DDCDCDD ", + " D EEE D ", " ", + " C C ", " E E ", + " C C ", " E E ", + " ", " ", + " ", " ", + " D D ", " D D ", + " D D ", "CCE ECC", + " DE ED ", "CCE ECC", + " D D ", " D D ", + " D D ", " ", + " ", " ", + " ", " E E ", + " C C ", " E E ", + " C C ", " ", + " D EEE D ", " DDCDCDD ", + " C C " }, + { " CHHCCCHHC ", " CCCCDCCDCCDCCCC ", + " CCC D EAAAE D CCC ", " CC CC ", + " CC CC ", " CC E E CC ", + " CC CC ", " CC E E CC ", + " C C ", " CC CC ", + " C C ", " C C ", + "CCD DCC", "CD DC", + "CCE ECC", "CCA ACC", + "CDA ADC", "CCA ACC", + "CCE ECC", "CD DC", + "CCD DCC", " C C ", + " C C ", " CC CC ", + " C C ", " CC E E CC ", + " CC CC ", " CC E E CC ", + " CC CC ", " CC CC ", + " CCC D EAAAE D CCC ", " CCCCDCCDCCDCCCC ", + " CCCCCCCCC " }, + { " CHHC~CHHC ", " DDDDDDD ", + " DDD EAAAE DDD ", " DD DD ", + " CDAA AADC ", " DA AD ", + " CDA ADC ", " DA AD ", + " DA AD ", " DA AD ", + " D D ", " D D ", + " D D ", " D D ", + " DE ED ", "CDA ADC", + " DA AD ", "CDA ADC", + " DE ED ", " D D ", + " D D ", " D D ", + " D D ", " DA AD ", + " DA AD ", " DA AD ", + " CDA ADC ", " DA AD ", + " CDAA AADC ", " DD DD ", + " DDD EAAAE DDD ", " DDDDDDD ", + " C C " }, + { " CHHCCCHHC ", " CCCCDCCDCCDCCCC ", + " CCC D EAAAE D CCC ", " CC CC ", + " CC CC ", " CC E E CC ", + " CC CC ", " CC E E CC ", + " C C ", " CC CC ", + " C C ", " C C ", + "CCD DCC", "CD DC", + "CCE ECC", "CCA ACC", + "CDA ADC", "CCA ACC", + "CCE ECC", "CD DC", + "CCD DCC", " C C ", + " C C ", " CC CC ", + " C C ", " CC E E CC ", + " CC CC ", " CC E E CC ", + " CC CC ", " CC CC ", + " CCC D EAAAE D CCC ", " CCCCDCCDCCDCCCC ", + " CCCCCCCCC " }, + { " CHHHHHHHC ", " DDCDCDD ", + " D EEE D ", " ", + " C C ", " E E ", + " C C ", " E E ", + " ", " ", + " ", " ", + " D D ", " D D ", + " D D ", "CCE ECC", + " DE ED ", "CCE ECC", + " D D ", " D D ", + " D D ", " ", + " ", " ", + " ", " E E ", + " C C ", " E E ", + " C C ", " ", + " D EEE D ", " DDCDCDD ", + " C C " }, + { " CCHHHHHCC ", " DDDDD ", + " DD DD ", " ", + " ", " S S ", + " ", " S S ", + " ", " ", + " ", " ", + " D D ", " D D ", + " D D ", "CD DC", + " D D ", "CD DC", + " D D ", " D D ", + " D D ", " ", + " ", " ", + " ", " S S ", + " ", " S S ", + " ", " ", + " DD DD ", " DDDDD ", + " C C " }, + { " CCCCCCC ", " C C ", + " DDDDDDD ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " D D ", + " D D ", "CCD DCC", + " D D ", "CCD DCC", + " D D ", " D D ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " DDDDDDD ", " C C ", + " C C " }, + { " ", " C C ", + " D ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " D D ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " D ", " C C ", + " " }, + { " ", " C C ", + " D ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " D D ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " D ", " C C ", + " " }, + { " ", " C C ", + " C C ", " D ", + " A ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " CC CC ", + " DA AD ", " CC CC ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " A ", " D ", + " C C ", " C C ", + " " }, + { " ", " ", + " C C ", " D ", + " A ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " DA AD ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " A ", " D ", + " C C ", " ", + " " }, + { " ", " ", + " C C ", " C C ", + " D ", " SEEAEES ", + " ", " ", + " ", " ", + " ", " ", + " ", " S S ", + " E E ", " CC E E CC ", + " DA AD ", " CC E E CC ", + " E E ", " S S ", + " ", " ", + " ", " ", + " ", " ", + " ", " SEEAEES ", + " D ", " C C ", + " C C ", " ", + " " }, + { " ", " ", + " ", " C C ", + " CCCCC ", " D ", + " A ", " ", + " ", " ", + " ", " ", + " ", " ", + " C C ", " CC CC ", + " CDA ADC ", " CC CC ", + " C C ", " ", + " ", " ", + " ", " ", + " ", " ", + " A ", " D ", + " CCCCC ", " C C ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " C C ", " C C ", + " D ", " SEEAEES ", + " ", " ", + " ", " ", + " ", " S S ", + " E E ", " CC E E CC ", + " DA AD ", " CC E E CC ", + " E E ", " S S ", + " ", " ", + " ", " ", + " ", " SEEAEES ", + " D ", " C C ", + " C C ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " C C ", + " CCCCC ", " D ", + " A ", " A ", + " ", " ", + " ", " ", + " C C ", " CC CC ", + " CDAA AADC ", " CC CC ", + " C C ", " ", + " ", " ", + " ", " A ", + " A ", " D ", + " CCCCC ", " C C ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " ", + " C C ", " C C ", + " D ", " D ", + " ", " ", + " ", " ", + " ", " CC CC ", + " DD DD ", " CC CC ", + " ", " ", + " ", " ", + " ", " D ", + " D ", " C C ", + " C C ", " ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " C C ", " C C ", + " D ", " D ", + " DDDDDDD ", " DD DD ", + " D EEE D ", " CCC D EAAAE D CCC ", + " DDD EAAAE DDD ", " CCC D EAAAE D CCC ", + " D EEE D ", " DD DD ", + " DDDDDDD ", " D ", + " D ", " C C ", + " C C ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " C C ", + " C C ", " C C ", + " C C ", " DDDDD ", + " DDCDCDD ", " CCCCDCCDCCDCCCC ", + " DDDDDDD ", " CCCCDCCDCCDCCCC ", + " DDCDCDD ", " DDDDD ", + " C C ", " C C ", + " C C ", " C C ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " " }, + { " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " C C ", " C C ", + " C C ", " CCCCCCCCC ", + " C C ", " CCCCCCCCC ", + " C C ", " C C ", + " C C ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " ", " ", + " " } })) + .addElement( + 'A', + withChannel( + "spacetime compression", + ofBlocksTiered( + (block, meta) -> block == TT_Container_Casings.SpacetimeCompressionFieldGenerators ? meta : null, + ImmutableList.of( + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 0), + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 1), + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 2), + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 3), + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 4), + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 5), + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 6), + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 7), + Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 8)), + -1, + (t, meta) -> t.spacetimeCompressionFieldMetadata = meta, + t -> t.spacetimeCompressionFieldMetadata))) + .addElement( + 'S', + withChannel( + "stabilisation", + ofBlocksTiered( + (block, meta) -> block == TT_Container_Casings.StabilisationFieldGenerators ? meta : null, + ImmutableList.of( + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 0), + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 1), + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 2), + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 3), + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 4), + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 5), + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 6), + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 7), + Pair.of(TT_Container_Casings.StabilisationFieldGenerators, 8)), + -1, + (t, meta) -> t.stabilisationFieldMetadata = meta, + t -> t.stabilisationFieldMetadata))) + .addElement('C', ofBlock(sBlockCasingsBA0, 11)) + .addElement('D', ofBlock(sBlockCasingsBA0, 10)) + .addElement( + 'H', + buildHatchAdder(GT_MetaTileEntity_EM_EyeOfHarmony.class) + .atLeast(InputHatch, OutputHatch, InputBus, OutputBus) + .casingIndex(texturePage << 7) + .dot(1) + .buildAndChain(sBlockCasingsBA0, 12)) + .addElement( + 'E', + withChannel( + "time dilation", + ofBlocksTiered( + (block, meta) -> block == TT_Container_Casings.TimeAccelerationFieldGenerator ? meta : null, + ImmutableList.of( + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 0), + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 1), + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 2), + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 3), + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 4), + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 5), + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 6), + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 7), + Pair.of(TT_Container_Casings.TimeAccelerationFieldGenerator, 8)), + -1, + (t, meta) -> t.timeAccelerationFieldMetadata = meta, + t -> t.timeAccelerationFieldMetadata))) + .build(); + + private double hydrogenOverflowProbabilityAdjustment; + private double heliumOverflowProbabilityAdjustment; + private double stellarPlasmaOverflowProbabilityAdjustment; + private static final long TICKS_BETWEEN_HATCH_DRAIN = EOH_DEBUG_MODE ? 10 : 20; + + private List<ItemStackLong> outputItems = new ArrayList<>(); + private List<FluidStackLong> outputFluids = new ArrayList<>(); + + private void calculateInputFluidExcessValues(final long hydrogenRecipeRequirement, + final long heliumRecipeRequirement) { + + double hydrogenStored = getHydrogenStored(); + double heliumStored = getHeliumStored(); + double stellarPlasmaStored = getStellarPlasmaStored(); + + double hydrogenExcessPercentage = hydrogenStored / hydrogenRecipeRequirement - 1; + double heliumExcessPercentage = heliumStored / heliumRecipeRequirement - 1; + double stellarPlasmaExcessPercentage = stellarPlasmaStored + / (heliumRecipeRequirement * (12.4 / 1_000_000f) * parallelAmount) - 1; + + hydrogenOverflowProbabilityAdjustment = 1 - exp(-pow(30 * hydrogenExcessPercentage, 2)); + heliumOverflowProbabilityAdjustment = 1 - exp(-pow(30 * heliumExcessPercentage, 2)); + stellarPlasmaOverflowProbabilityAdjustment = 1 - exp(-pow(30 * stellarPlasmaExcessPercentage, 2)); + } + + private double recipeChanceCalculator() { + double chance = currentRecipe.getBaseRecipeSuccessChance() + - timeAccelerationFieldMetadata * TIME_ACCEL_DECREASE_CHANCE_PER_TIER + + stabilisationFieldMetadata * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER; + + if (parallelAmount > 1) { + chance -= stellarPlasmaOverflowProbabilityAdjustment; + } else { + chance -= (hydrogenOverflowProbabilityAdjustment + heliumOverflowProbabilityAdjustment); + } + + return MathHelper.clamp_double(chance, 0.0, 1.0); + } + + private double recipeYieldCalculator() { + double yield = 1.0 - stabilisationFieldMetadata * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER; + + if (parallelAmount > 1) { + yield -= stellarPlasmaOverflowProbabilityAdjustment; + } else { + yield -= (hydrogenOverflowProbabilityAdjustment + heliumOverflowProbabilityAdjustment); + } + return MathHelper.clamp_double(yield, 0.0, 1.0); + } + + private int recipeProcessTimeCalculator(final long recipeTime, final long recipeSpacetimeCasingRequired) { + + // Tier 1 recipe. + // Tier 2 spacetime blocks. + // = 3% discount. + + // Tier 1 recipe. + // Tier 3 spacetime blocks. + // = 3%*3% = 5.91% discount. + + final long spacetimeCasingDifference = (recipeSpacetimeCasingRequired - spacetimeCompressionFieldMetadata); + final double recipeTimeDiscounted = recipeTime * pow(2.0, -timeAccelerationFieldMetadata) + * pow(1 - SPACETIME_CASING_DIFFERENCE_DISCOUNT_PERCENTAGE, -spacetimeCasingDifference) + / max(1, pow(2, currentCircuitMultiplier)); + return (int) Math.max(recipeTimeDiscounted, 1.0); + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_EM_EyeOfHarmony> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + public GT_MetaTileEntity_EM_EyeOfHarmony(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_EyeOfHarmony(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_EyeOfHarmony(mName); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + + spacetimeCompressionFieldMetadata = -1; + timeAccelerationFieldMetadata = -1; + stabilisationFieldMetadata = -1; + + // Check structure of multi. + if (!structureCheck_EM(STRUCTURE_PIECE_MAIN, 16, 16, 0)) { + return false; + } + + // Make sure there are no Crafting Input Buffers/Buses/Slaves. + if (!mDualInputHatches.isEmpty()) { + return false; + } + + // Check if there is 1 output bus, and it is a ME output bus. + { + if (mOutputBusses.size() != 1) { + return false; + } + + if (!(mOutputBusses.get(0) instanceof GT_MetaTileEntity_Hatch_OutputBus_ME)) { + return false; + } + } + + // Check if there is 1 output hatch, and they are ME output hatches. + { + if (mOutputHatches.size() != 1) { + return false; + } + + if (!(mOutputHatches.get(0) instanceof GT_MetaTileEntity_Hatch_Output_ME)) { + return false; + } + } + + // Check there is 1 input bus, and it is not a stocking input bus. + { + if (mInputBusses.size() != 1) { + return false; + } + + if (mInputBusses.get(0) instanceof GT_MetaTileEntity_Hatch_InputBus_ME) { + return false; + } + } + + // Make sure there are no energy hatches. + { + if (mEnergyHatches.size() > 0) { + return false; + } + + if (mExoticEnergyHatches.size() > 0) { + return false; + } + } + + // Make sure there are 2 input hatches. + if (mInputHatches.size() != 2) { + return false; + } + + mHardHammer = true; + mSoftHammer = true; + mScrewdriver = true; + mCrowbar = true; + mSolderingTool = true; + mWrench = true; + return true; + } + + private boolean animationsEnabled = true; + + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + animationsEnabled = !animationsEnabled; + aPlayer.addChatMessage( + new ChatComponentText("Animations are now " + (animationsEnabled ? "enabled" : "disabled") + ".")); + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Spacetime Manipulator, EOH") + .addInfo(TOOLTIP_BAR) + .addInfo("Creates a pocket of spacetime that is bigger on the inside using transdimensional") + .addInfo("engineering. Certified Time Lord regulation compliant. This multi uses too much EU") + .addInfo("to be handled with conventional means. All EU requirements are handled directly by") + .addInfo("your wireless EU network.") + .addInfo(TOOLTIP_BAR) + .addInfo("This multiblock will constantly consume hydrogen and helium when it is not running a") + .addInfo("recipe once per second. It will store this internally, you can see the totals by") + .addInfo("using a scanner. This multi also has three tiered blocks with " + RED + 9 + GRAY + " tiers") + .addInfo("each. They are as follows and have the associated effects on the multi.") + .addInfo(BLUE + "Spacetime Compression Field Generator:") + .addInfo("- The tier of this block determines what recipes can be run. If the multiblocks") + .addInfo(" spacetime compression field block exceeds the requirements of the recipe it") + .addInfo( + " will decrease the processing time by " + RED + + formatNumbers(SPACETIME_CASING_DIFFERENCE_DISCOUNT_PERCENTAGE * 100) + + "%" + + GRAY + + " per tier over the requirement (multiplicative).") + .addInfo(BLUE + "Time Dilation Field Generator:") + .addInfo( + "- Decreases the time required for a recipe by " + RED + + "50%" + + GRAY + + " per tier of block (multiplicative).") + .addInfo( + " Decreases the probability of a recipe succeeding by " + RED + + formatNumbers(TIME_ACCEL_DECREASE_CHANCE_PER_TIER * 100) + + "%" + + GRAY + + " per tier (additive)") + .addInfo(BLUE + "Stabilisation Field Generator:") + .addInfo( + "- Increases the probability of a recipe succeeding by " + RED + + formatNumbers(STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER * 100) + + "%" + + GRAY + + " per tier (additive).") + .addInfo( + " Decreases the yield of a recipe by " + RED + + formatNumbers(STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER * 100) + + "%" + + GRAY + + " per tier (additive). ") + .addInfo(" > Low tier stabilisation field generators have a power output penalty.") + .addInfo( + " The power output penalty for using Crude Stabilisation Field Generators is " + RED + + formatNumbers( + STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER * TOTAL_CASING_TIERS_WITH_POWER_PENALTY + * 100) + + "%" + + GRAY + + ".") + .addInfo( + " This penalty decreases by " + RED + + formatNumbers(STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER * 100) + + "%" + + GRAY + + " per tier (additive).") + .addInfo(TOOLTIP_BAR) + .addInfo("Going over a recipe requirement on hydrogen or helium has a penalty on yield and recipe chance.") + .addInfo("All stored hydrogen and helium is consumed during a craft. The associated formulas are:") + .addInfo(GREEN + "Overflow ratio = (Stored fluid / Recipe requirement) - 1") + .addInfo(GREEN + "Adjustment value = 1 - exp(-(30 * Overflow ratio)^2)") + .addInfo("The Adjustment value is then subtracted from the total yield and recipe chance.") + .addInfo(TOOLTIP_BAR) + .addInfo("It should be noted that base recipe chance is determined per recipe and yield always starts") + .addInfo("at 1 and subtracts depending on penalties. All fluid/item outputs are multiplied by the") + .addInfo("yield. Failure fluid is exempt.") + .addInfo(TOOLTIP_BAR) + .addInfo("This multiblock can only output to ME output buses/hatches.") + .addInfo(TOOLTIP_BAR) + .addInfo("This multiblock can be overclocked by placing a programmed circuit into the input bus.") + .addInfo( + "E.g. A circuit of 2 will provide 2 OCs, 16x EU input and 0.25x the time. EU output is unaffected.") + .addInfo("All outputs are equal. All item and fluid output chances & amounts per recipe are unaffected.") + .addInfo(TOOLTIP_BAR) + .addInfo( + "If a recipe fails the EOH will output " + GREEN + + "Success chance * " + + formatNumbers(MOLTEN_SPACETIME_PER_FAILURE_TIER) + + " * (" + + SPACETIME_FAILURE_BASE + + ")^(Recipe tier)" + + GRAY + + "L of molten") + .addInfo( + MaterialsUEVplus.SpaceTime.getLocalizedNameForItem("%material") + + " instead of fluid/item outputs and output as much EU as a successful recipe.") + .addInfo(TOOLTIP_BAR) + .addInfo( + "This multiblock can perform parallel processing by placing Astral Array Fabricators into the input bus.") + .addInfo("The amount of parallel is calculated via these formulas:") + .addInfo(GREEN + "Parallel exponent = floor(log(8 * Astral Array amount) / log(1.7))") + .addInfo(GREEN + "Parallel = 2^(Parallel exponent)") + .addInfo("If the EOH is running parallel recipes, the power calculation changes.") + .addInfo("The power needed for parallel processing is calculated as follows:") + .addInfo(GREEN + "total EU = ((EU output - EU input * 1.63) / 9) * 2.3^(Parallel exponent - 1)") + .addInfo( + "Furthermore, if parallel recipes are run, the recipes consume " + + MaterialsUEVplus.RawStarMatter.getLocalizedNameForItem("%material")) + .addInfo("instead of helium and hydrogen. Overflow penalties still apply.") + .addInfo( + "The required amount of fluid to start a recipe is " + GREEN + + "12.4 / 10^6 * Helium amount * Parallel" + + GRAY + + ".") + .addInfo("The success or failure of each parallel is determined independently.") + .addInfo(TOOLTIP_BAR) + .addInfo("Animations can be disabled by using a screwdriver on the multiblock.") + .addSeparator() + .addStructureInfo("Eye of Harmony structure is too complex! See schematic for details.") + .addStructureInfo( + EnumChatFormatting.GOLD + "896" + EnumChatFormatting.GRAY + " Reinforced Spatial Structure Casing.") + .addStructureInfo( + EnumChatFormatting.GOLD + "534" + EnumChatFormatting.GRAY + " Reinforced Temporal Structure Casing.") + .addStructureInfo( + EnumChatFormatting.GOLD + "31" + + EnumChatFormatting.GRAY + + " Infinite SpaceTime Energy Boundary Casing.") + .addStructureInfo( + EnumChatFormatting.GOLD + "168" + EnumChatFormatting.GRAY + " Time Dilation Field Generator.") + .addStructureInfo( + EnumChatFormatting.GOLD + "48" + EnumChatFormatting.GRAY + " Stabilisation Field Generator.") + .addStructureInfo( + EnumChatFormatting.GOLD + "138" + EnumChatFormatting.GRAY + " Spacetime Compression Field Generator.") + .addStructureInfo("--------------------------------------------") + .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 2 + EnumChatFormatting.GRAY + " input hatches.") + .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 1 + EnumChatFormatting.GRAY + " ME output hatch.") + .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 1 + EnumChatFormatting.GRAY + " input bus.") + .addStructureInfo("Requires " + EnumChatFormatting.GOLD + 1 + EnumChatFormatting.GRAY + " ME output bus.") + .addStructureInfo("--------------------------------------------") + .beginStructureBlock(33, 33, 33, false) + .toolTipFinisher(AuthorColen.substring(8) + EnumChatFormatting.GRAY + "&" + CommonValues.TEC_MARK_EM); + return tt; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/EM_BHG"); + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/EM_BHG_ACTIVE"); + super.registerIcons(aBlockIconRegister); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][12], + new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][12] }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM(STRUCTURE_PIECE_MAIN, 16, 16, 0, stackSize, hintsOnly); + } + + private final Map<Fluid, Long> validFluidMap = new HashMap<>() { + + private static final long serialVersionUID = -8452610443191188130L; + + { + put(Materials.Hydrogen.mGas, 0L); + put(Materials.Helium.mGas, 0L); + put(MaterialsUEVplus.RawStarMatter.mFluid, 0L); + } + }; + + private void drainFluidFromHatchesAndStoreInternally() { + List<FluidStack> fluidStacks = getStoredFluids(); + for (FluidStack fluidStack : fluidStacks) { + if (validFluidMap.containsKey(fluidStack.getFluid())) { + validFluidMap.merge(fluidStack.getFluid(), (long) fluidStack.amount, Long::sum); + fluidStack.amount = 0; + } + } + updateSlots(); + } + + @Override + public RecipeMap<?> getRecipeMap() { + // Only for visual + return TecTechRecipeMaps.eyeOfHarmonyRecipes; + } + + private EyeOfHarmonyRecipe currentRecipe; + + // Counter for lag prevention. + private long lagPreventer = 0; + + // Check for recipe every recipeCheckInterval ticks. + private static final long RECIPE_CHECK_INTERVAL = 3 * 20; + private long currentCircuitMultiplier = 0; + private long astralArrayAmount = 0; + private long parallelAmount = 1; + private long successfulParallelAmount = 0; + private double yield = 0; + private BigInteger usedEU = BigInteger.ZERO; + private FluidStackLong stellarPlasma; + private FluidStackLong starMatter; + + @Override + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + ItemStack controllerStack = getControllerSlot(); + if (controllerStack == null) { + return SimpleCheckRecipeResult.ofFailure("no_planet_block"); + } + + lagPreventer++; + if (lagPreventer < RECIPE_CHECK_INTERVAL) { + lagPreventer = 0; + // No item in multi gui slot. + + currentRecipe = eyeOfHarmonyRecipeStorage.recipeLookUp(controllerStack); + if (currentRecipe == null) { + return CheckRecipeResultRegistry.NO_RECIPE; + } + CheckRecipeResult result = processRecipe(currentRecipe); + if (!result.wasSuccessful()) currentRecipe = null; + return result; + } + return CheckRecipeResultRegistry.NO_RECIPE; + } + + private long getHydrogenStored() { + return validFluidMap.get(Materials.Hydrogen.mGas); + } + + private long getHeliumStored() { + return validFluidMap.get(Materials.Helium.mGas); + } + + private long getStellarPlasmaStored() { + return validFluidMap.get(MaterialsUEVplus.RawStarMatter.mFluid); + } + + public CheckRecipeResult processRecipe(EyeOfHarmonyRecipe recipeObject) { + + // Get circuit damage, clamp it and then use it later for overclocking. + currentCircuitMultiplier = 0; + if (!mInputBusses.isEmpty()) { + for (ItemStack itemStack : mInputBusses.get(0) + .getRealInventory()) { + if (GT_Utility.isAnyIntegratedCircuit(itemStack)) { + currentCircuitMultiplier = MathHelper.clamp_int(itemStack.getItemDamage(), 0, 24); + break; + } + } + } + + astralArrayAmount = 0; + + for (ItemStack itemStack : mInputBusses.get(0) + .getRealInventory()) { + if (itemStack != null && itemStack.isItemEqual(astralArrayFabricator.get(1))) { + astralArrayAmount += itemStack.stackSize; + } + } + + long parallelExponent = 1; + + if (astralArrayAmount != 0) { + parallelExponent = (long) Math.floor(Math.log(8 * astralArrayAmount) / LOG_CONSTANT); + parallelAmount = (long) pow(2, parallelExponent); + } else { + parallelAmount = 1; + } + + // Debug mode, overwrites the required fluids to initiate the recipe to 100L of each. + if (parallelAmount > 1) { + if ((EOH_DEBUG_MODE && getStellarPlasmaStored() < 100) || (!EOH_DEBUG_MODE && getStellarPlasmaStored() + < currentRecipe.getHeliumRequirement() * (12.4 / 1_000_000f) * parallelAmount)) { + return SimpleCheckRecipeResult.ofFailure("no_stellar_plasma"); + } + } + + if (parallelAmount == 1) { + if ((EOH_DEBUG_MODE && getHydrogenStored() < 100) + || (!EOH_DEBUG_MODE && getHydrogenStored() < currentRecipe.getHydrogenRequirement() * parallelAmount)) { + return SimpleCheckRecipeResult.ofFailure("no_hydrogen"); + } + + if ((EOH_DEBUG_MODE && getHeliumStored() < 100) + || (!EOH_DEBUG_MODE && getHeliumStored() < currentRecipe.getHeliumRequirement() * parallelAmount)) { + return SimpleCheckRecipeResult.ofFailure("no_helium"); + } + } + + if (spacetimeCompressionFieldMetadata == -1) { + return CheckRecipeResultRegistry + .insufficientMachineTier((int) recipeObject.getSpacetimeCasingTierRequired()); + } + + // Check tier of spacetime compression blocks is high enough. + if ((spacetimeCompressionFieldMetadata + 1) < recipeObject.getSpacetimeCasingTierRequired()) { + return CheckRecipeResultRegistry + .insufficientMachineTier((int) recipeObject.getSpacetimeCasingTierRequired()); + } + + // Calculate multipliers used in power calculations + double powerMultiplier = Math.max(1, Math.pow(2.3, (parallelExponent - 1))); + + // Determine EU recipe input + startEU = recipeObject.getEUStartCost(); + + // Calculate normal EU values + double outputEUPenalty = (TOTAL_CASING_TIERS_WITH_POWER_PENALTY - stabilisationFieldMetadata) + * STABILITY_INCREASE_PROBABILITY_DECREASE_YIELD_PER_TIER; + outputEU_BigInt = BigInteger.valueOf((long) (recipeObject.getEUOutput() * (1 - outputEUPenalty))); + usedEU = BigInteger.valueOf(-startEU) + .multiply(BigInteger.valueOf((long) Math.pow(4, currentCircuitMultiplier))); + + // Calculate parallel EU values + if (parallelAmount > 1) { + outputEU_BigInt = outputEU_BigInt + .multiply(BigInteger.valueOf((long) (powerMultiplier * PRECISION_MULTIPLIER))) + .divide(BigInteger.valueOf(PRECISION_MULTIPLIER * POWER_DIVISION_CONSTANT)); + + usedEU = usedEU + .multiply( + BigInteger.valueOf((long) (powerMultiplier * PARALLEL_MULTIPLIER_CONSTANT * PRECISION_MULTIPLIER))) + .divide(BigInteger.valueOf(PRECISION_MULTIPLIER * POWER_DIVISION_CONSTANT)); + } + + // Remove EU from the users network. + if (!addEUToGlobalEnergyMap(userUUID, usedEU)) { + return SimpleCheckRecipeResult.ofFailure("insufficient_power_no_val"); + } + + mMaxProgresstime = recipeProcessTimeCalculator( + recipeObject.getRecipeTimeInTicks(), + recipeObject.getSpacetimeCasingTierRequired()); + + calculateInputFluidExcessValues(recipeObject.getHydrogenRequirement(), recipeObject.getHeliumRequirement()); + + if (EOH_DEBUG_MODE) { + hydrogenOverflowProbabilityAdjustment = 0; + heliumOverflowProbabilityAdjustment = 0; + stellarPlasmaOverflowProbabilityAdjustment = 0; + } + + successChance = recipeChanceCalculator(); + currentRecipeRocketTier = currentRecipe.getRocketTier(); + + // Reduce internal storage by input fluid quantity required for recipe. + if (parallelAmount > 1) { + validFluidMap.put(MaterialsUEVplus.RawStarMatter.mFluid, 0L); + } else { + validFluidMap.put(Materials.Hydrogen.mGas, 0L); + validFluidMap.put(Materials.Helium.mGas, 0L); + } + + yield = recipeYieldCalculator(); + if (EOH_DEBUG_MODE) { + successChance = 1; // Debug recipes, sets them to 100% output chance. + } + + // Return copies of the output objects. + outputFluids = recipeObject.getOutputFluids(); + outputItems = recipeObject.getOutputItems(); + + // Star matter is always the last element in the array. + starMatter = new FluidStackLong(outputFluids.get(outputFluids.size() - 1)); + + // And stellar plasma is the second last. + stellarPlasma = new FluidStackLong(outputFluids.get(outputFluids.size() - 2)); + + successfulParallelAmount = (long) calculateChancedOutputMultiplier( + (int) (10000 * successChance), + (int) parallelAmount); + // Iterate over item output list and apply yield & successful parallel values. + for (ItemStackLong itemStackLong : outputItems) { + itemStackLong.stackSize *= yield * successfulParallelAmount; + } + + // Iterate over fluid output list and apply yield & successful parallel values. + for (FluidStackLong fluidStackLong : outputFluids) { + fluidStackLong.amount *= yield * successfulParallelAmount; + } + + updateSlots(); + + if (animationsEnabled) { + createRenderBlock(currentRecipe); + } + + recipeRunning = true; + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + private void createRenderBlock(final EyeOfHarmonyRecipe currentRecipe) { + + IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); + + int x = gregTechTileEntity.getXCoord(); + int y = gregTechTileEntity.getYCoord(); + int z = gregTechTileEntity.getZCoord(); + + double xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX; + double zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + double yOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetY; + + this.getBaseMetaTileEntity() + .getWorld() + .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); + this.getBaseMetaTileEntity() + .getWorld() + .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), eyeOfHarmonyRenderBlock); + TileEyeOfHarmony rendererTileEntity = (TileEyeOfHarmony) this.getBaseMetaTileEntity() + .getWorld() + .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset)); + + rendererTileEntity.setTier(currentRecipe.getRocketTier()); + + int recipeSpacetimeTier = (int) currentRecipe.getSpacetimeCasingTierRequired(); + + // Star is a larger size depending on the spacetime tier of the recipe. + rendererTileEntity.setSize((1 + recipeSpacetimeTier)); + + // Star rotates faster the higher tier time dilation you use in the multi. + // Lower value = faster rotation speed. + rendererTileEntity.setRotationSpeed((1 + timeAccelerationFieldMetadata) / 2.0f); + } + + private double successChance; + private long currentRecipeRocketTier; + + private void outputFailedChance() { + long failedParallelAmount = parallelAmount - successfulParallelAmount; + if (failedParallelAmount > 0) { + // 2^Tier spacetime released upon recipe failure. + outputFluidToAENetwork( + MaterialsUEVplus.SpaceTime.getMolten(1), + (long) ((successChance * MOLTEN_SPACETIME_PER_FAILURE_TIER + * pow(SPACETIME_FAILURE_BASE, currentRecipeRocketTier + 1)) * failedParallelAmount)); + } + super.outputAfterRecipe_EM(); + } + + @Override + public void stopMachine(@Nonnull ShutDownReason reason) { + super.stopMachine(reason); + destroyRenderBlock(); + recipeRunning = false; + } + + @Override + public void onBlockDestroyed() { + super.onBlockDestroyed(); + destroyRenderBlock(); + } + + private void destroyRenderBlock() { + IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); + + int x = gregTechTileEntity.getXCoord(); + int y = gregTechTileEntity.getYCoord(); + int z = gregTechTileEntity.getZCoord(); + + double xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX; + double zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + double yOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetY; + + this.getBaseMetaTileEntity() + .getWorld() + .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); + } + + public void outputAfterRecipe_EM() { + recipeRunning = false; + eRequiredData = 0L; + + destroyRenderBlock(); + + // Output EU + addEUToGlobalEnergyMap(userUUID, outputEU_BigInt); + + startEU = 0; + outputEU_BigInt = BigInteger.ZERO; + + outputFailedChance(); + + if (successfulParallelAmount > 0) { + for (ItemStackLong itemStack : outputItems) { + outputItemToAENetwork(itemStack.itemStack, itemStack.stackSize); + } + + for (FluidStackLong fluidStack : outputFluids) { + outputFluidToAENetwork(fluidStack.fluidStack, fluidStack.amount); + } + } + + // Clear the array list for new recipes. + outputItems = new ArrayList<>(); + outputFluids = new ArrayList<>(); + + // Do other stuff from TT superclasses. E.g. outputting fluids. + super.outputAfterRecipe_EM(); + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + + if (aTick == 1) { + userUUID = String.valueOf(getBaseMetaTileEntity().getOwnerUuid()); + String userName = getBaseMetaTileEntity().getOwnerName(); + strongCheckOrAddUser(userUUID, userName); + } + + if (!recipeRunning && mMachine) { + if ((aTick % TICKS_BETWEEN_HATCH_DRAIN) == 0) { + drainFluidFromHatchesAndStoreInternally(); + } + } + } + + private boolean recipeRunning = false; + + // Will void if AE network is full. + private void outputItemToAENetwork(ItemStack item, long amount) { + + if ((item == null) || (amount <= 0)) { + return; + } + + if (amount < Integer.MAX_VALUE) { + ItemStack tmpItem = item.copy(); + tmpItem.stackSize = (int) amount; + ((GT_MetaTileEntity_Hatch_OutputBus_ME) mOutputBusses.get(0)).store(tmpItem); + } else { + // For item stacks > Int max. + while (amount >= Integer.MAX_VALUE) { + ItemStack tmpItem = item.copy(); + tmpItem.stackSize = Integer.MAX_VALUE; + ((GT_MetaTileEntity_Hatch_OutputBus_ME) mOutputBusses.get(0)).store(tmpItem); + amount -= Integer.MAX_VALUE; + } + ItemStack tmpItem = item.copy(); + tmpItem.stackSize = (int) amount; + ((GT_MetaTileEntity_Hatch_OutputBus_ME) mOutputBusses.get(0)).store(tmpItem); + } + } + + private void outputFluidToAENetwork(FluidStack fluid, long amount) { + + if ((fluid == null) || (amount <= 0)) { + return; + } + + if (amount < Integer.MAX_VALUE) { + FluidStack tmpFluid = fluid.copy(); + tmpFluid.amount = (int) amount; + ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid); + } else { + // For fluidStacks > Int max. + while (amount >= Integer.MAX_VALUE) { + FluidStack tmpFluid = fluid.copy(); + tmpFluid.amount = Integer.MAX_VALUE; + ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid); + amount -= Integer.MAX_VALUE; + } + FluidStack tmpFluid = fluid.copy(); + tmpFluid.amount = (int) amount; + ((GT_MetaTileEntity_Hatch_Output_ME) mOutputHatches.get(0)).tryFillAE(tmpFluid); + } + } + + @Override + public String[] getInfoData() { + ArrayList<String> str = new ArrayList<>(Arrays.asList(super.getInfoData())); + str.add(GOLD + "---------------- Control Block Statistics ----------------"); + if (spacetimeCompressionFieldMetadata < 0) { + str.add("Spacetime Compression Field Grade: None"); + } else { + str.add( + "Spacetime Compression Field Grade: " + EOH_TIER_FANCY_NAMES[spacetimeCompressionFieldMetadata] + + RESET + + " (" + + YELLOW + + spacetimeCompressionFieldMetadata + + RESET + + ")"); + } + if (timeAccelerationFieldMetadata < 0) { + str.add("Time Dilation Field Grade: None"); + } else { + str.add( + "Time Dilation Field Grade: " + EOH_TIER_FANCY_NAMES[timeAccelerationFieldMetadata] + + RESET + + " (" + + YELLOW + + timeAccelerationFieldMetadata + + RESET + + ")"); + } + if (stabilisationFieldMetadata < 0) { + str.add("Stabilisation Field Grade: None"); + } else { + str.add( + "Stabilisation Field Grade: " + EOH_TIER_FANCY_NAMES[stabilisationFieldMetadata] + + RESET + + " (" + + YELLOW + + stabilisationFieldMetadata + + RESET + + ")"); + } + str.add(GOLD + "----------------- Internal Fluids Stored ----------------"); + validFluidMap.forEach( + (key, value) -> str.add(BLUE + key.getLocalizedName() + RESET + " : " + RED + formatNumbers(value))); + if (recipeRunning) { + str.add(GOLD + "---------------------- Other Stats ---------------"); + str.add("Recipe Success Chance: " + RED + formatNumbers(100 * successChance) + RESET + "%"); + str.add("Recipe Yield: " + RED + formatNumbers(100 * yield) + RESET + "%"); + str.add("Astral Array Fabricators detected: " + RED + formatNumbers(astralArrayAmount)); + str.add("Total Parallel: " + RED + formatNumbers(parallelAmount)); + str.add("EU Output: " + RED + toStandardForm(outputEU_BigInt) + RESET + " EU"); + str.add("EU Input: " + RED + toStandardForm(usedEU.abs()) + RESET + " EU"); + int currentMaxProgresstime = Math.max(maxProgresstime(), 1); + if (starMatter != null && starMatter.fluidStack != null) { + FluidStackLong starMatterOutput = new FluidStackLong( + starMatter.fluidStack, + (long) (starMatter.amount * yield * successChance * parallelAmount)); + str.add( + "Average " + starMatterOutput.fluidStack.getLocalizedName() + + " Output: " + + RED + + formatNumbers(starMatterOutput.amount) + + RESET + + " L, " + + YELLOW + + formatNumbers(starMatterOutput.amount * 20.0 / currentMaxProgresstime) + + RESET + + " L/s"); + + FluidStackLong stellarPlasmaOutput = new FluidStackLong( + MaterialsUEVplus.RawStarMatter.getFluid(0), + (long) (stellarPlasma.amount * yield * successChance * parallelAmount)); + str.add( + "Average " + stellarPlasmaOutput.fluidStack.getLocalizedName() + + " Output: " + + RED + + formatNumbers(stellarPlasmaOutput.amount) + + RESET + + " L, " + + YELLOW + + formatNumbers(stellarPlasmaOutput.amount * 20.0 / currentMaxProgresstime) + + RESET + + " L/s"); + } + BigInteger euPerTick = (outputEU_BigInt.subtract(usedEU.abs())) + .divide(BigInteger.valueOf(currentMaxProgresstime)); + + str.add("Estimated EU/t: " + RED + toStandardForm(euPerTick) + RESET + " EU/t"); + } + str.add(GOLD + "-----------------------------------------------------"); + return str.toArray(new String[0]); + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return new String[] { "Eye of Harmony multiblock" }; + } + + // NBT save/load strings. + private static final String EYE_OF_HARMONY = "eyeOfHarmonyOutput"; + private static final String NUMBER_OF_ITEMS_NBT_TAG = EYE_OF_HARMONY + "numberOfItems"; + private static final String NUMBER_OF_FLUIDS_NBT_TAG = EYE_OF_HARMONY + "numberOfFluids"; + private static final String ITEM_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "itemOutput"; + private static final String FLUID_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "fluidOutput"; + private static final String RECIPE_RUNNING_NBT_TAG = EYE_OF_HARMONY + "recipeRunning"; + private static final String CURRENT_RECIPE_STAR_MATTER_TAG = EYE_OF_HARMONY + "recipeStarMatter"; + private static final String CURRENT_RECIPE_STELLAR_PLASMA_TAG = EYE_OF_HARMONY + "recipeStellarPlasma"; + private static final String CURRENT_RECIPE_FIXED_OUTPUTS_TAG = EYE_OF_HARMONY + "recipeFixedOutputs"; + private static final String RECIPE_SUCCESS_CHANCE_NBT_TAG = EYE_OF_HARMONY + "recipeSuccessChance"; + private static final String ROCKET_TIER_NBT_TAG = EYE_OF_HARMONY + "rocketTier"; + private static final String CURRENT_CIRCUIT_MULTIPLIER_TAG = EYE_OF_HARMONY + "currentCircuitMultiplier"; + private static final String ANIMATIONS_ENABLED = EYE_OF_HARMONY + "animationsEnabled"; + private static final String CALCULATED_EU_OUTPUT_NBT_TAG = EYE_OF_HARMONY + "outputEU_BigInt"; + private static final String PARALLEL_AMOUNT_NBT_TAG = EYE_OF_HARMONY + "parallelAmount"; + private static final String YIELD_NBT_TAG = EYE_OF_HARMONY + "yield"; + private static final String SUCCESSFUL_PARALLEL_AMOUNT_NBT_TAG = EYE_OF_HARMONY + "successfulParallelAmount"; + private static final String ASTRAL_ARRAY_AMOUNT_NBT_TAG = EYE_OF_HARMONY + "astralArrayAmount"; + private static final String CALCULATED_EU_INPUT_NBT_TAG = EYE_OF_HARMONY + "usedEU"; + + // Sub tags, less specific names required. + private static final String STACK_SIZE = "stackSize"; + private static final String ITEM_STACK_NBT_TAG = "itemStack"; + private static final String FLUID_AMOUNT = "fluidAmount"; + private static final String FLUID_STACK_NBT_TAG = "fluidStack"; + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + // Save the quantity of fluid stored inside the controller. + validFluidMap.forEach((key, value) -> aNBT.setLong("stored." + key.getUnlocalizedName(), value)); + + aNBT.setBoolean(RECIPE_RUNNING_NBT_TAG, recipeRunning); + aNBT.setDouble(RECIPE_SUCCESS_CHANCE_NBT_TAG, successChance); + aNBT.setLong(ROCKET_TIER_NBT_TAG, currentRecipeRocketTier); + aNBT.setLong(CURRENT_CIRCUIT_MULTIPLIER_TAG, currentCircuitMultiplier); + aNBT.setBoolean(ANIMATIONS_ENABLED, animationsEnabled); + aNBT.setLong(PARALLEL_AMOUNT_NBT_TAG, parallelAmount); + aNBT.setLong(SUCCESSFUL_PARALLEL_AMOUNT_NBT_TAG, successfulParallelAmount); + aNBT.setDouble(YIELD_NBT_TAG, yield); + aNBT.setLong(ASTRAL_ARRAY_AMOUNT_NBT_TAG, astralArrayAmount); + aNBT.setByteArray(CALCULATED_EU_OUTPUT_NBT_TAG, outputEU_BigInt.toByteArray()); + aNBT.setByteArray(CALCULATED_EU_INPUT_NBT_TAG, usedEU.toByteArray()); + + // Store damage values/stack sizes of GT items being outputted. + NBTTagCompound itemStackListNBTTag = new NBTTagCompound(); + itemStackListNBTTag.setLong(NUMBER_OF_ITEMS_NBT_TAG, outputItems.size()); + + int index = 0; + for (ItemStackLong itemStackLong : outputItems) { + // Save stack size to NBT. + itemStackListNBTTag.setLong(index + STACK_SIZE, itemStackLong.stackSize); + + // Save ItemStack to NBT. + aNBT.setTag(index + ITEM_STACK_NBT_TAG, itemStackLong.itemStack.writeToNBT(new NBTTagCompound())); + + index++; + } + + aNBT.setTag(ITEM_OUTPUT_NBT_TAG, itemStackListNBTTag); + + // Store damage values/stack sizes of GT fluids being outputted. + NBTTagCompound fluidStackListNBTTag = new NBTTagCompound(); + fluidStackListNBTTag.setLong(NUMBER_OF_FLUIDS_NBT_TAG, outputFluids.size()); + + int indexFluids = 0; + for (FluidStackLong fluidStackLong : outputFluids) { + // Save fluid amount to NBT. + fluidStackListNBTTag.setLong(indexFluids + FLUID_AMOUNT, fluidStackLong.amount); + + // Save FluidStack to NBT. + aNBT.setTag(indexFluids + FLUID_STACK_NBT_TAG, fluidStackLong.fluidStack.writeToNBT(new NBTTagCompound())); + + indexFluids++; + } + + aNBT.setTag(FLUID_OUTPUT_NBT_TAG, fluidStackListNBTTag); + + if (starMatter != null && starMatter.fluidStack != null) { + + NBTTagCompound fixedRecipeOutputs = new NBTTagCompound(); + + fixedRecipeOutputs.setLong(0 + FLUID_AMOUNT, starMatter.amount); + aNBT.setTag(CURRENT_RECIPE_STAR_MATTER_TAG, starMatter.fluidStack.writeToNBT(new NBTTagCompound())); + + fixedRecipeOutputs.setLong(1 + FLUID_AMOUNT, stellarPlasma.amount); + aNBT.setTag(CURRENT_RECIPE_STELLAR_PLASMA_TAG, stellarPlasma.fluidStack.writeToNBT(new NBTTagCompound())); + + aNBT.setTag(CURRENT_RECIPE_FIXED_OUTPUTS_TAG, fixedRecipeOutputs); + } + + super.saveNBTData(aNBT); + } + + @Override + public void loadNBTData(final NBTTagCompound aNBT) { + + // Load the quantity of fluid stored inside the controller. + validFluidMap + .forEach((key, value) -> validFluidMap.put(key, aNBT.getLong("stored." + key.getUnlocalizedName()))); + + // Load other stuff from NBT. + recipeRunning = aNBT.getBoolean(RECIPE_RUNNING_NBT_TAG); + successChance = aNBT.getDouble(RECIPE_SUCCESS_CHANCE_NBT_TAG); + currentRecipeRocketTier = aNBT.getLong(ROCKET_TIER_NBT_TAG); + currentCircuitMultiplier = aNBT.getLong(CURRENT_CIRCUIT_MULTIPLIER_TAG); + animationsEnabled = aNBT.getBoolean(ANIMATIONS_ENABLED); + parallelAmount = aNBT.getLong(PARALLEL_AMOUNT_NBT_TAG); + yield = aNBT.getDouble(YIELD_NBT_TAG); + successfulParallelAmount = aNBT.getLong(SUCCESSFUL_PARALLEL_AMOUNT_NBT_TAG); + astralArrayAmount = aNBT.getLong(ASTRAL_ARRAY_AMOUNT_NBT_TAG); + outputEU_BigInt = new BigInteger(aNBT.getByteArray(CALCULATED_EU_OUTPUT_NBT_TAG)); + usedEU = new BigInteger(aNBT.getByteArray(CALCULATED_EU_INPUT_NBT_TAG)); + + // Load damage values/stack sizes of GT items being outputted and convert back to items. + NBTTagCompound tempItemTag = aNBT.getCompoundTag(ITEM_OUTPUT_NBT_TAG); + + // Iterate over all stored items. + for (int index = 0; index < tempItemTag.getInteger(NUMBER_OF_ITEMS_NBT_TAG); index++) { + + // Load stack size from NBT. + long stackSize = tempItemTag.getLong(index + STACK_SIZE); + + // Load ItemStack from NBT. + ItemStack itemStack = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag(index + ITEM_STACK_NBT_TAG)); + + outputItems.add(new ItemStackLong(itemStack, stackSize)); + } + + // Load damage values/fluid amounts of GT fluids being outputted and convert back to fluids. + NBTTagCompound tempFluidTag = aNBT.getCompoundTag(FLUID_OUTPUT_NBT_TAG); + + // Iterate over all stored fluids. + for (int indexFluids = 0; indexFluids < tempFluidTag.getInteger(NUMBER_OF_FLUIDS_NBT_TAG); indexFluids++) { + + // Load fluid amount from NBT. + long fluidAmount = tempFluidTag.getLong(indexFluids + FLUID_AMOUNT); + + // Load FluidStack from NBT. + FluidStack fluidStack = FluidStack + .loadFluidStackFromNBT(aNBT.getCompoundTag(indexFluids + FLUID_STACK_NBT_TAG)); + + outputFluids.add(new FluidStackLong(fluidStack, fluidAmount)); + } + + tempFluidTag = aNBT.getCompoundTag(CURRENT_RECIPE_FIXED_OUTPUTS_TAG); + starMatter = new FluidStackLong( + FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag(CURRENT_RECIPE_STAR_MATTER_TAG)), + tempFluidTag.getLong(0 + FLUID_AMOUNT)); + stellarPlasma = new FluidStackLong( + FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag(CURRENT_RECIPE_STELLAR_PLASMA_TAG)), + tempFluidTag.getLong(1 + FLUID_AMOUNT)); + + super.loadNBTData(aNBT); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java new file mode 100644 index 0000000000..6d6d7fdb43 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java @@ -0,0 +1,2385 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.GodforgeCasings; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.forgeOfGodsRenderBlock; +import static com.github.technus.tectech.util.GodforgeMath.allowModuleConnection; +import static com.github.technus.tectech.util.GodforgeMath.calculateEnergyDiscountForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateFuelConsumption; +import static com.github.technus.tectech.util.GodforgeMath.calculateMaxFuelFactor; +import static com.github.technus.tectech.util.GodforgeMath.calculateMaxHeatForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateMaxParallelForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateProcessingVoltageForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateSpeedBonusForModules; +import static com.github.technus.tectech.util.GodforgeMath.calculateStartupFuelConsumption; +import static com.github.technus.tectech.util.GodforgeMath.queryMilestoneStats; +import static com.github.technus.tectech.util.GodforgeMath.setMiscModuleParameters; +import static com.github.technus.tectech.util.TT_Utility.toExponentForm; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static gregtech.api.enums.Mods.Avaritia; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GT_ModHandler.getModItem; +import static gregtech.api.util.GT_RecipeBuilder.SECONDS; +import static gregtech.api.util.GT_Utility.formatNumbers; +import static java.lang.Math.floor; +import static java.lang.Math.log; +import static java.lang.Math.max; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +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.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.CustomItemList; +import com.github.technus.tectech.thing.block.GodforgeGlassBlock; +import com.github.technus.tectech.thing.block.TileForgeOfGods; +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_BaseModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule; +import com.github.technus.tectech.util.CommonValues; +import com.google.common.math.LongMath; +import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizons.modularui.api.ModularUITextures; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.MainAxisAlignment; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Interactable; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.FluidNameHolderWidget; +import com.gtnewhorizons.modularui.common.widget.MultiChildWidget; +import com.gtnewhorizons.modularui.common.widget.ProgressBar; +import com.gtnewhorizons.modularui.common.widget.Scrollable; +import com.gtnewhorizons.modularui.common.widget.SlotGroup; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; +import gregtech.api.util.GT_HatchElementBuilder; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.IGT_HatchAdder; + +public class GT_MetaTileEntity_EM_ForgeOfGods extends GT_MetaTileEntity_MultiblockBase_EM + implements IConstructable, ISurvivalConstructable { + + private static Textures.BlockIcons.CustomIcon ScreenON; + + private int fuelConsumptionFactor = 1; + private int selectedFuelType = 0; + private int internalBattery = 0; + private int maxBatteryCharge = 100; + private int gravitonShardsAvailable = 0; + private int gravitonShardsSpent = 0; + private int ringAmount = 1; + private int stellarFuelAmount = 0; + private int neededStartupFuel = 0; + private long fuelConsumption = 0; + private long totalRecipesProcessed = 0; + private long totalFuelConsumed = 0; + private float totalExtensionsBuilt = 0; + private float powerMilestonePercentage = 0; + private float recipeMilestonePercentage = 0; + private float fuelMilestonePercentage = 0; + private float structureMilestonePercentage = 0; + private float invertedPowerMilestonePercentage = 0; + private float invertedRecipeMilestonePercentage = 0; + private float invertedFuelMilestonePercentage = 0; + private float invertedStructureMilestonePercentage = 0; + private BigInteger totalPowerConsumed = BigInteger.ZERO; + private boolean batteryCharging = false; + private boolean inversion = false; + public ArrayList<GT_MetaTileEntity_EM_BaseModule> moduleHatches = new ArrayList<>(); + protected ItemStackHandler inputSlotHandler = new ItemStackHandler(16); + + private static final int FUEL_CONFIG_WINDOW_ID = 9; + private static final int UPGRADE_TREE_WINDOW_ID = 10; + private static final int INDIVIDUAL_UPGRADE_WINDOW_ID = 11; + private static final int BATTERY_CONFIG_WINDOW_ID = 12; + private static final int MILESTONE_WINDOW_ID = 13; + private static final int INDIVIDUAL_MILESTONE_WINDOW_ID = 14; + private static final int MANUAL_INSERTION_WINDOW_ID = 15; + private static final int TEXTURE_INDEX = 960; + private static final int[] FIRST_SPLIT_UPGRADES = new int[] { 12, 13, 14 }; + private static final long POWER_MILESTONE_CONSTANT = LongMath.pow(10, 15); + private static final long RECIPE_MILESTONE_CONSTANT = LongMath.pow(10, 7); + private static final long FUEL_MILESTONE_CONSTANT = 10_000; + private static final long RECIPE_MILESTONE_T7_CONSTANT = RECIPE_MILESTONE_CONSTANT * LongMath.pow(6, 6); + private static final long FUEL_MILESTONE_T7_CONSTANT = FUEL_MILESTONE_CONSTANT * LongMath.pow(3, 6); + private static final BigInteger POWER_MILESTONE_T7_CONSTANT = BigInteger.valueOf(POWER_MILESTONE_CONSTANT) + .multiply(BigInteger.valueOf(LongMath.pow(9, 6))); + private static final double POWER_LOG_CONSTANT = Math.log(9); + private static final double RECIPE_LOG_CONSTANT = Math.log(6); + private static final double FUEL_LOG_CONSTANT = Math.log(3); + protected static final String STRUCTURE_PIECE_MAIN = "main"; + protected static final String STRUCTURE_PIECE_SECOND_RING = "second_ring"; + protected static final String STRUCTURE_PIECE_THIRD_RING = "third_ring"; + private static final String TOOLTIP_BAR = EnumChatFormatting.BLUE + "--------------------------------------------"; + private static final ItemStack STELLAR_FUEL = Avaritia.isModLoaded() ? getModItem(Avaritia.ID, "Resource", 1, 8) + : GT_OreDictUnificator.get(OrePrefixes.block, Materials.CosmicNeutronium, 1); + + private final boolean debugMode = true; + + public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { + if (mMachine) return -1; + int realBudget = elementBudget >= 1000 ? elementBudget : Math.min(1000, elementBudget * 5); + // 1000 blocks max per placement. + int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 63, 20, 1, realBudget, env, false, true); + if (isUpgradeActive(26) && stackSize.stackSize > 1) { + built += survivialBuildPiece( + STRUCTURE_PIECE_SECOND_RING, + stackSize, + 55, + 11, + -67, + realBudget, + env, + false, + true); + } + if (isUpgradeActive(29) && stackSize.stackSize > 2) { + built += survivialBuildPiece( + STRUCTURE_PIECE_THIRD_RING, + stackSize, + 47, + 13, + -76, + realBudget, + env, + false, + true); + } + return built; + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_EM_ForgeOfGods> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + public static final IStructureDefinition<GT_MetaTileEntity_EM_ForgeOfGods> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_EM_ForgeOfGods>builder() + .addShape(STRUCTURE_PIECE_MAIN, ForgeOfGodsStructureString.MAIN_STRUCTURE) + .addShape(STRUCTURE_PIECE_SECOND_RING, ForgeOfGodsRingsStructureString.SECOND_RING) + .addShape(STRUCTURE_PIECE_THIRD_RING, ForgeOfGodsRingsStructureString.THIRD_RING) + .addElement('A', classicHatches(TEXTURE_INDEX + 3, 1, GodforgeCasings, 3)) + .addElement('B', ofBlock(GodforgeCasings, 0)) + .addElement('C', ofBlock(GodforgeCasings, 1)) + .addElement('D', ofBlock(GodforgeCasings, 2)) + .addElement('E', ofBlock(GodforgeCasings, 3)) + .addElement('F', ofBlock(GodforgeCasings, 4)) + .addElement('G', ofBlock(GodforgeCasings, 5)) + .addElement('H', ofBlock(GodforgeGlassBlock.INSTANCE, 0)) + .addElement('I', ofBlock(GodforgeCasings, 7)) + .addElement( + 'J', + GT_HatchElementBuilder.<GT_MetaTileEntity_EM_ForgeOfGods>builder() + .atLeast(moduleElement.Module) + .casingIndex(TEXTURE_INDEX) + .dot(3) + .buildAndChain(GodforgeCasings, 0)) + .addElement('K', ofBlock(GodforgeCasings, 6)) + .build(); + + public GT_MetaTileEntity_EM_ForgeOfGods(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_ForgeOfGods(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_ForgeOfGods(mName); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/GODFORGE_CONTROLLER"); + super.registerIcons(aBlockIconRegister); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX + 1), + new TT_RenderedExtendedFacingTexture(ScreenON) }; + } + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX + 1) }; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM(STRUCTURE_PIECE_MAIN, 63, 14, 1, stackSize, hintsOnly); + if (isUpgradeActive(26) && stackSize.stackSize > 1) { + buildPiece(STRUCTURE_PIECE_SECOND_RING, stackSize, hintsOnly, 55, 11, -67); + } + if (isUpgradeActive(29) && stackSize.stackSize > 2) { + buildPiece(STRUCTURE_PIECE_THIRD_RING, stackSize, hintsOnly, 47, 13, -76); + } + } + + private final ArrayList<FluidStack> validFuelList = new ArrayList<>() { + + { + add(MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1)); + add(MaterialsUEVplus.RawStarMatter.getFluid(1)); + add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1)); + } + }; + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + + moduleHatches.clear(); + + // Check structure of multi. + if (!structureCheck_EM(STRUCTURE_PIECE_MAIN, 63, 14, 1)) { + return false; + } + + // Check there is 1 input bus. + if (mInputBusses.size() != 1) { + return false; + } + + // Make sure there are no energy hatches. + + if (mEnergyHatches.size() > 0) { + return false; + } + + if (mExoticEnergyHatches.size() > 0) { + return false; + } + + // Make sure there is 1 input hatch. + if (mInputHatches.size() != 1) { + return false; + } + + if (isUpgradeActive(26) && checkPiece(STRUCTURE_PIECE_SECOND_RING, 55, 11, -67)) { + ringAmount = 2; + if (isUpgradeActive(29) && checkPiece(STRUCTURE_PIECE_THIRD_RING, 47, 13, -76)) { + ringAmount = 3; + } + } + + mHardHammer = true; + mSoftHammer = true; + mScrewdriver = true; + mCrowbar = true; + mSolderingTool = true; + mWrench = true; + return true; + } + + int ticker = 0; + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide()) { + ticker++; + // Check and drain fuel + if (ticker % (5 * SECONDS) == 0) { + ticker = 0; + FluidStack fluidInHatch = null; + if (mInputHatches != null && mInputHatches.size() != 0) { + fluidInHatch = mInputHatches.get(0) + .getFluid(); + } + int maxModuleCount = 8; + + if (upgrades[26]) { + maxModuleCount += 4; + } + if (upgrades[29]) { + maxModuleCount += 4; + } + if (getBaseMetaTileEntity().isAllowedToWork()) { + if (internalBattery == 0) { + + for (ItemStack itemStack : mInputBusses.get(0) + .getRealInventory()) { + if (itemStack != null && itemStack.isItemEqual(STELLAR_FUEL)) { + stellarFuelAmount += itemStack.stackSize; + itemStack.stackSize = 0; + } + } + neededStartupFuel = calculateStartupFuelConsumption(this); + if (stellarFuelAmount >= neededStartupFuel) { + stellarFuelAmount -= neededStartupFuel; + increaseBattery(neededStartupFuel); + } + } else { + fuelConsumption = (long) calculateFuelConsumption(this) * 5 * (batteryCharging ? 2 : 1); + if (fluidInHatch != null && fluidInHatch.isFluidEqual(validFuelList.get(selectedFuelType))) { + FluidStack fluidNeeded = new FluidStack( + validFuelList.get(selectedFuelType), + (int) fuelConsumption); + FluidStack fluidReal = mInputHatches.get(0) + .drain(fluidNeeded.amount, true); + if (fluidReal == null || fluidReal.amount < fluidNeeded.amount) { + reduceBattery(fuelConsumptionFactor); + } else { + totalFuelConsumed += getFuelFactor(); + if (batteryCharging) { + increaseBattery(fuelConsumptionFactor); + } + } + } else { + reduceBattery(fuelConsumptionFactor); + } + } + } else { + reduceBattery(fuelConsumptionFactor); + } + + determineCompositionMilestoneLevel(); + checkInversionStatus(); + determineMilestoneProgress(); + if (!debugMode) { + determineGravitonShardAmount(); + } + + // Do module calculations and checks + if (moduleHatches.size() > 0 && internalBattery > 0 && moduleHatches.size() <= maxModuleCount) { + for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { + if (allowModuleConnection(module, this)) { + module.connect(); + calculateMaxHeatForModules(module, this); + calculateSpeedBonusForModules(module, this); + calculateMaxParallelForModules(module, this); + calculateEnergyDiscountForModules(module, this); + setMiscModuleParameters(module, this); + queryMilestoneStats(module, this); + if (!upgrades[28]) { + calculateProcessingVoltageForModules(module, this); + } + } else { + module.disconnect(); + } + } + } else if (moduleHatches.size() > maxModuleCount) { + for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { + module.disconnect(); + } + } + if (mEfficiency < 0) mEfficiency = 0; + fixAllMaintenance(); + } + } + } + + public boolean addModuleToMachineList(IGregTechTileEntity tileEntity, int baseCasingIndex) { + if (tileEntity == null) { + return false; + } + IMetaTileEntity metaTileEntity = tileEntity.getMetaTileEntity(); + if (metaTileEntity == null) { + return false; + } + if (metaTileEntity instanceof GT_MetaTileEntity_EM_BaseModule) { + return moduleHatches.add((GT_MetaTileEntity_EM_BaseModule) metaTileEntity); + } + return false; + } + + public enum moduleElement implements IHatchElement<GT_MetaTileEntity_EM_ForgeOfGods> { + + Module(GT_MetaTileEntity_EM_ForgeOfGods::addModuleToMachineList, GT_MetaTileEntity_EM_BaseModule.class) { + + @Override + public long count(GT_MetaTileEntity_EM_ForgeOfGods tileEntity) { + return tileEntity.moduleHatches.size(); + } + }; + + private final List<Class<? extends IMetaTileEntity>> mteClasses; + private final IGT_HatchAdder<GT_MetaTileEntity_EM_ForgeOfGods> adder; + + @SafeVarargs + moduleElement(IGT_HatchAdder<GT_MetaTileEntity_EM_ForgeOfGods> adder, + Class<? extends IMetaTileEntity>... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List<? extends Class<? extends IMetaTileEntity>> mteClasses() { + return mteClasses; + } + + public IGT_HatchAdder<? super GT_MetaTileEntity_EM_ForgeOfGods> adder() { + return adder; + } + } + + private void createRenderBlock() { + + IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity(); + + int x = gregTechTileEntity.getXCoord(); + int y = gregTechTileEntity.getYCoord(); + int z = gregTechTileEntity.getZCoord(); + + double xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX; + double zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ; + double yOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetY; + + this.getBaseMetaTileEntity() + .getWorld() + .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air); + this.getBaseMetaTileEntity() + .getWorld() + .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), forgeOfGodsRenderBlock); + TileForgeOfGods rendererTileEntity = (TileForgeOfGods) this.getBaseMetaTileEntity() + .getWorld() + .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset)); + + rendererTileEntity.setRenderSize(20); + rendererTileEntity.setRenderRotationSpeed(5); + } + + @Override + public String[] getInfoData() { + ArrayList<String> str = new ArrayList<>(Arrays.asList(super.getInfoData())); + str.add(TOOLTIP_BAR); + str.add("Number of Rings: " + EnumChatFormatting.GOLD + ringAmount); + str.add("Total Upgrades Unlocked: " + EnumChatFormatting.GOLD + getTotalActiveUpgrades()); + str.add("Connected Modules: " + EnumChatFormatting.GOLD + moduleHatches.size()); + str.add(TOOLTIP_BAR); + return str.toArray(new String[0]); + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + createRenderBlock(); + } + + @Override + public void onRemoval() { + if (moduleHatches != null && moduleHatches.size() > 0) { + for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { + module.disconnect(); + } + } + super.onRemoval(); + } + + protected void fixAllMaintenance() { + mWrench = true; + mScrewdriver = true; + mSoftHammer = true; + mHardHammer = true; + mSolderingTool = true; + mCrowbar = true; + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + if (doesBindPlayerInventory()) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE) + .setPos(4, 4) + .setSize(190, 85)); + } else { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE_NO_INVENTORY) + .setPos(4, 4) + .setSize(190, 171)); + } + buildContext.addSyncedWindow(UPGRADE_TREE_WINDOW_ID, this::createUpgradeTreeWindow); + buildContext.addSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID, this::createIndividualUpgradeWindow); + buildContext.addSyncedWindow(FUEL_CONFIG_WINDOW_ID, this::createFuelConfigWindow); + buildContext.addSyncedWindow(BATTERY_CONFIG_WINDOW_ID, this::createBatteryWindow); + buildContext.addSyncedWindow(MILESTONE_WINDOW_ID, this::createMilestoneWindow); + buildContext.addSyncedWindow(INDIVIDUAL_MILESTONE_WINDOW_ID, this::createIndividualMilestoneWindow); + buildContext.addSyncedWindow(MANUAL_INSERTION_WINDOW_ID, this::createManualInsertionWindow); + builder.widget( + new ButtonWidget().setOnClick( + (clickData, widget) -> { + if (!widget.isClient()) widget.getContext() + .openSyncedWindow(UPGRADE_TREE_WINDOW_ID); + }) + .setSize(16, 16) + .setBackground(() -> { + List<UITexture> button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP); + return button.toArray(new IDrawable[0]); + }) + .addTooltip("Path of Celestial Transcendence") + .setPos(174, 167) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK_SMALL) + .setPos(174, 183) + .setSize(16, 6)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(FUEL_CONFIG_WINDOW_ID); + } + }) + .setSize(16, 16) + .setBackground(() -> { + List<UITexture> button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_BUTTON_HEAT_ON); + return button.toArray(new IDrawable[0]); + }) + .addTooltip(translateToLocal("fog.button.fuelconfig.tooltip")) + .setPos(174, 110) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + TextWidget.dynamicText(this::storedFuel) + .setDefaultColor(EnumChatFormatting.WHITE) + .setPos(6, 8) + .setSize(74, 34)) + .widget(createPowerSwitchButton()) + .widget(createBatteryButton(builder)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> getBaseMetaTileEntity().isAllowedToWork(), val -> { + if (val) { + getBaseMetaTileEntity().enableWorking(); + } else { + getBaseMetaTileEntity().disableWorking(); + } + })) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + checkMachine_EM(this.getBaseMetaTileEntity(), null); + } + }) + .setSize(16, 16) + .setBackground(() -> { + List<UITexture> button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_CYCLIC_BLUE); + return button.toArray(new IDrawable[0]); + }) + .addTooltip(translateToLocal("fog.button.structurecheck.tooltip")) + .setPos(8, 91) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(MILESTONE_WINDOW_ID); + } + }) + .setSize(16, 16) + .setBackground(() -> { + List<UITexture> button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_BUTTON_FLAG); + return button.toArray(new IDrawable[0]); + }) + .addTooltip(translateToLocal("fog.button.milestones.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 91)); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO) + .setSize(18, 18) + .setPos(172, 67)); + } + + @Override + protected ButtonWidget createPowerSwitchButton() { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + if (getBaseMetaTileEntity().isAllowedToWork()) { + getBaseMetaTileEntity().disableWorking(); + } else { + getBaseMetaTileEntity().enableWorking(); + } + }) + .setPlayClickSound(false) + .setBackground(() -> { + List<UITexture> ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + if (getBaseMetaTileEntity().isAllowedToWork()) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED); + } + return ret.toArray(new IDrawable[0]); + }) + .setPos(174, doesBindPlayerInventory() ? 148 : 172) + .setSize(16, 16); + button.addTooltip("Power Switch") + .setTooltipShowUpDelay(TOOLTIP_DELAY); + return (ButtonWidget) button; + } + + protected Widget createBatteryButton(IWidgetBuilder<?> builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + if (clickData.mouseButton == 0) { + batteryCharging = !batteryCharging; + } else if (clickData.mouseButton == 1 && !widget.isClient() && upgrades[8]) { + widget.getContext() + .openSyncedWindow(BATTERY_CONFIG_WINDOW_ID); + } + }) + .setPlayClickSound(false) + .setBackground(() -> { + List<UITexture> ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + if (batteryCharging) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_BATTERY_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_BATTERY_OFF); + } + return ret.toArray(new IDrawable[0]); + }) + .setPos(174, 129) + .setSize(16, 16); + button.addTooltip(translateToLocal("fog.button.battery.tooltip.01")) + .addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.battery.tooltip.02")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> batteryCharging, val -> batteryCharging = val), + builder); + return button; + } + + protected ModularWindow createBatteryWindow(final EntityPlayer player) { + final int WIDTH = 78; + final int HEIGHT = 52; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + .add( + Alignment.BottomRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) + .add(WIDTH - 3, 0) + .subtract(0, 10))); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.batteryinfo") + .setPos(3, 4) + .setSize(74, 20)) + .widget( + new NumericWidget().setSetter(val -> maxBatteryCharge = (int) val) + .setGetter(() -> maxBatteryCharge) + .setBounds(1, Integer.MAX_VALUE) + .setDefaultValue(100) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(70, 18) + .setPos(4, 25) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)); + return builder.build(); + } + + protected ModularWindow createFuelConfigWindow(final EntityPlayer player) { + final int WIDTH = 78; + final int HEIGHT = 130; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + .add( + Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) + .add(WIDTH - 3, 0))); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelconsumption") + .setPos(3, 2) + .setSize(74, 34)) + .widget( + new NumericWidget().setSetter(val -> fuelConsumptionFactor = (int) val) + .setGetter(() -> fuelConsumptionFactor) + .setBounds(1, calculateMaxFuelFactor(this)) + .setDefaultValue(1) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(70, 18) + .setPos(4, 35) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)) + .widget( + new DrawableWidget().setDrawable(ModularUITextures.ICON_INFO) + .setPos(64, 24) + .setSize(10, 10) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.0")) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.1")) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.2")) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.3")) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.4")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.fueltype") + .setPos(3, 57) + .setSize(74, 24)) + .widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelusage") + .setPos(3, 100) + .setSize(74, 20)) + .widget( + TextWidget.dynamicText(this::fuelUsage) + .setPos(3, 115) + .setSize(74, 15)) + .widget( + new MultiChildWidget().addChild( + new FluidNameHolderWidget( + () -> MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1) + .getUnlocalizedName() + .substring(6), + (String) -> MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1) + .getUnlocalizedName()) { + + @Override + public void buildTooltip(List<Text> tooltip) { + FluidStack fluid = createFluidStack(); + addFluidNameInfo(tooltip, fluid); + addAdditionalFluidInfo(tooltip, fluid); + } + }.setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(1, 1) + .setSize(16, 16)) + .addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + selectedFuelType = 0; + }) + .setBackground(() -> { + if (selectedFuelType == 0) { + return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN }; + } else { + return new IDrawable[] {}; + } + }) + .setSize(18, 18) + .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType), builder)) + + .setPos(6, 82) + .setSize(18, 18)) + .widget( + new MultiChildWidget().addChild( + new FluidNameHolderWidget( + () -> MaterialsUEVplus.RawStarMatter.getFluid(1) + .getUnlocalizedName() + .substring(6), + (String) -> MaterialsUEVplus.RawStarMatter.getFluid(1) + .getUnlocalizedName()) { + + @Override + public void buildTooltip(List<Text> tooltip) { + FluidStack fluid = createFluidStack(); + addFluidNameInfo(tooltip, fluid); + addAdditionalFluidInfo(tooltip, fluid); + } + }.setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(1, 1) + .setSize(16, 16)) + .addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + selectedFuelType = 1; + }) + .setBackground(() -> { + if (selectedFuelType == 1) { + return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN }; + } else { + return new IDrawable[] {}; + } + }) + .setSize(18, 18)) + .setPos(29, 82) + .setSize(18, 18) + .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType), builder)) + .widget( + new MultiChildWidget().addChild( + new FluidNameHolderWidget( + () -> MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1) + .getUnlocalizedName() + .substring(6), + (String) -> MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1) + .getUnlocalizedName()) { + + @Override + public void buildTooltip(List<Text> tooltip) { + FluidStack fluid = createFluidStack(); + addFluidNameInfo(tooltip, fluid); + addAdditionalFluidInfo(tooltip, fluid); + } + }.setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(1, 1) + .setSize(16, 16)) + .addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + selectedFuelType = 2; + }) + .setBackground(() -> { + if (selectedFuelType == 2) { + return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN }; + } else { + return new IDrawable[] {}; + } + }) + .setSize(18, 18)) + .setPos(52, 82) + .setSize(18, 18) + .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType), builder)); + + return builder.build(); + } + + private final int[] milestoneProgress = new int[] { 0, 0, 0, 0 }; + + protected ModularWindow createMilestoneWindow(final EntityPlayer player) { + final int WIDTH = 400; + final int HEIGHT = 300; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(TecTechUITextures.BACKGROUND_SPACE); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.widget(createMilestoneButton(0, 80, 100, new Pos2d(62, 24))); + builder.widget(createMilestoneButton(1, 70, 98, new Pos2d(263, 25))); + builder.widget(createMilestoneButton(2, 100, 100, new Pos2d(52, 169))); + builder.widget(createMilestoneButton(3, 100, 100, new Pos2d(248, 169))); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.powermilestone") + .setDefaultColor(EnumChatFormatting.GOLD) + .setPos(77, 45) + .setSize(50, 30)); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.recipemilestone") + .setDefaultColor(EnumChatFormatting.GOLD) + .setPos(268, 45) + .setSize(60, 30)); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelmilestone") + .setDefaultColor(EnumChatFormatting.GOLD) + .setPos(77, 190) + .setSize(50, 30)); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.purchasablemilestone") + .setDefaultColor(EnumChatFormatting.GOLD) + .setPos(268, 190) + .setSize(60, 30)); + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND) + .setPos(37, 70) + .setSize(130, 7)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND) + .setPos(233, 70) + .setSize(130, 7)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND) + .setPos(37, 215) + .setSize(130, 7)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BACKGROUND) + .setPos(233, 215) + .setSize(130, 7)); + builder.widget( + new ProgressBar().setProgress(() -> powerMilestonePercentage) + .setDirection(ProgressBar.Direction.RIGHT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RED, 130) + .setSynced(true, false) + .setSize(130, 7) + .setPos(37, 70) + .addTooltip(milestoneProgressText(0, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> recipeMilestonePercentage) + .setDirection(ProgressBar.Direction.RIGHT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_PURPLE, 130) + .setSynced(true, false) + .setSize(130, 7) + .setPos(233, 70) + .addTooltip(milestoneProgressText(1, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> fuelMilestonePercentage) + .setDirection(ProgressBar.Direction.RIGHT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BLUE, 130) + .setSynced(true, false) + .setSize(130, 7) + .setPos(37, 215) + .addTooltip(milestoneProgressText(2, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> structureMilestonePercentage) + .setDirection(ProgressBar.Direction.RIGHT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW, 130) + .setSynced(true, false) + .setSize(130, 7) + .setPos(233, 215) + .addTooltip(milestoneProgressText(3, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> invertedPowerMilestonePercentage) + .setDirection(ProgressBar.Direction.LEFT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RED_INVERTED, 130) + .setSynced(true, false) + .setSize(130, 7) + .setPos(37, 70) + .addTooltip(milestoneProgressText(0, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> invertedRecipeMilestonePercentage) + .setDirection(ProgressBar.Direction.LEFT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_PURPLE_INVERTED, 130) + .setSynced(true, false) + .setSize(130, 7) + .setPos(233, 70) + .addTooltip(milestoneProgressText(1, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> invertedFuelMilestonePercentage) + .setDirection(ProgressBar.Direction.LEFT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_BLUE_INVERTED, 130) + .setSynced(true, false) + .setSize(130, 7) + .setPos(37, 215) + .addTooltip(milestoneProgressText(2, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ProgressBar().setProgress(() -> invertedStructureMilestonePercentage) + .setDirection(ProgressBar.Direction.LEFT) + .setTexture(TecTechUITextures.PROGRESSBAR_GODFORGE_MILESTONE_RAINBOW_INVERTED, 130) + .setSynced(true, false) + .setSize(130, 7) + .setPos(233, 215) + .addTooltip(milestoneProgressText(3, false)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + ButtonWidget.closeWindowButton(true) + .setPos(382, 6)); + return builder.build(); + } + + protected ModularWindow createIndividualMilestoneWindow(final EntityPlayer player) { + final int WIDTH = 150; + final int HEIGHT = 150; + int symbol_width; + int symbol_height; + String milestoneType; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + UITexture symbol; + switch (currentMilestoneID) { + case 1 -> { + symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION; + symbol_width = 54; + symbol_height = 75; + milestoneType = "recipe"; + } + case 2 -> { + symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST; + symbol_width = 75; + symbol_height = 75; + milestoneType = "fuel"; + } + case 3 -> { + symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION; + symbol_width = 75; + symbol_height = 75; + milestoneType = "purchasable"; + } + default -> { + symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE; + symbol_width = 60; + symbol_height = 75; + milestoneType = "power"; + } + } + + builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_WHITE); + builder.setDraggable(true); + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(134, 4)) + .widget( + new DrawableWidget().setDrawable(symbol) + .setSize(symbol_width, symbol_height) + .setPos((WIDTH - symbol_width) / 2, (HEIGHT - symbol_height) / 2)) + .widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG." + milestoneType + "milestone") + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setPos(0, 8) + .setSize(150, 15)) + .widget( + TextWidget.dynamicText(this::inversionStatusText) + .setDefaultColor(EnumChatFormatting.AQUA) + .setTextAlignment(Alignment.Center) + .setScale(0.8f) + .setPos(0, 120) + .setSize(150, 15)) + .widget( + TextWidget.dynamicText(() -> totalMilestoneProgress(currentMilestoneID)) + .setScale(0.7f) + .setDefaultColor(EnumChatFormatting.WHITE) + .setTextAlignment(Alignment.Center) + .setPos(5, 30) + .setSize(140, 30)) + .widget( + TextWidget.dynamicText(() -> currentMilestone(currentMilestoneID)) + .setScale(0.7f) + .setDefaultColor(EnumChatFormatting.WHITE) + .setTextAlignment(Alignment.Center) + .setPos(5, 50) + .setSize(140, 30)) + .widget( + TextWidget.dynamicText(() -> milestoneProgressText(currentMilestoneID, true)) + .setScale(0.7f) + .setDefaultColor(EnumChatFormatting.WHITE) + .setSize(140, 30) + .setPos(5, 70)) + .widget( + TextWidget.dynamicText(() -> gravitonShardAmountText(currentMilestoneID)) + .setScale(0.7f) + .setDefaultColor(EnumChatFormatting.WHITE) + .setSize(140, 30) + .setPos(5, 90)); + + return builder.build(); + } + + private int currentMilestoneID = 0; + + private Widget createMilestoneButton(int milestoneID, int width, int height, Pos2d pos) { + return new ButtonWidget().setOnClick((clickData, widget) -> { + currentMilestoneID = milestoneID; + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); + } + }) + .setSize(width, height) + .setBackground(() -> switch (milestoneID) { + case 1 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION_GLOW }; + case 2 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST_GLOW }; + case 3 -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION_GLOW }; + default -> new IDrawable[] { TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE_GLOW }; + }) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.milestoneinfo")) + .setPos(pos) + .setTooltipShowUpDelay(TOOLTIP_DELAY); + } + + private int currentUpgradeID = 0; + private int currentColorCode = 0; + private int currentMilestoneBG = 0; + private int gravitonShardCost = 0; + private int[] prereqUpgrades = new int[] {}; + private int[] followupUpgrades = new int[] {}; + private boolean allPrereqRequired = false; + private boolean isUpradeSplitStart = false; + private boolean[] upgrades = new boolean[31]; + + protected ModularWindow createUpgradeTreeWindow(final EntityPlayer player) { + final Scrollable scrollable = new Scrollable().setVerticalScroll(); + final int PARENT_WIDTH = 300; + final int PARENT_HEIGHT = 1000; + ModularWindow.Builder builder = ModularWindow.builder(PARENT_WIDTH, PARENT_HEIGHT); + scrollable.widget( + createUpgradeBox(0, 0, 3, new int[] {}, false, new int[] { 1 }, false, 0, new Pos2d(126, 56), scrollable)) + .widget( + createUpgradeBox( + 1, + 0, + 1, + new int[] { 0 }, + false, + new int[] { 2, 3 }, + false, + 1, + new Pos2d(126, 116), + scrollable)) + .widget( + createUpgradeBox( + 2, + 0, + 2, + new int[] { 1 }, + false, + new int[] { 4, 5 }, + false, + 1, + new Pos2d(96, 176), + scrollable)) + .widget( + createUpgradeBox( + 3, + 0, + 2, + new int[] { 1 }, + false, + new int[] { 5, 6 }, + false, + 1, + new Pos2d(156, 176), + scrollable)) + .widget( + createUpgradeBox( + 4, + 0, + 0, + new int[] { 2 }, + false, + new int[] { 8 }, + false, + 1, + new Pos2d(66, 236), + scrollable)) + .widget( + createUpgradeBox( + 5, + 0, + 3, + new int[] { 2, 3 }, + false, + new int[] { 7 }, + false, + 1, + new Pos2d(126, 236), + scrollable)) + .widget( + createUpgradeBox( + 6, + 0, + 1, + new int[] { 3 }, + false, + new int[] { 10 }, + false, + 1, + new Pos2d(186, 236), + scrollable)) + .widget( + createUpgradeBox( + 7, + 0, + 3, + new int[] { 5 }, + false, + new int[] { 8, 9, 10 }, + false, + 2, + new Pos2d(126, 296), + scrollable)) + .widget( + createUpgradeBox( + 8, + 0, + 0, + new int[] { 4, 7 }, + true, + new int[] { 11 }, + false, + 2, + new Pos2d(56, 356), + scrollable)) + .widget( + createUpgradeBox( + 9, + 0, + 2, + new int[] { 7 }, + false, + new int[] {}, + false, + 2, + new Pos2d(126, 356), + scrollable)) + .widget( + createUpgradeBox( + 10, + 0, + 1, + new int[] { 6, 7 }, + true, + new int[] { 11 }, + false, + 2, + new Pos2d(196, 356), + scrollable)) + .widget( + createUpgradeBox( + 11, + 0, + 3, + new int[] { 8, 10 }, + false, + new int[] { 12, 13, 14 }, + false, + 2, + new Pos2d(126, 416), + scrollable)) + .widget( + createUpgradeBox( + 12, + 1, + 2, + new int[] { 11 }, + false, + new int[] { 17 }, + true, + 3, + new Pos2d(66, 476), + scrollable)) + .widget( + createUpgradeBox( + 13, + 2, + 1, + new int[] { 11 }, + false, + new int[] { 18 }, + true, + 3, + new Pos2d(126, 476), + scrollable)) + .widget( + createUpgradeBox( + 14, + 3, + 0, + new int[] { 11 }, + false, + new int[] { 15, 19 }, + true, + 3, + new Pos2d(186, 476), + scrollable)) + .widget( + createUpgradeBox( + 15, + 3, + 1, + new int[] { 14 }, + false, + new int[] {}, + false, + 4, + new Pos2d(246, 496), + scrollable)) + .widget( + createUpgradeBox( + 16, + 1, + 1, + new int[] { 17 }, + false, + new int[] {}, + false, + 4, + new Pos2d(6, 556), + scrollable)) + .widget( + createUpgradeBox( + 17, + 1, + 0, + new int[] { 12 }, + false, + new int[] { 16, 20 }, + false, + 3, + new Pos2d(66, 536), + scrollable)) + .widget( + createUpgradeBox( + 18, + 2, + 1, + new int[] { 13 }, + false, + new int[] { 21 }, + false, + 3, + new Pos2d(126, 536), + scrollable)) + .widget( + createUpgradeBox( + 19, + 3, + 0, + new int[] { 14 }, + false, + new int[] { 22 }, + false, + 3, + new Pos2d(186, 536), + scrollable)) + .widget( + createUpgradeBox( + 20, + 1, + 0, + new int[] { 17 }, + false, + new int[] { 23 }, + false, + 3, + new Pos2d(66, 596), + scrollable)) + .widget( + createUpgradeBox( + 21, + 2, + 1, + new int[] { 18 }, + false, + new int[] { 23 }, + false, + 3, + new Pos2d(126, 596), + scrollable)) + .widget( + createUpgradeBox( + 22, + 3, + 1, + new int[] { 19 }, + false, + new int[] { 23 }, + false, + 3, + new Pos2d(186, 596), + scrollable)) + .widget( + createUpgradeBox( + 23, + 0, + 0, + new int[] { 20, 21, 22 }, + false, + new int[] { 24 }, + false, + 4, + new Pos2d(126, 656), + scrollable)) + .widget( + createUpgradeBox( + 24, + 0, + 1, + new int[] { 23 }, + false, + new int[] { 25 }, + false, + 5, + new Pos2d(126, 718), + scrollable)) + .widget( + createUpgradeBox( + 25, + 0, + 1, + new int[] { 24 }, + false, + new int[] { 26 }, + false, + 6, + new Pos2d(36, 758), + scrollable)) + .widget( + createUpgradeBox( + 26, + 0, + 3, + new int[] { 25 }, + false, + new int[] { 27 }, + false, + 7, + new Pos2d(36, 848), + scrollable)) + .widget( + createUpgradeBox( + 27, + 0, + 2, + new int[] { 26 }, + false, + new int[] { 28 }, + false, + 8, + new Pos2d(126, 888), + scrollable)) + .widget( + createUpgradeBox( + 28, + 0, + 0, + new int[] { 27 }, + false, + new int[] { 29 }, + false, + 9, + new Pos2d(216, 848), + scrollable)) + .widget( + createUpgradeBox( + 29, + 0, + 3, + new int[] { 28 }, + false, + new int[] { 30 }, + false, + 10, + new Pos2d(216, 758), + scrollable)) + .widget( + createUpgradeBox( + 30, + 0, + 3, + new int[] { 29 }, + false, + new int[] {}, + false, + 12, + new Pos2d(126, 798), + scrollable)) + .widget(new TextWidget("").setPos(0, 945)); + + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_STAR) + .setPos(0, 350) + .setSize(300, 300)) + .widget( + scrollable.setSize(292, 292) + .setPos(4, 354)) + .widget( + ButtonWidget.closeWindowButton(true) + .setPos(282, 354)); + if (debugMode) { + builder.widget( + new MultiChildWidget() + .addChild( + new ButtonWidget().setOnClick((clickData, widget) -> upgrades = new boolean[31]) + .setSize(40, 15) + .setBackground(GT_UITextures.BUTTON_STANDARD) + .addTooltip(translateToLocal("fog.debug.resetbutton.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .addChild( + new TextWidget(translateToLocal("fog.debug.resetbutton.text")) + .setTextAlignment(Alignment.Center) + .setScale(0.57f) + .setMaxWidth(36) + .setPos(3, 3)) + .addChild( + new NumericWidget().setSetter(val -> gravitonShardsAvailable = (int) val) + .setGetter(() -> gravitonShardsAvailable) + .setBounds(0, 112) + .setDefaultValue(0) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(25, 18) + .setPos(4, 16) + .addTooltip(translateToLocal("fog.debug.gravitonshardsetter.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD)) + .addChild( + new ButtonWidget().setOnClick((clickData, widget) -> Arrays.fill(upgrades, true)) + .setSize(40, 15) + .setBackground(GT_UITextures.BUTTON_STANDARD) + .addTooltip(translateToLocal("fog.debug.unlockall.text")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(0, 35)) + .addChild( + new TextWidget(translateToLocal("fog.debug.unlockall.text")).setTextAlignment(Alignment.Center) + .setScale(0.57f) + .setMaxWidth(36) + .setPos(3, 38)) + .setPos(4, 354)); + + } + return builder.build(); + } + + protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) { + UITexture background; + UITexture overlay; + UITexture milestoneSymbol; + float widthRatio; + switch (currentColorCode) { + case 1 -> { + background = TecTechUITextures.BACKGROUND_GLOW_PURPLE; + overlay = TecTechUITextures.PICTURE_OVERLAY_PURPLE; + } + case 2 -> { + background = TecTechUITextures.BACKGROUND_GLOW_ORANGE; + overlay = TecTechUITextures.PICTURE_OVERLAY_ORANGE; + } + case 3 -> { + background = TecTechUITextures.BACKGROUND_GLOW_GREEN; + overlay = TecTechUITextures.PICTURE_OVERLAY_GREEN; + } + default -> { + background = TecTechUITextures.BACKGROUND_GLOW_BLUE; + overlay = TecTechUITextures.PICTURE_OVERLAY_BLUE; + } + } + switch (currentMilestoneBG) { + case 1 -> { + milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION; + widthRatio = 0.72f; + } + case 2 -> { + milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST; + widthRatio = 1f; + } + case 3 -> { + milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION; + widthRatio = 1f; + } + default -> { + milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE; + widthRatio = 0.8f; + } + } + int WIDTH = 250; + int HEIGHT = 250; + int LORE_POS = 110; + if (currentUpgradeID == 0) { + WIDTH = 300; + HEIGHT = 300; + LORE_POS = 85; + } + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT) + .setBackground(background) + .widget( + ButtonWidget.closeWindowButton(true) + .setPos(WIDTH - 15, 3)) + .widget( + new DrawableWidget().setDrawable(milestoneSymbol) + .setPos((int) ((1 - widthRatio / 2) * WIDTH / 2), HEIGHT / 4) + .setSize((int) (WIDTH / 2 * widthRatio), HEIGHT / 2)) + .widget( + new DrawableWidget().setDrawable(overlay) + .setPos(WIDTH / 4, HEIGHT / 4) + .setSize(WIDTH / 2, HEIGHT / 2)) + .widget( + new MultiChildWidget() + .addChild( + new TextWidget(translateToLocal("fog.upgrade.tt." + (currentUpgradeID))) + .setTextAlignment(Alignment.Center) + .setDefaultColor(EnumChatFormatting.GOLD) + .setSize(WIDTH - 15, 30) + .setPos(9, 5)) + .addChild( + new TextWidget(translateToLocal("fog.upgrade.text." + (currentUpgradeID))) + .setTextAlignment(Alignment.CenterLeft) + .setDefaultColor(0x9c9c9c) + .setSize(WIDTH - 15, LORE_POS - 30) + .setPos(9, 30)) + .addChild( + new TextWidget( + EnumChatFormatting.ITALIC + translateToLocal("fog.upgrade.lore." + (currentUpgradeID))) + .setTextAlignment(Alignment.Center) + .setDefaultColor(0x9c9c9c) + .setSize(WIDTH - 15, (int) (HEIGHT * 0.9) - LORE_POS) + .setPos(9, LORE_POS)) + .addChild( + new TextWidget( + translateToLocal("gt.blockmachines.multimachine.FOG.shardcost") + " " + + EnumChatFormatting.BLUE + + gravitonShardCost).setTextAlignment(Alignment.Center) + .setScale(0.7f) + .setMaxWidth(70) + .setDefaultColor(0x9c9c9c) + .setPos(11, HEIGHT - 25)) + .addChild( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.availableshards")) + .setTextAlignment(Alignment.Center) + .setScale(0.7f) + .setMaxWidth(90) + .setDefaultColor(0x9c9c9c) + .setPos(WIDTH - 87, HEIGHT - 25)) + .addChild( + TextWidget.dynamicText(this::gravitonShardAmount) + .setTextAlignment(Alignment.Center) + .setScale(0.7f) + .setMaxWidth(90) + .setDefaultColor(0x9c9c9c) + .setPos(WIDTH - 27, HEIGHT - 18))) + .setSize(WIDTH, HEIGHT) + + .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + int unlockedPrereqUpgrades = 0; + int unlockedFollowupUpgrades = 0; + int unlockedSplitUpgrades = 0; + if (!upgrades[currentUpgradeID]) { + for (int prereqUpgrade : prereqUpgrades) { + if (upgrades[prereqUpgrade]) { + unlockedPrereqUpgrades++; + } + } + if (allPrereqRequired) { + if (unlockedPrereqUpgrades == prereqUpgrades.length + && gravitonShardsAvailable >= gravitonShardCost) { + gravitonShardsAvailable -= gravitonShardCost; + gravitonShardsSpent += gravitonShardCost; + upgrades[currentUpgradeID] = true; + } + } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades.length == 0) { + if (isUpradeSplitStart) { + for (int splitUpgrade : FIRST_SPLIT_UPGRADES) { + if (upgrades[splitUpgrade]) { + unlockedSplitUpgrades++; + } + } + unlockedSplitUpgrades -= (ringAmount - 1); + } + if (unlockedSplitUpgrades <= 0 && gravitonShardsAvailable >= gravitonShardCost) { + gravitonShardsAvailable -= gravitonShardCost; + gravitonShardsSpent += gravitonShardCost; + upgrades[currentUpgradeID] = true; + } + } + } else { + for (int followupUpgrade : followupUpgrades) { + if (upgrades[followupUpgrade]) { + unlockedFollowupUpgrades++; + } + } + if (unlockedFollowupUpgrades == 0) { + gravitonShardsAvailable += gravitonShardCost; + gravitonShardsSpent -= gravitonShardCost; + upgrades[currentUpgradeID] = false; + } + } + }) + .setSize(40, 15) + .setBackground(() -> { + if (upgrades[currentUpgradeID]) { + return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED }; + } else { + return new IDrawable[] { GT_UITextures.BUTTON_STANDARD }; + } + }) + .addTooltip(translateToLocal("fog.upgrade.confirm")) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .addChild( + new TextWidget(translateToLocal("fog.upgrade.confirm")).setTextAlignment(Alignment.Center) + .setScale(0.7f) + .setMaxWidth(36) + .setPos(3, 5)) + .addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(MANUAL_INSERTION_WINDOW_ID); + widget.getContext() + .closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + widget.getContext() + .closeWindow(UPGRADE_TREE_WINDOW_ID); + } + }) + .setBackground(TecTechUITextures.BUTTON_CELESTIAL_32x32) + .setPos(50, 50)) + .setPos(WIDTH / 2 - 21, (int) (HEIGHT * 0.9))); + return builder.build(); + } + + /** + * @param upgradeID ID of the upgrade + * @param colorCode Number deciding which colored background to use, 0 for blue, 1 for purple, 2 for + * orange and 3 for green + * @param milestone Number deciding which milestone symbol to display in the background, 0 for charge, + * 1 for conversion, 2 for catalyst and 3 for composition + * @param prerequisiteUpgradeIDs IDs of the prior upgrades directly connected to the current one + * @param requireAllPrerequisites Decides how many connected prerequisite upgrades have to be unlocked to be able to + * unlock this one. True means ALL, False means AT LEAST ONE + * @param followingUpgradeIDs IDs of the following upgrades directly connected to the current one + * @param isStartOfSplit Whether this upgrade is one of the initial split upgrades + * @param shardCost How many graviton shards are needed to unlock this upgrade + * @param pos Position of the upgrade inside the scrollableWidget + */ + private Widget createUpgradeBox(int upgradeID, int colorCode, int milestone, int[] prerequisiteUpgradeIDs, + boolean requireAllPrerequisites, int[] followingUpgradeIDs, boolean isStartOfSplit, int shardCost, Pos2d pos, + IWidgetBuilder<?> builder) { + return new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + currentUpgradeID = upgradeID; + currentColorCode = colorCode; + currentMilestoneBG = milestone; + gravitonShardCost = shardCost; + prereqUpgrades = prerequisiteUpgradeIDs; + allPrereqRequired = requireAllPrerequisites; + followupUpgrades = followingUpgradeIDs; + isUpradeSplitStart = isStartOfSplit; + if (!widget.isClient()) widget.getContext() + .openSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + }) + .setSize(40, 15) + .setBackground(() -> { + if (upgrades[upgradeID]) { + return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED }; + } else { + return new IDrawable[] { GT_UITextures.BUTTON_STANDARD }; + } + }) + .addTooltip(translateToLocal("fog.upgrade.tt." + upgradeID)) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .addChild( + new TextWidget(translateToLocal("fog.upgrade.tt." + upgradeID)).setTextAlignment(Alignment.Center) + .setScale(0.57f) + .setMaxWidth(36) + .setPos(3, 3)) + .setPos(pos) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> upgrades[upgradeID], val -> upgrades[upgradeID] = val), + builder); + } + + List<ItemStack> inputs = new ArrayList<>( + Arrays.asList( + ItemList.Electric_Motor_UMV.get(13L), + ItemList.Electric_Pump_UXV.get(32L), + ItemList.Electric_Piston_UXV.get(32L), + ItemList.Robot_Arm_UXV.get(32L), + ItemList.Superconducting_Magnet_Solenoid_UIV.get(48L), + ItemList.NaquadriaSupersolid.get(32L), + CustomItemList.astralArrayFabricator.get(36L), + CustomItemList.Machine_Multi_EyeOfHarmony.get(2L))); + + protected ModularWindow createManualInsertionWindow(final EntityPlayer player) { + final int WIDTH = 189; + final int HEIGHT = 84; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + final MultiChildWidget columns = new MultiChildWidget(); + final DynamicPositionedColumn column1 = new DynamicPositionedColumn(); + final DynamicPositionedColumn column2 = new DynamicPositionedColumn(); + final DynamicPositionedColumn column3 = new DynamicPositionedColumn(); + List<DynamicPositionedColumn> columnList = Arrays.asList(column1, column2, column3); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + .add(Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))) + .subtract(5, 0) + .add(0, 4)); + builder.widget( + SlotGroup.ofItemHandler(inputSlotHandler, 4) + .startFromSlot(0) + .endAtSlot(15) + .phantom(false) + .background(getGUITextureSet().getItemSlot()) + .build() + .setPos(111, 6)); + for (int i = 0; i < inputs.size(); i++) { + int index = i; + int cleanDiv4 = index / 4; + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.BUTTON_STANDARD_PRESSED) + .setPos(6 + cleanDiv4 * 36, 6 + index % 4 * 18) + .setSize(18, 18)); + columnList.get(cleanDiv4) + .addChild( + new ItemDrawable().setItem(inputs.get(index)) + .asWidget() + .dynamicTooltip(() -> { + List<String> tooltip = new ArrayList<>(); + tooltip.add( + inputs.get(index) != null ? inputs.get(index) + .getDisplayName() : ""); + return tooltip; + }) + .setSize(16, 16)); + } + + columns.addChild( + column1.setSpace(2) + .setAlignment(MainAxisAlignment.SPACE_BETWEEN) + .setSize(34, 72) + .setPos(1, 1)); + columns.addChild( + column2.setSpace(2) + .setAlignment(MainAxisAlignment.SPACE_BETWEEN) + .setSize(34, 72) + .setPos(37, 1)); + columns.addChild( + column3.setSpace(2) + .setAlignment(MainAxisAlignment.SPACE_BETWEEN) + .setSize(34, 72) + .setPos(73, 1)); + builder.widget( + columns.setSize(72, 72) + .setPos(6, 6)); + return builder.build(); + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Material Manipulator") // Machine Type: + .addInfo("Controller block for the Forge of Gods") // Controller + .addInfo("Uses a Star to to manipulate metals") + .addSeparator() + .beginStructureBlock(1, 4, 2, false) + .addStructureInfo("Output bus/hatch has to be the ME variant") + .addStructureInfo("Dot 2 of Input Hatch is the Fuel Input Hatch") + .addInputHatch("Any Infinite Spacetime Casing", 1) + .addInputHatch("Any Infinite Spacetime Casing", 2) // Fuel + // Input + // Hatch + .addInputBus("Any Infinite Spacetime Casing", 1) + .addOutputBus("Any Infinite Spacetime Casing", 1) + .addOutputHatch("Any Infinite Spacetime Casing", 1) + .toolTipFinisher(CommonValues.GODFORGE_MARK); + return tt; + } + + @Override + public boolean energyFlowOnRunningTick(ItemStack aStack, boolean allowProduction) { + return true; + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return new String[] { "Forge of Gods multiblock" }; + } + + public int getFuelType() { + return selectedFuelType; + } + + private void setFuelType(int fuelType) { + selectedFuelType = fuelType; + } + + public int getFuelFactor() { + return fuelConsumptionFactor; + } + + public boolean isUpgradeActive(int upgradeID) { + return upgrades[upgradeID]; + } + + public int getRingAmount() { + return ringAmount; + } + + public int getTotalActiveUpgrades() { + int totalUpgrades = 0; + for (boolean upgrade : upgrades) { + if (upgrade) { + totalUpgrades++; + } + } + return totalUpgrades; + } + + private Text fuelUsage() { + return new Text(fuelConsumption + " L/5s"); + } + + private Text gravitonShardAmount() { + EnumChatFormatting enoughGravitonShards = EnumChatFormatting.RED; + if (gravitonShardsAvailable >= gravitonShardCost) { + enoughGravitonShards = EnumChatFormatting.GREEN; + } + return new Text(enoughGravitonShards + Integer.toString(gravitonShardsAvailable)); + + } + + private Text storedFuel() { + if (internalBattery == 0) { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.storedstartupfuel") + " " + + stellarFuelAmount + + "/" + + neededStartupFuel); + } + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel") + " " + + internalBattery + + "/" + + maxBatteryCharge); + } + + private void checkInversionStatus() { + int inversionChecker = 0; + for (int progress : milestoneProgress) { + if (progress < 7) { + break; + } + inversionChecker++; + } + inversion = inversionChecker == 4; + } + + private Text inversionStatusText() { + String inversionStatus = ""; + if (inversion) { + inversionStatus = EnumChatFormatting.BOLD + translateToLocal("gt.blockmachines.multimachine.FOG.inversion"); + } + return new Text(inversionStatus); + } + + private void determineCompositionMilestoneLevel() { + int[] uniqueModuleCount = new int[5]; + int smelting = 0; + int molten = 0; + int plasma = 0; + int exotic = 0; + int exoticMagmatter = 0; + for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { + if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) { + uniqueModuleCount[0] = 1; + smelting++; + continue; + } + if (module instanceof GT_MetaTileEntity_EM_MoltenModule) { + uniqueModuleCount[1] = 1; + molten++; + continue; + } + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { + uniqueModuleCount[2] = 1; + plasma++; + continue; + } + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (!((GT_MetaTileEntity_EM_ExoticModule) module).isMagmatterModeOn()) { + uniqueModuleCount[3] = 1; + exotic++; + } else { + uniqueModuleCount[4] = 1; + exoticMagmatter++; + } + } + + } + totalExtensionsBuilt = Arrays.stream(uniqueModuleCount) + .sum() + ringAmount + - 1; + if (inversion) { + totalExtensionsBuilt += (smelting - 1 + + (molten - 1) * 2 + + (plasma - 1) * 3 + + (exotic - 1) * 4 + + (exoticMagmatter - 1) * 5) / 5f; + } + milestoneProgress[3] = (int) Math.floor(totalExtensionsBuilt); + } + + private void determineMilestoneProgress() { + int closestRelevantSeven; + float rawProgress; + float actualProgress; + if (milestoneProgress[0] < 7) { + powerMilestonePercentage = (float) max( + (log((totalPowerConsumed.divide(BigInteger.valueOf(POWER_MILESTONE_CONSTANT))).longValue()) + / POWER_LOG_CONSTANT + 1), + 0) / 7; + milestoneProgress[0] = (int) floor(powerMilestonePercentage * 7); + } + if (inversion) { + rawProgress = (totalPowerConsumed.divide(POWER_MILESTONE_T7_CONSTANT) + .floatValue() - 1) / 7; + closestRelevantSeven = (int) floor(rawProgress); + actualProgress = rawProgress - closestRelevantSeven; + milestoneProgress[0] = 7 + (int) floor(rawProgress * 7); + if (closestRelevantSeven % 2 == 0) { + invertedPowerMilestonePercentage = actualProgress; + powerMilestonePercentage = 1 - invertedPowerMilestonePercentage; + } else { + powerMilestonePercentage = actualProgress; + invertedPowerMilestonePercentage = 1 - powerMilestonePercentage; + } + } + + if (milestoneProgress[1] < 7) { + recipeMilestonePercentage = (float) max( + (log(totalRecipesProcessed * 1f / RECIPE_MILESTONE_CONSTANT) / RECIPE_LOG_CONSTANT + 1), + 0) / 7; + milestoneProgress[1] = (int) floor(recipeMilestonePercentage * 7); + } + if (inversion) { + rawProgress = (((float) totalRecipesProcessed / RECIPE_MILESTONE_T7_CONSTANT) - 1) / 7; + closestRelevantSeven = (int) floor(rawProgress); + actualProgress = rawProgress - closestRelevantSeven; + milestoneProgress[1] = 7 + (int) floor(rawProgress * 7); + if (closestRelevantSeven % 2 == 0) { + invertedRecipeMilestonePercentage = actualProgress; + recipeMilestonePercentage = 1 - invertedRecipeMilestonePercentage; + } else { + recipeMilestonePercentage = actualProgress; + invertedRecipeMilestonePercentage = 1 - recipeMilestonePercentage; + } + } + if (milestoneProgress[2] < 7) { + fuelMilestonePercentage = (float) max( + (log(totalFuelConsumed * 1f / FUEL_MILESTONE_CONSTANT) / FUEL_LOG_CONSTANT + 1), + 0) / 7; + milestoneProgress[2] = (int) floor(fuelMilestonePercentage * 7); + } + if (inversion) { + rawProgress = (((float) totalFuelConsumed / FUEL_MILESTONE_T7_CONSTANT) - 1) / 7; + closestRelevantSeven = (int) floor(rawProgress); + actualProgress = rawProgress - closestRelevantSeven; + milestoneProgress[2] = 7 + (int) floor(rawProgress * 7); + if ((closestRelevantSeven % 2) == 0) { + invertedFuelMilestonePercentage = actualProgress; + fuelMilestonePercentage = 1 - invertedFuelMilestonePercentage; + } else { + fuelMilestonePercentage = actualProgress; + invertedFuelMilestonePercentage = 1 - fuelMilestonePercentage; + } + } + + if (milestoneProgress[3] < 7) { + structureMilestonePercentage = totalExtensionsBuilt / 7f; + } + if (inversion) { + rawProgress = (totalExtensionsBuilt - 7) / 7f; + closestRelevantSeven = (int) floor(rawProgress); + actualProgress = rawProgress - closestRelevantSeven; + if ((closestRelevantSeven % 2) == 0) { + invertedStructureMilestonePercentage = actualProgress; + structureMilestonePercentage = 1 - invertedStructureMilestonePercentage; + } else { + structureMilestonePercentage = actualProgress; + invertedStructureMilestonePercentage = 1 - structureMilestonePercentage; + } + } + } + + private void determineGravitonShardAmount() { + int sum = 0; + for (int progress : milestoneProgress) { + if (!inversion) { + progress = Math.min(progress, 7); + } + sum += progress * (progress + 1) / 2; + } + gravitonShardsAvailable = sum - gravitonShardsSpent; + } + + private Text gravitonShardAmountText(int milestoneID) { + int sum; + int progress = milestoneProgress[milestoneID]; + if (!inversion) { + progress = Math.min(progress, 7); + } + sum = progress * (progress + 1) / 2; + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.shardgain") + ": " + EnumChatFormatting.GRAY + sum); + } + + private Text totalMilestoneProgress(int milestoneID) { + long progress; + BigInteger bigProgress; + String suffix; + boolean shift = Interactable.hasShiftDown(); + switch (milestoneID) { + case 1 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes"); + progress = totalRecipesProcessed; + } + case 2 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.fuel"); + progress = totalFuelConsumed; + } + case 3 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions"); + progress = milestoneProgress[3]; + } + default -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power"); + bigProgress = totalPowerConsumed; + if (!shift && (totalPowerConsumed.compareTo(BigInteger.valueOf(1_000L)) > 0)) { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + toExponentForm(bigProgress) + + " " + + suffix); + } else { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + bigProgress + + " " + + suffix); + } + } + } + if (!shift) { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + formatNumbers(progress) + + " " + + suffix); + } else { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + progress + + " " + + suffix); + } + + } + + private Text currentMilestone(int milestoneID) { + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.milestoneprogress") + ": " + + EnumChatFormatting.GRAY + + milestoneProgress[milestoneID]); + } + + private Text milestoneProgressText(int milestoneID, boolean formatting) { + long max; + BigInteger bigMax; + String suffix; + String progressText = translateToLocal("gt.blockmachines.multimachine.FOG.progress"); + Text done = new Text(translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete")); + if (Interactable.hasShiftDown()) { + formatting = false; + done = new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete") + EnumChatFormatting.DARK_RED + + "?"); + } + switch (milestoneID) { + case 0: + if (milestoneProgress[0] < 7 || inversion) { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power"); + if (inversion) { + bigMax = POWER_MILESTONE_T7_CONSTANT.multiply(BigInteger.valueOf(milestoneProgress[0] - 5)); + } else { + bigMax = BigInteger.valueOf(LongMath.pow(9, milestoneProgress[0])) + .multiply(BigInteger.valueOf(LongMath.pow(10, 15))); + } + if (formatting && (totalPowerConsumed.compareTo(BigInteger.valueOf(1_000L)) > 0)) { + return new Text( + progressText + ": " + EnumChatFormatting.GRAY + toExponentForm(bigMax) + " " + suffix); + } else { + return new Text(progressText + ": " + EnumChatFormatting.GRAY + bigMax + " " + suffix); + } + } else { + return done; + } + case 1: + if (milestoneProgress[1] < 7 || inversion) { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes"); + if (inversion) { + max = RECIPE_MILESTONE_T7_CONSTANT * (milestoneProgress[1] - 5); + } else { + max = LongMath.pow(6, milestoneProgress[1]) * LongMath.pow(10, 7); + } + break; + } else { + return done; + } + case 2: + if (milestoneProgress[2] < 7 || inversion) { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.fuel"); + if (inversion) { + max = FUEL_MILESTONE_T7_CONSTANT * (milestoneProgress[2] - 5); + } else { + max = LongMath.pow(3, milestoneProgress[2]) * LongMath.pow(10, 4); + } + break; + } else { + return done; + } + case 3: + if (milestoneProgress[3] < 7 || inversion) { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions"); + max = milestoneProgress[3] + 1; + break; + } else { + return done; + } + default: + return new Text("Error"); + } + if (formatting) { + return new Text(progressText + ": " + EnumChatFormatting.GRAY + formatNumbers(max) + " " + suffix); + } else { + return new Text(progressText + ": " + EnumChatFormatting.GRAY + max + " " + suffix); + } + } + + private void increaseBattery(int amount) { + if ((internalBattery + amount) <= maxBatteryCharge) { + internalBattery += amount; + } else { + batteryCharging = false; + } + } + + public void reduceBattery(int amount) { + if (internalBattery - amount <= 0) { + internalBattery = 0; + if (moduleHatches.size() > 0) { + for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) { + module.disconnect(); + } + } + } else { + internalBattery -= amount; + totalFuelConsumed += amount; + } + + } + + public int getBatteryCharge() { + return internalBattery; + } + + public int getMaxBatteryCharge() { + return maxBatteryCharge; + } + + public void addTotalPowerConsumed(BigInteger amount) { + totalPowerConsumed = totalPowerConsumed.add(amount); + } + + public void addTotalRecipesProcessed(long amount) { + totalRecipesProcessed += amount; + } + + @Override + protected void setHatchRecipeMap(GT_MetaTileEntity_Hatch_Input hatch) {} + + @Override + public void setItemNBT(NBTTagCompound NBT) { + NBT.setInteger("selectedFuelType", selectedFuelType); + NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor); + NBT.setInteger("internalBattery", internalBattery); + NBT.setBoolean("batteryCharging", batteryCharging); + NBT.setInteger("batterySize", maxBatteryCharge); + NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable); + NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent); + NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray()); + NBT.setLong("totalRecipesProcessed", totalRecipesProcessed); + NBT.setLong("totalFuelConsumed", totalFuelConsumed); + NBT.setInteger("starFuelStored", stellarFuelAmount); + + // Store booleanArray of all upgrades + NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound(); + + int upgradeIndex = 0; + for (Boolean upgrade : upgrades) { + upgradeBooleanArrayNBTTag.setBoolean("upgrade" + upgradeIndex, upgrade); + upgradeIndex++; + } + + NBT.setTag("upgrades", upgradeBooleanArrayNBTTag); + super.saveNBTData(NBT); + } + + @Override + public void saveNBTData(NBTTagCompound NBT) { + NBT.setInteger("selectedFuelType", selectedFuelType); + NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor); + NBT.setInteger("internalBattery", internalBattery); + NBT.setBoolean("batteryCharging", batteryCharging); + NBT.setInteger("batterySize", maxBatteryCharge); + NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable); + NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent); + NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray()); + NBT.setLong("totalRecipesProcessed", totalRecipesProcessed); + NBT.setLong("totalFuelConsumed", totalFuelConsumed); + NBT.setInteger("starFuelStored", stellarFuelAmount); + + // Store booleanArray of all upgrades + NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound(); + + int upgradeIndex = 0; + for (Boolean upgrade : upgrades) { + upgradeBooleanArrayNBTTag.setBoolean("upgrade" + upgradeIndex, upgrade); + upgradeIndex++; + } + + NBT.setTag("upgrades", upgradeBooleanArrayNBTTag); + super.saveNBTData(NBT); + } + + @Override + public void loadNBTData(NBTTagCompound NBT) { + selectedFuelType = NBT.getInteger("selectedFuelType"); + fuelConsumptionFactor = NBT.getInteger("fuelConsumptionFactor"); + internalBattery = NBT.getInteger("internalBattery"); + batteryCharging = NBT.getBoolean("batteryCharging"); + maxBatteryCharge = NBT.getInteger("batterySize"); + gravitonShardsAvailable = NBT.getInteger("gravitonShardsAvailable"); + gravitonShardsSpent = NBT.getInteger("gravitonShardsSpent"); + totalPowerConsumed = new BigInteger(NBT.getByteArray("totalPowerConsumed")); + totalRecipesProcessed = NBT.getLong("totalRecipesProcessed"); + totalFuelConsumed = NBT.getLong("totalFuelConsumed"); + stellarFuelAmount = NBT.getInteger("starFuelStored"); + + NBTTagCompound tempBooleanTag = NBT.getCompoundTag("upgrades"); + + for (int upgradeIndex = 0; upgradeIndex < 31; upgradeIndex++) { + boolean upgrade = tempBooleanTag.getBoolean("upgrade" + upgradeIndex); + upgrades[upgradeIndex] = upgrade; + } + + super.loadNBTData(NBT); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java new file mode 100644 index 0000000000..1be94b4333 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_computer.java @@ -0,0 +1,525 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_NEUTRAL; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_OK; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_LOW; +import static com.github.technus.tectech.util.CommonValues.MULTI_CHECK_AT; +import static com.github.technus.tectech.util.CommonValues.V; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GT_HatchElement.Energy; +import static gregtech.api.enums.GT_HatchElement.Maintenance; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; +import static gregtech.api.util.GT_Utility.filterValidMTEs; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputData; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputData; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Rack; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.INameFunction; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.IStatusFunction; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.IGT_HatchAdder; +import gregtech.api.util.shutdown.ShutDownReason; + +/** + * Created by danie_000 on 17.12.2016. + */ +public class GT_MetaTileEntity_EM_computer extends GT_MetaTileEntity_MultiblockBase_EM + implements ISurvivalConstructable { + + // region variables + private final ArrayList<GT_MetaTileEntity_Hatch_Rack> eRacks = new ArrayList<>(); + + private static Textures.BlockIcons.CustomIcon ScreenOFF; + private static Textures.BlockIcons.CustomIcon ScreenON; + // endregion + + // region structure + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", + translateToLocal("gt.blockmachines.multimachine.em.computer.hint.0"), // 1 - Classic/Data Hatches or + // Computer casing + translateToLocal("gt.blockmachines.multimachine.em.computer.hint.1"), // 2 - Rack Hatches or Advanced + // computer casing + }; + + private static final IStructureDefinition<GT_MetaTileEntity_EM_computer> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_EM_computer>builder() + .addShape("front", transpose(new String[][] { { " AA" }, { " AA" }, { " ~A" }, { " AA" } })) + .addShape("cap", transpose(new String[][] { { "-CB" }, { " DD" }, { " DD" }, { "-CB" } })) + .addShape("slice", transpose(new String[][] { { "-CB" }, { " ED" }, { " ED" }, { "-CB" } })) + .addShape("back", transpose(new String[][] { { " AA" }, { " AA" }, { " AA" }, { " AA" } })) + .addElement('B', ofBlock(sBlockCasingsTT, 1)) + .addElement('C', ofBlock(sBlockCasingsTT, 2)) + .addElement('D', ofBlock(sBlockCasingsTT, 3)) + .addElement( + 'A', + buildHatchAdder(GT_MetaTileEntity_EM_computer.class) + .atLeast( + Energy.or(HatchElement.EnergyMulti), + Maintenance, + HatchElement.Uncertainty, + HatchElement.OutputData) + .casingIndex(textureOffset + 1) + .dot(1) + .buildAndChain(ofBlock(sBlockCasingsTT, 1))) + .addElement('E', ofChain(RackHatchElement.INSTANCE.newAny(textureOffset + 3, 2), ofBlock(sBlockCasingsTT, 3))) + .build(); + // endregion + + // region parameters + protected Parameters.Group.ParameterIn overclock, overvolt; + protected Parameters.Group.ParameterOut maxCurrentTemp, availableData; + + private static final INameFunction<GT_MetaTileEntity_EM_computer> OC_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.em.computer.cfgi.0"); // Overclock ratio + private static final INameFunction<GT_MetaTileEntity_EM_computer> OV_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.em.computer.cfgi.1"); // Overvoltage ratio + private static final INameFunction<GT_MetaTileEntity_EM_computer> MAX_TEMP_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.em.computer.cfgo.0"); // Current max. heat + private static final INameFunction<GT_MetaTileEntity_EM_computer> COMPUTE_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.em.computer.cfgo.1"); // Produced computation + private static final IStatusFunction<GT_MetaTileEntity_EM_computer> OC_STATUS = (base, p) -> LedStatus + .fromLimitsInclusiveOuterBoundary(p.get(), 0, 1, 1, 3); + private static final IStatusFunction<GT_MetaTileEntity_EM_computer> OV_STATUS = (base, p) -> LedStatus + .fromLimitsInclusiveOuterBoundary(p.get(), .7, .8, 1.2, 2); + private static final IStatusFunction<GT_MetaTileEntity_EM_computer> MAX_TEMP_STATUS = (base, p) -> LedStatus + .fromLimitsInclusiveOuterBoundary(p.get(), -10000, 0, 0, 5000); + private static final IStatusFunction<GT_MetaTileEntity_EM_computer> COMPUTE_STATUS = (base, p) -> { + if (base.eAvailableData < 0) { + return STATUS_TOO_LOW; + } + if (base.eAvailableData == 0) { + return STATUS_NEUTRAL; + } + return STATUS_OK; + }; + // endregion + + public GT_MetaTileEntity_EM_computer(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + eCertainMode = 5; + eCertainStatus = -128; // no-brain value + } + + public GT_MetaTileEntity_EM_computer(String aName) { + super(aName); + eCertainMode = 5; + eCertainStatus = -128; // no-brain value + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_computer(mName); + } + + @Override + protected void parametersInstantiation_EM() { + Parameters.Group hatch_0 = parametrization.getGroup(0); + overclock = hatch_0.makeInParameter(0, 1, OC_NAME, OC_STATUS); + overvolt = hatch_0.makeInParameter(1, 1, OV_NAME, OV_STATUS); + maxCurrentTemp = hatch_0.makeOutParameter(0, 0, MAX_TEMP_NAME, MAX_TEMP_STATUS); + availableData = hatch_0.makeOutParameter(1, 0, COMPUTE_NAME, COMPUTE_STATUS); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) { + rack.getBaseMetaTileEntity() + .setActive(false); + } + eRacks.clear(); + if (!structureCheck_EM("front", 1, 2, 0)) { + return false; + } + if (!structureCheck_EM("cap", 1, 2, -1)) { + return false; + } + byte offset = -2, totalLen = 4; + while (offset > -16) { + if (!structureCheck_EM("slice", 1, 2, offset)) { + break; + } + totalLen++; + offset--; + } + if (totalLen > 17) { + return false; + } + if (!structureCheck_EM("cap", 1, 2, ++offset)) { + return false; + } + if (!structureCheck_EM("back", 1, 2, --offset)) { + return false; + } + eCertainMode = (byte) Math.min(totalLen / 3, 5); + for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) { + rack.getBaseMetaTileEntity() + .setActive(iGregTechTileEntity.isActive()); + } + return eUncertainHatches.size() == 1; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setDouble("computation", availableData.get()); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + if (availableData != null) { + availableData.set(aNBT.getDouble("computation")); + eAvailableData = (long) availableData.get(); + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide() && mMachine + && !aBaseMetaTileEntity.isActive() + && aTick % 20 == MULTI_CHECK_AT) { + double maxTemp = 0; + for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) { + if (rack.heat > maxTemp) { + maxTemp = rack.heat; + } + } + maxCurrentTemp.set(maxTemp); + } + } + + @Override + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + parametrization.setToDefaults(false, true); + eAvailableData = 0; + double maxTemp = 0; + double overClockRatio = overclock.get(); + double overVoltageRatio = overvolt.get(); + if (Double.isNaN(overClockRatio) || Double.isNaN(overVoltageRatio)) { + return SimpleCheckRecipeResult.ofFailure("no_computing"); + } + if (overclock.getStatus(true).isOk && overvolt.getStatus(true).isOk) { + float eut = V[8] * (float) overVoltageRatio * (float) overClockRatio; + if (eut < Integer.MAX_VALUE - 7) { + mEUt = -(int) eut; + } else { + mEUt = -(int) V[8]; + return CheckRecipeResultRegistry.POWER_OVERFLOW; + } + short thingsActive = 0; + int rackComputation; + + for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) { + if (rack.heat > maxTemp) { + maxTemp = rack.heat; + } + rackComputation = rack.tickComponents((float) overClockRatio, (float) overVoltageRatio); + if (rackComputation > 0) { + eAvailableData += rackComputation; + thingsActive += 4; + } + rack.getBaseMetaTileEntity() + .setActive(true); + } + + for (GT_MetaTileEntity_Hatch_InputData di : eInputData) { + if (di.q != null) // ok for power losses + { + thingsActive++; + } + } + + if (thingsActive > 0 && eCertainStatus == 0) { + thingsActive += eOutputData.size(); + eAmpereFlow = 1 + (thingsActive >> 2); + mMaxProgresstime = 20; + mEfficiencyIncrease = 10000; + maxCurrentTemp.set(maxTemp); + availableData.set(eAvailableData); + return SimpleCheckRecipeResult.ofSuccess("computing"); + } else { + eAvailableData = 0; + mEUt = -(int) V[8]; + eAmpereFlow = 1; + mMaxProgresstime = 20; + mEfficiencyIncrease = 10000; + maxCurrentTemp.set(maxTemp); + availableData.set(eAvailableData); + return SimpleCheckRecipeResult.ofSuccess("no_computing"); + } + } + return SimpleCheckRecipeResult.ofFailure("no_computing"); + } + + @Override + public void outputAfterRecipe_EM() { + if (!eOutputData.isEmpty()) { + Vec3Impl pos = new Vec3Impl( + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord()); + + QuantumDataPacket pack = new QuantumDataPacket(eAvailableData / eOutputData.size()).unifyTraceWith(pos); + if (pack == null) { + return; + } + for (GT_MetaTileEntity_Hatch_InputData hatch : eInputData) { + if (hatch.q == null || hatch.q.contains(pos)) { + continue; + } + pack = pack.unifyPacketWith(hatch.q); + if (pack == null) { + return; + } + } + + for (GT_MetaTileEntity_Hatch_OutputData o : eOutputData) { + o.q = pack; + } + } + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.computer.name")) // Machine Type: Quantum + // Computer + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.computer.desc.0")) // Controller block of + // the Quantum Computer + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.computer.desc.1")) // Used to generate + // computation (and heat) + .addInfo(translateToLocal("tt.keyword.Structure.StructureTooComplex")) // The structure is too complex! + .addSeparator() + .beginVariableStructureBlock(2, 2, 4, 4, 5, 16, false) + .addOtherStructurePart( + translateToLocal("gt.blockmachines.hatch.certain.tier.07.name"), + translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"), + 1) // Uncertainty Resolver: Any Computer Casing on first or last slice + .addOtherStructurePart( + translateToLocal("tt.keyword.Structure.DataConnector"), + translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"), + 1) // Optical Connector: Any Computer Casing on first or last slice + .addOtherStructurePart( + translateToLocal("gt.blockmachines.hatch.rack.tier.08.name"), + translateToLocal("tt.keyword.Structure.AnyAdvComputerCasingExceptOuter"), + 2) // Computer Rack: Any Advanced Computer Casing, except the outer ones + .addOtherStructurePart( + translateToLocal("gt.blockmachines.hatch.param.tier.05.name"), + translateToLocal("tt.keyword.Structure.Optional") + " " + + translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"), + 2) // Parametrizer: (optional) Any Computer Casing on first or last slice + .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"), 1) // Energy + // Hatch: + // Any + // Computer + // Casing + // on + // first + // or + // last + // slice + .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice"), 1) // Maintenance + // Hatch: + // Any + // Computer + // Casing + // on + // first + // or + // last + // slice + .toolTipFinisher(CommonValues.TEC_MARK_EM); + return tt; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/EM_COMPUTER"); + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/EM_COMPUTER_ACTIVE"); + super.registerIcons(aBlockIconRegister); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][3], + new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][3] }; + } + + @Override + @SideOnly(Side.CLIENT) + protected ResourceLocation getActivitySound() { + return GT_MetaTileEntity_EM_switch.activitySound; + } + + @Override + public void onRemoval() { + super.onRemoval(); + for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) { + rack.getBaseMetaTileEntity() + .setActive(false); + } + } + + @Override + protected void extraExplosions_EM() { + for (MetaTileEntity tTileEntity : eRacks) { + tTileEntity.getBaseMetaTileEntity() + .doExplosion(V[9]); + } + } + + @Override + protected long getAvailableData_EM() { + return eAvailableData; + } + + @Override + public void stopMachine(@Nonnull ShutDownReason reason) { + super.stopMachine(reason); + eAvailableData = 0; + for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) { + rack.getBaseMetaTileEntity() + .setActive(false); + } + } + + @Override + protected void afterRecipeCheckFailed() { + super.afterRecipeCheckFailed(); + for (GT_MetaTileEntity_Hatch_Rack rack : filterValidMTEs(eRacks)) { + rack.getBaseMetaTileEntity() + .setActive(false); + } + } + + public final boolean addRackToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Rack) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eRacks.add((GT_MetaTileEntity_Hatch_Rack) aMetaTileEntity); + } + return false; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM("front", 1, 2, 0, stackSize, hintsOnly); + structureBuild_EM("cap", 1, 2, -1, stackSize, hintsOnly); + + byte offset = -2; + for (int rackSlices = Math.min(stackSize.stackSize, 12); rackSlices > 0; rackSlices--) { + structureBuild_EM("slice", 1, 2, offset--, stackSize, hintsOnly); + } + + structureBuild_EM("cap", 1, 2, offset--, stackSize, hintsOnly); + structureBuild_EM("back", 1, 2, offset, stackSize, hintsOnly); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + int built; + built = survivialBuildPiece("front", stackSize, 1, 2, 0, elementBudget, source, actor, false, true); + if (built >= 0) return built; + built = survivialBuildPiece("cap", stackSize, 1, 2, -1, elementBudget, source, actor, false, true); + if (built >= 0) return built; + + byte offset = -2; + for (int rackSlices = Math.min(stackSize.stackSize, 12); rackSlices > 0; rackSlices--) { + built = survivialBuildPiece("slice", stackSize, 1, 2, offset--, elementBudget, source, actor, false, true); + if (built >= 0) return built; + } + built = survivialBuildPiece("cap", stackSize, 1, 2, offset--, elementBudget, source, actor, false, true); + if (built >= 0) return built; + return survivialBuildPiece("back", stackSize, 1, 2, offset, elementBudget, source, actor, false, true); + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_EM_computer> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } + + private enum RackHatchElement implements IHatchElement<GT_MetaTileEntity_EM_computer> { + + INSTANCE; + + @Override + public List<? extends Class<? extends IMetaTileEntity>> mteClasses() { + return Collections.singletonList(GT_MetaTileEntity_Hatch_Rack.class); + } + + @Override + public IGT_HatchAdder<? super GT_MetaTileEntity_EM_computer> adder() { + return GT_MetaTileEntity_EM_computer::addRackToMachineList; + } + + @Override + public long count(GT_MetaTileEntity_EM_computer t) { + return t.eRacks.size(); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java new file mode 100644 index 0000000000..bbf719542b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_dataBank.java @@ -0,0 +1,302 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; +import static com.github.technus.tectech.util.CommonValues.V; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.mechanics.dataTransport.InventoryDataPacket; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputDataItems; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputDataItems; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.IGT_HatchAdder; + +public class GT_MetaTileEntity_EM_dataBank extends GT_MetaTileEntity_MultiblockBase_EM + implements ISurvivalConstructable { + + // region variables + private final ArrayList<GT_MetaTileEntity_Hatch_OutputDataItems> eStacksDataOutputs = new ArrayList<>(); + private final ArrayList<IInventory> eDataAccessHatches = new ArrayList<>(); + private boolean slave = false; + // endregion + + // region structure + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", + translateToLocal("gt.blockmachines.multimachine.em.databank.hint.0"), // 1 - Classic Hatches or high power + // casing + translateToLocal("gt.blockmachines.multimachine.em.databank.hint.1"), // 2 - Data Access/Data Bank Master + // Hatches or + // computer casing + }; + + private static final IStructureDefinition<GT_MetaTileEntity_EM_dataBank> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_EM_dataBank>builder() + .addShape( + "main", + transpose( + new String[][] { { "BCCCB", "BDDDB", "BDDDB" }, { "BC~CB", "BAAAB", "BDDDB" }, + { "BCCCB", "BDDDB", "BDDDB" } })) + .addElement('A', ofBlock(sBlockCasingsTT, 1)) + .addElement('B', ofBlock(sBlockCasingsTT, 2)) + .addElement('C', classicHatches(textureOffset, 1, sBlockCasingsTT, 0)) + .addElement( + 'D', + buildHatchAdder(GT_MetaTileEntity_EM_dataBank.class) + .atLeast(DataBankHatches.OutboundConnector, DataBankHatches.InboundConnector) + .casingIndex(textureOffset + 1) + .dot(2) + .buildAndChain(DataBankHatches.DataStick.newAny(textureOffset + 1, 2), ofBlock(sBlockCasingsTT, 1))) + .build(); + // endregion + + public GT_MetaTileEntity_EM_dataBank(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_dataBank(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_dataBank(mName); + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.databank.name")) // Machine Type: Data Bank + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.databank.desc.0")) // Controller block of + // the Data Bank + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.databank.desc.1")) // Used to supply + // Assembling Lines + // with more Data Sticks + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.databank.desc.2")) // and give multiple + // Assembling + // Lines access to the same Data + // Stick + .addInfo(translateToLocal("tt.keyword.Structure.StructureTooComplex")) // The structure is too complex! + .addSeparator() + .beginStructureBlock(5, 3, 3, false) + .addOtherStructurePart( + translateToLocal("tt.keyword.Structure.DataAccessHatch"), + translateToLocal("tt.keyword.Structure.AnyComputerCasing"), + 2) // Data Access Hatch: Any Computer Casing + .addOtherStructurePart( + translateToLocal("gt.blockmachines.hatch.dataoutass.tier.07.name"), + translateToLocal("tt.keyword.Structure.AnyComputerCasing"), + 2) // Data Bank Master Connector: Any Computer Casing + .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) // Energy Hatch: Any + // High Power Casing + .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) // Maintenance + // Hatch: Any High + // Power Casing + .toolTipFinisher(CommonValues.TEC_MARK_EM); + return tt; + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + eDataAccessHatches.clear(); + eStacksDataOutputs.clear(); + slave = false; + return structureCheck_EM("main", 2, 1, 0); + } + + @Override + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + if (eDataAccessHatches.size() > 0 && eStacksDataOutputs.size() > 0) { + mEUt = -(int) V[slave ? 6 : 4]; + eAmpereFlow = 1 + (long) eStacksDataOutputs.size() * eDataAccessHatches.size(); + mMaxProgresstime = 20; + mEfficiencyIncrease = 10000; + return SimpleCheckRecipeResult.ofSuccess("providing_data"); + } + return SimpleCheckRecipeResult.ofFailure("no_data"); + } + + @Override + public void outputAfterRecipe_EM() { + ArrayList<ItemStack> stacks = new ArrayList<>(); + for (IInventory dataAccess : eDataAccessHatches) { + int count = dataAccess.getSizeInventory(); + for (int i = 0; i < count; i++) { + ItemStack stack = dataAccess.getStackInSlot(i); + if (stack != null) { + stacks.add(stack); + } + } + } + if (stacks.size() > 0) { + ItemStack[] arr = stacks.toArray(nullItem); + for (GT_MetaTileEntity_Hatch_OutputDataItems hatch : eStacksDataOutputs) { + hatch.q = new InventoryDataPacket(arr); + } + } else { + for (GT_MetaTileEntity_Hatch_OutputDataItems hatch : eStacksDataOutputs) { + hatch.q = null; + } + } + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][1], + new TT_RenderedExtendedFacingTexture( + aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON + : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][1] }; + } + + public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_hi_freq"); + + @Override + @SideOnly(Side.CLIENT) + protected ResourceLocation getActivitySound() { + return activitySound; + } + + public final boolean addDataBankHatchToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputDataItems) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eStacksDataOutputs.add((GT_MetaTileEntity_Hatch_OutputDataItems) aMetaTileEntity); + } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DataAccess + && !(aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputDataItems)) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eDataAccessHatches.add(aMetaTileEntity); + } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputDataItems) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + slave = true; + return eDataAccessHatches.add(aMetaTileEntity); + } + return false; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM("main", 2, 1, 0, stackSize, hintsOnly); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 2, 1, 0, elementBudget, source, actor, false, true); + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_EM_dataBank> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } + + private enum DataBankHatches implements IHatchElement<GT_MetaTileEntity_EM_dataBank> { + + DataStick(GT_MetaTileEntity_Hatch_DataAccess.class) { + + @Override + public long count(GT_MetaTileEntity_EM_dataBank t) { + return t.eDataAccessHatches.size(); + } + }, + OutboundConnector(GT_MetaTileEntity_Hatch_OutputDataItems.class) { + + @Override + public long count(GT_MetaTileEntity_EM_dataBank t) { + return t.eStacksDataOutputs.size(); + } + }, + InboundConnector(GT_MetaTileEntity_Hatch_InputDataItems.class) { + + @Override + public long count(GT_MetaTileEntity_EM_dataBank t) { + return t.eDataAccessHatches.size(); + } + }; + + private final List<? extends Class<? extends IMetaTileEntity>> mteClasses; + + @SafeVarargs + DataBankHatches(Class<? extends IMetaTileEntity>... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + } + + @Override + public List<? extends Class<? extends IMetaTileEntity>> mteClasses() { + return mteClasses; + } + + @Override + public IGT_HatchAdder<? super GT_MetaTileEntity_EM_dataBank> adder() { + return GT_MetaTileEntity_EM_dataBank::addDataBankHatchToMachineList; + } + } + + @Override + public boolean isPowerPassButtonEnabled() { + return true; + } + + @Override + public boolean isSafeVoidButtonEnabled() { + return false; + } + + @Override + public boolean isAllowedToWorkButtonEnabled() { + return true; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_infuser.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_infuser.java new file mode 100644 index 0000000000..577fae6d4b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_infuser.java @@ -0,0 +1,315 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.GregTech_API.mEUtoRF; +import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; + +import cofh.api.energy.IEnergyContainerItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_InputBus_ME; +import ic2.api.item.ElectricItem; +import ic2.api.item.IElectricItem; + +/** + * Created by danie_000 on 17.12.2016. + */ +public class GT_MetaTileEntity_EM_infuser extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable { + + private static final int maxRepairedDamagePerOperation = 1000; + private static final long usedEuPerDurability = 1000; + private static final int usedUumPerDurability = 1; + + // region structure + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", + // 1 - Classic Hatches or High Power Casing + translateToLocal("gt.blockmachines.multimachine.em.infuser.hint"), }; + + private static final IStructureDefinition<GT_MetaTileEntity_EM_infuser> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_EM_infuser>builder() + .addShape( + "main", + transpose( + new String[][] { { "CCC", "CCC", "CCC" }, { "BBB", "BAB", "BBB" }, { "A~A", "AAA", "AAA" }, + { "BBB", "BAB", "BBB" }, { "CCC", "CCC", "CCC" } })) + .addElement('A', ofBlock(sBlockCasingsTT, 4)) + .addElement('B', ofBlock(sBlockCasingsTT, 7)) + .addElement( + 'C', + ofHatchAdderOptional( + GT_MetaTileEntity_EM_infuser::addClassicToMachineList, + textureOffset, + 1, + sBlockCasingsTT, + 0)) + .build(); + // endregion + + public GT_MetaTileEntity_EM_infuser(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + minRepairStatus = (byte) getIdealStatus(); + eDismantleBoom = true; + } + + public GT_MetaTileEntity_EM_infuser(String aName) { + super(aName); + minRepairStatus = (byte) getIdealStatus(); + eDismantleBoom = true; + } + + private boolean isItemStackFullyCharged(ItemStack stack) { + if (stack == null) { + return true; + } + Item item = stack.getItem(); + if (stack.stackSize == 1) { + if (item instanceof IElectricItem) { + return ElectricItem.manager.getCharge(stack) >= ((IElectricItem) item).getMaxCharge(stack); + } else if (TecTech.hasCOFH && item instanceof IEnergyContainerItem) { + return ((IEnergyContainerItem) item).getEnergyStored(stack) + >= ((IEnergyContainerItem) item).getMaxEnergyStored(stack); + } + } + return true; + } + + private boolean isItemStackFullyRepaired(ItemStack stack) { + if (stack == null) { + return true; + } + Item item = stack.getItem(); + return !item.isRepairable() || item.getMaxDamage(stack) <= 0 || item.getDamage(stack) <= 0; + } + + private long doChargeItemStack(IElectricItem item, ItemStack stack) { + try { + double euDiff = item.getMaxCharge(stack) - ElectricItem.manager.getCharge(stack); + long remove = (long) Math.ceil( + ElectricItem.manager.charge(stack, Math.min(euDiff, getEUVar()), item.getTier(stack), true, false)); + setEUVar(getEUVar() - remove); + if (getEUVar() < 0) { + setEUVar(0); + } + return remove; + } catch (Exception e) { + if (DEBUG_MODE) { + e.printStackTrace(); + } + } + return 0; + } + + private long doChargeItemStackRF(IEnergyContainerItem item, ItemStack stack) { + try { + long RF = Math + .min(item.getMaxEnergyStored(stack) - item.getEnergyStored(stack), getEUVar() * mEUtoRF / 100L); + RF = item.receiveEnergy(stack, RF > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) RF, false); + RF = RF * 100L / mEUtoRF; + setEUVar(getEUVar() - RF); + if (getEUVar() < 0) { + setEUVar(0); + } + return RF; + } catch (Exception e) { + if (DEBUG_MODE) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_infuser(mName); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + return structureCheck_EM("main", 1, 2, 0); + } + + @Override + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + for (GT_MetaTileEntity_Hatch_InputBus inputBus : mInputBusses) { + if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME) continue; + for (int i = 0; i < inputBus.getSizeInventory(); i++) { + ItemStack itemStackInBus = inputBus.getStackInSlot(i); + if (itemStackInBus == null) continue; + Item item = itemStackInBus.getItem(); + if (itemStackInBus.stackSize != 1 || item == null) continue; + if (isItemStackFullyCharged(itemStackInBus) && isItemStackFullyRepaired(itemStackInBus)) { + if (addOutput(itemStackInBus)) { + this.depleteInput(itemStackInBus); + } + } else { + mEfficiencyIncrease = 10000; + mMaxProgresstime = 20; + return SimpleCheckRecipeResult.ofSuccess("charging"); + } + } + } + return SimpleCheckRecipeResult.ofFailure("no_chargeable_item"); + } + + @Override + public void outputAfterRecipe_EM() { + boolean itemProcessed = false; + startRecipeProcessing(); + for (GT_MetaTileEntity_Hatch_InputBus inputBus : mInputBusses) { + if (inputBus instanceof GT_MetaTileEntity_Hatch_InputBus_ME) continue; + for (int i = 0; i < inputBus.getSizeInventory(); i++) { + ItemStack itemStackInBus = inputBus.getStackInSlot(i); + if (itemStackInBus == null) continue; + Item item = itemStackInBus.getItem(); + if (itemStackInBus.stackSize != 1 || item == null) continue; + if (isItemStackFullyCharged(itemStackInBus) && isItemStackFullyRepaired(itemStackInBus)) { + itemProcessed = true; + if (addOutput(itemStackInBus)) { + this.depleteInput(itemStackInBus); + } + } else { + if (item.isRepairable()) { + FluidStack uum = getStoredFluids().stream() + .filter( + fluid -> Materials.UUMatter.getFluid(1) + .isFluidEqual(fluid)) + .findAny() + .orElse(null); + if (uum != null) { + int repairedDamage = Math + .min(item.getDamage(itemStackInBus), maxRepairedDamagePerOperation); + long euCost = repairedDamage * usedEuPerDurability; + if (getEUVar() >= euCost && depleteInput( + new FluidStack(Materials.UUMatter.mFluid, repairedDamage * usedUumPerDurability))) { + item.setDamage( + itemStackInBus, + Math.max(item.getDamage(itemStackInBus) - repairedDamage, 0)); + setEUVar(Math.min(getEUVar() - euCost, 0)); + } + } + } + if (item instanceof IElectricItem) { + doChargeItemStack((IElectricItem) item, itemStackInBus); + return; + } else if (TecTech.hasCOFH && item instanceof IEnergyContainerItem) { + doChargeItemStackRF((IEnergyContainerItem) item, itemStackInBus); + return; + } + } + } + } + endRecipeProcessing(); + if (!itemProcessed) { + afterRecipeCheckFailed(); + } + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + // Machine Type: Energy Infuser + tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.infuser.name")) + // Controller block of the Energy Infuser + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.infuser.desc.0")) + // Can be used to charge items (lossless) + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.infuser.desc.1")) + // Can be fed with UU-Matter to repair items + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.infuser.desc.2")) + // Stocking Bus is not supported + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.infuser.desc.3")) + .addSeparator() + .beginStructureBlock(3, 5, 3, false) + // Controller: Front 3rd layer center + .addController(translateToLocal("tt.keyword.Structure.FrontCenter3rd")) + .addOtherStructurePart( + // High Power + translateToLocal("gt.blockcasingsTT.0.name"), + translateToLocal("gt.blockmachines.multimachine.em.infuser.Structure.HighPowerCasing")) + // Casing: Layer + // 1 and 5 + .addOtherStructurePart( + // Molecular Coil + translateToLocal("gt.blockcasingsTT.7.name"), + translateToLocal("gt.blockmachines.multimachine.em.infuser.Structure.MolecularCoil")) + // Layer 2 and 4 + .addOtherStructurePart( + // Molecular + translateToLocal("gt.blockcasingsTT.4.name"), + translateToLocal("gt.blockmachines.multimachine.em.infuser.Structure.MolecularCasing")) + // Casing: Layer + // 3 (hollow) + // Energy Hatch: Any High Power Casing + .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) + // Maintenance Hatch: Any High Power Casing + .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) + .toolTipFinisher(CommonValues.TEC_MARK_GENERAL); + return tt; + } + + public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_whooum"); + + @Override + @SideOnly(Side.CLIENT) + protected ResourceLocation getActivitySound() { + return activitySound; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM("main", 1, 2, 0, stackSize, hintsOnly); + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_EM_infuser> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } + + @Override + public boolean isPowerPassButtonEnabled() { + return true; + } + + @Override + public boolean isSafeVoidButtonEnabled() { + return false; + } + + @Override + public boolean isAllowedToWorkButtonEnabled() { + return true; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java new file mode 100644 index 0000000000..fce7913613 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_research.java @@ -0,0 +1,823 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; +import static com.github.technus.tectech.util.CommonValues.V; +import static com.github.technus.tectech.util.CommonValues.VN; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GT_HatchElement.Energy; +import static gregtech.api.enums.GT_HatchElement.Maintenance; +import static gregtech.api.recipe.RecipeMaps.scannerFakeRecipes; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; +import static gregtech.api.util.GT_Utility.filterValidMTEs; +import static mcp.mobius.waila.api.SpecialChars.GREEN; +import static mcp.mobius.waila.api.SpecialChars.RED; +import static mcp.mobius.waila.api.SpecialChars.RESET; +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.recipe.TecTechRecipeMaps; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Holder; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; + +import gregtech.api.enums.ItemList; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_AssemblyLineUtils; +import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.IGT_HatchAdder; +import gregtech.api.util.shutdown.ShutDownReason; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +/** + * Created by danie_000 on 17.12.2016. + */ +@SuppressWarnings("unchecked") +public class GT_MetaTileEntity_EM_research extends GT_MetaTileEntity_MultiblockBase_EM + implements ISurvivalConstructable { + + public static final String machine = "EM Machinery"; + public static final String crafter = "EM Crafting"; + // region variables + private final ArrayList<GT_MetaTileEntity_Hatch_Holder> eHolders = new ArrayList<>(); + private GT_Recipe.GT_Recipe_AssemblyLine tRecipe; + private static final String assembly = "Assembly line"; + private static final String scanner = "Scanner"; + private String machineType = assembly; + private ItemStack holdItem; + private long computationRemaining, computationRequired; + + private static LinkedHashMap<String, String> lServerNames; + + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", + translateToLocal("gt.blockmachines.multimachine.em.research.hint.0"), // 1 - Classic/Data Hatches or + // Computer casing + translateToLocal("gt.blockmachines.multimachine.em.research.hint.1"), // 2 - Holder Hatch + }; + + private String clientLocale = "en_US"; + // endregion + + // region structure + private static final IStructureDefinition<GT_MetaTileEntity_EM_research> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_EM_research>builder() + .addShape( + "main", + transpose( + new String[][] { { " ", " A ", " A ", "AAA", "AAA", "AAA", "AAA" }, + { "AAA", "ACA", "ACA", "ACA", "BCB", "BCB", "BBB" }, + { " ", " C ", " ", " ", "ACA", "CCC", "DDD" }, + { " ", " E ", " ", " ", "A~A", "CCC", "DDD" }, + { " ", " C ", " ", " ", "ACA", "CCC", "DDD" }, + { "AAA", "ACA", "ACA", "ACA", "BCB", "BCB", "BBB" }, + { " ", " A ", " A ", "AAA", "AAA", "AAA", "AAA" } })) + .addElement('A', ofBlock(sBlockCasingsTT, 1)) + .addElement('B', ofBlock(sBlockCasingsTT, 2)) + .addElement('C', ofBlock(sBlockCasingsTT, 3)) + .addElement( + 'D', + buildHatchAdder(GT_MetaTileEntity_EM_research.class) + .atLeast(Energy.or(HatchElement.EnergyMulti), Maintenance, HatchElement.InputData) + .casingIndex(textureOffset + 1) + .dot(1) + .buildAndChain(ofBlock(sBlockCasingsTT, 1))) + .addElement('E', HolderHatchElement.INSTANCE.newAny(textureOffset + 3, 2)) + .build(); + // endregion + + public GT_MetaTileEntity_EM_research(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_research(String aName) { + super(aName); + } + + private void makeStick() { + mInventory[1].setTagCompound(new NBTTagCompound()); + mInventory[1].setStackDisplayName( + GT_LanguageManager.getTranslation(tRecipe.mOutput.getDisplayName()) + " Construction Data"); + GT_Utility.ItemNBT.setBookTitle( + mInventory[1], + GT_LanguageManager.getTranslation(tRecipe.mOutput.getDisplayName()) + " Construction Data"); + NBTTagCompound tNBT = mInventory[1].getTagCompound(); // code above makes it not null + + tNBT.setTag("output", tRecipe.mOutput.writeToNBT(new NBTTagCompound())); + tNBT.setInteger("time", tRecipe.mDuration); + tNBT.setInteger("eu", tRecipe.mEUt); + for (int i = 0; i < tRecipe.mInputs.length; i++) { + tNBT.setTag(String.valueOf(i), tRecipe.mInputs[i].writeToNBT(new NBTTagCompound())); + } + for (int i = 0; i < tRecipe.mFluidInputs.length; i++) { + tNBT.setTag("f" + i, tRecipe.mFluidInputs[i].writeToNBT(new NBTTagCompound())); + } + tNBT.setString( + "author", + EnumChatFormatting.BLUE + "Tec" + + EnumChatFormatting.DARK_BLUE + + "Tech" + + EnumChatFormatting.WHITE + + " Assembling Line Recipe Generator"); + NBTTagList tNBTList = new NBTTagList(); + tNBTList.appendTag( + new NBTTagString( + "Construction plan for " + tRecipe.mOutput.stackSize + + ' ' + + GT_LanguageManager.getTranslation(tRecipe.mOutput.getDisplayName()) + + ". Needed EU/t: " + + tRecipe.mEUt + + " Production time: " + + tRecipe.mDuration / 20)); + for (int i = 0; i < tRecipe.mInputs.length; i++) { + if (tRecipe.mInputs[i] != null) { + tNBTList.appendTag( + new NBTTagString( + "Input Bus " + (i + 1) + + ": " + + tRecipe.mInputs[i].stackSize + + ' ' + + GT_LanguageManager.getTranslation(tRecipe.mInputs[i].getDisplayName()))); + } + } + for (int i = 0; i < tRecipe.mFluidInputs.length; i++) { + if (tRecipe.mFluidInputs[i] != null) { + tNBTList.appendTag( + new NBTTagString( + "Input Hatch " + (i + 1) + + ": " + + tRecipe.mFluidInputs[i].amount + + "L " + + GT_LanguageManager.getTranslation(tRecipe.mFluidInputs[i].getLocalizedName()))); + } + } + tNBT.setTag("pages", tNBTList); + } + + static { + try { + Class<?> GT_Assemblyline_Server = Class.forName("gregtech.api.util.GT_Assemblyline_Server"); + lServerNames = (LinkedHashMap<String, String>) GT_Assemblyline_Server.getField("lServerNames") + .get(null); + } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { + lServerNames = null; + } + } + + private void makeStick2() { + String s = tRecipe.mOutput.getDisplayName(); + if (getBaseMetaTileEntity().isServerSide()) { + if (lServerNames != null) { + s = lServerNames.get(tRecipe.mOutput.getDisplayName()); + if (s == null) { + s = tRecipe.mOutput.getDisplayName(); + } + } else { + s = tRecipe.mOutput.getDisplayName(); + } + } + mInventory[1].setTagCompound(new NBTTagCompound()); + mInventory[1].setStackDisplayName(s + " Construction Data"); + GT_Utility.ItemNBT.setBookTitle(mInventory[1], s + " Construction Data"); + + NBTTagCompound tNBT = mInventory[1].getTagCompound(); + + tNBT.setTag("output", tRecipe.mOutput.writeToNBT(new NBTTagCompound())); + tNBT.setInteger("time", tRecipe.mDuration); + tNBT.setInteger("eu", tRecipe.mEUt); + for (int i = 0; i < tRecipe.mInputs.length; i++) { + tNBT.setTag("" + i, tRecipe.mInputs[i].writeToNBT(new NBTTagCompound())); + } + for (int i = 0; i < tRecipe.mOreDictAlt.length; i++) { + if (tRecipe.mOreDictAlt[i] != null && tRecipe.mOreDictAlt[i].length > 0) { + tNBT.setInteger("a" + i, tRecipe.mOreDictAlt[i].length); + for (int j = 0; j < tRecipe.mOreDictAlt[i].length; j++) { + tNBT.setTag("a" + i + ":" + j, tRecipe.mOreDictAlt[i][j].writeToNBT(new NBTTagCompound())); + } + } + } + for (int i = 0; i < tRecipe.mFluidInputs.length; i++) { + tNBT.setTag("f" + i, tRecipe.mFluidInputs[i].writeToNBT(new NBTTagCompound())); + } + tNBT.setString( + "author", + EnumChatFormatting.BLUE + "Tec" + + EnumChatFormatting.DARK_BLUE + + "Tech" + + EnumChatFormatting.WHITE + + ' ' + + machineType + + " Recipe Generator"); + NBTTagList tNBTList = new NBTTagList(); + s = tRecipe.mOutput.getDisplayName(); + if (getBaseMetaTileEntity().isServerSide()) { + s = lServerNames.get(tRecipe.mOutput.getDisplayName()); + if (s == null) { + s = tRecipe.mOutput.getDisplayName(); + } + } + tNBTList.appendTag( + new NBTTagString( + "Construction plan for " + tRecipe.mOutput.stackSize + + " " + + s + + ". Needed EU/t: " + + tRecipe.mEUt + + " Production time: " + + (tRecipe.mDuration / 20))); + for (int i = 0; i < tRecipe.mInputs.length; i++) { + if (tRecipe.mOreDictAlt[i] != null) { + int count = 0; + StringBuilder tBuilder = new StringBuilder("Input Bus " + (i + 1) + ": "); + for (ItemStack tStack : tRecipe.mOreDictAlt[i]) { + if (tStack != null) { + s = tStack.getDisplayName(); + if (getBaseMetaTileEntity().isServerSide()) { + s = lServerNames.get(tStack.getDisplayName()); + if (s == null) s = tStack.getDisplayName(); + } + + tBuilder.append(count == 0 ? "" : "\nOr ") + .append(tStack.stackSize) + .append(" ") + .append(s); + count++; + } + } + if (count > 0) tNBTList.appendTag(new NBTTagString(tBuilder.toString())); + } else if (tRecipe.mInputs[i] != null) { + s = tRecipe.mInputs[i].getDisplayName(); + if (getBaseMetaTileEntity().isServerSide()) { + s = lServerNames.get(tRecipe.mInputs[i].getDisplayName()); + if (s == null) { + s = tRecipe.mInputs[i].getDisplayName(); + } + } + tNBTList.appendTag( + new NBTTagString("Input Bus " + (i + 1) + ": " + tRecipe.mInputs[i].stackSize + " " + s)); + } + } + for (int i = 0; i < tRecipe.mFluidInputs.length; i++) { + if (tRecipe.mFluidInputs[i] != null) { + s = tRecipe.mFluidInputs[i].getLocalizedName(); + if (getBaseMetaTileEntity().isServerSide()) { + s = lServerNames.get(tRecipe.mFluidInputs[i].getLocalizedName()); + if (s == null) { + s = tRecipe.mFluidInputs[i].getLocalizedName(); + } + } + tNBTList.appendTag( + new NBTTagString("Input Hatch " + (i + 1) + ": " + tRecipe.mFluidInputs[i].amount + "L " + s)); + } + } + tNBT.setTag("pages", tNBTList); + + mInventory[1].setTagCompound(tNBT); + } + + private boolean iterateRecipes() { + for (GT_Recipe ttRecipe : TecTechRecipeMaps.researchStationFakeRecipes.getAllRecipes()) { + if (GT_Utility.areStacksEqual(ttRecipe.mInputs[0], holdItem, true)) { + computationRequired = computationRemaining = ttRecipe.mDuration * 20L; + mMaxProgresstime = 20; + mEfficiencyIncrease = 10000; + eRequiredData = (short) (ttRecipe.mSpecialValue >>> 16); + eAmpereFlow = (short) (ttRecipe.mSpecialValue & 0xFFFF); + mEUt = Math.min(ttRecipe.mEUt, -ttRecipe.mEUt); + eHolders.get(0) + .getBaseMetaTileEntity() + .setActive(true); + return true; + } + } + return false; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_research(mName); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + for (GT_MetaTileEntity_Hatch_Holder rack : filterValidMTEs(eHolders)) { + rack.getBaseMetaTileEntity() + .setActive(false); + } + eHolders.clear(); + + if (!structureCheck_EM("main", 1, 3, 4)) { + return false; + } + + for (GT_MetaTileEntity_Hatch_Holder rack : filterValidMTEs(eHolders)) { + rack.getBaseMetaTileEntity() + .setActive(iGregTechTileEntity.isActive()); + } + return eHolders.size() == 1; + } + + @Override + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + ItemStack controllerStack = getControllerSlot(); + tRecipe = null; + if (!eHolders.isEmpty() && eHolders.get(0).mInventory[0] != null) { + holdItem = eHolders.get(0).mInventory[0].copy(); + if (ItemList.Tool_DataStick.isStackEqual(controllerStack, false, true)) { + switch (machineType) { + case scanner -> { + for (GT_Recipe.GT_Recipe_AssemblyLine assRecipe : GT_Recipe.GT_Recipe_AssemblyLine.sAssemblylineRecipes) { + if (GT_Utility.areStacksEqual(assRecipe.mResearchItem, holdItem, true)) { + boolean failScanner = true; + for (GT_Recipe scannerRecipe : scannerFakeRecipes.getAllRecipes()) { + if (GT_Utility.areStacksEqual(scannerRecipe.mInputs[0], holdItem, true)) { + failScanner = false; + break; + } + } + if (failScanner) { + return SimpleCheckRecipeResult.ofFailure("wrongRequirements"); + } + this.tRecipe = assRecipe; + // Scanner mode should consume item first + eHolders.get(0).mInventory[0] = null; + mInventory[1] = null; + // Set property + computationRequired = computationRemaining = assRecipe.mResearchTime; + mMaxProgresstime = 20; + mEfficiencyIncrease = 10000; + eRequiredData = 1; + eAmpereFlow = 1; + mEUt = -524288; + eHolders.get(0) + .getBaseMetaTileEntity() + .setActive(true); + return SimpleCheckRecipeResult.ofSuccess("scanning"); + } + } + } + case assembly -> { + for (GT_Recipe.GT_Recipe_AssemblyLine assRecipe : TecTechRecipeMaps.researchableALRecipeList) { + if (GT_Utility.areStacksEqual(assRecipe.mResearchItem, holdItem, true)) { + tRecipe = assRecipe; + // if found + if (iterateRecipes()) return SimpleCheckRecipeResult.ofSuccess("researching"); + } + } + } + } + } else { + return CheckRecipeResultRegistry.NO_DATA_STICKS; + } + } + holdItem = null; + computationRequired = computationRemaining = 0; + for (GT_MetaTileEntity_Hatch_Holder r : eHolders) { + r.getBaseMetaTileEntity() + .setActive(false); + } + return SimpleCheckRecipeResult.ofFailure("no_research_item"); + } + + @Override + public void outputAfterRecipe_EM() { + if (!eHolders.isEmpty()) { + switch (machineType) { + case assembly -> { + if (tRecipe != null && ItemList.Tool_DataStick.isStackEqual(mInventory[1], false, true)) { + eHolders.get(0) + .getBaseMetaTileEntity() + .setActive(false); + eHolders.get(0).mInventory[0] = null; + if (lServerNames == null) { + makeStick(); + } else { + try { + makeStick2(); + } catch (NoSuchFieldError e) { + makeStick(); + } + } + } + } + case scanner -> { + mInventory[1] = ItemList.Tool_DataStick.get(1); + GT_AssemblyLineUtils.setAssemblyLineRecipeOnDataStick(mInventory[1], tRecipe); + eHolders.get(0) + .getBaseMetaTileEntity() + .setActive(false); + } + } + } + computationRequired = computationRemaining = 0; + tRecipe = null; + holdItem = null; + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.research.name")) // Machine Type: Research + // Station + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.research.desc.0")) // Controller block of + // the Research Station + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.research.desc.1")) // Used to scan Data + // Sticks for + // Assembling Line Recipes + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.research.desc.2")) // Needs to be fed with + // computation to work + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.research.desc.3")) // Does not consume the + // item until + // the Data Stick is written + .addInfo(translateToLocal("tt.keyword.Structure.StructureTooComplex")) // The structure is too complex! + .addSeparator() + .beginStructureBlock(3, 7, 7, false) + .addOtherStructurePart( + translateToLocal("gt.blockmachines.hatch.holder.tier.09.name"), + translateToLocal("tt.keyword.Structure.CenterPillar"), + 2) // Object Holder: Center of the front pillar + .addOtherStructurePart( + translateToLocal("tt.keyword.Structure.DataConnector"), + translateToLocal("tt.keyword.Structure.AnyComputerCasingBackMain"), + 1) // Optical Connector: Any Computer Casing on the backside of the main body + .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasingBackMain"), 1) // Energy Hatch: + // Any Computer + // Casing on the + // backside of + // the main body + .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasingBackMain"), 1) // Maintenance + // Hatch: + // Any + // Computer + // Casing on + // the + // backside + // of the + // main body + .toolTipFinisher(CommonValues.TEC_MARK_EM); + return tt; + } + + @Override + public String[] getInfoData() { + long storedEnergy = 0; + long maxEnergy = 0; + for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + for (GT_MetaTileEntity_Hatch_EnergyMulti tHatch : filterValidMTEs(eEnergyMulti)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + + return new String[] { translateToLocalFormatted("tt.keyphrase.Energy_Hatches", clientLocale) + ":", + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GT_Utility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + (mEUt <= 0 ? translateToLocalFormatted("tt.keyphrase.Probably_uses", clientLocale) + ": " + : translateToLocalFormatted("tt.keyphrase.Probably_makes", clientLocale) + ": ") + + EnumChatFormatting.RED + + GT_Utility.formatNumbers(Math.abs(mEUt)) + + EnumChatFormatting.RESET + + " EU/t " + + translateToLocalFormatted("tt.keyword.at", clientLocale) + + " " + + EnumChatFormatting.RED + + GT_Utility.formatNumbers(eAmpereFlow) + + EnumChatFormatting.RESET + + " A", + translateToLocalFormatted("tt.keyphrase.Tier_Rating", clientLocale) + ": " + + EnumChatFormatting.YELLOW + + VN[getMaxEnergyInputTier_EM()] + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.GREEN + + VN[getMinEnergyInputTier_EM()] + + EnumChatFormatting.RESET + + " " + + translateToLocalFormatted("tt.keyphrase.Amp_Rating", clientLocale) + + ": " + + EnumChatFormatting.GREEN + + GT_Utility.formatNumbers(eMaxAmpereFlow) + + EnumChatFormatting.RESET + + " A", + translateToLocalFormatted("tt.keyword.Problems", clientLocale) + ": " + + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " " + + translateToLocalFormatted("tt.keyword.Efficiency", clientLocale) + + ": " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + translateToLocalFormatted("tt.keyword.PowerPass", clientLocale) + ": " + + EnumChatFormatting.BLUE + + ePowerPass + + EnumChatFormatting.RESET + + " " + + translateToLocalFormatted("tt.keyword.SafeVoid", clientLocale) + + ": " + + EnumChatFormatting.BLUE + + eSafeVoid, + translateToLocalFormatted("tt.keyphrase.Computation_Available", clientLocale) + ": " + + EnumChatFormatting.GREEN + + GT_Utility.formatNumbers(eAvailableData) + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.YELLOW + + GT_Utility.formatNumbers(eRequiredData) + + EnumChatFormatting.RESET, + translateToLocalFormatted("tt.keyphrase.Computation_Remaining", clientLocale) + ":", + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(computationRemaining / 20L) + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.YELLOW + + GT_Utility.formatNumbers(computationRequired / 20L) }; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][3], + new TT_RenderedExtendedFacingTexture( + aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON + : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][3] }; + } + + @Override + public void onRemoval() { + super.onRemoval(); + for (GT_MetaTileEntity_Hatch_Holder r : eHolders) { + r.getBaseMetaTileEntity() + .setActive(false); + } + } + + @Override + protected void extraExplosions_EM() { + for (MetaTileEntity tTileEntity : eHolders) { + tTileEntity.getBaseMetaTileEntity() + .doExplosion(V[9]); + } + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setLong("eComputationRemaining", computationRemaining); + aNBT.setLong("eComputationRequired", computationRequired); + aNBT.setString("eMachineType", machineType); + if (holdItem != null) { + aNBT.setTag("eHold", holdItem.writeToNBT(new NBTTagCompound())); + } else { + aNBT.removeTag("eHold"); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + computationRemaining = aNBT.getLong("eComputationRemaining"); + computationRequired = aNBT.getLong("eComputationRequired"); + machineType = aNBT.hasKey("eMachineType") ? aNBT.getString("eMachineType") : assembly; + if (aNBT.hasKey("eHold")) { + holdItem = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag("eHold")); + } else { + holdItem = null; + } + } + + @Override + public void stopMachine(@Nonnull ShutDownReason reason) { + super.stopMachine(reason); + for (GT_MetaTileEntity_Hatch_Holder r : eHolders) { + r.getBaseMetaTileEntity() + .setActive(false); + } + computationRequired = computationRemaining = 0; + tRecipe = null; + holdItem = null; + } + + @Override + public void onFirstTick_EM(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isServerSide()) { + if (computationRemaining > 0) { + tRecipe = null; + if (holdItem != null) { + if (ItemList.Tool_DataStick.isStackEqual(mInventory[1], false, true)) { + for (GT_Recipe.GT_Recipe_AssemblyLine tRecipe : TecTechRecipeMaps.researchableALRecipeList) { + if (GT_Utility.areStacksEqual(tRecipe.mResearchItem, holdItem, true)) { + this.tRecipe = tRecipe; + break; + } + } + } + } + if (tRecipe == null) { + holdItem = null; + computationRequired = computationRemaining = 0; + mMaxProgresstime = 0; + mEfficiencyIncrease = 0; + for (GT_MetaTileEntity_Hatch_Holder r : eHolders) { + r.getBaseMetaTileEntity() + .setActive(false); + } + } + } + } + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + if (computationRemaining <= 0) { + computationRemaining = 0; + mProgresstime = mMaxProgresstime; + return true; + } else { + computationRemaining -= eAvailableData; + mProgresstime = 1; + return super.onRunningTick(aStack); + } + } + + public final boolean addHolderToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Holder) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eHolders.add((GT_MetaTileEntity_Hatch_Holder) aMetaTileEntity); + } + return false; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + super.onRightclick(aBaseMetaTileEntity, aPlayer); + + if (!aBaseMetaTileEntity.isClientSide() && aPlayer instanceof EntityPlayerMP) { + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + } else { + return true; + } + return true; + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + super.onScrewdriverRightClick(side, aPlayer, aX, aY, aZ); + switch (machineType) { + case scanner -> machineType = assembly; + case assembly -> machineType = scanner; + } + aPlayer.addChatComponentMessage( + new ChatComponentTranslation( + "gt.blockmachines.multimachine.em.research.mode." + machineType.replace(" ", "_"))); + } + + @Override + public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, + int z) { + tag.setBoolean("hasProblems", (getIdealStatus() - getRepairStatus()) > 0); + tag.setFloat("efficiency", mEfficiency / 100.0F); + tag.setBoolean("incompleteStructure", (getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0); + tag.setString("machineType", machineType); + tag.setLong("computation", (computationRequired - computationRemaining) / 20L); + tag.setLong("computationRequired", computationRequired / 20L); + } + + @Override + public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + final NBTTagCompound tag = accessor.getNBTData(); + + if (tag.getBoolean("incompleteStructure")) { + currentTip.add(RED + "** INCOMPLETE STRUCTURE **" + RESET); + } + currentTip.add( + (tag.getBoolean("hasProblems") ? (RED + "** HAS PROBLEMS **") : GREEN + "Running Fine") + RESET + + " Efficiency: " + + tag.getFloat("efficiency") + + "%"); + currentTip.add("Mode: " + tag.getString("machineType")); + currentTip.add( + String.format( + "Computation: %,d / %,d", + tag.getInteger("computation"), + tag.getInteger("computationRequired"))); + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM("main", 1, 3, 4, stackSize, hintsOnly); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 1, 3, 4, elementBudget, source, actor, false, true); + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_EM_research> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } + + private enum HolderHatchElement implements IHatchElement<GT_MetaTileEntity_EM_research> { + + INSTANCE; + + @Override + public List<? extends Class<? extends IMetaTileEntity>> mteClasses() { + return Collections.singletonList(GT_MetaTileEntity_Hatch_Holder.class); + } + + @Override + public IGT_HatchAdder<? super GT_MetaTileEntity_EM_research> adder() { + return GT_MetaTileEntity_EM_research::addHolderToMachineList; + } + + @Override + public long count(GT_MetaTileEntity_EM_research t) { + return t.eHolders.size(); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_switch.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_switch.java new file mode 100644 index 0000000000..b408e63af4 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_switch.java @@ -0,0 +1,291 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_HIGH; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_LOW; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_NEUTRAL; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_OK; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_LOW; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_WRONG; +import static com.github.technus.tectech.util.CommonValues.V; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.mechanics.dataTransport.QuantumDataPacket; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputData; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputData; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.INameFunction; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.IStatusFunction; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; + +/** + * Created by danie_000 on 17.12.2016. + */ +public class GT_MetaTileEntity_EM_switch extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable { + + // region structure + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", + "1 - Classic/Data Hatches or Computer casing", // 1 - Classic/Data Hatches or Computer casing + }; + + private static final IStructureDefinition<GT_MetaTileEntity_EM_switch> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_EM_switch>builder() + .addShape( + "main", + transpose(new String[][] { { "BBB", "BBB", "BBB" }, { "B~B", "BAB", "BBB" }, { "BBB", "BBB", "BBB" } })) + .addElement('A', ofBlock(sBlockCasingsTT, 3)) + .addElement( + 'B', + ofHatchAdderOptional( + GT_MetaTileEntity_EM_switch::addClassicToMachineList, + textureOffset + 1, + 1, + sBlockCasingsTT, + 1)) + .build(); + // endregion + + // region parameters + private static final INameFunction<GT_MetaTileEntity_EM_switch> ROUTE_NAME = (base, + p) -> (p.parameterId() == 0 ? translateToLocal("tt.keyword.Destination") + " " + : translateToLocal("tt.keyword.Weight") + " ") + p.hatchId(); + private static final IStatusFunction<GT_MetaTileEntity_EM_switch> WEI_STATUS = (base, p) -> { + double v = p.get(); + if (Double.isNaN(v)) return STATUS_WRONG; + if (v < 0) return STATUS_TOO_LOW; + if (v == 0) return STATUS_LOW; + if (Double.isInfinite(v)) return STATUS_HIGH; + return STATUS_OK; + }; + private static final IStatusFunction<GT_MetaTileEntity_EM_switch> DST_STATUS = (base, p) -> { + if (base.weight[p.hatchId()].getStatus(false).isOk) { + double v = p.get(); + if (Double.isNaN(v)) return STATUS_WRONG; + v = (int) v; + if (v <= 0) return STATUS_TOO_LOW; + return STATUS_OK; + } + return STATUS_NEUTRAL; + }; + protected Parameters.Group.ParameterIn[] dst; + protected Parameters.Group.ParameterIn[] weight; + // endregion + + public GT_MetaTileEntity_EM_switch(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_switch(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_switch(mName); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + return structureCheck_EM("main", 1, 1, 0); + } + + @Override + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + short thingsActive = 0; + for (GT_MetaTileEntity_Hatch_InputData di : eInputData) { + if (di.q != null) { + thingsActive++; + } + } + + if (thingsActive > 0) { + thingsActive += eOutputData.size(); + mEUt = -(int) V[7]; + eAmpereFlow = 1 + (thingsActive >> 2); + mMaxProgresstime = 20; + mEfficiencyIncrease = 10000; + return SimpleCheckRecipeResult.ofSuccess("routing"); + } + return SimpleCheckRecipeResult.ofFailure("no_routing"); + } + + @Override + public void outputAfterRecipe_EM() { + if (!eOutputData.isEmpty()) { + double total = 0; + double weight; + for (int i = 0; i < 10; i++) { // each param pair + weight = this.weight[i].get(); + if (weight > 0 && dst[i].get() >= 0) { + total += weight; // Total weighted div + } + } + + Vec3Impl pos = new Vec3Impl( + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord()); + + QuantumDataPacket pack = new QuantumDataPacket(0L).unifyTraceWith(pos); + if (pack == null) { + return; + } + for (GT_MetaTileEntity_Hatch_InputData hatch : eInputData) { + if (hatch.q == null || hatch.q.contains(pos)) { + continue; + } + pack = pack.unifyPacketWith(hatch.q); + if (pack == null) { + return; + } + } + + long remaining = pack.getContent(); + + double dest; + for (int i = 0; i < 10; i++) { + dest = dst[i].get(); + weight = this.weight[i].get(); + if (weight > 0 && dest >= 0) { + int outIndex = (int) dest - 1; + if (outIndex < 0 || outIndex >= eOutputData.size()) { + continue; + } + GT_MetaTileEntity_Hatch_OutputData out = eOutputData.get(outIndex); + if (Double.isInfinite(total)) { + if (Double.isInfinite(weight)) { + out.q = new QuantumDataPacket(remaining).unifyTraceWith(pack); + break; + } + } else { + long part = (long) Math.floor(pack.getContent() * weight / total); + if (part > 0) { + remaining -= part; + if (remaining > 0) { + out.q = new QuantumDataPacket(part).unifyTraceWith(pack); + } else if (part + remaining > 0) { + out.q = new QuantumDataPacket(part + remaining).unifyTraceWith(pack); + break; + } else { + break; + } + } + } + } + } + } + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.switch.name")) // Machine Type: Network + // Switch With QoS + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.switch.desc.0")) // Controller block of the + // Network + // Switch With QoS + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.switch.desc.1")) // Used to route and + // distribute computation + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.switch.desc.2")) // Needs a Parametrizer to + // be configured + .addSeparator() + .beginStructureBlock(3, 3, 3, false) + .addController(translateToLocal("tt.keyword.Structure.FrontCenter")) // Controller: Front center + .addCasingInfoMin(translateToLocal("gt.blockcasingsTT.1.name"), 0, false) // 0x Computer Casing + // (minimum) + .addOtherStructurePart( + translateToLocal("gt.blockcasingsTT.3.name"), + translateToLocal("tt.keyword.Structure.Center")) // Advanced Computer Casing: Center + .addOtherStructurePart( + translateToLocal("tt.keyword.Structure.DataConnector"), + translateToLocal("tt.keyword.Structure.AnyComputerCasing"), + 2) // Data Connector: Any Computer Casing + .addOtherStructurePart( + translateToLocal("gt.blockmachines.hatch.param.tier.05.name"), + translateToLocal("tt.keyword.Structure.AnyComputerCasing"), + 2) // Parametrizer: Any Computer Casing + .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasing"), 1) // Energy Hatch: Any + // Computer Casing + .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyComputerCasing"), 1) // Maintenance + // Hatch: Any + // Computer Casing + .toolTipFinisher(CommonValues.TEC_MARK_EM); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][1], + new TT_RenderedExtendedFacingTexture( + aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON + : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][1] }; + } + + public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_hi_freq"); + + @Override + @SideOnly(Side.CLIENT) + protected ResourceLocation getActivitySound() { + return activitySound; + } + + @Override + protected void parametersInstantiation_EM() { + dst = new Parameters.Group.ParameterIn[10]; + weight = new Parameters.Group.ParameterIn[10]; + for (int i = 0; i < 10; i++) { + Parameters.Group hatch = parametrization.getGroup(i); + dst[i] = hatch.makeInParameter(0, i, ROUTE_NAME, DST_STATUS); + weight[i] = hatch.makeInParameter(1, 0, ROUTE_NAME, WEI_STATUS); + } + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM("main", 1, 1, 0, stackSize, hintsOnly); + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_EM_switch> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java new file mode 100644 index 0000000000..d6ab5fa6eb --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_transformer.java @@ -0,0 +1,221 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.DynamoMulti; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.EnergyMulti; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static gregtech.api.GregTech_API.sBlockCasings1; +import static gregtech.api.enums.GT_HatchElement.Dynamo; +import static gregtech.api.enums.GT_HatchElement.Energy; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; + +/** + * Created by danie_000 on 17.12.2016. + */ +public class GT_MetaTileEntity_EM_transformer extends GT_MetaTileEntity_MultiblockBase_EM + implements ISurvivalConstructable { + + @Override + public void onFirstTick_EM(IGregTechTileEntity aBaseMetaTileEntity) { + if (!hasMaintenanceChecks) turnOffMaintenance(); + if (!mMachine) { + aBaseMetaTileEntity.disableWorking(); + } + } + + // region structure + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", + translateToLocal("gt.blockmachines.multimachine.em.transformer.hint"), // 1 - Energy IO Hatches or High + // Power Casing + }; + private static final IStructureDefinition<GT_MetaTileEntity_EM_transformer> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_EM_transformer>builder() + .addShape( + "main", + new String[][] { { "111", "1~1", "111", }, { "111", "101", "111", }, { "111", "111", "111", }, }) + .addElement('0', ofBlock(sBlockCasings1, 15)) + .addElement( + '1', + buildHatchAdder(GT_MetaTileEntity_EM_transformer.class).atLeast(Energy, EnergyMulti, Dynamo, DynamoMulti) + .casingIndex(textureOffset) + .dot(1) + .buildAndChain(onElementPass(t -> t.casingCount++, ofBlock(sBlockCasingsTT, 0)))) + .build(); + private int casingCount = 0; + + @Override + public IStructureDefinition<GT_MetaTileEntity_EM_transformer> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + // endregion + + public GT_MetaTileEntity_EM_transformer(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + turnOffMaintenance(); + eDismantleBoom = true; + } + + public GT_MetaTileEntity_EM_transformer(String aName) { + super(aName); + turnOffMaintenance(); + eDismantleBoom = true; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_transformer(mName); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + casingCount = 0; + return structureCheck_EM("main", 1, 1, 0) && casingCount >= 5; + } + + @Override + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + if (ePowerPass) { + mEfficiencyIncrease = 10000; + mMaxProgresstime = 20; + } else { + mEfficiencyIncrease = 0; + mMaxProgresstime = 0; + } + eAmpereFlow = 0; + mEUt = 0; + return ePowerPass ? SimpleCheckRecipeResult.ofSuccess("routing") + : SimpleCheckRecipeResult.ofFailure("no_routing"); + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.em.transformer.name")) // Machine Type: + // Transformer + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.transformer.desc.0")) // Controller block of + // the + // Active Transformer + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.transformer.desc.1")) // Can transform to + // and from any + // voltage + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.transformer.desc.2")) // Only 0.004% power + // loss, HAYO! + .addInfo(translateToLocal("gt.blockmachines.multimachine.em.transformer.desc.3")) // Will explode if + // broken while + // running + .addSeparator() + .beginStructureBlock(3, 3, 3, false) + .addController(translateToLocal("tt.keyword.Structure.FrontCenter")) // Controller: Front center + .addCasingInfoMin(translateToLocal("gt.blockcasingsTT.0.name"), 5, false) // 5x High Power Casing + // (minimum) + .addOtherStructurePart( + translateToLocal("tt.keyword.Structure.SuperconductingCoilBlock"), + translateToLocal("tt.keyword.Structure.Center")) // SuperconductingCoilBlock: Center + .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) // Energy Hatch: Any + // High Power Casing + .addDynamoHatch(translateToLocal("tt.keyword.Structure.AnyHighPowerCasing"), 1) // Dynamo Hatch: Any + // High Power Casing + .toolTipFinisher(CommonValues.TEC_MARK_GENERAL); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][0], + new TT_RenderedExtendedFacingTexture( + aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON + : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][0] }; + } + + public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_noise"); + + @Override + @SideOnly(Side.CLIENT) + protected ResourceLocation getActivitySound() { + return activitySound; + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + return true; + } + + @Override + public boolean doRandomMaintenanceDamage() { + return true; + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if ((aTick & 31) == 31) { + ePowerPass = aBaseMetaTileEntity.isAllowedToWork(); + } + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM("main", 1, 1, 0, stackSize, hintsOnly); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 1, 1, 0, elementBudget, source, actor, false, true); + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } + + @Override + public boolean isPowerPassButtonEnabled() { + return true; + } + + @Override + public boolean isSafeVoidButtonEnabled() { + return false; + } + + @Override + public boolean isAllowedToWorkButtonEnabled() { + return true; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_microwave.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_microwave.java new file mode 100644 index 0000000000..4ae61796a5 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_microwave.java @@ -0,0 +1,348 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.loader.MainLoader.microwaving; +import static com.github.technus.tectech.recipe.TT_recipeAdder.nullItem; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_OK; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_HIGH; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_LOW; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_WRONG; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.GregTech_API.sBlockCasings4; +import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional; +import static net.minecraft.util.AxisAlignedBB.getBoundingBox; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.ArrayList; +import java.util.HashSet; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.INameFunction; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.IStatusFunction; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.shutdown.ShutDownReason; + +/** + * Created by danie_000 on 17.12.2016. + */ +public class GT_MetaTileEntity_TM_microwave extends GT_MetaTileEntity_MultiblockBase_EM implements IConstructable { + + // region variables + private boolean hasBeenPausedThisCycle = false; + // endregion + + // region structure + // use multi A energy inputs, use less power the longer it runs + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", + translateToLocal("gt.blockmachines.multimachine.tm.microwave.hint.0"), // 1 - Classic Hatches or Clean + // Stainless Steel + // Casing + translateToLocal("gt.blockmachines.multimachine.tm.microwave.hint.1"), // Also acts like a hopper so give it + // an Output + // Bus + }; + + private static final IStructureDefinition<GT_MetaTileEntity_TM_microwave> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_TM_microwave>builder() + .addShape( + "main", + transpose( + new String[][] { { "AAAAA", "A---A", "A---A", "A---A", "AAAAA" }, + { "AAAAA", "A---A", "A---A", "A---A", "AAAAA" }, { "AA~AA", "A---A", "A---A", "A---A", "AAAAA" }, + { "ABBBA", "BAAAB", "BAAAB", "BAAAB", "ABBBA" } })) + .addElement('A', ofBlock(sBlockCasings4, 1)) + .addElement( + 'B', + ofHatchAdderOptional(GT_MetaTileEntity_TM_microwave::addClassicToMachineList, 49, 1, sBlockCasings4, 1)) + .build(); + // endregion + + // region parameters + protected Parameters.Group.ParameterIn powerSetting, timerSetting; + protected Parameters.Group.ParameterOut timerValue, remainingTime; + private static final INameFunction<GT_MetaTileEntity_TM_microwave> POWER_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.microwave.cfgi.0"); // Power setting + private static final INameFunction<GT_MetaTileEntity_TM_microwave> TIMER_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.microwave.cfgi.1"); // Timer setting + + private static final INameFunction<GT_MetaTileEntity_TM_microwave> TIMER_VALUE_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.microwave.cfgo.0"); // Timer value + private static final INameFunction<GT_MetaTileEntity_TM_microwave> TIMER_REMAINING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.microwave.cfgo.1"); // Timer remaining + private static final IStatusFunction<GT_MetaTileEntity_TM_microwave> POWER_STATUS = (base, p) -> LedStatus + .fromLimitsInclusiveOuterBoundary(p.get(), 300, 1000, 1000, Double.POSITIVE_INFINITY); + private static final IStatusFunction<GT_MetaTileEntity_TM_microwave> TIMER_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (int) value; + if (value <= 0) return STATUS_TOO_LOW; + if (value > 3000) return STATUS_TOO_HIGH; + return STATUS_OK; + }; + // endregion + + public GT_MetaTileEntity_TM_microwave(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_TM_microwave(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_TM_microwave(mName); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + return structureCheck_EM("main", 2, 2, 0); + } + + @Override + @NotNull + public CheckRecipeResult checkProcessing_EM() { + hasBeenPausedThisCycle = false; + if ((int) powerSetting.get() < 300 || timerSetting.get() <= 0 || timerSetting.get() > 3000) { + return SimpleCheckRecipeResult.ofFailure("invalid_timer"); + } + if (remainingTime.get() <= 0) { + remainingTime.set(timerSetting.get()); + timerValue.set(0); + } + mEUt = -((int) powerSetting.get() >> 1); + eAmpereFlow = 1; + mMaxProgresstime = 20; + mEfficiencyIncrease = 10000; + return SimpleCheckRecipeResult.ofSuccess("microwaving"); + } + + @Override + public void outputAfterRecipe_EM() { + if (hasBeenPausedThisCycle) { + return; // skip timer and actions if paused + } + timerValue.set(timerValue.get() + 1); + remainingTime.set(timerSetting.get() - timerValue.get()); + IGregTechTileEntity mte = getBaseMetaTileEntity(); + Vec3Impl xyzOffsets = getExtendedFacing().getWorldOffset(new Vec3Impl(0, -1, 2)); + double xPos = mte.getXCoord() + 0.5f + xyzOffsets.get0(); + double yPos = mte.getYCoord() + 0.5f + xyzOffsets.get1(); + double zPos = mte.getZCoord() + 0.5f + xyzOffsets.get2(); + AxisAlignedBB aabb = getBoundingBox(-2, -2, -2, 2, 2, 2).offset(xPos, yPos, zPos); + xyzOffsets = getExtendedFacing().getWorldOffset(new Vec3Impl(0, -4, 0)); + Vec3Impl xyzExpansion = getExtendedFacing().getWorldOffset(new Vec3Impl(1, 0, 1)) + .abs(); + int power = (int) powerSetting.get(); + int damagingFactor = Math.min(power >> 6, 8) + Math.min(power >> 8, 24) + + Math.min(power >> 12, 48) + + (power >> 18); + + ArrayList<ItemStack> itemsToOutput = new ArrayList<>(); + HashSet<Entity> tickedStuff = new HashSet<>(); + + boolean inside = true; + do { + for (Object entity : mte.getWorld() + .getEntitiesWithinAABBExcludingEntity(null, aabb)) { + if (entity instanceof Entity) { + if (tickedStuff.add((Entity) entity)) { + if (inside && entity instanceof EntityItem) { + GT_Recipe tRecipe = RecipeMaps.microwaveRecipes.findRecipe( + mte, + null, + true, + 128, + null, + null, + new ItemStack[] { ((EntityItem) entity).getEntityItem() }); + if (tRecipe == null || tRecipe.mInputs[0].stackSize != 1) { + itemsToOutput.add(((EntityItem) entity).getEntityItem()); + } else { + ItemStack newStuff = tRecipe.getOutput(0) + .copy(); + newStuff.stackSize = ((EntityItem) entity).getEntityItem().stackSize; + itemsToOutput.add(newStuff); + } + ((EntityItem) entity).delayBeforeCanPickup = 2; + ((EntityItem) entity).setDead(); + } else if (entity instanceof EntityLivingBase) { + if (!GT_Utility.isWearingFullElectroHazmat((EntityLivingBase) entity)) { + ((EntityLivingBase) entity).attackEntityFrom(microwaving, damagingFactor); + } + } + } + } + } + aabb.offset(xyzOffsets.get0(), xyzOffsets.get1(), xyzOffsets.get2()); + aabb = aabb.expand(xyzExpansion.get0() * 1.5, xyzExpansion.get1() * 1.5, xyzExpansion.get2() * 1.5); + inside = false; + damagingFactor >>= 1; + } while (damagingFactor > 0); + + mOutputItems = itemsToOutput.toArray(nullItem); + + if (remainingTime.get() <= 0) { + mte.getWorld() + .playSoundEffect(xPos, yPos, zPos, Reference.MODID + ":microwave_ding", 1, 1); + stopMachine(); + } + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.tm.microwave.name")) // Machine Type: + // Microwave Grinder + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.0")) // Controller block of + // the + // Microwave Grinder + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.1")) // Starts a timer when + // enabled + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.2")) // While the timer is + // running + // anything inside the machine + // will take damage + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.3")) // The machine will also + // collect + // any items inside of it + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.4")) // Can be configured + // with a Parametrizer + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.microwave.desc.5")) // (Do not insert a + // Wither) + .addSeparator() + .beginStructureBlock(5, 4, 5, true) + .addController(translateToLocal("tt.keyword.Structure.FrontCenter")) // Controller: Front center + .addCasingInfoMin(translateToLocal("tt.keyword.Structure.StainlessSteelCasing"), 60, false) // 60x + // Stainless + // Steel + // Casing (minimum) + .addOtherStructurePart( + translateToLocal("tt.keyword.Structure.DataConnector"), + translateToLocal("tt.keyword.Structure.AnyOuterCasingOnBottom"), + 2) // Output Bus: Any outer casing on the bottom layer + .addOtherStructurePart( + translateToLocal("gt.blockmachines.hatch.param.tier.05.name"), + translateToLocal("tt.keyword.Structure.Optional") + " " + + translateToLocal("tt.keyword.Structure.AnyOuterCasingOnBottom"), + 2) // Parametrizer: (optional) Any outer casing on the bottom layer + .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyOuterCasingOnBottom"), 1) // Energy Hatch: Any + // outer casing on + // the bottom layer + .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyOuterCasingOnBottom"), 1) // Maintenance + // Hatch: Any + // outer casing + // on the + // bottom layer + .toolTipFinisher(CommonValues.THETA_MOVEMENT); + return tt; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][49], + new TT_RenderedExtendedFacingTexture( + aActive ? Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE_ACTIVE + : Textures.BlockIcons.OVERLAY_FRONT_ELECTRIC_BLAST_FURNACE) }; + } else if (side == facing.getOpposite()) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][49], + aActive ? Textures.BlockIcons.casingTexturePages[0][52] + : Textures.BlockIcons.casingTexturePages[0][53] }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[0][49] }; + } + + @Override + protected void parametersInstantiation_EM() { + Parameters.Group hatch_0 = parametrization.getGroup(0, true); + powerSetting = hatch_0.makeInParameter(0, 1000, POWER_SETTING_NAME, POWER_STATUS); + timerSetting = hatch_0.makeInParameter(1, 360, TIMER_SETTING_NAME, TIMER_STATUS); + + timerValue = hatch_0.makeOutParameter(0, 0, TIMER_VALUE_NAME, TIMER_STATUS); + remainingTime = hatch_0.makeOutParameter(1, 360, TIMER_REMAINING_NAME, TIMER_STATUS); + } + + @Override + public void stopMachine(@Nonnull ShutDownReason reason) { + super.stopMachine(reason); + remainingTime.set(timerSetting.get()); + timerValue.set(0); + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + if (eSafeVoid) { + hasBeenPausedThisCycle = true; + } + return hasBeenPausedThisCycle || super.onRunningTick(aStack); // consume eu and other resources if not paused + } + + // TODO Why is the basetype 1?? + @Override + public byte getTileEntityBaseType() { + return 1; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM("main", 2, 2, 0, stackSize, hintsOnly); + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_TM_microwave> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } + + @Override + public boolean isPowerPassButtonEnabled() { + return true; + } + + @Override + public boolean isSafeVoidButtonEnabled() { + return false; + } + + @Override + public boolean isAllowedToWorkButtonEnabled() { + return true; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java new file mode 100644 index 0000000000..d3fa0401e6 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java @@ -0,0 +1,1080 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi; + +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.generateTeslaNodeMap; +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.powerTeslaNodeMap; +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetAdd; +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetRemove; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.textureOffset; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsBA0; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.DynamoMulti; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.EnergyMulti; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM.HatchElement.Param; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_HIGH; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_LOW; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_NEUTRAL; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_OK; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_HIGH; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_TOO_LOW; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_WRONG; +import static com.github.technus.tectech.thing.metaTileEntity.multi.base.LedStatus.STATUS_WTF; +import static com.github.technus.tectech.util.CommonValues.V; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static gregtech.api.enums.GT_HatchElement.Dynamo; +import static gregtech.api.enums.GT_HatchElement.Energy; +import static gregtech.api.enums.GT_HatchElement.InputHatch; +import static gregtech.api.enums.GT_HatchElement.Maintenance; +import static gregtech.api.enums.GT_HatchElement.OutputHatch; +import static gregtech.api.util.GT_StructureUtility.buildHatchAdder; +import static gregtech.api.util.GT_Utility.filterValidMTEs; +import static java.lang.Math.min; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import javax.annotation.Nonnull; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Items; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.loader.NetworkDispatcher; +import com.github.technus.tectech.mechanics.spark.RendererMessage; +import com.github.technus.tectech.mechanics.spark.ThaumSpark; +import com.github.technus.tectech.mechanics.tesla.ITeslaConnectable; +import com.github.technus.tectech.mechanics.tesla.ITeslaConnectableSimple; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Capacitor; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Param; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.INameFunction; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.IStatusFunction; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.Parameters; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.github.technus.tectech.util.CommonValues; +import com.google.common.collect.Multimap; +import com.google.common.collect.MultimapBuilder; +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; +import com.gtnewhorizon.structurelib.structure.IItemSource; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.IStructureElement; +import com.gtnewhorizon.structurelib.structure.StructureUtility; +import com.gtnewhorizon.structurelib.util.ItemStackPredicate; +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Materials; +import gregtech.api.enums.OrePrefixes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Frame; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_OreDictUnificator; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.IGT_HatchAdder; +import gregtech.api.util.shutdown.ShutDownReason; +import gregtech.common.blocks.GT_Item_Machines; + +public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_MultiblockBase_EM + implements ISurvivalConstructable, ITeslaConnectable { + + // Interface fields + private final Multimap<Integer, ITeslaConnectableSimple> teslaNodeMap = MultimapBuilder.treeKeys() + .linkedListValues() + .build(); + private final HashSet<ThaumSpark> sparkList = new HashSet<>(); + private int sparkCount = 10; + + // region variables + private static final int transferRadiusTowerFromConfig = TecTech.configTecTech.TESLA_MULTI_RANGE_TOWER; // Default + // is 32 + private static final int transferRadiusTransceiverFromConfig = TecTech.configTecTech.TESLA_MULTI_RANGE_TRANSCEIVER; // Default + // is + // 16 + private static final int transferRadiusCoverUltimateFromConfig = TecTech.configTecTech.TESLA_MULTI_RANGE_COVER; // Default + // is + // 16 + private static final int plasmaRangeMultiT1 = TecTech.configTecTech.TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T1; // Default + // is 2 + private static final int plasmaRangeMultiT2 = TecTech.configTecTech.TESLA_MULTI_RANGE_COEFFICIENT_PLASMA_T2; // Default + // is 4 + private static final int heliumUse = TecTech.configTecTech.TESLA_MULTI_PLASMA_PER_SECOND_T1_HELIUM; // Default is + // 100 + private static final int nitrogenUse = TecTech.configTecTech.TESLA_MULTI_PLASMA_PER_SECOND_T1_NITROGEN; // Default + // is 50 + private static final int radonUse = TecTech.configTecTech.TESLA_MULTI_PLASMA_PER_SECOND_T2_RADON; // Default is 50 + private static final boolean visualEffect = TecTech.configTecTech.TESLA_VISUAL_EFFECT; // Default is true + // Default is {1, 1, 1} + private static final int[] plasmaTierLoss = new int[] { TecTech.configTecTech.TESLA_MULTI_LOSS_PER_BLOCK_T0, + TecTech.configTecTech.TESLA_MULTI_LOSS_PER_BLOCK_T1, TecTech.configTecTech.TESLA_MULTI_LOSS_PER_BLOCK_T2 }; + private static final float overDriveLoss = TecTech.configTecTech.TESLA_MULTI_LOSS_FACTOR_OVERDRIVE; // Default is + // 0.25F; + private static final boolean doFluidOutput = TecTech.configTecTech.TESLA_MULTI_GAS_OUTPUT; // Default is false + + // Face icons + private static Textures.BlockIcons.CustomIcon ScreenOFF; + private static Textures.BlockIcons.CustomIcon ScreenON; + + private int mTier = 0; // Determines max voltage (LV to ZPM) + private int plasmaTier = 0; // 0 is None, 1 is Helium or Nitrogen, 2 is Radon (Does not match actual plasma tiers) + + private FluidStack[] mOutputFluidsQueue; // Used to buffer the fluid outputs, so the tesla takes a second to 'cool' + // any plasma it + // would output as a gas + + private final ArrayList<GT_MetaTileEntity_Hatch_Capacitor> eCapacitorHatches = new ArrayList<>(); // Capacitor + // hatches which + // determine the + // max voltage + // tier and count + // of amps + + private long energyCapacity = 0; // Total energy storage limited by capacitors + private long outputVoltageMax = 0; // Tesla voltage output limited by capacitors + private int vTier = -1; // Tesla voltage tier limited by capacitors + private long outputCurrentMax = 0; // Tesla current output limited by capacitors + + // outputVoltage and current after settings + private long outputVoltage; + private long outputCurrent; + + // Prevents unnecessary offset calculation, saving on lag + private byte oldRotation = -1; + private ForgeDirection oldOrientation = ForgeDirection.UNKNOWN; + // Location of the center of the sphere on top of the tower, used as the Thaumcraft lightning and origin + public Vec3Impl posTop = Vec3Impl.NULL_VECTOR; + // endregion + + // region structure + private static final String[] description = new String[] { + EnumChatFormatting.AQUA + translateToLocal("tt.keyphrase.Hint_Details") + ":", + translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.hint.0"), // 1 - Classic Hatches, Capacitor + // Hatches or Tesla + // Base Casing + translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.hint.1"), // 2 - ""Titanium frames"" + }; + + private static final IStructureDefinition<GT_MetaTileEntity_TM_teslaCoil> STRUCTURE_DEFINITION = IStructureDefinition + .<GT_MetaTileEntity_TM_teslaCoil>builder() + .addShape( + "main", + transpose( + new String[][] { { " ", " ", " BBB ", " BBB ", " BBB ", " ", " " }, + { " ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " BBB ", " " }, + { " ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " BBB ", " " }, + { " ", " BBB ", " BBBBB ", " BBBBB ", " BBBBB ", " BBB ", " " }, + { " ", " ", " BBB ", " BCB ", " BBB ", " ", " " }, + { " ", " ", " ", " C ", " ", " ", " " }, + { " ", " BBB ", " B F B ", " BFCFB ", " B F B ", " BBB ", " " }, + { " ", " ", " ", " C ", " ", " ", " " }, + { " ", " BBB ", " B F B ", " BFCFB ", " B F B ", " BBB ", " " }, + { " ", " ", " ", " C ", " ", " ", " " }, + { " ", " BBB ", " B F B ", " BFCFB ", " B F B ", " BBB ", " " }, + { " ", " ", " ", " C ", " ", " ", " " }, + { " ", " BBB ", " B F B ", " BFCFB ", " B F B ", " BBB ", " " }, + { " ", " ", " ", " C ", " ", " ", " " }, + { " ", " ", " ", " C ", " ", " ", " " }, + { " ", " DDD ", " D D ", " D C D ", " D D ", " DDD ", " " }, + { " EE~EE ", "EAAAAAE", "EADDDAE", "EADADAE", "EADDDAE", "EAAAAAE", " EEEEE " } })) + .addElement('A', ofBlock(sBlockCasingsBA0, 6)) + .addElement('B', ofBlock(sBlockCasingsBA0, 7)) + .addElement('C', ofBlock(sBlockCasingsBA0, 8)) + .addElement( + 'D', + ofBlocksTiered( + (block, meta) -> block != sBlockCasingsBA0 ? null + : meta <= 5 ? Integer.valueOf(meta) : meta == 9 ? 6 : null, + IntStream.range(0, 7) + .map(tier -> tier == 6 ? 9 : tier) + .mapToObj(meta -> Pair.of(sBlockCasingsBA0, meta)) + .collect(Collectors.toList()), + -1, + (t, v) -> t.mTier = v, + t -> t.mTier)) + .addElement( + 'E', + buildHatchAdder(GT_MetaTileEntity_TM_teslaCoil.class) + .atLeast( + CapacitorHatchElement.INSTANCE, + EnergyMulti, + Energy, + DynamoMulti, + Dynamo, + InputHatch, + OutputHatch, + Param, + Maintenance) + .dot(1) + .casingIndex(textureOffset + 16 + 6) + .buildAndChain(sBlockCasingsBA0, 6)) + .addElement('F', new IStructureElement<GT_MetaTileEntity_TM_teslaCoil>() { + + private IIcon[] mIcons; + + @Override + public boolean check(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z) { + TileEntity tBase = world.getTileEntity(x, y, z); + if (tBase instanceof BaseMetaPipeEntity tPipeBase) { + if (tPipeBase.isInvalidTileEntity()) return false; + return tPipeBase.getMetaTileEntity() instanceof GT_MetaPipeEntity_Frame; + } + return false; + } + + @Override + public boolean spawnHint(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z, + ItemStack trigger) { + if (mIcons == null) { + mIcons = new IIcon[6]; + Arrays + .fill(mIcons, Materials._NULL.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon()); + } + StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, Materials._NULL.mRGBa); + return true; + } + + @Override + public boolean placeBlock(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z, + ItemStack trigger) { + ItemStack tFrameStack = GT_OreDictUnificator.get(OrePrefixes.frameGt, Materials.Titanium, 1); + if (!GT_Utility.isStackValid(tFrameStack) + || !(tFrameStack.getItem() instanceof ItemBlock tFrameStackItem)) return false; + return tFrameStackItem + .placeBlockAt(tFrameStack, null, world, x, y, z, 6, 0, 0, 0, Items.feather.getDamage(tFrameStack)); + } + + @Override + public PlaceResult survivalPlaceBlock(GT_MetaTileEntity_TM_teslaCoil t, World world, int x, int y, int z, + ItemStack trigger, IItemSource source, EntityPlayerMP actor, Consumer<IChatComponent> chatter) { + if (check(t, world, x, y, z)) return PlaceResult.SKIP; + ItemStack tFrameStack = source + .takeOne(s -> GT_Item_Machines.getMetaTileEntity(s) instanceof GT_MetaPipeEntity_Frame, true); + if (tFrameStack == null) return PlaceResult.REJECT; + return StructureUtility.survivalPlaceBlock( + tFrameStack, + ItemStackPredicate.NBTMode.IGNORE_KNOWN_INSIGNIFICANT_TAGS, + null, + false, + world, + x, + y, + z, + source, + actor, + chatter); + } + }) + .build(); + // endregion + + // region parameters + protected Parameters.Group.ParameterIn popogaSetting, histLowSetting, histHighSetting, transferRadiusTowerSetting, + transferRadiusTransceiverSetting, transferRadiusCoverUltimateSetting, outputVoltageSetting, + outputCurrentSetting, sortTimeMinSetting, overDriveSetting; + protected Parameters.Group.ParameterOut popogaDisplay, transferRadiusTowerDisplay, transferRadiusTransceiverDisplay, + transferRadiusCoverUltimateDisplay, outputVoltageDisplay, outputCurrentDisplay, energyCapacityDisplay, + energyStoredDisplay, energyFractionDisplay, sortTimeDisplay; + + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> HYSTERESIS_LOW_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.0"); // Hysteresis low setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> HYSTERESIS_HIGH_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.1"); // Hysteresis high setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TOWER_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.2"); // Tesla Towers transfer radius + // setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TRANSCEIVER_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.3"); // Tesla Transceiver transfer + // radius setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_COVER_ULTIMATE_SETTING_NAME = ( + base, p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.4"); // Tesla Ultimate Cover + // transfer radius + // setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_VOLTAGE_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.5"); // Output voltage setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_CURRENT_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.6"); // Output current setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> SCAN_TIME_MIN_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.7"); // Scan time Min setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OVERDRIVE_SETTING_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.8"); // Overdrive setting + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> POPOGA_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgi.9"); // Unused + + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TOWER_DISPLAY_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.0"); // Tesla Towers transfer radius + // display + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TRANSCEIVER_DISPLAY_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.1"); // Tesla Transceiver transfer + // radius display + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_COVER_ULTIMATE_DISPLAY_NAME = ( + base, p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.2"); // Tesla Ultimate Cover + // transfer radius + // display + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_VOLTAGE_DISPLAY_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.3"); // Output voltage display + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_CURRENT_DISPLAY_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.4"); // Output current display + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> ENERGY_CAPACITY_DISPLAY_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.5"); // Energy Capacity display + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> ENERGY_STORED_DISPLAY_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.6"); // Energy Stored display + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> ENERGY_FRACTION_DISPLAY_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.7"); // Energy Fraction display + private static final INameFunction<GT_MetaTileEntity_TM_teslaCoil> SCAN_TIME_DISPLAY_NAME = (base, + p) -> translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.cfgo.8"); // Scan time display + + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> HYSTERESIS_LOW_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) { + return STATUS_WRONG; + } + if (value <= 0.05) return STATUS_TOO_LOW; + if (value > base.histHighSetting.get()) return STATUS_TOO_HIGH; + return STATUS_OK; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> HYSTERESIS_HIGH_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + if (value <= base.histLowSetting.get()) return STATUS_TOO_LOW; + if (value > 0.95) return STATUS_TOO_HIGH; + return STATUS_OK; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TOWER_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (int) value; + if (value < 0) return STATUS_TOO_LOW; + if (value > transferRadiusTowerFromConfig) return STATUS_HIGH; + if (value < transferRadiusTowerFromConfig) return STATUS_LOW; + return STATUS_OK; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_TRANSCEIVER_STATUS = (base, + p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (int) value; + if (value < 0) return STATUS_TOO_LOW; + if (value > transferRadiusTransceiverFromConfig) return STATUS_HIGH; + if (value < transferRadiusTransceiverFromConfig) return STATUS_LOW; + return STATUS_OK; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> TRANSFER_RADIUS_COVER_ULTIMATE_STATUS = (base, + p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (int) value; + if (value < 0) return STATUS_TOO_LOW; + if (value > transferRadiusCoverUltimateFromConfig) return STATUS_HIGH; + if (value < transferRadiusCoverUltimateFromConfig) return STATUS_LOW; + return STATUS_OK; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> OUTPUT_VOLTAGE_OR_CURRENT_STATUS = (base, + p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (long) value; + if (value == -1) return STATUS_OK; + if (value <= 0) return STATUS_TOO_LOW; + return STATUS_OK; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> SCAN_TIME_MIN_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (int) value; + if (value < 100) return STATUS_TOO_LOW; + if (value == 100) return STATUS_OK; + return STATUS_HIGH; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> OVERDRIVE_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (int) value; + if (value < 0) return STATUS_TOO_LOW; + if (value == 0) return STATUS_LOW; + return STATUS_HIGH; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> POPOGA_STATUS = (base, p) -> { + if (base.getBaseMetaTileEntity() + .getWorld() + .isThundering()) { + return STATUS_WTF; + } + return STATUS_NEUTRAL; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> SCAN_TIME_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (int) value; + if (value == 0) return STATUS_HIGH; + return STATUS_LOW; + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> POWER_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + value = (long) value; + if (value > 0) { + return STATUS_OK; + } else { + return STATUS_LOW; + } + }; + private static final IStatusFunction<GT_MetaTileEntity_TM_teslaCoil> ENERGY_STATUS = (base, p) -> { + double value = p.get(); + if (Double.isNaN(value)) return STATUS_WRONG; + if (base.energyFractionDisplay.get() > base.histHighSetting.get()) { + return STATUS_HIGH; + } else if (base.energyFractionDisplay.get() < base.histLowSetting.get()) { + return STATUS_LOW; + } else { + return STATUS_OK; + } + }; + // endregion + + public GT_MetaTileEntity_TM_teslaCoil(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_TM_teslaCoil(String aName) { + super(aName); + } + + private float getRangeMulti(int mTier, int vTier) { + // By Default: + // Helium and Nitrogen Plasmas will double the range + // Radon will quadruple the range + int plasmaBoost; + switch (plasmaTier) { + case 2: + plasmaBoost = plasmaRangeMultiT2; + break; + case 1: + plasmaBoost = plasmaRangeMultiT1; + break; + default: + plasmaBoost = 1; + } + + // Over-tiered coils will add +25% range + if (vTier > mTier) { + return 1.25F * plasmaBoost; + } + return 1F * plasmaBoost; + } + + private void checkPlasmaBoost() { + // If there's fluid in the queue, try to output it + // That way it takes at least a second to 'process' the plasma + if (mOutputFluidsQueue != null) { + mOutputFluids = mOutputFluidsQueue; + mOutputFluidsQueue = null; + } + + for (GT_MetaTileEntity_Hatch_Input fluidHatch : mInputHatches) { + if (fluidHatch.mFluid != null) { + if (fluidHatch.mFluid.isFluidEqual(Materials.Helium.getPlasma(1)) + && fluidHatch.mFluid.amount >= heliumUse) { + fluidHatch.mFluid.amount = fluidHatch.mFluid.amount - heliumUse; + if (doFluidOutput) { + mOutputFluidsQueue = new FluidStack[] { Materials.Helium.getGas(heliumUse) }; + } + plasmaTier = 1; + return; + } else if (fluidHatch.mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1)) + && fluidHatch.mFluid.amount >= nitrogenUse) { + fluidHatch.mFluid.amount = fluidHatch.mFluid.amount - nitrogenUse; + if (doFluidOutput) { + mOutputFluidsQueue = new FluidStack[] { Materials.Nitrogen.getGas(nitrogenUse) }; + } + plasmaTier = 1; + return; + } else if (fluidHatch.mFluid.isFluidEqual(Materials.Radon.getPlasma(1)) + && fluidHatch.mFluid.amount >= radonUse) { + fluidHatch.mFluid.amount = fluidHatch.mFluid.amount - radonUse; + if (doFluidOutput) { + mOutputFluidsQueue = new FluidStack[] { Materials.Radon.getGas(radonUse) }; + } + plasmaTier = 2; + return; + } + } + } + plasmaTier = 0; + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_TM_teslaCoil(mName); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) { + cap.getBaseMetaTileEntity() + .setActive(false); + } + eCapacitorHatches.clear(); + + mTier = -1; + + if (structureCheck_EM("main", 3, 16, 0)) { + for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) { + cap.getBaseMetaTileEntity() + .setActive(iGregTechTileEntity.isActive()); + } + + // Only recalculate offsets on orientation or rotation change + if (oldRotation != getExtendedFacing().ordinal() + || oldOrientation != iGregTechTileEntity.getFrontFacing()) { + oldRotation = (byte) getExtendedFacing().ordinal(); + oldOrientation = iGregTechTileEntity.getFrontFacing(); + + Vec3Impl posBMTE = new Vec3Impl( + getBaseMetaTileEntity().getXCoord(), + getBaseMetaTileEntity().getYCoord(), + getBaseMetaTileEntity().getZCoord()); + + // Calculate coordinates of the middle bottom + posTop = getExtendedFacing().getWorldOffset(new Vec3Impl(0, 0, 2)) + .add(posBMTE); + + // Calculate coordinates of the top sphere + posTop = getExtendedFacing().getWorldOffset(new Vec3Impl(0, -14, 2)) + .add(posBMTE); + } + // Generate node map + if (!getBaseMetaTileEntity().isClientSide()) { + teslaSimpleNodeSetAdd(this); + generateTeslaNodeMap(this); + } + return true; + } + return false; + } + + @Override + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + checkPlasmaBoost(); + + if (!histHighSetting.getStatus(false).isOk || !histLowSetting.getStatus(false).isOk) + return SimpleCheckRecipeResult.ofFailure("invalid_hysteresis"); + if (!transferRadiusTowerSetting.getStatus(false).isOk || !transferRadiusTransceiverSetting.getStatus(false).isOk + || !transferRadiusCoverUltimateSetting.getStatus(false).isOk) + return SimpleCheckRecipeResult.ofFailure("invalid_transfer_radius"); + if (!outputVoltageSetting.getStatus(false).isOk) + return SimpleCheckRecipeResult.ofFailure("invalid_voltage_setting"); + if (!outputCurrentSetting.getStatus(false).isOk) + return SimpleCheckRecipeResult.ofFailure("invalid_current_setting"); + if (!sortTimeMinSetting.getStatus(false).isOk) return SimpleCheckRecipeResult.ofFailure("invalid_time_setting"); + if (!overDriveSetting.getStatus(false).isOk) + return SimpleCheckRecipeResult.ofFailure("invalid_overdrive_setting"); + + mEfficiencyIncrease = 10000; + mMaxProgresstime = 20; + vTier = -1; + long[] capacitorData; + for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) { + if (cap.getCapacitors()[0] > vTier) { + vTier = (int) cap.getCapacitors()[0]; + } + } + + energyCapacity = 0; + outputCurrentMax = 0; + + if (vTier < 0) { + // Returning true to allow for 'passive running' + outputVoltageMax = 0; + return SimpleCheckRecipeResult.ofSuccess("routing"); + } else if (vTier > mTier && getEUVar() > 0) { + explodeMultiblock(); + } + + outputVoltageMax = V[vTier + 1]; + for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) { + cap.getBaseMetaTileEntity() + .setActive(true); + capacitorData = cap.getCapacitors(); + if (capacitorData[0] < vTier) { + if (getEUVar() > 0 && capacitorData[0] != 0) { + cap.getBaseMetaTileEntity() + .setToFire(); + } + eCapacitorHatches.remove(cap); + } else { + outputCurrentMax += capacitorData[1]; + energyCapacity += capacitorData[2]; + } + } + return SimpleCheckRecipeResult.ofSuccess("routing"); + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.name")) // Machine Type: Tesla + // Tower + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.0")) // Controller block of + // the Tesla Tower + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.1")) // Used to transmit + // power to Tesla + // Coil Covers and Tesla + // Transceivers + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.2")) // Can be fed with + // Helium/Nitrogen/Radon Plasma to + // increase the range + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.3")) // Transmitted voltage + // depends on + // the used Tesla Capacitor tier + .addInfo(translateToLocal("gt.blockmachines.multimachine.tm.teslaCoil.desc.4")) // Primary Tesla + // Windings need to + // be at least the same tier as + // the Tesla Capacitor + .addInfo(translateToLocal("tt.keyword.Structure.StructureTooComplex")) // The structure is too complex! + .addSeparator() + .beginStructureBlock(7, 17, 7, false) + .addOtherStructurePart( + translateToLocal("gt.blockmachines.hatch.capacitor.tier.03.name"), + translateToLocal("tt.keyword.Structure.AnyTeslaBaseCasingOuter"), + 1) // Capacitor Hatch: Any outer Tesla Base Casing + .addEnergyHatch(translateToLocal("tt.keyword.Structure.AnyTeslaBaseCasingOuter"), 1) // Energy Hatch: + // Any outer Tesla + // Base Casing + .addMaintenanceHatch(translateToLocal("tt.keyword.Structure.AnyTeslaBaseCasingOuter"), 1) // Maintenance + // Hatch: Any + // outer Tesla + // Base Casing + .toolTipFinisher(CommonValues.THETA_MOVEMENT); + return tt; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/TM_TESLA_TOWER"); + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/TM_TESLA_TOWER_ACTIVE"); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][16 + 6], + new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][16 + 6] }; + } + + @Override + public void onRemoval() { + super.onRemoval(); + if (!getBaseMetaTileEntity().isClientSide()) { + teslaSimpleNodeSetRemove(this); + for (GT_MetaTileEntity_Hatch_Capacitor cap : filterValidMTEs(eCapacitorHatches)) { + cap.getBaseMetaTileEntity() + .setActive(false); + } + } + } + + @Override + public void onUnload() { + if (!getBaseMetaTileEntity().isClientSide()) { + teslaSimpleNodeSetRemove(this); + } + } + + @Override + protected void parametersInstantiation_EM() { + Parameters.Group hatch_0 = parametrization.getGroup(0, true); + Parameters.Group hatch_1 = parametrization.getGroup(1, true); + Parameters.Group hatch_2 = parametrization.getGroup(2, true); + Parameters.Group hatch_3 = parametrization.getGroup(3, true); + Parameters.Group hatch_4 = parametrization.getGroup(4, true); + Parameters.Group hatch_5 = parametrization.getGroup(5, true); + Parameters.Group hatch_6 = parametrization.getGroup(6, true); + Parameters.Group hatch_7 = parametrization.getGroup(7, true); + Parameters.Group hatch_8 = parametrization.getGroup(8, true); + Parameters.Group hatch_9 = parametrization.getGroup(9, true); + + histLowSetting = hatch_0.makeInParameter(0, 0.25, HYSTERESIS_LOW_SETTING_NAME, HYSTERESIS_LOW_STATUS); + popogaSetting = hatch_0.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + histHighSetting = hatch_1.makeInParameter(0, 0.75, HYSTERESIS_HIGH_SETTING_NAME, HYSTERESIS_HIGH_STATUS); + popogaSetting = hatch_1.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + transferRadiusTowerSetting = hatch_2.makeInParameter( + 0, + transferRadiusTowerFromConfig, + TRANSFER_RADIUS_TOWER_SETTING_NAME, + TRANSFER_RADIUS_TOWER_STATUS); + popogaSetting = hatch_2.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + transferRadiusTransceiverSetting = hatch_3.makeInParameter( + 0, + transferRadiusTransceiverFromConfig, + TRANSFER_RADIUS_TRANSCEIVER_SETTING_NAME, + TRANSFER_RADIUS_TRANSCEIVER_STATUS); + transferRadiusCoverUltimateSetting = hatch_3.makeInParameter( + 1, + transferRadiusCoverUltimateFromConfig, + TRANSFER_RADIUS_COVER_ULTIMATE_SETTING_NAME, + TRANSFER_RADIUS_COVER_ULTIMATE_STATUS); + outputVoltageSetting = hatch_4 + .makeInParameter(0, -1, OUTPUT_VOLTAGE_SETTING_NAME, OUTPUT_VOLTAGE_OR_CURRENT_STATUS); + popogaSetting = hatch_4.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + outputCurrentSetting = hatch_5 + .makeInParameter(0, -1, OUTPUT_CURRENT_SETTING_NAME, OUTPUT_VOLTAGE_OR_CURRENT_STATUS); + popogaSetting = hatch_5.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + popogaSetting = hatch_6.makeInParameter(0, 0, POPOGA_NAME, POPOGA_STATUS); + popogaSetting = hatch_6.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + sortTimeMinSetting = hatch_7.makeInParameter(0, 100, SCAN_TIME_MIN_SETTING_NAME, SCAN_TIME_MIN_STATUS); + popogaSetting = hatch_7.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + overDriveSetting = hatch_8.makeInParameter(0, 0, OVERDRIVE_SETTING_NAME, OVERDRIVE_STATUS); + popogaSetting = hatch_8.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + popogaSetting = hatch_9.makeInParameter(0, 0, POPOGA_NAME, POPOGA_STATUS); + popogaSetting = hatch_9.makeInParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + + popogaDisplay = hatch_0.makeOutParameter(0, 0, POPOGA_NAME, POPOGA_STATUS); + popogaDisplay = hatch_0.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + popogaDisplay = hatch_1.makeOutParameter(0, 0, POPOGA_NAME, POPOGA_STATUS); + popogaDisplay = hatch_1.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + transferRadiusTowerDisplay = hatch_2 + .makeOutParameter(0, 0, TRANSFER_RADIUS_TOWER_DISPLAY_NAME, TRANSFER_RADIUS_TOWER_STATUS); + popogaDisplay = hatch_2.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + transferRadiusTransceiverDisplay = hatch_3 + .makeOutParameter(0, 0, TRANSFER_RADIUS_TRANSCEIVER_DISPLAY_NAME, TRANSFER_RADIUS_TRANSCEIVER_STATUS); + transferRadiusCoverUltimateDisplay = hatch_3 + .makeOutParameter(1, 0, TRANSFER_RADIUS_COVER_ULTIMATE_DISPLAY_NAME, TRANSFER_RADIUS_COVER_ULTIMATE_STATUS); + outputVoltageDisplay = hatch_4.makeOutParameter(0, 0, OUTPUT_VOLTAGE_DISPLAY_NAME, POWER_STATUS); + popogaDisplay = hatch_4.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + outputCurrentDisplay = hatch_5.makeOutParameter(0, 0, OUTPUT_CURRENT_DISPLAY_NAME, POWER_STATUS); + energyCapacityDisplay = hatch_5.makeOutParameter(1, 0, ENERGY_CAPACITY_DISPLAY_NAME, ENERGY_STATUS); + energyStoredDisplay = hatch_6.makeOutParameter(0, 0, ENERGY_STORED_DISPLAY_NAME, ENERGY_STATUS); + energyFractionDisplay = hatch_6.makeOutParameter(1, 0, ENERGY_FRACTION_DISPLAY_NAME, ENERGY_STATUS); + sortTimeDisplay = hatch_7.makeOutParameter(0, 0, SCAN_TIME_DISPLAY_NAME, SCAN_TIME_STATUS); + popogaDisplay = hatch_7.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + popogaDisplay = hatch_8.makeOutParameter(0, 0, POPOGA_NAME, POPOGA_STATUS); + popogaDisplay = hatch_8.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + popogaDisplay = hatch_9.makeOutParameter(0, 0, POPOGA_NAME, POPOGA_STATUS); + popogaDisplay = hatch_9.makeOutParameter(1, 0, POPOGA_NAME, POPOGA_STATUS); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setLong("eEnergyCapacity", energyCapacity); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + energyCapacity = aNBT.getLong("eEnergyCapacity"); + teslaSimpleNodeSetAdd(this); + } + + @Override + public void stopMachine(@Nonnull ShutDownReason reason) { + super.stopMachine(reason); + for (GT_MetaTileEntity_Hatch_Capacitor cap : eCapacitorHatches) { + cap.getBaseMetaTileEntity() + .setActive(false); + } + + ePowerPass = false; + setEUVar(0); + energyStoredDisplay.set(0); + energyFractionDisplay.set(0); + } + + @Override + public boolean onRunningTick(ItemStack aStack) { + // Hysteresis based ePowerPass setting + float energyFrac = (float) getEUVar() / energyCapacity; + + energyCapacityDisplay.set(energyCapacity); + energyStoredDisplay.set(getEUVar()); + energyFractionDisplay.set(energyFrac); + + if (!ePowerPass && energyFrac > histHighSetting.get()) { + ePowerPass = true; + } else if (ePowerPass && energyFrac < histLowSetting.get()) { + ePowerPass = false; + } + + // Power Limit Settings + if (outputVoltageSetting.get() > 0) { + outputVoltage = min(outputVoltageMax, (long) outputVoltageSetting.get()); + } else { + outputVoltage = outputVoltageMax; + } + outputVoltageDisplay.set(outputVoltage); + + if (outputCurrentSetting.get() > 0) { + outputCurrent = min(outputCurrentMax, (long) outputCurrentSetting.get()); + } else { + outputCurrent = outputCurrentMax; + } + + // Range calculation and display + int transferRadiusTower = getTeslaTransmissionRange(); + transferRadiusTowerDisplay.set(transferRadiusTower); + transferRadiusTransceiverDisplay.set(transferRadiusTower * 2); + transferRadiusCoverUltimateDisplay.set(transferRadiusTower); + + // Power transfer + outputCurrentDisplay.set(powerTeslaNodeMap(this)); + + // TODO Encapsulate the spark sender + sparkCount--; + if (sparkCount == 0 && visualEffect) { + IGregTechTileEntity mte = getBaseMetaTileEntity(); + sparkCount = 10; + if (!sparkList.isEmpty()) { + NetworkDispatcher.INSTANCE.sendToAllAround( + new RendererMessage.RendererData(sparkList), + mte.getWorld().provider.dimensionId, + mte.getXCoord(), + mte.getYCoord(), + mte.getZCoord(), + 256); + sparkList.clear(); + } + } + return true; + } + + @Override + public long maxEUStore() { + // Setting the power here so that the tower looses all it's charge once disabled + // This also stops it from exploding + return getBaseMetaTileEntity().isActive() ? energyCapacity * 2 : 0; + } + + @Override + public long getEUVar() { + // Same reason as maxEUStore, set to 1 instead of zero so it doesn't drain constantly + return getBaseMetaTileEntity().isActive() ? super.getEUVar() : 1; + } + + private boolean addCapacitorToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Capacitor) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eCapacitorHatches.add((GT_MetaTileEntity_Hatch_Capacitor) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity); + } + return false; + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_TM_teslaCoil> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM("main", 3, 16, 0, stackSize, hintsOnly); + } + + @Override + public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) { + if (mMachine) return -1; + return survivialBuildPiece("main", stackSize, 3, 16, 0, elementBudget, source, actor, false, true); + } + + @Override + public String[] getStructureDescription(ItemStack stackSize) { + return description; + } + + @Override + public byte getTeslaReceptionCapability() { + return 0; + } + + @Override + public float getTeslaReceptionCoefficient() { + return 0; + } + + @Override + public Multimap<Integer, ITeslaConnectableSimple> getTeslaNodeMap() { + return teslaNodeMap; + } + + @Override + public HashSet<ThaumSpark> getSparkList() { + return sparkList; + } + + @Override + public byte getTeslaTransmissionCapability() { + return 1; + } + + @Override + public int getTeslaTransmissionRange() { + return (int) (transferRadiusTowerSetting.get() * getRangeMulti(mTier, vTier)); + } + + @Override + public boolean isOverdriveEnabled() { + return overDriveSetting.get() > 0; + } + + @Override + public int getTeslaEnergyLossPerBlock() { + return plasmaTierLoss[plasmaTier]; + } + + @Override + public float getTeslaOverdriveLossCoefficient() { + return overDriveLoss; + } + + @Override + public long getTeslaOutputVoltage() { + return outputVoltage; + } + + @Override + public long getTeslaOutputCurrent() { + return outputCurrent; + } + + @Override + public boolean teslaDrainEnergy(long teslaVoltageDrained) { + if (getEUVar() < teslaVoltageDrained) { + return false; + } + + setEUVar(getEUVar() - teslaVoltageDrained); + return true; + } + + @Override + public boolean isTeslaReadyToReceive() { + return !this.ePowerPass; + } + + @Override + public long getTeslaStoredEnergy() { + return getEUVar(); + } + + @Override + public Vec3Impl getTeslaPosition() { + return posTop; + } + + @Override + public Integer getTeslaDimension() { + return this.getBaseMetaTileEntity() + .getWorld().provider.dimensionId; + } + + @Override + public boolean teslaInjectEnergy(long teslaVoltageInjected) { + if (this.getEUVar() + teslaVoltageInjected <= (this.maxEUStore() / 2)) { + this.getBaseMetaTileEntity() + .increaseStoredEnergyUnits(teslaVoltageInjected, true); + return true; + } + return false; + } + + private enum CapacitorHatchElement implements IHatchElement<GT_MetaTileEntity_TM_teslaCoil> { + + INSTANCE; + + @Override + public List<? extends Class<? extends IMetaTileEntity>> mteClasses() { + return Collections.singletonList(GT_MetaTileEntity_Hatch_Capacitor.class); + } + + @Override + public IGT_HatchAdder<? super GT_MetaTileEntity_TM_teslaCoil> adder() { + return GT_MetaTileEntity_TM_teslaCoil::addCapacitorToMachineList; + } + + @Override + public long count(GT_MetaTileEntity_TM_teslaCoil gt_metaTileEntity_tm_teslaCoil) { + return gt_metaTileEntity_tm_teslaCoil.eCapacitorHatches.size(); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java new file mode 100644 index 0000000000..20a9582521 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/GT_MetaTileEntity_MultiblockBase_EM.java @@ -0,0 +1,2823 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.base; + +import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE; +import static com.github.technus.tectech.loader.TecTechConfig.POWERLESS_MODE; +import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage; +import static com.github.technus.tectech.util.CommonValues.MULTI_CHECK_AT; +import static com.github.technus.tectech.util.CommonValues.RECIPE_AT; +import static com.github.technus.tectech.util.CommonValues.TEC_MARK_GENERAL; +import static com.github.technus.tectech.util.CommonValues.V; +import static com.github.technus.tectech.util.CommonValues.VN; +import static com.github.technus.tectech.util.TT_Utility.getTier; +import static gregtech.api.enums.GT_HatchElement.InputBus; +import static gregtech.api.enums.GT_HatchElement.InputHatch; +import static gregtech.api.enums.GT_HatchElement.Maintenance; +import static gregtech.api.enums.GT_HatchElement.Muffler; +import static gregtech.api.enums.GT_HatchElement.OutputBus; +import static gregtech.api.enums.GT_HatchElement.OutputHatch; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GT_Utility.filterValidMTEs; +import static java.lang.Math.min; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; +import org.lwjgl.opengl.GL11; + +import com.github.technus.tectech.Reference; +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DataConnector; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_DynamoMulti; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyMulti; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_InputData; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_OutputData; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Param; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Uncertainty; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.google.common.collect.Iterables; +import com.gtnewhorizon.structurelib.StructureLibAPI; +import com.gtnewhorizon.structurelib.alignment.IAlignment; +import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.IStructureElement; +import com.gtnewhorizon.structurelib.util.Vec3Impl; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.Pos2d; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.IHatchElement; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IBindPlayerInventoryUI; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_ExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Dynamo; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Maintenance; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.util.GT_HatchElementBuilder; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_Utility; +import gregtech.api.util.IGT_HatchAdder; +import gregtech.api.util.shutdown.ShutDownReason; +import gregtech.api.util.shutdown.ShutDownReasonRegistry; +import gregtech.api.util.shutdown.SimpleShutDownReason; +import gregtech.common.GT_Pollution; +import gregtech.common.tileentities.machines.IDualInputHatch; + +/** + * Created by danie_000 on 27.10.2016. + */ +public abstract class GT_MetaTileEntity_MultiblockBase_EM + extends GT_MetaTileEntity_ExtendedPowerMultiBlockBase<GT_MetaTileEntity_MultiblockBase_EM> + implements IAlignment, IBindPlayerInventoryUI { + // region Client side variables (static - one per class) + + // Front icon holders - static so it is default one for my blocks + // just add new static ones in your class and and override getTexture + protected static Textures.BlockIcons.CustomIcon ScreenOFF; + protected static Textures.BlockIcons.CustomIcon ScreenON; + + /** Base ID for the LED window popup. LED 1 I0 will have ID 100, LED 1 I1 101... */ + protected static int LED_WINDOW_BASE_ID = 100; + + // Sound resource - same as with screen but override getActivitySound + public static final ResourceLocation activitySound = new ResourceLocation(Reference.MODID + ":fx_lo_freq"); + + @SideOnly(Side.CLIENT) + private SoundLoop activitySoundLoop; + // endregion + + // region HATCHES ARRAYS - they hold info about found hatches, add hatches to them... (auto structure magic does it + // tho) + + // HATCHES!!!, should be added and removed in check machine + protected ArrayList<GT_MetaTileEntity_Hatch_Param> eParamHatches = new ArrayList<>(); + protected ArrayList<GT_MetaTileEntity_Hatch_Uncertainty> eUncertainHatches = new ArrayList<>(); + // multi amp hatches in/out + protected ArrayList<GT_MetaTileEntity_Hatch_EnergyMulti> eEnergyMulti = new ArrayList<>(); + protected ArrayList<GT_MetaTileEntity_Hatch_DynamoMulti> eDynamoMulti = new ArrayList<>(); + // data hatches + protected ArrayList<GT_MetaTileEntity_Hatch_InputData> eInputData = new ArrayList<>(); + protected ArrayList<GT_MetaTileEntity_Hatch_OutputData> eOutputData = new ArrayList<>(); + + // endregion + + // region parameters + public final Parameters parametrization; + // endregion + + // region Control variables + + // should explode on dismatle?, set it in constructor, if true machine will explode if invalidated structure while + // active + protected boolean eDismantleBoom = false; + + // what is the amount of A required + public long eAmpereFlow = 1; // analogue of EU/t but for amperes used (so eu/t is actually eu*A/t) USE ONLY POSITIVE + // NUMBERS! + + // set to what you need it to be in check recipe + // data required to operate + protected long eRequiredData = 0; + + // Counter for the computation timeout. Will be initialized one to the max time and then only decreased. + protected int eComputationTimeout = MAX_COMPUTATION_TIMEOUT; + + // Max timeout of computation in ticks + protected static int MAX_COMPUTATION_TIMEOUT = 100; + + // are parameters correct - change in check recipe/output/update params etc. (maintenance status boolean) + protected boolean eParameters = true; + + // what type of certainty inconvenience is used - can be used as in Computer - more info in uncertainty hatch + protected byte eCertainMode = 0, eCertainStatus = 0; + + // minimal repair status to make the machine even usable (how much unfixed fixed stuff is needed) + // if u need to force some things to be fixed - u might need to override doRandomMaintenanceDamage + protected byte minRepairStatus = 3; + + // whether there is a maintenance hatch in the multi and whether checks are necessary (for now only used in a + // transformer) + protected boolean hasMaintenanceChecks = true; + + // is power pass cover present + public boolean ePowerPassCover = false; + + // functionality toggles - changed by buttons in gui also + public boolean ePowerPass = false, eSafeVoid = false; + + // endregion + + // region READ ONLY unless u really need to change it + + // max amperes machine can take in after computing it to the lowest tier (exchange packets to min tier count) + protected long eMaxAmpereFlow = 0, eMaxAmpereGen = 0; + + // What is the max and minimal tier of eu hatches installed + private long maxEUinputMin = 0, maxEUinputMax = 0, maxEUoutputMin = 0, maxEUoutputMax = 0; + + // read only unless you are making computation generator - read computer class + protected long eAvailableData = 0; // data being available + + // just some info - private so hidden + private boolean explodedThisTick = false; + + /** Flag if the new long power variable should be used */ + protected boolean useLongPower = false; + + // Locale-aware formatting of numbers. + protected static NumberFormatMUI numberFormat; + static { + numberFormat = new NumberFormatMUI(); + numberFormat.setMaximumFractionDigits(8); + } + + // endregion + + protected GT_MetaTileEntity_MultiblockBase_EM(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + parametrization = new Parameters(this); + parametersInstantiation_EM(); + parametrization.setToDefaults(true, true); + } + + protected GT_MetaTileEntity_MultiblockBase_EM(String aName) { + super(aName); + parametrization = new Parameters(this); + parametersInstantiation_EM(); + parametrization.setToDefaults(true, true); + } + + // region SUPER STRUCT + + /** + * Gets structure + * + * @return STATIC INSTANCE OF STRUCTURE + */ + public abstract IStructureDefinition<? extends GT_MetaTileEntity_MultiblockBase_EM> getStructure_EM(); + + @SuppressWarnings("unchecked") + private IStructureDefinition<GT_MetaTileEntity_MultiblockBase_EM> getStructure_EM_Internal() { + return (IStructureDefinition<GT_MetaTileEntity_MultiblockBase_EM>) getStructure_EM(); + } + + @Override + public IStructureDefinition<GT_MetaTileEntity_MultiblockBase_EM> getStructureDefinition() { + return getStructure_EM_Internal(); + } + + public final boolean structureCheck_EM(String piece, int horizontalOffset, int verticalOffset, int depthOffset) { + IGregTechTileEntity baseMetaTileEntity = getBaseMetaTileEntity(); + return getStructure_EM_Internal().check( + this, + piece, + baseMetaTileEntity.getWorld(), + getExtendedFacing(), + baseMetaTileEntity.getXCoord(), + baseMetaTileEntity.getYCoord(), + baseMetaTileEntity.getZCoord(), + horizontalOffset, + verticalOffset, + depthOffset, + !mMachine); + } + + public final boolean structureBuild_EM(String piece, int horizontalOffset, int verticalOffset, int depthOffset, + ItemStack trigger, boolean hintsOnly) { + IGregTechTileEntity baseMetaTileEntity = getBaseMetaTileEntity(); + return getStructure_EM_Internal().buildOrHints( + this, + trigger, + piece, + baseMetaTileEntity.getWorld(), + getExtendedFacing(), + baseMetaTileEntity.getXCoord(), + baseMetaTileEntity.getYCoord(), + baseMetaTileEntity.getZCoord(), + horizontalOffset, + verticalOffset, + depthOffset, + hintsOnly); + } + // endregion + + // region METHODS TO OVERRIDE - general functionality, recipe check, output + + /** + * Check structure here, also add hatches + * + * @param iGregTechTileEntity - the tile entity + * @param itemStack - what is in the controller input slot + * @return is structure valid + */ + protected boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + return false; + } + + /** + * Checks Recipes (when all machine is complete and can work) + * <p> + * can get/set Parameters here also + * + * @deprecated Use {@link #createProcessingLogic()} ()} or {@link #checkProcessing_EM()} + * + * @param itemStack item in the controller + * @return is recipe is valid + */ + @Deprecated + public boolean checkRecipe_EM(ItemStack itemStack) { + return false; + } + + @NotNull + protected CheckRecipeResult checkProcessing_EM() { + if (processingLogic == null) { + return checkRecipe_EM(getControllerSlot()) ? CheckRecipeResultRegistry.SUCCESSFUL + : CheckRecipeResultRegistry.NO_RECIPE; + } + return super.checkProcessing(); + } + + /** + * Put EM stuff from outputEM into EM output hatches here or do other stuff - it is basically on recipe succeded + * <p> + * based on "machine state" do output, this must move to outputEM to EM output hatches and can also modify output + * items/fluids/EM, remaining EM is NOT overflowed. (Well it can be overflowed if machine didn't finished, + * soft-hammered/disabled/not enough EU) Setting available data processing + */ + public void outputAfterRecipe_EM() {} + // endregion + + // region tooltip and scanner result + + public ArrayList<String> getFullLedDescriptionIn(int hatchNo, int paramID) { + ArrayList<String> list = new ArrayList<>(); + list.add( + EnumChatFormatting.WHITE + "ID: " + + EnumChatFormatting.AQUA + + hatchNo + + EnumChatFormatting.YELLOW + + ":" + + EnumChatFormatting.AQUA + + paramID + + EnumChatFormatting.YELLOW + + ":" + + EnumChatFormatting.AQUA + + "I " + + parametrization.getStatusIn(hatchNo, paramID).name.get()); + list.add( + EnumChatFormatting.WHITE + "Value: " + + EnumChatFormatting.AQUA + + numberFormat.format(parametrization.getIn(hatchNo, paramID))); + try { + list.add(parametrization.groups[hatchNo].parameterIn[paramID].getBrief()); + } catch (NullPointerException | IndexOutOfBoundsException e) { + list.add("Unused"); + } + return list; + } + + public ArrayList<String> getFullLedDescriptionOut(int hatchNo, int paramID) { + ArrayList<String> list = new ArrayList<>(); + list.add( + EnumChatFormatting.WHITE + "ID: " + + EnumChatFormatting.AQUA + + hatchNo + + EnumChatFormatting.YELLOW + + ":" + + EnumChatFormatting.AQUA + + paramID + + EnumChatFormatting.YELLOW + + ":" + + EnumChatFormatting.AQUA + + "O " + + parametrization.getStatusOut(hatchNo, paramID).name.get()); + list.add( + EnumChatFormatting.WHITE + "Value: " + + EnumChatFormatting.AQUA + + numberFormat.format(parametrization.getOut(hatchNo, paramID))); + try { + list.add(parametrization.groups[hatchNo].parameterOut[paramID].getBrief()); + } catch (NullPointerException | IndexOutOfBoundsException e) { + list.add("Unused"); + } + return list; + } + + @Override + protected GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addInfo("Nothing special just override me") + .toolTipFinisher(TEC_MARK_GENERAL); + return tt; + } + + /** + * scanner gives it + */ + @Override + public String[] getInfoData() { // TODO Do it + long storedEnergy = 0; + long maxEnergy = 0; + for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + for (GT_MetaTileEntity_Hatch_EnergyMulti tHatch : filterValidMTEs(eEnergyMulti)) { + storedEnergy += tHatch.getBaseMetaTileEntity() + .getStoredEU(); + maxEnergy += tHatch.getBaseMetaTileEntity() + .getEUCapacity(); + } + + return new String[] { "Progress:", + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(mProgresstime / 20) + + EnumChatFormatting.RESET + + " s / " + + EnumChatFormatting.YELLOW + + GT_Utility.formatNumbers(mMaxProgresstime / 20) + + EnumChatFormatting.RESET + + " s", + "Energy Hatches:", + EnumChatFormatting.GREEN + GT_Utility.formatNumbers(storedEnergy) + + EnumChatFormatting.RESET + + " EU / " + + EnumChatFormatting.YELLOW + + GT_Utility.formatNumbers(maxEnergy) + + EnumChatFormatting.RESET + + " EU", + (getPowerFlow() * eAmpereFlow <= 0 ? "Probably uses: " : "Probably makes: ") + EnumChatFormatting.RED + + GT_Utility.formatNumbers(Math.abs(getPowerFlow())) + + EnumChatFormatting.RESET + + " EU/t at " + + EnumChatFormatting.RED + + GT_Utility.formatNumbers(eAmpereFlow) + + EnumChatFormatting.RESET + + " A", + "Tier Rating: " + EnumChatFormatting.YELLOW + + VN[getMaxEnergyInputTier_EM()] + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.GREEN + + VN[getMinEnergyInputTier_EM()] + + EnumChatFormatting.RESET + + " Amp Rating: " + + EnumChatFormatting.GREEN + + GT_Utility.formatNumbers(eMaxAmpereFlow) + + EnumChatFormatting.RESET + + " A", + "Problems: " + EnumChatFormatting.RED + + (getIdealStatus() - getRepairStatus()) + + EnumChatFormatting.RESET + + " Efficiency: " + + EnumChatFormatting.YELLOW + + mEfficiency / 100.0F + + EnumChatFormatting.RESET + + " %", + "PowerPass: " + EnumChatFormatting.BLUE + + ePowerPass + + EnumChatFormatting.RESET + + " SafeVoid: " + + EnumChatFormatting.BLUE + + eSafeVoid, + "Computation: " + EnumChatFormatting.GREEN + + GT_Utility.formatNumbers(eAvailableData) + + EnumChatFormatting.RESET + + " / " + + EnumChatFormatting.YELLOW + + GT_Utility.formatNumbers(eRequiredData) + + EnumChatFormatting.RESET }; + } + + /** + * should it work with scanner? HELL YES + */ + @Override + public boolean isGivingInformation() { + return true; + } + + // endregion + + // region GUI/SOUND/RENDER + + /** + * add more textures + */ + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/EM_CONTROLLER"); + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/EM_CONTROLLER_ACTIVE"); + super.registerIcons(aBlockIconRegister); + } + + /** + * actually use textures + */ + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][4], + new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][4] }; + } + + /** + * should return your activity sound + */ + @SideOnly(Side.CLIENT) + protected ResourceLocation getActivitySound() { + return activitySound; + } + + /** + * plays the sounds auto magically + */ + @SideOnly(Side.CLIENT) + protected void soundMagic(ResourceLocation activitySound) { + if (getBaseMetaTileEntity().isActive()) { + if (activitySoundLoop == null) { + activitySoundLoop = new SoundLoop(activitySound, getBaseMetaTileEntity(), false, true); + Minecraft.getMinecraft() + .getSoundHandler() + .playSound(activitySoundLoop); + } + } else { + if (activitySoundLoop != null) { + activitySoundLoop = null; + } + } + } + + // endregion + + // region Methods to maybe override (if u implement certain stuff) + + /** + * is the thing inside controller a valid item to make the machine work + */ + @Override + public boolean isCorrectMachinePart(ItemStack itemStack) { + return true; + } + + /** + * how much damage to apply to thing in controller - not sure how it does it + */ + @Override + public int getDamageToComponent(ItemStack itemStack) { + return 0; + } + + /** + * called when removing from map - not when unloading? //todo check + */ + @Override + public void onRemoval() { + try { + if (ePowerPass && getEUVar() > V[3] + || eDismantleBoom && mMaxProgresstime > 0 && areChunksAroundLoaded_EM()) { + explodeMultiblock(); + } + } catch (Exception e) { + if (DEBUG_MODE) { + e.printStackTrace(); + } + } + } + + /** + * prevents spontaneous explosions when the chunks unloading would cause them should cover 3 chunks radius + */ + protected boolean areChunksAroundLoaded_EM() { + if (this.isValid() && getBaseMetaTileEntity().isServerSide()) { + IGregTechTileEntity base = getBaseMetaTileEntity(); + return base.getWorld() + .doChunksNearChunkExist(base.getXCoord(), base.getYCoord(), base.getZCoord(), 3); + // todo check if it is actually checking if chunks are loaded + } else { + return false; + } + } + + /** + * instantiate parameters in CONSTRUCTOR! CALLED ONCE on creation, don't call it in your classes + */ + protected void parametersInstantiation_EM() {} + + /** + * It is automatically called OFTEN update status of parameters in guis (and "machine state" if u wish) Called + * before check recipe, before outputting, and every second the machine is complete + * <p> + * good place to update parameter statuses, default implementation handles it well + * + * @param machineBusy is machine doing stuff + */ + protected void parametersStatusesWrite_EM(boolean machineBusy) { // todo unimplement? + if (!machineBusy) { + for (Parameters.Group.ParameterIn parameterIn : parametrization.parameterInArrayList) { + if (parameterIn != null) { + parameterIn.updateStatus(); + } + } + } else { + for (Parameters.Group hatch : parametrization.groups) { + if (hatch != null && hatch.updateWhileRunning) { + for (Parameters.Group.ParameterIn in : hatch.parameterIn) { + if (in != null) { + in.updateStatus(); + } + } + } + } + } + for (Parameters.Group.ParameterOut parameterOut : parametrization.parameterOutArrayList) { + if (parameterOut != null) { + parameterOut.updateStatus(); + } + } + } + + /** + * For extra types of hatches initiation, LOOK HOW IT IS CALLED! in onPostTick + * + * @param mMachine was the machine considered complete at that point in onPostTick + */ + protected void hatchInit_EM(boolean mMachine) {} + + /** + * called when the multiblock is exploding - if u want to add more EXPLOSIONS, for ex. new types of hatches also + * have to explode + */ + protected void extraExplosions_EM() {} // For that extra hatches explosions, and maybe some MOORE EXPLOSIONS + + /** + * Get Available data, Override only on data outputters should return mAvailableData that is set in check recipe + * + * @return available data + */ + protected long getAvailableData_EM() { + long result = 0; + IGregTechTileEntity baseMetaTileEntity = getBaseMetaTileEntity(); + Vec3Impl pos = new Vec3Impl( + baseMetaTileEntity.getXCoord(), + baseMetaTileEntity.getYCoord(), + baseMetaTileEntity.getZCoord()); + for (GT_MetaTileEntity_Hatch_InputData in : eInputData) { + if (in.q != null) { + Long value = in.q.contentIfNotInTrace(pos); + if (value != null) { + result += value; + } + } + } + return result; + } + + protected long getPowerFlow() { + return useLongPower ? lEUt : mEUt; + } + + protected void setPowerFlow(long lEUt) { + if (useLongPower) { + this.lEUt = lEUt; + } else { + mEUt = (int) Math.min(Integer.MAX_VALUE, lEUt); + } + } + + @Override + protected long getActualEnergyUsage() { + return -(useLongPower ? lEUt : mEUt) * eAmpereFlow * 10_000 / Math.max(1_000, mEfficiency); + } + + /** + * Extra hook on cyclic updates (not really needed for machines smaller than 1 chunk) BUT NEEDED WHEN - machine + * blocks are not touching each other or they don't implement IMachineBlockUpdateable (ex. air,stone,weird TE's) + */ + protected boolean cyclicUpdate_EM() { + return mUpdate <= -1000; // set to false to disable cyclic update + // default is once per 50s; mUpdate is decremented every tick + } + + /** + * get pollution per tick + * + * @param itemStack what is in controller + * @return how much pollution is produced + */ + @Override + public int getPollutionPerTick(ItemStack itemStack) { + return 0; + } + + /** + * EM pollution per tick + * + * @param itemStack - item in controller + * @return how much excess matter is there + */ + public float getExcessMassPerTick_EM(ItemStack itemStack) { + return 0f; + } + + /** + * triggered if machine is not allowed to work after completing a recipe, override to make it not shutdown for + * instance (like turbines). bu just replacing it with blank - active transformer is doing it + * <p> + * CALLED DIRECTLY when soft hammered to offline state - usually should stop the machine unless some other mechanics + * should do it + */ + protected void notAllowedToWork_stopMachine_EM() { + stopMachine(); + } + + /** + * store data + */ + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setLong("eMaxGenEUmin", maxEUoutputMin); + aNBT.setLong("eMaxGenEUmax", maxEUoutputMax); + aNBT.setLong("eGenRating", eMaxAmpereGen); + aNBT.setLong("eMaxEUmin", maxEUinputMin); + aNBT.setLong("eMaxEUmax", maxEUinputMax); + aNBT.setLong("eRating", eAmpereFlow); + aNBT.setLong("eMaxA", eMaxAmpereFlow); + aNBT.setLong("eDataR", eRequiredData); + aNBT.setLong("eDataA", eAvailableData); + aNBT.setByte("eCertainM", eCertainMode); + aNBT.setByte("eCertainS", eCertainStatus); + aNBT.setByte("eMinRepair", minRepairStatus); + aNBT.setBoolean("eParam", eParameters); + aNBT.setBoolean("ePass", ePowerPass); + aNBT.setBoolean("ePowerPassCover", ePowerPassCover); + aNBT.setBoolean("eVoid", eSafeVoid); + aNBT.setBoolean("eBoom", eDismantleBoom); + aNBT.setBoolean("eOK", mMachine); + // Ensures compatibility + if (mOutputItems != null) { + aNBT.setInteger("mOutputItemsLength", mOutputItems.length); + for (int i = 0; i < mOutputItems.length; i++) { + if (mOutputItems[i] != null) { + NBTTagCompound tNBT = new NBTTagCompound(); + mOutputItems[i].writeToNBT(tNBT); + aNBT.setTag("mOutputItem" + i, tNBT); + } + } + } + + // Ensures compatibility + if (mOutputFluids != null) { + aNBT.setInteger("mOutputFluidsLength", mOutputFluids.length); + for (int i = 0; i < mOutputFluids.length; i++) { + if (mOutputFluids[i] != null) { + NBTTagCompound tNBT = new NBTTagCompound(); + mOutputFluids[i].writeToNBT(tNBT); + aNBT.setTag("mOutputFluids" + i, tNBT); + } + } + } + + aNBT.setInteger("eOutputStackCount", 0); + aNBT.removeTag("outputEM"); + + NBTTagCompound paramI = new NBTTagCompound(); + for (int i = 0; i < parametrization.iParamsIn.length; i++) { + paramI.setDouble(Integer.toString(i), parametrization.iParamsIn[i]); + } + aNBT.setTag("eParamsInD", paramI); + + NBTTagCompound paramO = new NBTTagCompound(); + for (int i = 0; i < parametrization.iParamsOut.length; i++) { + paramO.setDouble(Integer.toString(i), parametrization.iParamsOut[i]); + } + aNBT.setTag("eParamsOutD", paramO); + + NBTTagCompound paramIs = new NBTTagCompound(); + for (int i = 0; i < parametrization.eParamsInStatus.length; i++) { + paramIs.setByte(Integer.toString(i), parametrization.eParamsInStatus[i].getOrdinalByte()); + } + aNBT.setTag("eParamsInS", paramIs); + + NBTTagCompound paramOs = new NBTTagCompound(); + for (int i = 0; i < parametrization.eParamsOutStatus.length; i++) { + paramOs.setByte(Integer.toString(i), parametrization.eParamsOutStatus[i].getOrdinalByte()); + } + aNBT.setTag("eParamsOutS", paramOs); + } + + /** + * load data + */ + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + maxEUoutputMin = aNBT.getLong("eMaxGenEUmin"); + maxEUoutputMax = aNBT.getLong("eMaxGenEUmax"); + eMaxAmpereGen = aNBT.getLong("eGenRating"); + maxEUinputMin = aNBT.getLong("eMaxEUmin"); + maxEUinputMax = aNBT.getLong("eMaxEUmax"); + eAmpereFlow = aNBT.hasKey("eRating") ? aNBT.getLong("eRating") : 1; + eMaxAmpereFlow = aNBT.getLong("eMaxA"); + eRequiredData = aNBT.getLong("eDataR"); + eAvailableData = aNBT.getLong("eDataA"); + eCertainMode = aNBT.getByte("eCertainM"); + eCertainStatus = aNBT.getByte("eCertainS"); + minRepairStatus = aNBT.hasKey("eMinRepair") ? aNBT.getByte("eMinRepair") : 3; + eParameters = !aNBT.hasKey("eParam") || aNBT.getBoolean("eParam"); + ePowerPass = aNBT.getBoolean("ePass"); + ePowerPassCover = aNBT.getBoolean("ePowerPassCover"); + eSafeVoid = aNBT.getBoolean("eVoid"); + eDismantleBoom = aNBT.getBoolean("eBoom"); + mMachine = aNBT.getBoolean("eOK"); + + // Ensures compatibility + int aOutputItemsLength = aNBT.getInteger("mOutputItemsLength"); + if (aOutputItemsLength > 0) { + mOutputItems = new ItemStack[aOutputItemsLength]; + for (int i = 0; i < mOutputItems.length; i++) { + mOutputItems[i] = GT_Utility.loadItem(aNBT, "mOutputItem" + i); + } + } + + // Ensures compatibility + int aOutputFluidsLength = aNBT.getInteger("mOutputFluidsLength"); + if (aOutputFluidsLength > 0) { + mOutputFluids = new FluidStack[aOutputFluidsLength]; + for (int i = 0; i < mOutputFluids.length; i++) { + mOutputFluids[i] = GT_Utility.loadFluid(aNBT, "mOutputFluids" + i); + } + } + + if (aNBT.hasKey("eParamsIn") && aNBT.hasKey("eParamsOut") && aNBT.hasKey("eParamsB")) { + NBTTagCompound paramI = aNBT.getCompoundTag("eParamsIn"); + NBTTagCompound paramO = aNBT.getCompoundTag("eParamsOut"); + NBTTagCompound paramB = aNBT.getCompoundTag("eParamsB"); + for (int i = 0; i < 10; i++) { + if (paramB.getBoolean(Integer.toString(i))) { + parametrization.iParamsIn[i] = Float.intBitsToFloat(paramI.getInteger(Integer.toString(i))); + parametrization.iParamsOut[i] = Float.intBitsToFloat(paramO.getInteger(Integer.toString(i))); + } else { + parametrization.iParamsIn[i] = paramI.getInteger(Integer.toString(i)); + parametrization.iParamsOut[i] = paramO.getInteger(Integer.toString(i)); + } + } + } else { + NBTTagCompound paramI = aNBT.getCompoundTag("eParamsInD"); + for (int i = 0; i < parametrization.iParamsIn.length; i++) { + parametrization.iParamsIn[i] = paramI.getDouble(Integer.toString(i)); + } + NBTTagCompound paramO = aNBT.getCompoundTag("eParamsOutD"); + for (int i = 0; i < parametrization.iParamsOut.length; i++) { + parametrization.iParamsOut[i] = paramO.getDouble(Integer.toString(i)); + } + } + + NBTTagCompound paramIs = aNBT.getCompoundTag("eParamsInS"); + for (int i = 0; i < parametrization.eParamsInStatus.length; i++) { + parametrization.eParamsInStatus[i] = LedStatus.getStatus(paramIs.getByte(Integer.toString(i))); + } + + NBTTagCompound paramOs = aNBT.getCompoundTag("eParamsOutS"); + for (int i = 0; i < parametrization.eParamsOutStatus.length; i++) { + parametrization.eParamsOutStatus[i] = LedStatus.getStatus(paramOs.getByte(Integer.toString(i))); + } + } + + /** + * Override if needed but usually call super method at start! On machine stop - NOT called directly when soft + * hammered to offline state! - it SHOULD cause a full stop like power failure does + */ + @Override + public void stopMachine(@Nonnull ShutDownReason reason) { + if (!ShutDownReasonRegistry.isRegistered(reason.getID())) { + throw new RuntimeException(String.format("Reason %s is not registered for registry", reason.getID())); + } + for (GT_MetaTileEntity_Hatch_OutputData data : eOutputData) { + data.q = null; + } + + mOutputItems = null; + mOutputFluids = null; + mEfficiency = 0; + mEfficiencyIncrease = 0; + mProgresstime = 0; + mMaxProgresstime = 0; + eAvailableData = 0; + hatchesStatusUpdate_EM(); + getBaseMetaTileEntity().disableWorking(); + getBaseMetaTileEntity().setShutDownReason(reason); + getBaseMetaTileEntity().setShutdownStatus(true); + if (reason.wasCritical()) { + sendSound(INTERRUPT_SOUND_INDEX); + } + } + + /** + * After recipe check failed helper method so i don't have to set that params to nothing at all times + */ + protected void afterRecipeCheckFailed() { + + for (GT_MetaTileEntity_Hatch_OutputData data : eOutputData) { + data.q = null; + } + + mOutputItems = null; + mOutputFluids = null; + mEfficiency = 0; + mEfficiencyIncrease = 0; + mProgresstime = 0; + mMaxProgresstime = 0; + eAvailableData = 0; + } + + /** + * cyclic check even when not working, called LESS frequently + */ + private boolean cyclicUpdate() { + if (cyclicUpdate_EM()) { + mUpdate = 0; + return true; + } + return false; + } + + /** + * mining level... + */ + @Override + public byte getTileEntityBaseType() { + return 3; + } + + // endregion + + // region internal + + /** + * internal check machine + */ + @Override + public final boolean checkMachine(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { + return checkMachine_EM(iGregTechTileEntity, itemStack); + } + + /** + * internal check recipe + */ + @Override + public final boolean checkRecipe(ItemStack itemStack) { // do recipe checks, based on "machine content and state" + hatchesStatusUpdate_EM(); + startRecipeProcessing(); + boolean result = checkRecipe_EM(itemStack); // if had no - set default params + endRecipeProcessing(); + hatchesStatusUpdate_EM(); + return result; + } + + @NotNull + @Override + public final CheckRecipeResult checkProcessing() { + hatchesStatusUpdate_EM(); + CheckRecipeResult result = checkProcessing_EM(); + hatchesStatusUpdate_EM(); + return result; + } + + /** + * callback for updating parameters and new hatches + */ + protected void hatchesStatusUpdate_EM() { + if (getBaseMetaTileEntity().isClientSide()) { + return; + } + boolean busy = mMaxProgresstime > 0; + if (busy) { // write from buffer to hatches only + for (GT_MetaTileEntity_Hatch_Param hatch : filterValidMTEs(eParamHatches)) { + if (hatch.param < 0) { + continue; + } + int hatchId = hatch.param; + if (parametrization.groups[hatchId] != null && parametrization.groups[hatchId].updateWhileRunning) { + parametrization.iParamsIn[hatchId] = hatch.value0D; + parametrization.iParamsIn[hatchId + 10] = hatch.value1D; + } + hatch.input0D = parametrization.iParamsOut[hatchId]; + hatch.input1D = parametrization.iParamsOut[hatchId + 10]; + } + } else { // if has nothing to do update all + for (GT_MetaTileEntity_Hatch_Param hatch : filterValidMTEs(eParamHatches)) { + if (hatch.param < 0) { + continue; + } + int hatchId = hatch.param; + parametrization.iParamsIn[hatchId] = hatch.value0D; + parametrization.iParamsIn[hatchId + 10] = hatch.value1D; + hatch.input0D = parametrization.iParamsOut[hatchId]; + hatch.input1D = parametrization.iParamsOut[hatchId + 10]; + } + } + for (GT_MetaTileEntity_Hatch_Uncertainty uncertainty : eUncertainHatches) { + eCertainStatus = uncertainty.update(eCertainMode); + } + eAvailableData = getAvailableData_EM(); + parametersStatusesWrite_EM(busy); + } + + @Deprecated + public final int getAmountOfOutputs() { + throw new NoSuchMethodError("Deprecated Do not use"); + } + // endregion + + // region TICKING functions + + public void onFirstTick_EM(IGregTechTileEntity aBaseMetaTileEntity) {} + + @Override + public final void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + isFacingValid(aBaseMetaTileEntity.getFrontFacing()); + if (getBaseMetaTileEntity().isClientSide()) { + StructureLibAPI.queryAlignment((IAlignmentProvider) aBaseMetaTileEntity); + } + onFirstTick_EM(aBaseMetaTileEntity); + } + + /** + * called every tick the machines is active + */ + @Override + public boolean onRunningTick(ItemStack aStack) { + return onRunningTickCheck(aStack); + } + + public boolean onRunningTickCheck_EM(ItemStack aStack) { + if (eRequiredData > eAvailableData) { + if (!checkComputationTimeout()) { + if (energyFlowOnRunningTick_EM(aStack, false)) { + stopMachine(SimpleShutDownReason.ofCritical("computation_loss")); + } + return false; + } + } + return energyFlowOnRunningTick_EM(aStack, true); + } + + public boolean onRunningTickCheck(ItemStack aStack) { + if (eRequiredData > eAvailableData) { + if (!checkComputationTimeout()) { + if (energyFlowOnRunningTick(aStack, false)) { + stopMachine(SimpleShutDownReason.ofCritical("computation_loss")); + } + return false; + } + } + return energyFlowOnRunningTick(aStack, true); + } + + /** + * CAREFUL!!! it calls most of the callbacks, like everything else in here + */ + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + explodedThisTick = false; + if (mEfficiency < 0) { + mEfficiency = 0; + } + + if (--mUpdate == 0 || --mStartUpCheck == 0 + || cyclicUpdate() + || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) { + clearHatches_EM(); + + if (aBaseMetaTileEntity instanceof BaseTileEntity) { + ((BaseTileEntity) aBaseMetaTileEntity).ignoreUnloadedChunks = mMachine; + } + mMachine = checkMachine(aBaseMetaTileEntity, mInventory[1]); + + if (!mMachine) { + if (ePowerPass && getEUVar() > V[3] + || eDismantleBoom && mMaxProgresstime > 0 && areChunksAroundLoaded_EM()) { + explodeMultiblock(); + } + } + + if (eUncertainHatches.size() > 1) { + mMachine = false; + } + + if (mMachine) { + setupHatches_EM(); + + setupEnergyHatchesVariables_EM(); + + if (getEUVar() > maxEUStore()) { + setEUVar(maxEUStore()); + } + } else { + maxEUinputMin = 0; + maxEUinputMax = 0; + eMaxAmpereFlow = 0; + setEUVar(0); + } + hatchInit_EM(mMachine); + } + + if (mStartUpCheck < 0) { // E + if (mMachine) { // S + byte Tick = (byte) (aTick % 20); + if (MULTI_CHECK_AT == Tick) { + maintenance_EM(); + } + + if (getRepairStatus() >= minRepairStatus) { // S + if (MULTI_CHECK_AT == Tick) { + hatchesStatusUpdate_EM(); + } + + dischargeController_EM(aBaseMetaTileEntity); + chargeController_EM(aBaseMetaTileEntity); + + if (mMaxProgresstime > 0 && doRandomMaintenanceDamage()) { // Start + if (onRunningTick(mInventory[1])) { // Compute EU + if (!polluteEnvironment(getPollutionPerTick(mInventory[1]))) { + stopMachine(ShutDownReasonRegistry.POLLUTION_FAIL); + } + + if (mMaxProgresstime > 0 && ++mProgresstime >= mMaxProgresstime) { // progress increase + // and done + hatchesStatusUpdate_EM(); + + outputAfterRecipe_EM(); + + addClassicOutputs_EM(); + + updateSlots(); + mProgresstime = 0; + mMaxProgresstime = 0; + mEfficiencyIncrease = 0; + + if (aBaseMetaTileEntity.isAllowedToWork()) { + if (checkRecipe()) { + mEfficiency = Math.max( + 0, + min( + mEfficiency + mEfficiencyIncrease, + getMaxEfficiency(mInventory[1]) + - (getIdealStatus() - getRepairStatus()) * 1000)); + } else { + afterRecipeCheckFailed(); + } + updateSlots(); + } else { + notAllowedToWork_stopMachine_EM(); + } + } + } // else {//failed to consume power/resources - inside on running tick + // stopMachine(); + // } + } else if (RECIPE_AT == Tick || aBaseMetaTileEntity.hasWorkJustBeenEnabled()) { + if (aBaseMetaTileEntity.isAllowedToWork()) { + if (checkRecipe()) { + mEfficiency = Math.max( + 0, + min( + mEfficiency + mEfficiencyIncrease, + getMaxEfficiency(mInventory[1]) + - (getIdealStatus() - getRepairStatus()) * 1000)); + } else { + afterRecipeCheckFailed(); + } + updateSlots(); + } // else notAllowedToWork_stopMachine_EM(); //it is already stopped here + } + } else { // not repaired + stopMachine(ShutDownReasonRegistry.NO_REPAIR); + } + } else { // not complete + stopMachine(ShutDownReasonRegistry.STRUCTURE_INCOMPLETE); + } + } + + aBaseMetaTileEntity.setErrorDisplayID( + aBaseMetaTileEntity.getErrorDisplayID() & -512 | (mWrench ? 0 : 1) + | (mScrewdriver ? 0 : 2) + | (mSoftHammer ? 0 : 4) + | (mHardHammer ? 0 : 8) + | (mSolderingTool ? 0 : 16) + | (mCrowbar ? 0 : 32) + | (mMachine ? 0 : 64) + | (eCertainStatus == 0 ? 0 : 128) + | (eParameters ? 0 : 256)); + aBaseMetaTileEntity.setActive(mMaxProgresstime > 0); + boolean active = aBaseMetaTileEntity.isActive() && mPollution > 0; + setMufflers(active); + } else { + soundMagic(getActivitySound()); + } + } + + protected void addClassicOutputs_EM() { + if (mOutputItems != null) { + for (ItemStack tStack : mOutputItems) { + if (tStack != null) { + addOutput(tStack); + } + } + } + mOutputItems = null; + + if (mOutputFluids != null) { + if (mOutputFluids.length == 1) { + for (FluidStack tStack : mOutputFluids) { + if (tStack != null) { + addOutput(tStack); + } + } + } else if (mOutputFluids.length > 1) { + addFluidOutputs(mOutputFluids); + } + } + mOutputFluids = null; + } + + protected void maintenance_EM() { + if (GT_MetaTileEntity_MultiBlockBase.disableMaintenance) { + mWrench = true; + mScrewdriver = true; + mSoftHammer = true; + mHardHammer = true; + mSolderingTool = true; + mCrowbar = true; + } else { + for (GT_MetaTileEntity_Hatch_Maintenance tHatch : filterValidMTEs(mMaintenanceHatches)) { + if (tHatch.mAuto + && !(mWrench && mScrewdriver && mSoftHammer && mHardHammer && mSolderingTool && mCrowbar)) { + tHatch.autoMaintainance(); + } + if (tHatch.mWrench) { + mWrench = true; + } + if (tHatch.mScrewdriver) { + mScrewdriver = true; + } + if (tHatch.mSoftHammer) { + mSoftHammer = true; + } + if (tHatch.mHardHammer) { + mHardHammer = true; + } + if (tHatch.mSolderingTool) { + mSolderingTool = true; + } + if (tHatch.mCrowbar) { + mCrowbar = true; + } + + tHatch.mWrench = false; + tHatch.mScrewdriver = false; + tHatch.mSoftHammer = false; + tHatch.mHardHammer = false; + tHatch.mSolderingTool = false; + tHatch.mCrowbar = false; + } + } + } + + protected void clearHatches_EM() { + mDualInputHatches.clear(); + mInputHatches.clear(); + mInputBusses.clear(); + mOutputHatches.clear(); + mOutputBusses.clear(); + mDynamoHatches.clear(); + mEnergyHatches.clear(); + mMufflerHatches.clear(); + mMaintenanceHatches.clear(); + + for (GT_MetaTileEntity_Hatch_DataConnector<?> hatch_data : filterValidMTEs(eOutputData)) { + hatch_data.id = -1; + } + for (GT_MetaTileEntity_Hatch_DataConnector<?> hatch_data : filterValidMTEs(eInputData)) { + hatch_data.id = -1; + } + + for (GT_MetaTileEntity_Hatch_Uncertainty hatch : filterValidMTEs(eUncertainHatches)) { + hatch.getBaseMetaTileEntity() + .setActive(false); + } + for (GT_MetaTileEntity_Hatch_Param hatch : filterValidMTEs(eParamHatches)) { + hatch.getBaseMetaTileEntity() + .setActive(false); + } + + eUncertainHatches.clear(); + eEnergyMulti.clear(); + eParamHatches.clear(); + eDynamoMulti.clear(); + eOutputData.clear(); + eInputData.clear(); + } + + protected void setupHatches_EM() { + short id = 1; + + for (GT_MetaTileEntity_Hatch_DataConnector<?> hatch_data : filterValidMTEs(eOutputData)) { + hatch_data.id = id++; + } + id = 1; + for (GT_MetaTileEntity_Hatch_DataConnector<?> hatch_data : filterValidMTEs(eInputData)) { + hatch_data.id = id++; + } + + for (GT_MetaTileEntity_Hatch_Uncertainty hatch : filterValidMTEs(eUncertainHatches)) { + hatch.getBaseMetaTileEntity() + .setActive(true); + } + for (GT_MetaTileEntity_Hatch_Param hatch : filterValidMTEs(eParamHatches)) { + hatch.getBaseMetaTileEntity() + .setActive(true); + } + } + + protected void setupEnergyHatchesVariables_EM() { + if (!mEnergyHatches.isEmpty() || !eEnergyMulti.isEmpty() + || !mDynamoHatches.isEmpty() + || !eDynamoMulti.isEmpty()) { + maxEUinputMin = V[15]; + maxEUinputMax = V[0]; + maxEUoutputMin = V[15]; + maxEUoutputMax = V[0]; + for (GT_MetaTileEntity_Hatch_Energy hatch : filterValidMTEs(mEnergyHatches)) { + if (hatch.maxEUInput() < maxEUinputMin) { + maxEUinputMin = hatch.maxEUInput(); + } + if (hatch.maxEUInput() > maxEUinputMax) { + maxEUinputMax = hatch.maxEUInput(); + } + } + for (GT_MetaTileEntity_Hatch_EnergyMulti hatch : filterValidMTEs(eEnergyMulti)) { + if (hatch.maxEUInput() < maxEUinputMin) { + maxEUinputMin = hatch.maxEUInput(); + } + if (hatch.maxEUInput() > maxEUinputMax) { + maxEUinputMax = hatch.maxEUInput(); + } + } + for (GT_MetaTileEntity_Hatch_Dynamo hatch : filterValidMTEs(mDynamoHatches)) { + if (hatch.maxEUOutput() < maxEUoutputMin) { + maxEUoutputMin = hatch.maxEUOutput(); + } + if (hatch.maxEUOutput() > maxEUoutputMax) { + maxEUoutputMax = hatch.maxEUOutput(); + } + } + for (GT_MetaTileEntity_Hatch_DynamoMulti hatch : filterValidMTEs(eDynamoMulti)) { + if (hatch.maxEUOutput() < maxEUoutputMin) { + maxEUoutputMin = hatch.maxEUOutput(); + } + if (hatch.maxEUOutput() > maxEUoutputMax) { + maxEUoutputMax = hatch.maxEUOutput(); + } + } + eMaxAmpereFlow = 0; + eMaxAmpereGen = 0; + // counts only full amps + for (GT_MetaTileEntity_Hatch_Energy hatch : filterValidMTEs(mEnergyHatches)) { + eMaxAmpereFlow += hatch.maxEUInput() / maxEUinputMin; + } + for (GT_MetaTileEntity_Hatch_EnergyMulti hatch : filterValidMTEs(eEnergyMulti)) { + eMaxAmpereFlow += hatch.maxEUInput() / maxEUinputMin * hatch.Amperes; + } + for (GT_MetaTileEntity_Hatch_Dynamo hatch : filterValidMTEs(mDynamoHatches)) { + eMaxAmpereGen += hatch.maxEUOutput() / maxEUoutputMin; + } + for (GT_MetaTileEntity_Hatch_DynamoMulti hatch : filterValidMTEs(eDynamoMulti)) { + eMaxAmpereGen += hatch.maxEUOutput() / maxEUoutputMin * hatch.Amperes; + } + } else { + maxEUinputMin = 0; + maxEUinputMax = 0; + eMaxAmpereFlow = 0; + maxEUoutputMin = 0; + maxEUoutputMax = 0; + eMaxAmpereGen = 0; + } + } + + protected void dischargeController_EM(IGregTechTileEntity aBaseMetaTileEntity) { + if (ePowerPass && getEUVar() > getMinimumStoredEU()) { + powerPass(aBaseMetaTileEntity); + } + } + + protected final void powerPass(IGregTechTileEntity aBaseMetaTileEntity) { + long euVar; + for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) { + euVar = tHatch.maxEUOutput() * tHatch.maxAmperesOut(); + if (tHatch.getBaseMetaTileEntity() + .getStoredEU() <= tHatch.maxEUStore() - euVar + && aBaseMetaTileEntity + .decreaseStoredEnergyUnits(euVar + Math.max(euVar / 24576, tHatch.maxAmperesOut()), false)) { + tHatch.setEUVar( + tHatch.getBaseMetaTileEntity() + .getStoredEU() + euVar); + } + } + for (GT_MetaTileEntity_Hatch_DynamoMulti tHatch : filterValidMTEs(eDynamoMulti)) { + euVar = tHatch.maxEUOutput() * tHatch.maxAmperesOut(); + if (tHatch.getBaseMetaTileEntity() + .getStoredEU() <= tHatch.maxEUStore() - euVar + && aBaseMetaTileEntity + .decreaseStoredEnergyUnits(euVar + Math.max(euVar / 24576, tHatch.maxAmperesOut()), false)) { + tHatch.setEUVar( + tHatch.getBaseMetaTileEntity() + .getStoredEU() + euVar); + } + } + } + + protected final void powerPass_EM(IGregTechTileEntity aBaseMetaTileEntity) { + long euVar; + for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) { + euVar = tHatch.maxEUOutput(); + if (tHatch.getBaseMetaTileEntity() + .getStoredEU() <= tHatch.maxEUStore() - euVar + && aBaseMetaTileEntity.decreaseStoredEnergyUnits(euVar + Math.max(euVar / 24576, 1), false)) { + tHatch.setEUVar( + tHatch.getBaseMetaTileEntity() + .getStoredEU() + euVar); + } + } + for (GT_MetaTileEntity_Hatch_DynamoMulti tHatch : filterValidMTEs(eDynamoMulti)) { + euVar = tHatch.maxEUOutput() * tHatch.Amperes; + if (tHatch.getBaseMetaTileEntity() + .getStoredEU() <= tHatch.maxEUStore() - euVar + && aBaseMetaTileEntity + .decreaseStoredEnergyUnits(euVar + Math.max(euVar / 24576, tHatch.Amperes), false)) { + tHatch.setEUVar( + tHatch.getBaseMetaTileEntity() + .getStoredEU() + euVar); + } + } + } + + protected void chargeController_EM(IGregTechTileEntity aBaseMetaTileEntity) { + powerInput(); + } + + protected final void powerInput() { + long euVar; + for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { + if (getEUVar() > getMinimumStoredEU()) { + break; + } + euVar = Math.min(tHatch.maxEUInput() * tHatch.maxAmperesIn(), tHatch.getEUVar()); + if (tHatch.getBaseMetaTileEntity() + .decreaseStoredEnergyUnits(euVar, false)) { + setEUVar(getEUVar() + euVar); + } + } + for (GT_MetaTileEntity_Hatch_EnergyMulti tHatch : filterValidMTEs(eEnergyMulti)) { + if (getEUVar() > getMinimumStoredEU()) { + break; + } + euVar = Math.min(tHatch.maxEUInput() * tHatch.maxAmperesIn(), tHatch.getEUVar()); + if (tHatch.getBaseMetaTileEntity() + .decreaseStoredEnergyUnits(euVar, false)) { + setEUVar(getEUVar() + euVar); + } + } + } + + protected final void powerInput_EM() { + long euVar; + for (GT_MetaTileEntity_Hatch_Energy tHatch : filterValidMTEs(mEnergyHatches)) { + if (getEUVar() > getMinimumStoredEU()) { + break; + } + euVar = tHatch.maxEUInput(); + if (tHatch.getBaseMetaTileEntity() + .decreaseStoredEnergyUnits(euVar, false)) { + setEUVar(getEUVar() + euVar); + } + } + for (GT_MetaTileEntity_Hatch_EnergyMulti tHatch : filterValidMTEs(eEnergyMulti)) { + if (getEUVar() > getMinimumStoredEU()) { + break; + } + euVar = tHatch.maxEUInput() * tHatch.Amperes; + if (tHatch.getBaseMetaTileEntity() + .decreaseStoredEnergyUnits(euVar, false)) { + setEUVar(getEUVar() + euVar); + } + } + } + + // endregion + + // region EFFICIENCY AND FIXING LIMITS + + @Override + public int getMaxEfficiency(ItemStack itemStack) { + return 10000; + } + + @Override + public int getIdealStatus() { + return super.getIdealStatus() + 2; + } + + @Override + public int getRepairStatus() { + return super.getRepairStatus() + (eCertainStatus == 0 ? 1 : 0) + (eParameters ? 1 : 0); + } + + // endregion + + // region ENERGY!!!! + + // new method + public boolean energyFlowOnRunningTick_EM(ItemStack aStack, boolean allowProduction) { + long euFlow = getPowerFlow() * eAmpereFlow; // quick scope sign + if (allowProduction && euFlow > 0) { + addEnergyOutput_EM(getPowerFlow() * (long) mEfficiency / getMaxEfficiency(aStack), eAmpereFlow); + } else if (euFlow < 0) { + if (POWERLESS_MODE) { + return true; + } + if (!drainEnergyInput_EM( + getPowerFlow(), + getPowerFlow() * getMaxEfficiency(aStack) / Math.max(1000L, mEfficiency), + eAmpereFlow)) { + criticalStopMachine(); + return false; + } + } + return true; + } + + public boolean energyFlowOnRunningTick(ItemStack aStack, boolean allowProduction) { + long euFlow = getPowerFlow() * eAmpereFlow; // quick scope sign + if (allowProduction && euFlow > 0) { + addEnergyOutput_EM(getPowerFlow() * (long) mEfficiency / getMaxEfficiency(aStack), eAmpereFlow); + } else if (euFlow < 0) { + if (POWERLESS_MODE) { + return true; + } + if (!drainEnergyInput( + getPowerFlow() * getMaxEfficiency(aStack) / Math.max(1000L, mEfficiency), + eAmpereFlow)) { + criticalStopMachine(); + return false; + } + } + return true; + } + + @Override + public long maxEUStore() { + return Math.max(maxEUinputMin * (eMaxAmpereFlow << 3), maxEUoutputMin * (eMaxAmpereGen << 3)); + } + + @Override + public final long getMinimumStoredEU() { + return maxEUStore() >> 1; + } + + @Override + public final long maxAmperesIn() { + return 0L; + } + + @Override + public final long maxAmperesOut() { + return 0L; + } + + @Deprecated + @Override + public final boolean addEnergyOutput(long eu) { + return addEnergyOutput_EM(eu, 1); + } + + public boolean addEnergyOutput_EM(long EU, long Amperes) { + if (EU < 0) { + EU = -EU; + } + if (Amperes < 0) { + Amperes = -Amperes; + } + long euVar = EU * Amperes; + long diff; + for (GT_MetaTileEntity_Hatch_Dynamo tHatch : filterValidMTEs(mDynamoHatches)) { + if (tHatch.maxEUOutput() < EU) { + explodeMultiblock(); + } + diff = tHatch.maxEUStore() - tHatch.getBaseMetaTileEntity() + .getStoredEU(); + if (diff > 0) { + if (euVar > diff) { + tHatch.setEUVar(tHatch.maxEUStore()); + euVar -= diff; + } else if (euVar <= diff) { + tHatch.setEUVar( + tHatch.getBaseMetaTileEntity() + .getStoredEU() + euVar); + return true; + } + } + } + for (GT_MetaTileEntity_Hatch_DynamoMulti tHatch : filterValidMTEs(eDynamoMulti)) { + if (tHatch.maxEUOutput() < EU) { + explodeMultiblock(); + } + diff = tHatch.maxEUStore() - tHatch.getBaseMetaTileEntity() + .getStoredEU(); + if (diff > 0) { + if (euVar > diff) { + tHatch.setEUVar(tHatch.maxEUStore()); + euVar -= diff; + } else if (euVar <= diff) { + tHatch.setEUVar( + tHatch.getBaseMetaTileEntity() + .getStoredEU() + euVar); + return true; + } + } + } + setEUVar(min(getEUVar() + euVar, maxEUStore())); + return false; + } + + @Deprecated + @Override + public final boolean drainEnergyInput(long eu) { + return drainEnergyInput_EM(0, eu, 1); + } + + public boolean drainEnergyInput_EM(long EUtTierVoltage, long EUtEffective, long Amperes) { + long EUuse = EUtEffective * Amperes; + if (EUuse == 0) { + return true; + } + if (maxEUinputMin == 0) { + return false; + } + if (EUuse < 0) { + EUuse = -EUuse; + } + if (EUuse > getEUVar() || // not enough power + (EUtTierVoltage == 0 ? EUuse > getMaxInputEnergy() : (EUtTierVoltage > maxEUinputMax) || // TIER IS + // BASED ON + // BEST HATCH! + // not total + // EUtEffective + // input + (EUtTierVoltage * Amperes - 1) / maxEUinputMin + 1 > eMaxAmpereFlow)) { // EUuse==0? --> (EUuse + // - 1) / maxEUinputMin + // + 1 = 1! //if + // not too much A + if (DEBUG_MODE) { + TecTech.LOGGER.debug("L1 " + EUuse + ' ' + getEUVar() + ' ' + (EUuse > getEUVar())); + TecTech.LOGGER.debug("L2 " + EUtEffective + ' ' + maxEUinputMax + ' ' + (EUtEffective > maxEUinputMax)); + TecTech.LOGGER.debug("L3 " + Amperes + ' ' + getMaxInputEnergy()); + TecTech.LOGGER.debug( + "L4 " + ((EUuse - 1) / maxEUinputMin + 1) + + ' ' + + eMaxAmpereFlow + + ' ' + + ((EUuse - 1) / maxEUinputMin + 1 > eMaxAmpereFlow)); + } + return false; + } + // sub eu + setEUVar(getEUVar() - EUuse); + return true; + } + + public boolean drainEnergyInput(long EUtEffective, long Amperes) { + long EUuse = EUtEffective * Amperes; + if (EUuse == 0) { + return true; + } + if (maxEUinputMin == 0) { + return false; + } + if (EUuse < 0) { + EUuse = -EUuse; + } + // not enough power + if (EUuse > getEUVar() || EUuse > getMaxInputEnergy()) { // EUuse==0? --> (EUuse - 1) / maxEUinputMin + 1 = 1! + // //if not too much + // A + return false; + } + // sub eu + setEUVar(getEUVar() - EUuse); + return true; + } + + // new method + public final boolean overclockAndPutValuesIn_EM(long EU, int time) { // TODO revise + if (EU == 0L) { + setPowerFlow(0); + mMaxProgresstime = time; + return true; + } + long tempEUt = Math.max(EU, V[1]); + long tempTier = maxEUinputMax >> 2; + while (tempEUt < tempTier) { + tempEUt <<= 2; + time >>= 1; + EU = time == 0 ? EU >> 1 : EU << 2; // U know, if the time is less than 1 tick make the machine use less + // power + } + if (EU > Integer.MAX_VALUE || EU < Integer.MIN_VALUE) { + setPowerFlow(Integer.MAX_VALUE - 1); + mMaxProgresstime = Integer.MAX_VALUE - 1; + return false; + } + setPowerFlow(EU); + mMaxProgresstime = time == 0 ? 1 : time; + return true; + } // Use in EM check recipe return statement if you want overclocking + + /** + * Use {@link #getMaxInputVoltage()} + */ + @Deprecated + public final long getMaxInputVoltageSum() { + return getMaxInputVoltage(); + } + + /** + * Use {@link #getMaxInputEu()} + */ + @Deprecated + public final long getMaxInputEnergy() { + return getMaxInputEu(); + } + + /** + * Use {@link #getMaxInputEu()} + */ + @Deprecated + public final long getMaxInputEnergy_EM() { + return getMaxInputEu(); + } + + // new Method + public final int getMaxEnergyInputTier_EM() { + return getTier(maxEUinputMax); + } + + // new Method + public final int getMinEnergyInputTier_EM() { + return getTier(maxEUinputMin); + } + + public final long getMaxAmpereFlowAtMinTierOfEnergyHatches() { + return eAmpereFlow; + } + + @Override + public List<GT_MetaTileEntity_Hatch> getExoticAndNormalEnergyHatchList() { + List<GT_MetaTileEntity_Hatch> list = new ArrayList<>(); + list.addAll(mEnergyHatches); + list.addAll(eEnergyMulti); + return list; + } + + @Override + public List<GT_MetaTileEntity_Hatch> getExoticEnergyHatches() { + List<GT_MetaTileEntity_Hatch> list = new ArrayList<>(); + list.addAll(eEnergyMulti); + return list; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack itemStack) { + return false; + } + + @Override + public final void explodeMultiblock() { + if (explodedThisTick) { + return; + } + explodedThisTick = true; + if (!TecTech.configTecTech.BOOM_ENABLE) { + TecTech.proxy.broadcast( + "Multi Explode BOOM! " + getBaseMetaTileEntity().getXCoord() + + ' ' + + getBaseMetaTileEntity().getYCoord() + + ' ' + + getBaseMetaTileEntity().getZCoord()); + StackTraceElement[] ste = Thread.currentThread() + .getStackTrace(); + TecTech.proxy.broadcast("Multi Explode BOOM! " + ste[2].toString()); + return; + } + extraExplosions_EM(); + GT_Pollution.addPollution(getBaseMetaTileEntity(), 600000); + mInventory[1] = null; + @SuppressWarnings("unchecked") + Iterable<MetaTileEntity> allHatches = Iterables.concat( + mInputBusses, + mOutputBusses, + mInputHatches, + mOutputHatches, + mDynamoHatches, + mMufflerHatches, + mEnergyHatches, + mMaintenanceHatches, + eParamHatches, + eEnergyMulti, + eUncertainHatches, + eDynamoMulti, + eInputData, + eOutputData); + for (MetaTileEntity tTileEntity : allHatches) { + if (tTileEntity != null && tTileEntity.getBaseMetaTileEntity() != null) { + tTileEntity.getBaseMetaTileEntity() + .doExplosion(V[9]); + } + } + getBaseMetaTileEntity().doExplosion(V[15]); + } + + @Override + public void doExplosion(long aExplosionPower) { + if (!TecTech.configTecTech.BOOM_ENABLE) { + TecTech.proxy.broadcast( + "Multi DoExplosion BOOM! " + getBaseMetaTileEntity().getXCoord() + + ' ' + + getBaseMetaTileEntity().getYCoord() + + ' ' + + getBaseMetaTileEntity().getZCoord()); + StackTraceElement[] ste = Thread.currentThread() + .getStackTrace(); + TecTech.proxy.broadcast("Multi DoExplosion BOOM! " + ste[2].toString()); + return; + } + explodeMultiblock(); + super.doExplosion(aExplosionPower); + } // Redirecting to explodemultiblock + // endregion + + // region adder methods + @Override + public final boolean addToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + } + if (aMetaTileEntity instanceof IDualInputHatch) { + return mDualInputHatches.add((IDualInputHatch) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { + return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) { + return mInputBusses.add((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) { + return mOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) { + return mOutputBusses.add((GT_MetaTileEntity_Hatch_OutputBus) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) { + return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) { + return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) { + return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler) { + return mMufflerHatches.add((GT_MetaTileEntity_Hatch_Muffler) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) { + return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Uncertainty) { + return eUncertainHatches.add((GT_MetaTileEntity_Hatch_Uncertainty) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) { + return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) { + return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputData) { + return eInputData.add((GT_MetaTileEntity_Hatch_InputData) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputData) { + return eOutputData.add((GT_MetaTileEntity_Hatch_OutputData) aMetaTileEntity); + } + return false; + } + + public final boolean addClassicToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + } + if (aMetaTileEntity instanceof IDualInputHatch) { + return mDualInputHatches.add((IDualInputHatch) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { + return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) { + return mInputBusses.add((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) { + return mOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) { + return mOutputBusses.add((GT_MetaTileEntity_Hatch_OutputBus) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) { + return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) { + return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) { + return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler) { + return mMufflerHatches.add((GT_MetaTileEntity_Hatch_Muffler) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) { + return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Uncertainty) { + return eUncertainHatches.add((GT_MetaTileEntity_Hatch_Uncertainty) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) { + return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) { + return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputData) { + return eInputData.add((GT_MetaTileEntity_Hatch_InputData) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputData) { + return eOutputData.add((GT_MetaTileEntity_Hatch_OutputData) aMetaTileEntity); + } + return false; + } + + public final boolean addElementalToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + } + + return false; + } + + public final boolean addElementalMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + + return false; + } + + @Override + public final boolean addMufflerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Muffler) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mMufflerHatches.add((GT_MetaTileEntity_Hatch_Muffler) aMetaTileEntity); + } + + return false; + } + + @Override + public final boolean addInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof IDualInputHatch) { + ((IDualInputHatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mDualInputHatches.add((IDualInputHatch) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Input) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + ((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity).mRecipeMap = getRecipeMap(); + return mInputHatches.add((GT_MetaTileEntity_Hatch_Input) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputBus) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + ((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity).mRecipeMap = getRecipeMap(); + return mInputBusses.add((GT_MetaTileEntity_Hatch_InputBus) aMetaTileEntity); + } + + return false; + } + + @Override + public final boolean addOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Output) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mOutputHatches.add((GT_MetaTileEntity_Hatch_Output) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputBus) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mOutputBusses.add((GT_MetaTileEntity_Hatch_OutputBus) aMetaTileEntity); + } + + return false; + } + + @Deprecated + @Override + public final boolean addEnergyInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity); + } + return false; + } + + @Deprecated + @Override + public final boolean addDynamoToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity); + } + return false; + } + + // New Method + public final boolean addEnergyIOToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Energy) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mEnergyHatches.add((GT_MetaTileEntity_Hatch_Energy) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyMulti) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eEnergyMulti.add((GT_MetaTileEntity_Hatch_EnergyMulti) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Dynamo) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mDynamoHatches.add((GT_MetaTileEntity_Hatch_Dynamo) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DynamoMulti) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eDynamoMulti.add((GT_MetaTileEntity_Hatch_DynamoMulti) aMetaTileEntity); + } + return false; + } + + // NEW METHOD + public final boolean addElementalInputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + + return false; + } + + // NEW METHOD + public final boolean addElementalOutputToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + + return false; + } + + // NEW METHOD + public final boolean addParametrizerToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity); + } + return false; + } + + // NEW METHOD + public final boolean addUncertainToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Uncertainty) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eUncertainHatches.add((GT_MetaTileEntity_Hatch_Uncertainty) aMetaTileEntity); + } + return false; + } + + @Override + public final boolean addMaintenanceToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Param) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eParamHatches.add((GT_MetaTileEntity_Hatch_Param) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Uncertainty) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eUncertainHatches.add((GT_MetaTileEntity_Hatch_Uncertainty) aMetaTileEntity); + } + return false; + } + + // NEW METHOD + public final boolean addClassicMaintenanceToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_Maintenance) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return mMaintenanceHatches.add((GT_MetaTileEntity_Hatch_Maintenance) aMetaTileEntity); + } + return false; + } + + // NEW METHOD + public final boolean addDataConnectorToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity == null) { + return false; + } + IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity(); + if (aMetaTileEntity == null) { + return false; + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_InputData) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eInputData.add((GT_MetaTileEntity_Hatch_InputData) aMetaTileEntity); + } + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_OutputData) { + ((GT_MetaTileEntity_Hatch) aMetaTileEntity).updateTexture(aBaseCasingIndex); + return eOutputData.add((GT_MetaTileEntity_Hatch_OutputData) aMetaTileEntity); + } + return false; + } + // endregion + + protected static <T extends GT_MetaTileEntity_MultiblockBase_EM> IStructureElement<T> classicHatches( + int casingIndex, int dot, Block casingBlock, int casingMeta) { + return GT_HatchElementBuilder.<T>builder() + .atLeast( + InputBus, + InputHatch, + OutputHatch, + OutputBus, + Maintenance, + Muffler, + HatchElement.EnergyMulti, + HatchElement.DynamoMulti, + HatchElement.InputData, + HatchElement.OutputData, + HatchElement.Uncertainty) + .casingIndex(casingIndex) + .dot(dot) + .buildAndChain(casingBlock, casingMeta); + } + + protected static <T extends GT_MetaTileEntity_MultiblockBase_EM> IStructureElement<T> allHatches(int casingIndex, + int dot, Block casingBlock, int casingMeta) { + return GT_HatchElementBuilder.<T>builder() + .atLeast( + InputBus, + InputHatch, + OutputHatch, + OutputBus, + Maintenance, + Muffler, + HatchElement.EnergyMulti, + HatchElement.DynamoMulti, + HatchElement.InputData, + HatchElement.OutputData, + HatchElement.Uncertainty) + .casingIndex(casingIndex) + .dot(dot) + .buildAndChain(casingBlock, casingMeta); + } + + public enum HatchElement implements IHatchElement<GT_MetaTileEntity_MultiblockBase_EM> { + + Param(GT_MetaTileEntity_MultiblockBase_EM::addParametrizerToMachineList, GT_MetaTileEntity_Hatch_Param.class) { + + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eParamHatches.size(); + } + }, + Uncertainty(GT_MetaTileEntity_MultiblockBase_EM::addUncertainToMachineList, + GT_MetaTileEntity_Hatch_Uncertainty.class) { + + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eUncertainHatches.size(); + } + }, + EnergyMulti(GT_MetaTileEntity_MultiblockBase_EM::addEnergyInputToMachineList, + GT_MetaTileEntity_Hatch_EnergyMulti.class) { + + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eEnergyMulti.size(); + } + }, + DynamoMulti(GT_MetaTileEntity_MultiblockBase_EM::addDynamoToMachineList, + GT_MetaTileEntity_Hatch_DynamoMulti.class) { + + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eDynamoMulti.size(); + } + }, + InputData(GT_MetaTileEntity_MultiblockBase_EM::addDataConnectorToMachineList, + GT_MetaTileEntity_Hatch_InputData.class) { + + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eInputData.size(); + } + }, + OutputData(GT_MetaTileEntity_MultiblockBase_EM::addDataConnectorToMachineList, + GT_MetaTileEntity_Hatch_OutputData.class) { + + @Override + public long count(GT_MetaTileEntity_MultiblockBase_EM t) { + return t.eOutputData.size(); + } + },; + + private final List<Class<? extends IMetaTileEntity>> mteClasses; + private final IGT_HatchAdder<GT_MetaTileEntity_MultiblockBase_EM> adder; + + @SafeVarargs + HatchElement(IGT_HatchAdder<GT_MetaTileEntity_MultiblockBase_EM> adder, + Class<? extends IMetaTileEntity>... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List<? extends Class<? extends IMetaTileEntity>> mteClasses() { + return mteClasses; + } + + public IGT_HatchAdder<? super GT_MetaTileEntity_MultiblockBase_EM> adder() { + return adder; + } + } + + /** + * Check if the computation timeout is still active + * + * @return True if the timeout is still active or false if the machine should fail + */ + protected boolean checkComputationTimeout() { + if (eComputationTimeout > 0) { + return --eComputationTimeout > 0; + } + return false; + } + + // region ModularUI + + @Override + public int getGUIWidth() { + return 198; + } + + @Override + public int getGUIHeight() { + return 192; + } + + @Override + public void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.bindPlayerInventory(buildContext.getPlayer(), new Pos2d(7, 109), getGUITextureSet().getItemSlot()); + } + + public boolean isPowerPassButtonEnabled() { + return true; + } + + public boolean isSafeVoidButtonEnabled() { + return true; + } + + public boolean isAllowedToWorkButtonEnabled() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_TECTECH_LOGO_DARK) + .setSize(18, 18) + .setPos(173, 74)); + } + + private static byte LEDCounter = 0; + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + if (doesBindPlayerInventory()) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE) + .setPos(4, 4) + .setSize(190, 91)); + } else { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE_NO_INVENTORY) + .setPos(4, 4) + .setSize(190, 171)); + } + final SlotWidget inventorySlot = new SlotWidget(new BaseSlot(inventoryHandler, 1) { + + @Override + public int getSlotStackLimit() { + return getInventoryStackLimit(); + } + }); + if (doesBindPlayerInventory()) { + builder + .widget( + inventorySlot.setBackground(getGUITextureSet().getItemSlot(), TecTechUITextures.OVERLAY_SLOT_MESH) + .setPos(173, 167)) + .widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK_SMALL) + .setPos(173, 185) + .setSize(18, 6)); + } + + final DynamicPositionedColumn screenElements = new DynamicPositionedColumn(); + drawTexts(screenElements, inventorySlot); + builder.widget(screenElements.setPos(7, 8)); + + Widget powerPassButton = createPowerPassButton(); + builder.widget(powerPassButton) + .widget(new FakeSyncWidget.BooleanSyncer(() -> ePowerPass, val -> ePowerPass = val)) + .widget(new FakeSyncWidget.BooleanSyncer(() -> ePowerPassCover, val -> ePowerPassCover = val)); + Widget safeVoidButton = createSafeVoidButton(); + builder.widget(safeVoidButton) + .widget(new FakeSyncWidget.BooleanSyncer(() -> eSafeVoid, val -> eSafeVoid = val)); + Widget powerSwitchButton = createPowerSwitchButton(); + builder.widget(powerSwitchButton) + .widget(new FakeSyncWidget.BooleanSyncer(() -> getBaseMetaTileEntity().isAllowedToWork(), val -> { + if (val) getBaseMetaTileEntity().enableWorking(); + else getBaseMetaTileEntity().disableWorking(); + })); + + builder.widget(new DrawableWidget() { + + @Override + public void draw(float partialTicks) { + super.draw(partialTicks); + LEDCounter = (byte) ((1 + LEDCounter) % 6); + } + }.setDrawable(TecTechUITextures.PICTURE_PARAMETER_BLANK) + .setPos(5, doesBindPlayerInventory() ? 96 : 176) + .setSize(166, 12)); + for (int hatch = 0; hatch < 10; hatch++) { + for (int param = 0; param < 2; param++) { + int ledID = hatch + param * 10; + buildContext + .addSyncedWindow(LED_WINDOW_BASE_ID + ledID, (player) -> createLEDConfigurationWindow(ledID)); + addParameterLED(builder, hatch, param, true); + addParameterLED(builder, hatch, param, false); + } + } + + if (doesBindPlayerInventory()) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_UNCERTAINTY_MONITOR_MULTIMACHINE) + .setPos(173, 96) + .setSize(18, 18)); + for (int i = 0; i < 9; i++) { + final int index = i; + builder.widget(new DrawableWidget().setDrawable(() -> { + UITexture valid = TecTechUITextures.PICTURE_UNCERTAINTY_VALID[index]; + UITexture invalid = TecTechUITextures.PICTURE_UNCERTAINTY_INVALID[index]; + switch (eCertainMode) { + case 1: // ooo oxo ooo + if (index == 4) return eCertainStatus == 0 ? valid : invalid; + break; + case 2: // ooo xox ooo + if (index == 3) return (eCertainStatus & 1) == 0 ? valid : invalid; + if (index == 5) return (eCertainStatus & 2) == 0 ? valid : invalid; + break; + case 3: // oxo xox oxo + if (index == 1) return (eCertainStatus & 1) == 0 ? valid : invalid; + if (index == 3) return (eCertainStatus & 2) == 0 ? valid : invalid; + if (index == 5) return (eCertainStatus & 4) == 0 ? valid : invalid; + if (index == 7) return (eCertainStatus & 8) == 0 ? valid : invalid; + break; + case 4: // xox ooo xox + if (index == 0) return (eCertainStatus & 1) == 0 ? valid : invalid; + if (index == 2) return (eCertainStatus & 2) == 0 ? valid : invalid; + if (index == 6) return (eCertainStatus & 4) == 0 ? valid : invalid; + if (index == 8) return (eCertainStatus & 8) == 0 ? valid : invalid; + break; + case 5: // xox oxo xox + if (index == 0) return (eCertainStatus & 1) == 0 ? valid : invalid; + if (index == 2) return (eCertainStatus & 2) == 0 ? valid : invalid; + if (index == 4) return (eCertainStatus & 4) == 0 ? valid : invalid; + if (index == 6) return (eCertainStatus & 8) == 0 ? valid : invalid; + if (index == 8) return (eCertainStatus & 16) == 0 ? valid : invalid; + break; + } + return null; + }) + .setPos(174 + (index % 3) * 6, 97 + (index / 3) * 6) + .setSize(4, 4)); + } + builder.widget(new FakeSyncWidget.ByteSyncer(() -> eCertainMode, val -> eCertainMode = val)) + .widget(new FakeSyncWidget.ByteSyncer(() -> eCertainStatus, val -> eCertainStatus = val)); + } + } + + protected ButtonWidget createPowerPassButton() { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (isPowerPassButtonEnabled() || ePowerPassCover) { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + ePowerPass = !ePowerPass; + if (!isAllowedToWorkButtonEnabled()) { // TRANSFORMER HACK + if (ePowerPass) { + getBaseMetaTileEntity().enableWorking(); + } else { + getBaseMetaTileEntity().disableWorking(); + } + } + } + }) + .setPlayClickSound(false) + .setBackground(() -> { + List<UITexture> ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_STANDARD_16x16); + if (!isPowerPassButtonEnabled() && !ePowerPassCover) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_DISABLED); + } else { + if (ePowerPass) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_OFF); + } + } + return ret.toArray(new IDrawable[0]); + }) + .setPos(174, doesBindPlayerInventory() ? 116 : 140) + .setSize(16, 16); + if (isPowerPassButtonEnabled()) { + button.addTooltip("Power Pass") + .setTooltipShowUpDelay(TOOLTIP_DELAY); + } + return (ButtonWidget) button; + } + + protected ButtonWidget createSafeVoidButton() { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (isSafeVoidButtonEnabled()) { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + eSafeVoid = !eSafeVoid; + } + }) + .setPlayClickSound(false) + .setBackground(() -> { + List<UITexture> ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_STANDARD_16x16); + if (!isSafeVoidButtonEnabled()) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_DISABLED); + } else { + if (eSafeVoid) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_SAFE_VOID_OFF); + } + } + return ret.toArray(new IDrawable[0]); + }) + .setPos(174, doesBindPlayerInventory() ? 132 : 156) + .setSize(16, 16); + if (isSafeVoidButtonEnabled()) { + button.addTooltip("Safe Void") + .setTooltipShowUpDelay(TOOLTIP_DELAY); + } + return (ButtonWidget) button; + } + + protected ButtonWidget createPowerSwitchButton() { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (isAllowedToWorkButtonEnabled()) { + TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); + if (getBaseMetaTileEntity().isAllowedToWork()) { + getBaseMetaTileEntity().disableWorking(); + } else { + getBaseMetaTileEntity().enableWorking(); + } + } + }) + .setPlayClickSound(false) + .setBackground(() -> { + List<UITexture> ret = new ArrayList<>(); + ret.add(TecTechUITextures.BUTTON_STANDARD_16x16); + if (!isAllowedToWorkButtonEnabled()) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED); + } else { + if (getBaseMetaTileEntity().isAllowedToWork()) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF); + } + } + return ret.toArray(new IDrawable[0]); + }) + .setPos(174, doesBindPlayerInventory() ? 148 : 172) + .setSize(16, 16); + if (isAllowedToWorkButtonEnabled()) { + button.addTooltip("Power Switch") + .setTooltipShowUpDelay(TOOLTIP_DELAY); + } + return (ButtonWidget) button; + } + + private ModularWindow createLEDConfigurationWindow(int ledID) { + return ModularWindow.builder(100, 40) + .setBackground(TecTechUITextures.BACKGROUND_SCREEN_BLUE) + .setPos( + (screenSize, mainWindow) -> new Pos2d( + (screenSize.width / 2 - mainWindow.getSize().width / 2) - 110, + (screenSize.height / 2 - mainWindow.getSize().height / 2))) + .widget( + ButtonWidget.closeWindowButton(true) + .setPos(85, 3)) + .widget( + new NumericWidget().setGetter(() -> parametrization.iParamsIn[ledID]) + .setSetter(val -> parametrization.iParamsIn[ledID] = val) + .setIntegerOnly(false) + .modifyNumberFormat(format -> format.setMaximumFractionDigits(8)) + .setTextColor(Color.LIGHT_BLUE.normal) + .setTextAlignment(Alignment.CenterLeft) + .setFocusOnGuiOpen(true) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) + .setPos(5, 20) + .setSize(90, 15)) + .widget( + new TextWidget((ledID % 10) + ":" + (ledID / 10) + ":I").setDefaultColor(Color.WHITE.normal) + .setTextAlignment(Alignment.Center) + .setPos(5, 5)) + .build(); + } + + private void addParameterLED(ModularWindow.Builder builder, int hatch, int param, boolean input) { + final int parameterIndex = hatch + param * 10; + final int posIndex = hatch * 2 + param; + ButtonWidget ledWidget = new ButtonWidget() { + + @Override + public void draw(float partialTicks) { + IDrawable texture = null; + final LedStatus status = input ? parametrization.eParamsInStatus[parameterIndex] + : parametrization.eParamsOutStatus[parameterIndex]; + switch (status) { + case STATUS_WTF: { + int c = LEDCounter; + if (c > 4) { + c = TecTech.RANDOM.nextInt(5); + } + switch (c) { + case 0: + texture = TecTechUITextures.PICTURE_PARAMETER_BLUE[posIndex]; + break; + case 1: + texture = TecTechUITextures.PICTURE_PARAMETER_CYAN[posIndex]; + break; + case 2: + texture = TecTechUITextures.PICTURE_PARAMETER_GREEN[posIndex]; + break; + case 3: + texture = TecTechUITextures.PICTURE_PARAMETER_ORANGE[posIndex]; + break; + case 4: + texture = TecTechUITextures.PICTURE_PARAMETER_RED[posIndex]; + break; + } + break; + } + case STATUS_WRONG: // fallthrough + if (LEDCounter < 2) { + texture = TecTechUITextures.PICTURE_PARAMETER_BLUE[posIndex]; + break; + } else if (LEDCounter < 4) { + texture = TecTechUITextures.PICTURE_PARAMETER_RED[posIndex]; + break; + } + case STATUS_OK: // ok + texture = TecTechUITextures.PICTURE_PARAMETER_GREEN[posIndex]; + break; + case STATUS_TOO_LOW: // too low blink + if (LEDCounter < 3) { + texture = TecTechUITextures.PICTURE_PARAMETER_BLUE[posIndex]; + break; + } + case STATUS_LOW: // too low + texture = TecTechUITextures.PICTURE_PARAMETER_CYAN[posIndex]; + break; + case STATUS_TOO_HIGH: // too high blink + if (LEDCounter < 3) { + texture = TecTechUITextures.PICTURE_PARAMETER_RED[posIndex]; + break; + } + case STATUS_HIGH: // too high + texture = TecTechUITextures.PICTURE_PARAMETER_ORANGE[posIndex]; + break; + case STATUS_NEUTRAL: + if (LEDCounter < 3) { + GL11.glColor4f(.85f, .9f, .95f, .5F); + } else { + GL11.glColor4f(.8f, .9f, 1f, .5F); + } + texture = TecTechUITextures.PICTURE_PARAMETER_GRAY; + break; + case STATUS_UNDEFINED: + if (LEDCounter < 3) { + GL11.glColor4f(.5f, .1f, .15f, .5F); + } else { + GL11.glColor4f(0f, .1f, .2f, .5F); + } + texture = TecTechUITextures.PICTURE_PARAMETER_GRAY; + break; + case STATUS_UNUSED: + default: + // no-op + break; + } + setBackground(texture); + super.draw(partialTicks); + GL11.glColor4f(1f, 1f, 1f, 1f); + } + }.setOnClick((clickData, widget) -> { + if (!widget.isClient() && input + && parametrization.eParamsInStatus[parameterIndex] != LedStatus.STATUS_UNUSED) { + // We don't use CloseAllButMain here in case MB implementation adds their own window + for (int i = 0; i < parametrization.eParamsInStatus.length; i++) { + if (widget.getContext() + .isWindowOpen(LED_WINDOW_BASE_ID + i)) { + widget.getContext() + .closeWindow(LED_WINDOW_BASE_ID + i); + } + } + widget.getContext() + .openSyncedWindow(LED_WINDOW_BASE_ID + parameterIndex); + } + }); + builder.widget(ledWidget.dynamicTooltip(() -> { + if (input) { + return getFullLedDescriptionIn(hatch, param); + } else { + return getFullLedDescriptionOut(hatch, param); + } + }) + .setPos(12 + posIndex * 8, (doesBindPlayerInventory() ? 97 : 177) + (input ? 0 : 1) * 6) + .setSize(6, 4)); + if (input) { + builder + .widget( + new FakeSyncWidget.ByteSyncer( + () -> parametrization.eParamsInStatus[parameterIndex].getOrdinalByte(), + val -> parametrization.eParamsInStatus[parameterIndex] = LedStatus.getStatus(val)) + .setOnClientUpdate(val -> ledWidget.notifyTooltipChange())) + .widget( + new FakeSyncWidget.DoubleSyncer( + () -> parametrization.iParamsIn[parameterIndex], + val -> parametrization.iParamsIn[parameterIndex] = val) + .setOnClientUpdate(val -> ledWidget.notifyTooltipChange())); + } else { + builder + .widget( + new FakeSyncWidget.ByteSyncer( + () -> parametrization.eParamsOutStatus[parameterIndex].getOrdinalByte(), + val -> parametrization.eParamsOutStatus[parameterIndex] = LedStatus.getStatus(val)) + .setOnClientUpdate(val -> ledWidget.notifyTooltipChange())) + .widget( + new FakeSyncWidget.DoubleSyncer( + () -> parametrization.iParamsOut[parameterIndex], + val -> parametrization.iParamsOut[parameterIndex] = val) + .setOnClientUpdate(val -> ledWidget.notifyTooltipChange())); + } + } + + // endregion + + protected void turnOffMaintenance() { + mWrench = true; + mScrewdriver = true; + mSoftHammer = true; + mHardHammer = true; + mSolderingTool = true; + mCrowbar = true; + hasMaintenanceChecks = false; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/INameFunction.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/INameFunction.java new file mode 100644 index 0000000000..11867c067a --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/INameFunction.java @@ -0,0 +1,6 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.base; + +public interface INameFunction<T extends GT_MetaTileEntity_MultiblockBase_EM> { + + String apply(T t, Parameters.IParameter iParameter); +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/IStatusFunction.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/IStatusFunction.java new file mode 100644 index 0000000000..37d5664d20 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/IStatusFunction.java @@ -0,0 +1,6 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.base; + +public interface IStatusFunction<T extends GT_MetaTileEntity_MultiblockBase_EM> { + + LedStatus apply(T t, Parameters.IParameter iParameter); +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/LedStatus.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/LedStatus.java new file mode 100644 index 0000000000..e99739b69e --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/LedStatus.java @@ -0,0 +1,64 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.base; + +import java.util.function.Supplier; + +import net.minecraft.util.EnumChatFormatting; + +import com.github.technus.tectech.TecTech; + +public enum LedStatus { + + STATUS_UNUSED(() -> EnumChatFormatting.DARK_GRAY + "Unused", true), // + STATUS_TOO_LOW(() -> EnumChatFormatting.BLUE + "Too Low", false), // + STATUS_LOW(() -> EnumChatFormatting.AQUA + "Low", true), // + STATUS_WRONG(() -> EnumChatFormatting.DARK_PURPLE + "Wrong", false), // + STATUS_OK(() -> EnumChatFormatting.GREEN + "Valid", true), // + STATUS_TOO_HIGH(() -> EnumChatFormatting.RED + "Too High", false), // + STATUS_HIGH(() -> EnumChatFormatting.GOLD + "High", true), // + STATUS_UNDEFINED(() -> EnumChatFormatting.GRAY + "Unknown", false), + STATUS_NEUTRAL(() -> EnumChatFormatting.WHITE + "Neutral", true), + STATUS_WTF(() -> LedStatus.values()[TecTech.RANDOM.nextInt(9)].name.get(), false); + + public final Supplier<String> name; + public final boolean isOk; + + LedStatus(Supplier<String> name, boolean ok) { + this.name = name; + this.isOk = ok; + } + + public byte getOrdinalByte() { + return (byte) ordinal(); + } + + public static LedStatus getStatus(byte value) { + try { + return LedStatus.values()[value]; + } catch (Exception e) { + return STATUS_UNDEFINED; + } + } + + public static LedStatus[] makeArray(int count, LedStatus defaultValue) { + LedStatus[] statuses = new LedStatus[count]; + for (int i = 0; i < count; i++) { + statuses[i] = defaultValue; + } + return statuses; + } + + public static LedStatus fromLimitsInclusiveOuterBoundary(double value, double min, double low, double high, + double max, double... excludedNumbers) { + if (value < min) return STATUS_TOO_LOW; + if (value > max) return STATUS_TOO_HIGH; + + if (value < low) return STATUS_LOW; + if (value > high) return STATUS_HIGH; + for (double val : excludedNumbers) { + if (val == value) return STATUS_WRONG; + } + if (Double.isNaN(value)) return STATUS_WRONG; + return STATUS_OK; + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/Parameters.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/Parameters.java new file mode 100644 index 0000000000..5b2c73b593 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/Parameters.java @@ -0,0 +1,327 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.base; + +import java.util.ArrayList; + +/** + * Instantiate parameters as field in parametersInstantiation_EM(); + */ +public class Parameters { + + private static final IStatusFunction<?> LED_STATUS_FUNCTION_DEFAULT = (b, p) -> LedStatus.STATUS_UNDEFINED; + private static final INameFunction<?> NAME_FUNCTION_DEFAULT = (b, p) -> "Undefined"; + + final Group[] groups = new Group[10]; + + double[] iParamsIn = new double[20]; // number I from parametrizers + double[] iParamsOut = new double[20]; // number O to parametrizers + final ArrayList<Group.ParameterIn> parameterInArrayList = new ArrayList<>(); + final ArrayList<Group.ParameterOut> parameterOutArrayList = new ArrayList<>(); + + // package private for use in gui + LedStatus[] eParamsInStatus = LedStatus.makeArray(20, LedStatus.STATUS_UNUSED); // LED status for I + LedStatus[] eParamsOutStatus = LedStatus.makeArray(20, LedStatus.STATUS_UNUSED); // LED status for O + + double getIn(int hatchNo, int parameterId) { + return iParamsIn[hatchNo + 10 * parameterId]; + } + + double getOut(int hatchNo, int parameterId) { + return iParamsOut[hatchNo + 10 * parameterId]; + } + + LedStatus getStatusIn(int hatchNo, int parameterId) { + return eParamsInStatus[hatchNo + 10 * parameterId]; + } + + LedStatus getStatusOut(int hatchNo, int parameterId) { + return eParamsOutStatus[hatchNo + 10 * parameterId]; + } + + private final GT_MetaTileEntity_MultiblockBase_EM parent; + + Parameters(GT_MetaTileEntity_MultiblockBase_EM parent) { + this.parent = parent; + } + + public boolean trySetParameters(int hatch, double parameter0, double parameter1) { + Group p = groups[hatch]; + if (parent.mMaxProgresstime <= 0 || (p != null && p.updateWhileRunning)) { + iParamsIn[hatch] = parameter0; + iParamsIn[hatch + 10] = parameter1; + return true; + } + return false; + } + + @SuppressWarnings("unused") // Used in GTNH-Intergalactic, do not delete. + public boolean trySetParameters(int hatchNo, int parameterId, double parameter) { + Group p = groups[hatchNo]; + if (parent.mMaxProgresstime <= 0 || (p != null && p.updateWhileRunning)) { + iParamsIn[hatchNo + 10 * parameterId] = parameter; + return true; + } + return false; + } + + public void setToDefaults(int hatch, boolean defaultIn, boolean defaultOut) { + Group p = groups[hatch]; + if (p == null) { + if (defaultIn) { + iParamsIn[hatch] = 0; + iParamsIn[hatch + 10] = 0; + } + if (defaultOut) { + iParamsOut[hatch] = 0; + iParamsOut[hatch + 10] = 0; + } + } else { + p.setToDefaults(defaultIn, defaultOut); + } + } + + public void setToDefaults(boolean defaultIn, boolean defaultOut) { + for (int hatch = 0; hatch < 10; hatch++) { + setToDefaults(hatch, defaultIn, defaultOut); + } + } + + public Group getGroup(int hatchNo, boolean updateWhileRunning) { + return groups[hatchNo] != null ? groups[hatchNo] : new Group(hatchNo, updateWhileRunning); + } + + public Group getGroup(int hatchNo) { + return groups[hatchNo] != null ? groups[hatchNo] : new Group(hatchNo, false); + } + + public interface IParameter { + + double get(); + + double getDefault(); + + void updateStatus(); + + LedStatus getStatus(boolean update); + + int id(); + + int hatchId(); + + int parameterId(); + + String getBrief(); + } + + /** + * most likely used locally in parametersInstantiation_EM() + */ + public class Group { + + private final int hatchNo; + public final ParameterIn[] parameterIn = new ParameterIn[2]; + public final ParameterOut[] parameterOut = new ParameterOut[2]; + public boolean updateWhileRunning; + + private Group(int hatchNo, boolean updateWhileRunning) { + if (hatchNo < 0 || hatchNo >= 10) { + throw new IllegalArgumentException("Hatch id must be in 0 to 9 range"); + } + this.hatchNo = hatchNo; + this.updateWhileRunning = updateWhileRunning; + groups[hatchNo] = this; + } + + public ParameterIn makeInParameter(int paramID, double defaultValue, INameFunction<?> name, + IStatusFunction<?> status) { + return new ParameterIn(paramID, defaultValue, name, status); + } + + public ParameterOut makeOutParameter(int paramID, double defaultValue, INameFunction<?> name, + IStatusFunction<?> status) { + return new ParameterOut(paramID, defaultValue, name, status); + } + + public void setToDefaults(boolean defaultIn, boolean defaultOut) { + if (defaultIn) { + if (this.parameterIn[0] != null) { + this.parameterIn[0].setDefault(); + } else { + iParamsIn[hatchNo] = 0; + } + if (this.parameterIn[1] != null) { + this.parameterIn[1].setDefault(); + } else { + iParamsIn[hatchNo + 10] = 0; + } + } + if (defaultOut) { + if (this.parameterOut[0] != null) { + this.parameterOut[0].setDefault(); + } else { + iParamsOut[hatchNo] = 0; + } + if (this.parameterOut[1] != null) { + this.parameterOut[1].setDefault(); + } else { + iParamsOut[hatchNo + 10] = 0; + } + } + } + + /** + * Make a field out of this... + */ + public class ParameterOut implements IParameter { + + public final int id; + public final double defaultValue; + IStatusFunction status; + INameFunction name; + + private ParameterOut(int paramID, double defaultValue, INameFunction<?> name, IStatusFunction<?> status) { + this.name = name == null ? NAME_FUNCTION_DEFAULT : name; + if (paramID < 0 || paramID > 2) { + throw new IllegalArgumentException("Parameter id must be in 0 to 1 range"); + } + if (parameterOut[paramID] != null) { + throw new IllegalArgumentException("Parameter id already occupied"); + } + this.id = hatchNo + 10 * paramID; + this.defaultValue = defaultValue; + this.status = status == null ? LED_STATUS_FUNCTION_DEFAULT : status; + parameterOutArrayList.add(this); + parameterOut[paramID] = this; + } + + void setDefault() { + set(defaultValue); + } + + @Override + public double get() { + return iParamsOut[id]; + } + + @Override + public double getDefault() { + return defaultValue; + } + + public void set(double value) { + iParamsOut[id] = value; + } + + @SuppressWarnings("unchecked") + @Override + public void updateStatus() { + eParamsOutStatus[id] = status.apply(parent, this); + } + + @Override + public LedStatus getStatus(boolean update) { + if (update) { + updateStatus(); + } + return eParamsOutStatus[id]; + } + + @Override + public String getBrief() { + return name.apply(parent, this); + } + + @Override + public int id() { + return id; + } + + @Override + public int hatchId() { + return id % 10; + } + + @Override + public int parameterId() { + return id / 10; + } + } + + /** + * Make a field out of this... + */ + public class ParameterIn implements IParameter { + + public final int id; + public final double defaultValue; + IStatusFunction status; + INameFunction name; + + private ParameterIn(int paramID, double defaultValue, INameFunction<?> name, IStatusFunction<?> status) { + this.name = name == null ? NAME_FUNCTION_DEFAULT : name; + this.id = hatchNo + 10 * paramID; + if (paramID < 0 || paramID > 2) { + throw new IllegalArgumentException("Parameter id must be in 0 to 1 range"); + } + if (parameterIn[paramID] != null) { + throw new IllegalArgumentException("Parameter id already occupied"); + } + this.defaultValue = defaultValue; + this.status = status == null ? LED_STATUS_FUNCTION_DEFAULT : status; + parameterInArrayList.add(this); + parameterIn[paramID] = this; + } + + void setDefault() { + set(defaultValue); + } + + @Override + public double get() { + return iParamsIn[id]; + } + + void set(double value) { + iParamsIn[id] = value; + } + + @Override + public double getDefault() { + return defaultValue; + } + + @SuppressWarnings("unchecked") + @Override + public void updateStatus() { + eParamsInStatus[id] = status.apply(parent, this); + } + + @Override + public LedStatus getStatus(boolean update) { + if (update) { + updateStatus(); + } + return eParamsInStatus[id]; + } + + @Override + public String getBrief() { + return name.apply(parent, this); + } + + @Override + public int id() { + return id; + } + + @Override + public int hatchId() { + return id % 10; + } + + @Override + public int parameterId() { + return id / 10; + } + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/SoundLoop.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/SoundLoop.java new file mode 100644 index 0000000000..591f7d3be5 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/SoundLoop.java @@ -0,0 +1,59 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.base; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.MovingSound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +@SideOnly(Side.CLIENT) +public class SoundLoop extends MovingSound { + + private final boolean whileActive; + private final boolean whileInactive; + private final int worldID; + private boolean fadeMe = false; + + public SoundLoop(ResourceLocation p_i45104_1_, IGregTechTileEntity base, boolean stopWhenActive, + boolean stopWhenInactive) { + super(p_i45104_1_); + this.whileActive = stopWhenActive; + this.whileInactive = stopWhenInactive; + xPosF = base.getXCoord(); + yPosF = base.getYCoord(); + zPosF = base.getZCoord(); + worldID = base.getWorld().provider.dimensionId; + repeat = true; + volume = 0.0625f; + } + + @Override + public void update() { + if (donePlaying) { + return; + } + if (fadeMe) { + volume -= 0.0625f; + if (volume <= 0) { + volume = 0; + donePlaying = true; + } + } else if (volume < 1) { + volume += 0.0625f; + } + World world = Minecraft.getMinecraft().thePlayer.worldObj; + donePlaying = world.provider.dimensionId != worldID + || !world.checkChunksExist((int) xPosF, (int) yPosF, (int) zPosF, (int) xPosF, (int) yPosF, (int) zPosF); + if (donePlaying) return; + TileEntity tile = world.getTileEntity((int) xPosF, (int) yPosF, (int) zPosF); + if (!(tile instanceof IGregTechTileEntity)) { + donePlaying = true; + return; + } + fadeMe |= ((IGregTechTileEntity) tile).isActive() ? whileActive : whileInactive; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/render/TT_RenderedExtendedFacingTexture.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/render/TT_RenderedExtendedFacingTexture.java new file mode 100644 index 0000000000..6e5597516b --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/base/render/TT_RenderedExtendedFacingTexture.java @@ -0,0 +1,25 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.base.render; + +import gregtech.api.enums.Dyes; +import gregtech.api.interfaces.IIconContainer; +import gregtech.common.render.GT_RenderedTexture; + +public class TT_RenderedExtendedFacingTexture extends GT_RenderedTexture { + + public TT_RenderedExtendedFacingTexture(IIconContainer aIcon, short[] aRGBa, boolean allowAlpha, boolean glow, + boolean stdOrient, boolean extFacing) { + super(aIcon, aRGBa, allowAlpha, glow, stdOrient, extFacing); + } + + public TT_RenderedExtendedFacingTexture(IIconContainer aIcon, short[] aRGBa, boolean aAllowAlpha) { + this(aIcon, aRGBa, aAllowAlpha, false, false, true); + } + + public TT_RenderedExtendedFacingTexture(IIconContainer aIcon, short[] aRGBa) { + this(aIcon, aRGBa, true); + } + + public TT_RenderedExtendedFacingTexture(IIconContainer aIcon) { + this(aIcon, Dyes._NULL.mRGBa); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java new file mode 100644 index 0000000000..004fc2b40a --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java @@ -0,0 +1,497 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; + +import static com.github.technus.tectech.thing.casing.TT_Container_Casings.GodforgeCasings; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static gregtech.common.misc.WirelessNetworkManager.processInitialSettings; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.thing.gui.TecTechUITextures; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.SlotWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTech_API; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.util.GT_StructureUtility; + +public class GT_MetaTileEntity_EM_BaseModule extends GT_MetaTileEntity_MultiblockBase_EM { + + protected final int tier = getTier(); + protected boolean isConnected = false; + protected double overclockTimeFactor = 2d; + protected boolean isUpgrade83Unlocked = false; + protected boolean isMultiStepPlasmaCapable = false; + protected boolean isMagmatterCapable = false; + private boolean isVoltageConfigUnlocked = false; + protected UUID userUUID; + protected int machineHeat = 0; + protected int overclockHeat = 0; + protected int maximumParallel = 0; + protected int plasmaTier = 0; + protected float processingSpeedBonus = 0; + protected float energyDiscount = 0; + protected long processingVoltage = 2_000_000_000; + protected BigInteger powerTally = BigInteger.ZERO; + protected long recipeTally = 0; + private static Textures.BlockIcons.CustomIcon ScreenON; + private static Textures.BlockIcons.CustomIcon ScreenOFF; + + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final int VOLTAGE_WINDOW_ID = 9; + private static final int TEXTURE_INDEX = 960; + private static final IStructureDefinition<GT_MetaTileEntity_EM_BaseModule> STRUCTURE_DEFINITION = StructureDefinition + .<GT_MetaTileEntity_EM_BaseModule>builder() + .addShape( + STRUCTURE_PIECE_MAIN, + new String[][] { { " ", " BBB ", " BBBBB ", " BB~BB ", " BBBBB ", " BBB ", " " }, + { " CCC ", " CFFFC ", "CFFFFFC", "CFFFFFC", "CFFFFFC", " CFFFC ", " CCC " }, + { " ", " ", " E ", " EAE ", " E ", " ", " " }, + { " ", " ", " E ", " EAE ", " E ", " ", " " }, + { " ", " ", " E ", " EAE ", " E ", " ", " " }, + { " ", " ", " E ", " EAE ", " E ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " D ", " ", " ", " " }, + { " ", " ", " ", " G ", " ", " ", " " } }) + .addElement('A', ofBlock(GregTech_API.sSolenoidCoilCasings, 9)) + .addElement( + 'B', + GT_StructureUtility.ofHatchAdderOptional( + GT_MetaTileEntity_EM_BaseModule::addClassicToMachineList, + TEXTURE_INDEX, + 1, + GodforgeCasings, + 0)) + .addElement('C', ofBlock(GodforgeCasings, 0)) + .addElement('D', ofBlock(GodforgeCasings, 1)) + .addElement('E', ofBlock(GodforgeCasings, 2)) + .addElement('F', ofBlock(GodforgeCasings, 3)) + .addElement('G', ofBlock(GodforgeCasings, 4)) + .build(); + + public GT_MetaTileEntity_EM_BaseModule(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_BaseModule(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_BaseModule(mName); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && isConnected) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aTick % 400 == 0) fixAllIssues(); + if (mEfficiency < 0) mEfficiency = 0; + } + } + + @Override + public RecipeMap<?> getRecipeMap() { + return RecipeMaps.blastFurnaceRecipes; + } + + @Override + public boolean drainEnergyInput(long EUtEffective, long Amperes) { + long EU_drain = EUtEffective * Amperes; + if (EU_drain == 0L) { + return true; + } else { + if (EU_drain > 0L) { + EU_drain = -EU_drain; + } + return addEUToGlobalEnergyMap(userUUID, EU_drain); + } + } + + public void connect() { + isConnected = true; + } + + public void disconnect() { + isConnected = false; + } + + public void setHeat(int heat) { + machineHeat = heat; + } + + public int getHeat() { + return machineHeat; + } + + public void setHeatForOC(int heat) { + overclockHeat = heat; + } + + public int getHeatForOC() { + return overclockHeat; + } + + public void setMaxParallel(int parallel) { + maximumParallel = parallel; + } + + public int getMaxParallel() { + return maximumParallel; + } + + public void setSpeedBonus(float bonus) { + processingSpeedBonus = bonus; + } + + public float getSpeedBonus() { + return processingSpeedBonus; + } + + public void setEnergyDiscount(float discount) { + energyDiscount = discount; + } + + public float getEnergyDiscount() { + return energyDiscount; + } + + public void setUpgrade83(boolean unlocked) { + isUpgrade83Unlocked = unlocked; + } + + public void setOverclockTimeFactor(double factor) { + overclockTimeFactor = factor; + } + + public double getOverclockTimeFactor() { + return overclockTimeFactor; + } + + public void setMultiStepPlasma(boolean isCapable) { + isMultiStepPlasmaCapable = isCapable; + } + + public void setProcessingVoltage(long Voltage) { + processingVoltage = Voltage; + } + + public long getProcessingVoltage() { + return processingVoltage; + } + + public void setMagmatterCapable(boolean isCapable) { + isMagmatterCapable = isCapable; + } + + public float getHeatEnergyDiscount() { + return isUpgrade83Unlocked ? 0.92f : 0.95f; + } + + public void setPlasmaTier(int tier) { + plasmaTier = tier; + } + + public int getPlasmaTier() { + return plasmaTier; + } + + public void setVoltageConfig(boolean unlocked) { + isVoltageConfigUnlocked = unlocked; + } + + public void setPowerTally(BigInteger amount) { + powerTally = amount; + } + + public BigInteger getPowerTally() { + return powerTally; + } + + public void addToPowerTally(BigInteger amount) { + powerTally = powerTally.add(amount); + } + + public void setRecipeTally(long amount) { + recipeTally = amount; + } + + public long getRecipeTally() { + return recipeTally; + } + + public void addToRecipeTally(long amount) { + recipeTally += amount; + } + + protected void fixAllIssues() { + mWrench = true; + mScrewdriver = true; + mSoftHammer = true; + mHardHammer = true; + mSolderingTool = true; + mCrowbar = true; + } + + public int getTier() { + return tier; + } + + @Override + public long getMaxInputVoltage() { + return gregtech.api.enums.GT_Values.V[tier]; + } + + @Override + public IStructureDefinition<? extends GT_MetaTileEntity_MultiblockBase_EM> getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + @Override + public void construct(ItemStack stackSize, boolean hintsOnly) { + structureBuild_EM(STRUCTURE_PIECE_MAIN, 3, 3, 0, stackSize, hintsOnly); + } + + @Override + public boolean checkMachine_EM(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + fixAllIssues(); + return structureCheck_EM(STRUCTURE_PIECE_MAIN, 3, 3, 0); + } + + @Override + public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPreTick(aBaseMetaTileEntity, aTick); + + if (aBaseMetaTileEntity.isServerSide() && (aTick == 1)) { + userUUID = processInitialSettings(aBaseMetaTileEntity); + } + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) + .setPos(4, 4) + .setSize(190, 85)); + final SlotWidget inventorySlot = new SlotWidget(inventoryHandler, 1); + builder.widget( + inventorySlot.setPos(173, 167) + .setBackground(GT_UITextures.SLOT_DARK_GRAY)); + + final DynamicPositionedColumn screenElements = new DynamicPositionedColumn(); + drawTexts(screenElements, inventorySlot); + builder.widget(screenElements); + + buildContext.addSyncedWindow(VOLTAGE_WINDOW_ID, this::createVoltageWindow); + + builder.widget( + TextWidget.dynamicText(this::connectionStatus) + .setDefaultColor(EnumChatFormatting.BLACK) + .setPos(75, 94) + .setSize(100, 10)); + + builder.widget(createPowerSwitchButton(builder)) + .widget(createVoidExcessButton(builder)) + .widget(createInputSeparationButton(builder)) + .widget(createBatchModeButton(builder)) + .widget(createLockToSingleRecipeButton(builder)) + .widget(createVoltageButton(builder)); + } + + protected Widget createVoltageButton(IWidgetBuilder<?> builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (isVoltageConfigUnlocked) { + if (!widget.isClient()) { + widget.getContext() + .openSyncedWindow(VOLTAGE_WINDOW_ID); + } + } + }) + .setPlayClickSound(isVoltageConfigUnlocked) + .setBackground(() -> { + List<UITexture> ret = new ArrayList<>(); + ret.add(GT_UITextures.BUTTON_STANDARD); + if (isVoltageConfigUnlocked) { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_ON); + } else { + ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_PASS_DISABLED); + } + return ret.toArray(new IDrawable[0]); + }) + .addTooltip(translateToLocal("fog.button.voltageconfig.tooltip.01")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 129) + .setSize(16, 16) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> isVoltageConfigUnlocked, val -> isVoltageConfigUnlocked = val), + builder); + if (!isVoltageConfigUnlocked) { + button.addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.voltageconfig.tooltip.02")); + } + return button; + } + + protected ModularWindow createVoltageWindow(final EntityPlayer player) { + final int WIDTH = 158; + final int HEIGHT = 52; + final int PARENT_WIDTH = getGUIWidth(); + final int PARENT_HEIGHT = getGUIHeight(); + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); + builder.setGuiTint(getGUIColorization()); + builder.setDraggable(true); + builder.setPos( + (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)) + .add( + Alignment.BottomRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)) + .add(WIDTH - 3, 0) + .subtract(0, 10))); + builder.widget( + TextWidget.localised("gt.blockmachines.multimachine.FOG.voltageinfo") + .setPos(3, 4) + .setSize(150, 20)) + .widget( + new NumericWidget().setSetter(val -> processingVoltage = (long) val) + .setGetter(() -> processingVoltage) + .setBounds(2_000_000_000, Long.MAX_VALUE) + .setDefaultValue(2_000_000_000) + .setScrollValues(1, 4, 64) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(150, 18) + .setPos(4, 25) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.LongSyncer(this::getProcessingVoltage, this::setProcessingVoltage), + builder)); + return builder.build(); + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO) + .setSize(18, 18) + .setPos(172, 67)); + } + + @Override + public boolean supportsInputSeparation() { + return true; + } + + @Override + public boolean supportsBatchMode() { + return true; + } + + @Override + public boolean supportsVoidProtection() { + return true; + } + + @Override + public boolean supportsSingleRecipeLocking() { + return true; + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public boolean willExplodeInRain() { + return false; + } + + private Text connectionStatus() { + String status = EnumChatFormatting.RED + + translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus.false"); + if (isConnected) { + status = EnumChatFormatting.GREEN + translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus.true"); + } + return new Text(translateToLocal("gt.blockmachines.multimachine.FOG.modulestatus") + " " + status); + } + + @Override + public void saveNBTData(NBTTagCompound NBT) { + NBT.setBoolean("isConnected", isConnected); + NBT.setBoolean("isVoltageConfigUnlocked", isVoltageConfigUnlocked); + NBT.setLong("processingVoltage", processingVoltage); + NBT.setLong("recipeTally", recipeTally); + NBT.setByteArray("powerTally", powerTally.toByteArray()); + super.saveNBTData(NBT); + } + + @Override + public void loadNBTData(final NBTTagCompound NBT) { + isConnected = NBT.getBoolean("isConnected"); + isVoltageConfigUnlocked = NBT.getBoolean("isVoltageConfigUnlocked"); + processingVoltage = NBT.getLong("processingVoltage"); + recipeTally = NBT.getLong("recipeTally"); + powerTally = new BigInteger(NBT.getByteArray("powerTally")); + super.loadNBTData(NBT); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/GODFORGE_MODULE_ACTIVE"); + ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/SCREEN_OFF"); + super.registerIcons(aBlockIconRegister); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + if (side == facing) { + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX), + new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) }; + } + return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(TEXTURE_INDEX) }; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java new file mode 100644 index 0000000000..7e5c0d0b94 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java @@ -0,0 +1,529 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; + +import static com.github.technus.tectech.loader.recipe.Godforge.exoticModuleMagmatterItemMap; +import static com.github.technus.tectech.loader.recipe.Godforge.exoticModulePlasmaFluidMap; +import static com.github.technus.tectech.loader.recipe.Godforge.exoticModulePlasmaItemMap; +import static com.github.technus.tectech.recipe.TecTechRecipeMaps.godforgeExoticMatterRecipes; +import static com.github.technus.tectech.util.GodforgeMath.getRandomIntInRange; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GT_RecipeBuilder.INGOTS; +import static gregtech.api.util.GT_RecipeBuilder.SECONDS; +import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static gregtech.common.misc.WirelessNetworkManager.getUserEU; +import static net.minecraft.util.EnumChatFormatting.GREEN; +import static net.minecraft.util.EnumChatFormatting.RED; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.YELLOW; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.enums.MaterialsUEVplus; +import gregtech.api.enums.TierEU; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMapBackend; +import gregtech.api.recipe.RecipeMapBuilder; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_OverclockCalculator; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Utility; + +public class GT_MetaTileEntity_EM_ExoticModule extends GT_MetaTileEntity_EM_BaseModule { + + private int numberOfFluids = 0; + private int numberOfItems = 0; + private long wirelessEUt = 0; + private long EUt = 0; + private long actualParallel = 0; + private boolean recipeInProgress = false; + private boolean magmatterMode = false; + private FluidStack[] randomizedFluidInput = new FluidStack[] {}; + private ItemStack[] randomizedItemInput = new ItemStack[] {}; + List<FluidStack> inputPlasmas = new ArrayList<>(); + private GT_Recipe plasmaRecipe = null; + private static RecipeMap<RecipeMapBackend> tempRecipeMap = RecipeMapBuilder.of("bye") + .maxIO(0, 0, 7, 2) + .disableRegisterNEI() + .build(); + private static final RecipeMap<RecipeMapBackend> emptyRecipeMap = RecipeMapBuilder.of("hey") + .maxIO(0, 0, 7, 2) + .disableRegisterNEI() + .build(); + private static final int NUMBER_OF_INPUTS = 7; + + public GT_MetaTileEntity_EM_ExoticModule(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_ExoticModule(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_ExoticModule(mName); + } + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) { + if (!recipeInProgress) { + actualParallel = getMaxParallel(); + FluidStack outputFluid = MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000 * actualParallel); + tempRecipeMap = emptyRecipeMap; + if (magmatterMode) { + randomizedItemInput = getRandomItemInputs(exoticModuleMagmatterItemMap, 1); + numberOfItems = 1; + numberOfFluids = 2; + int timeAmount = getRandomIntInRange(1, 50); + int spaceAmount = getRandomIntInRange(51, 100); + randomizedFluidInput = new FluidStack[] { MaterialsUEVplus.Time.getMolten(timeAmount * 1000L), + MaterialsUEVplus.Space.getMolten(spaceAmount * 1000L) }; + inputPlasmas = new ArrayList<>( + Arrays.asList( + convertItemToPlasma(randomizedItemInput, (spaceAmount - timeAmount) * actualParallel))); + inputPlasmas.add(MaterialsUEVplus.Time.getMolten(timeAmount * actualParallel)); + inputPlasmas.add(MaterialsUEVplus.Space.getMolten(spaceAmount * actualParallel)); + outputFluid = MaterialsUEVplus.MagMatter.getMolten(144 * actualParallel); + } else { + numberOfFluids = getRandomIntInRange(0, NUMBER_OF_INPUTS); + numberOfItems = NUMBER_OF_INPUTS - numberOfFluids; + randomizedFluidInput = getRandomFluidInputs(exoticModulePlasmaFluidMap, numberOfFluids); + randomizedItemInput = getRandomItemInputs(exoticModulePlasmaItemMap, numberOfItems); + + if (numberOfFluids != 0) { + for (FluidStack fluidStack : randomizedFluidInput) { + fluidStack.amount = 1000 * getRandomIntInRange(1, 64); + } + } + + if (numberOfItems != 0) { + for (ItemStack itemStack : randomizedItemInput) { + itemStack.stackSize = getRandomIntInRange(1, 64); + } + } + + inputPlasmas = new ArrayList<>( + Arrays.asList(convertItemToPlasma(randomizedItemInput, actualParallel))); + inputPlasmas.addAll(Arrays.asList(convertFluidToPlasma(randomizedFluidInput, actualParallel))); + } + plasmaRecipe = new GT_Recipe( + false, + null, + null, + null, + null, + inputPlasmas.toArray(new FluidStack[0]), + new FluidStack[] { outputFluid }, + 10 * SECONDS * (int) actualParallel, + (int) TierEU.RECIPE_MAX, + 0); + + tempRecipeMap.add(plasmaRecipe); + } + return tempRecipeMap.getAllRecipes() + .parallelStream(); + } + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { + if (!recipeInProgress) { + maxParallel = 1; + wirelessEUt = (long) recipe.mEUt * maxParallel; + if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) { + tempRecipeMap = emptyRecipeMap; + return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); + } + + if (numberOfFluids != 0) { + for (FluidStack fluidStack : randomizedFluidInput) { + dumpFluid( + mOutputHatches, + new FluidStack( + fluidStack.getFluid(), + (int) (fluidStack.amount / 1000 * actualParallel)), + false); + } + } + + if (numberOfItems != 0) { + long multiplier = actualParallel; + if (magmatterMode) { + multiplier = 1; + } + for (ItemStack itemStack : randomizedItemInput) { + int stacksize = (int) (itemStack.stackSize * multiplier); + ItemStack tmpItem = itemStack.copy(); + // split itemStacks > 64 + while (stacksize >= 64) { + tmpItem.stackSize = 64; + addOutput(tmpItem); + stacksize -= 64; + } + tmpItem.stackSize = stacksize; + addOutput(tmpItem); + + } + } + + recipeInProgress = true; + } + if (new HashSet<>(Arrays.asList(inputFluids)).containsAll(inputPlasmas)) { + return CheckRecipeResultRegistry.SUCCESSFUL; + } + return SimpleCheckRecipeResult.ofFailure("waiting_for_inputs"); + } + + @NotNull + @Override + protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { + wirelessEUt = (long) recipe.mEUt * maxParallel; + if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { + return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); + } + addToPowerTally( + BigInteger.valueOf(calculatedEut) + .multiply(BigInteger.valueOf(duration))); + addToRecipeTally(calculatedParallels); + EUt = calculatedEut; + setCalculatedEut(0); + tempRecipeMap = emptyRecipeMap; + recipeInProgress = false; + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @Nonnull + @Override + protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { + return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) + .setDurationDecreasePerOC(getOverclockTimeFactor()); + } + + }; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(Long.MAX_VALUE); + logic.setAvailableAmperage(Integer.MAX_VALUE); + logic.setAmperageOC(false); + logic.setSpeedBonus(getSpeedBonus()); + logic.setEuModifier(getEnergyDiscount()); + } + + @Override + public RecipeMap<?> getRecipeMap() { + return godforgeExoticMatterRecipes; + } + + private FluidStack[] getRandomFluidInputs(HashMap<FluidStack, Integer> fluidMap, int numberOfFluids) { + int cumulativeWeight = 0; + + List<Map.Entry<FluidStack, Integer>> fluidEntryList = new ArrayList<>(fluidMap.entrySet()); + + List<Integer> cumulativeWeights = new ArrayList<>(); + for (Map.Entry<FluidStack, Integer> entry : fluidEntryList) { + cumulativeWeight += entry.getValue(); + cumulativeWeights.add(cumulativeWeight); + } + + List<FluidStack> pickedFluids = new ArrayList<>(); + for (int i = 0; i < numberOfFluids; i++) { + int randomWeight = getRandomIntInRange(1, cumulativeWeight); + // Find the corresponding FluidStack based on randomWeight + for (int j = 0; j < cumulativeWeights.size(); j++) { + if (randomWeight <= cumulativeWeights.get(j)) { + FluidStack pickedFluid = fluidEntryList.get(j) + .getKey(); + // prevent duplicates + if (pickedFluids.contains(pickedFluid)) { + i--; + break; + } + pickedFluids.add(pickedFluid); + break; + } + } + } + + return pickedFluids.toArray(new FluidStack[0]); + + } + + private ItemStack[] getRandomItemInputs(HashMap<ItemStack, Integer> itemMap, int numberOfItems) { + int cumulativeWeight = 0; + + List<Map.Entry<ItemStack, Integer>> itemEntryList = new ArrayList<>(itemMap.entrySet()); + + List<Integer> cumulativeWeights = new ArrayList<>(); + for (Map.Entry<ItemStack, Integer> entry : itemEntryList) { + cumulativeWeight += entry.getValue(); + cumulativeWeights.add(cumulativeWeight); + } + + List<ItemStack> pickedItems = new ArrayList<>(); + for (int i = 0; i < numberOfItems; i++) { + int randomWeight = getRandomIntInRange(1, cumulativeWeight); + // Find the corresponding ItemStack based on randomWeight + for (int j = 0; j < cumulativeWeights.size(); j++) { + if (randomWeight <= cumulativeWeights.get(j)) { + ItemStack pickedItem = itemEntryList.get(j) + .getKey(); + // prevent duplicates + if (pickedItems.contains(pickedItem)) { + i--; + break; + } + pickedItems.add(pickedItem); + break; + } + } + } + return pickedItems.toArray(new ItemStack[0]); + + } + + private FluidStack[] convertItemToPlasma(ItemStack[] items, long multiplier) { + List<FluidStack> plasmas = new ArrayList<>(); + + for (ItemStack itemStack : items) { + String dict = OreDictionary.getOreName(OreDictionary.getOreIDs(itemStack)[0]); + // substring 8 because dustTiny is 8 characters long and there is no other possible oreDict + String strippedOreDict = dict.substring(8); + plasmas.add( + FluidRegistry.getFluidStack( + "plasma." + strippedOreDict.toLowerCase(), + (int) (INGOTS * multiplier * itemStack.stackSize))); + } + + return plasmas.toArray(new FluidStack[0]); + } + + private FluidStack[] convertFluidToPlasma(FluidStack[] fluids, long multiplier) { + List<FluidStack> plasmas = new ArrayList<>(); + + for (FluidStack fluidStack : fluids) { + String[] fluidName = fluidStack.getUnlocalizedName() + .split("\\."); + plasmas.add( + FluidRegistry.getFluidStack( + "plasma." + fluidName[fluidName.length - 1], + (int) (multiplier * fluidStack.amount))); + } + + return plasmas.toArray(new FluidStack[0]); + } + + @Override + public boolean supportsSingleRecipeLocking() { + return false; + } + + @Override + public boolean supportsBatchMode() { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound NBT) { + + NBT.setBoolean("recipeInProgress", recipeInProgress); + NBT.setBoolean("magmatterMode", magmatterMode); + + // Store damage values/stack sizes of input plasmas + NBTTagCompound fluidStackListNBTTag = new NBTTagCompound(); + fluidStackListNBTTag.setLong("numberOfPlasmas", inputPlasmas.size()); + + int indexFluids = 0; + for (FluidStack fluidStack : inputPlasmas) { + // Save fluid amount to NBT + fluidStackListNBTTag.setLong(indexFluids + "fluidAmount", fluidStack.amount); + + // Save FluidStack to NBT + NBT.setTag(indexFluids + "fluidStack", fluidStack.writeToNBT(new NBTTagCompound())); + + indexFluids++; + } + + NBT.setTag("inputPlasmas", fluidStackListNBTTag); + super.saveNBTData(NBT); + } + + @Override + public void loadNBTData(final NBTTagCompound NBT) { + + recipeInProgress = NBT.getBoolean("recipeInProgress"); + magmatterMode = NBT.getBoolean("magmatterMode"); + + // Load damage values/fluid amounts of input plasmas and convert back to fluids + NBTTagCompound tempFluidTag = NBT.getCompoundTag("inputPlasmas"); + + // Iterate over all stored fluids + for (int indexFluids = 0; indexFluids < tempFluidTag.getLong("numberOfPlasmas"); indexFluids++) { + + // Load fluid amount from NBT + int fluidAmount = tempFluidTag.getInteger(indexFluids + "fluidAmount"); + + // Load FluidStack from NBT + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(NBT.getCompoundTag(indexFluids + "fluidStack")); + + inputPlasmas.add(new FluidStack(fluidStack, fluidAmount)); + } + FluidStack outputFluid = MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000); + + if (magmatterMode) { + outputFluid = MaterialsUEVplus.MagMatter.getMolten(144); + } + + tempRecipeMap.add( + new GT_Recipe( + false, + null, + null, + null, + null, + inputPlasmas.toArray(new FluidStack[0]), + new FluidStack[] { outputFluid }, + 10 * SECONDS, + (int) TierEU.RECIPE_MAX, + 0)); + + super.loadNBTData(NBT); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + builder.widget(magmatterSwitch(builder)); + + } + + protected ButtonWidget magmatterSwitch(IWidgetBuilder<?> builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { + if (isMagmatterCapable) { + magmatterMode = !magmatterMode; + } + }) + .setPlayClickSound(isMagmatterCapable) + .setBackground(() -> { + List<UITexture> ret = new ArrayList<>(); + if (isMagmatterModeOn()) { + ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); + if (isMagmatterCapable) { + ret.add(GT_UITextures.OVERLAY_BUTTON_CHECKMARK); + } else { + ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE); + } + } else { + ret.add(GT_UITextures.BUTTON_STANDARD); + if (isMagmatterCapable) { + ret.add(GT_UITextures.OVERLAY_BUTTON_CROSS); + } else { + ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE); + } + } + if (!isMagmatterCapable) { + ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE); + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isMagmatterModeOn, this::setMagmatterMode), builder) + .addTooltip(translateToLocal("fog.button.magmattermode.tooltip.01")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 91) + .setSize(16, 16) + .attachSyncer( + new FakeSyncWidget.BooleanSyncer(() -> isMagmatterCapable, this::setMagmatterCapable), + builder); + if (!isMagmatterCapable) { + button.addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.magmattermode.tooltip.02")); + } + return (ButtonWidget) button; + } + + public boolean isMagmatterModeOn() { + return magmatterMode; + } + + private void setMagmatterMode(boolean enabled) { + magmatterMode = enabled; + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Exotic Matter Producer") + .addInfo("Controller block of the Quark Gluon Plasma Module") + .addInfo("Uses a Star to to turn Items into Quark Gluon Plasma") + .addSeparator() + .beginStructureBlock(1, 4, 2, false) + .addEnergyHatch("Any Infinite Spacetime Casing", 1) + .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) + .toolTipFinisher(CommonValues.GODFORGE_MARK); + return tt; + } + + @Override + public String[] getInfoData() { + ArrayList<String> str = new ArrayList<>(); + str.add( + "Progress: " + GREEN + + GT_Utility.formatNumbers(mProgresstime / 20) + + RESET + + " s / " + + YELLOW + + GT_Utility.formatNumbers(mMaxProgresstime / 20) + + RESET + + " s"); + str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t"); + str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); + str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(getMaxParallel())); + str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); + str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); + str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); + return str.toArray(new String[0]); + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java new file mode 100644 index 0000000000..cfd0548f9e --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java @@ -0,0 +1,227 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; + +import static gregtech.api.util.GT_OreDictUnificator.getAssociation; +import static gregtech.api.util.GT_ParallelHelper.addFluidsLong; +import static gregtech.api.util.GT_ParallelHelper.addItemsLong; +import static gregtech.api.util.GT_RecipeBuilder.BUCKETS; +import static gregtech.api.util.GT_RecipeBuilder.INGOTS; +import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static gregtech.common.misc.WirelessNetworkManager.getUserEU; +import static net.minecraft.util.EnumChatFormatting.GREEN; +import static net.minecraft.util.EnumChatFormatting.RED; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.YELLOW; + +import java.math.BigInteger; +import java.util.ArrayList; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.util.CommonValues; + +import gregtech.api.enums.Materials; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.objects.ItemData; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_OverclockCalculator; +import gregtech.api.util.GT_ParallelHelper; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Utility; + +public class GT_MetaTileEntity_EM_MoltenModule extends GT_MetaTileEntity_EM_BaseModule { + + private long EUt = 0; + private int currentParallel = 0; + + public GT_MetaTileEntity_EM_MoltenModule(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_MoltenModule(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_MoltenModule(mName); + } + + long wirelessEUt = 0; + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + private FluidStack[] meltableItems; + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { + + if (recipe.mSpecialValue > getHeat()) { + return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); + } + wirelessEUt = (long) recipe.mEUt * getMaxParallel(); + if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) { + return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); + } + + meltableItems = new FluidStack[recipe.mOutputs.length]; + for (int i = 0; i < recipe.mOutputs.length; i++) { + ItemStack item = recipe.getOutput(i); + if (item == null) { + continue; + } + // if this is null it has to be a gt++ material + ItemData data = getAssociation(item); + Materials mat = data == null ? null : data.mMaterial.mMaterial; + if (mat != null) { + if (mat.mStandardMoltenFluid != null) { + meltableItems[i] = mat.getMolten(INGOTS); + } else if (mat.mFluid != null) { + meltableItems[i] = mat.getFluid(BUCKETS); + } + } else { + String dict = OreDictionary.getOreName(OreDictionary.getOreIDs(item)[0]); + // substring 8 because ingotHot is 8 characters long + String strippedOreDict = dict.substring(8); + meltableItems[i] = FluidRegistry + .getFluidStack("molten." + strippedOreDict.toLowerCase(), INGOTS); + } + } + + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @Nonnull + @Override + protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { + return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) + .setRecipeHeat(recipe.mSpecialValue) + .setHeatOC(true) + .setHeatDiscount(true) + .setMachineHeat(getHeatForOC()) + .setHeatDiscountMultiplier(getHeatEnergyDiscount()) + .setDurationDecreasePerOC(getOverclockTimeFactor()); + + } + + @NotNull + @Override + protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { + if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { + return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration); + } + addToPowerTally( + BigInteger.valueOf(calculatedEut) + .multiply(BigInteger.valueOf(duration))); + addToRecipeTally(calculatedParallels); + currentParallel = calculatedParallels; + EUt = calculatedEut; + setCalculatedEut(0); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @Nonnull + @Override + protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) { + return super.createParallelHelper(recipe).setCustomItemOutputCalculation(currentParallel -> { + ArrayList<ItemStack> outputItems = new ArrayList<>(); + for (int i = 0; i < recipe.mOutputs.length; i++) { + ItemStack item = recipe.getOutput(i); + if (item == null || meltableItems[i] != null) { + continue; + } + ItemStack itemToAdd = item.copy(); + addItemsLong(outputItems, itemToAdd, (long) item.stackSize * currentParallel); + } + return outputItems.toArray(new ItemStack[0]); + }) + .setCustomFluidOutputCalculation(currentParallel -> { + ArrayList<FluidStack> fluids = new ArrayList<>(); + + for (int i = 0; i < recipe.mOutputs.length; i++) { + FluidStack fluid = meltableItems[i]; + if (fluid == null) { + continue; + } + FluidStack fluidToAdd = fluid.copy(); + long fluidAmount = (long) fluidToAdd.amount * recipe.mOutputs[i].stackSize + * currentParallel; + addFluidsLong(fluids, fluidToAdd, fluidAmount); + } + + for (int i = 0; i < recipe.mFluidOutputs.length; i++) { + FluidStack fluid = recipe.getFluidOutput(i); + if (fluid == null) { + continue; + } + FluidStack fluidToAdd = fluid.copy(); + addFluidsLong(fluids, fluidToAdd, (long) fluidToAdd.amount * currentParallel); + } + return fluids.toArray(new FluidStack[0]); + }); + } + }; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(Long.MAX_VALUE); + logic.setAvailableAmperage(Integer.MAX_VALUE); + logic.setAmperageOC(false); + logic.setMaxParallel(getMaxParallel()); + logic.setSpeedBonus(getSpeedBonus()); + logic.setEuModifier(getEnergyDiscount()); + } + + @Override + public String[] getInfoData() { + ArrayList<String> str = new ArrayList<>(); + str.add( + "Progress: " + GREEN + + GT_Utility.formatNumbers(mProgresstime / 20) + + RESET + + " s / " + + YELLOW + + GT_Utility.formatNumbers(mMaxProgresstime / 20) + + RESET + + " s"); + str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t"); + str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); + str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel)); + str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat())); + str.add(YELLOW + "Effective Heat Capacity: " + RESET + formatNumbers(getHeatForOC())); + str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); + str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); + str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); + return str.toArray(new String[0]); + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Blast Furnace") + .addInfo("Controller block of the Molten Module") + .addInfo("Uses a Star to to melt Metals") + .addSeparator() + .beginStructureBlock(1, 4, 2, false) + .addEnergyHatch("Any Infinite Spacetime Casing", 1) + .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) + .toolTipFinisher(CommonValues.GODFORGE_MARK); + return tt; + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java new file mode 100644 index 0000000000..8143c6fea4 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java @@ -0,0 +1,226 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; + +import static com.github.technus.tectech.recipe.TecTechRecipeMaps.godforgePlasmaRecipes; +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static gregtech.common.misc.WirelessNetworkManager.getUserEU; +import static net.minecraft.util.EnumChatFormatting.GREEN; +import static net.minecraft.util.EnumChatFormatting.RED; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.YELLOW; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Objects; + +import javax.annotation.Nonnull; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.math.Color; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; + +import gregtech.api.enums.SoundResource; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.check.SimpleCheckRecipeResult; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_OverclockCalculator; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Utility; + +public class GT_MetaTileEntity_EM_PlasmaModule extends GT_MetaTileEntity_EM_BaseModule { + + private long EUt = 0; + private int currentParallel = 0; + private boolean debug = true; + private int inputMaxParallel = 0; + + public GT_MetaTileEntity_EM_PlasmaModule(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_PlasmaModule(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_PlasmaModule(mName); + } + + long wirelessEUt = 0; + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { + wirelessEUt = (long) recipe.mEUt * getMaxParallel(); + if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) { + return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); + } + if (recipe.mSpecialValue > getPlasmaTier() + || Objects.equals(recipe.mSpecialItems.toString(), "true") && !isMultiStepPlasmaCapable) { + return SimpleCheckRecipeResult.ofFailure("missing_upgrades"); + } + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @NotNull + @Override + protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { + wirelessEUt = (long) recipe.mEUt * maxParallel; + if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { + return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); + } + addToPowerTally( + BigInteger.valueOf(calculatedEut) + .multiply(BigInteger.valueOf(duration))); + addToRecipeTally(calculatedParallels); + currentParallel = calculatedParallels; + EUt = calculatedEut; + setCalculatedEut(0); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @Nonnull + @Override + protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { + return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) + .setDurationDecreasePerOC(getOverclockTimeFactor()); + } + }; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(Long.MAX_VALUE); + logic.setAvailableAmperage(Integer.MAX_VALUE); + logic.setAmperageOC(false); + logic.setMaxParallel(getMaxParallel()); + logic.setSpeedBonus(getSpeedBonus()); + logic.setEuModifier(getEnergyDiscount()); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + if (debug) { + builder.widget(createTestButton(builder)) + .widget(createTestButton2()) + .widget(createTestButton3()); + } + } + + protected Widget createTestButton(IWidgetBuilder<?> builder) { + return new ButtonWidget() + .setOnClick((clickData, widget) -> isMultiStepPlasmaCapable = !isMultiStepPlasmaCapable) + .setPlayClickSoundResource( + () -> isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation + : SoundResource.GUI_BUTTON_DOWN.resourceLocation) + .setBackground(() -> { + if (isMultiStepPlasmaCapable) { + return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED, + GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON }; + } else { + return new IDrawable[] { GT_UITextures.BUTTON_STANDARD, + GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF }; + } + }) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isAllowedToWork, val -> { + if (val) enableWorking(); + else disableWorking(); + }), builder) + .addTooltip("multi-step") + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 100) + .setSize(16, 16); + } + + protected Widget createTestButton2() { + return new TextFieldWidget().setSetterInt(this::setPlasmaTier) + .setGetterInt(this::getPlasmaTier) + .setNumbers(0, 2) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setPos(3, 18) + .addTooltip("fusion tier") + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setSize(16, 16) + .setPos(174, 80) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD); + } + + protected Widget createTestButton3() { + return new TextFieldWidget().setSetterInt(val -> inputMaxParallel = val) + .setGetterInt(() -> inputMaxParallel) + .setNumbers(0, Integer.MAX_VALUE) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setPos(3, 18) + .addTooltip("parallel") + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setSize(70, 16) + .setPos(174, 60) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD); + } + + @Override + public RecipeMap<?> getRecipeMap() { + return godforgePlasmaRecipes; + } + + @Override + public String[] getInfoData() { + ArrayList<String> str = new ArrayList<>(); + str.add( + "Progress: " + GREEN + + GT_Utility.formatNumbers(mProgresstime / 20) + + RESET + + " s / " + + YELLOW + + GT_Utility.formatNumbers(mMaxProgresstime / 20) + + RESET + + " s"); + str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t"); + str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); + str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel)); + str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); + str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); + str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); + return str.toArray(new String[0]); + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Plasma Fabricator") + .addInfo("Controller block of the Plasma Module") + .addInfo("Uses a Star to to turn Metals into Plasma") + .addSeparator() + .beginStructureBlock(1, 4, 2, false) + .addEnergyHatch("Any Infinite Spacetime Casing", 1) + .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) + .toolTipFinisher(CommonValues.GODFORGE_MARK); + return tt; + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java new file mode 100644 index 0000000000..ee77d7cc95 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java @@ -0,0 +1,228 @@ +package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules; + +import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; +import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; +import static gregtech.common.misc.WirelessNetworkManager.getUserEU; +import static net.minecraft.util.EnumChatFormatting.GREEN; +import static net.minecraft.util.EnumChatFormatting.RED; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.YELLOW; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import javax.annotation.Nonnull; + +import net.minecraft.nbt.NBTTagCompound; + +import org.jetbrains.annotations.NotNull; + +import com.github.technus.tectech.util.CommonValues; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; + +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.ProcessingLogic; +import gregtech.api.recipe.RecipeMap; +import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_OverclockCalculator; +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_Utility; + +public class GT_MetaTileEntity_EM_SmeltingModule extends GT_MetaTileEntity_EM_BaseModule { + + private long EUt = 0; + private long currentParallel = 0; + private boolean furnaceMode = false; + + public GT_MetaTileEntity_EM_SmeltingModule(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_EM_SmeltingModule(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_EM_SmeltingModule(mName); + } + + @Override + public RecipeMap<?> getRecipeMap() { + return furnaceMode ? RecipeMaps.furnaceRecipes : RecipeMaps.blastFurnaceRecipes; + } + + @Nonnull + @Override + public Collection<RecipeMap<?>> getAvailableRecipeMaps() { + return Arrays.asList(RecipeMaps.blastFurnaceRecipes, RecipeMaps.furnaceRecipes); + } + + long wirelessEUt = 0; + + @Override + protected ProcessingLogic createProcessingLogic() { + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) { + + if (recipe.mSpecialValue > getHeat()) { + return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); + } + + wirelessEUt = (long) recipe.mEUt * getMaxParallel(); + if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) { + return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); + } + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @NotNull + @Override + protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) { + if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { + return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration); + } + addToPowerTally( + BigInteger.valueOf(calculatedEut) + .multiply(BigInteger.valueOf(duration))); + if (!furnaceMode) { + addToRecipeTally(calculatedParallels); + } + currentParallel = calculatedParallels; + EUt = calculatedEut; + setCalculatedEut(0); + return CheckRecipeResultRegistry.SUCCESSFUL; + } + + @Nonnull + @Override + protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) { + return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) + .setRecipeHeat(recipe.mSpecialValue) + .setHeatOC(true) + .setHeatDiscount(true) + .setMachineHeat(getHeatForOC()) + .setHeatDiscountMultiplier(getHeatEnergyDiscount()) + .setDurationDecreasePerOC(getOverclockTimeFactor()); + } + }; + } + + @Override + protected void setProcessingLogicPower(ProcessingLogic logic) { + logic.setAvailableVoltage(Long.MAX_VALUE); + logic.setAvailableAmperage(Integer.MAX_VALUE); + logic.setAmperageOC(false); + logic.setMaxParallel(getMaxParallel()); + logic.setSpeedBonus(getSpeedBonus()); + logic.setEuModifier(getEnergyDiscount()); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + super.addUIWidgets(builder, buildContext); + builder.widget(furnaceSwitch(builder)); + + } + + protected ButtonWidget furnaceSwitch(IWidgetBuilder<?> builder) { + Widget button = new ButtonWidget().setOnClick((clickData, widget) -> furnaceMode = !furnaceMode) + .setPlayClickSound(true) + .setBackground(() -> { + List<UITexture> ret = new ArrayList<>(); + if (isFurnaceModeOn()) { + ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED); + ret.add(GT_UITextures.OVERLAY_BUTTON_CHECKMARK); + } else { + ret.add(GT_UITextures.BUTTON_STANDARD); + ret.add(GT_UITextures.OVERLAY_BUTTON_CROSS); + + } + return ret.toArray(new IDrawable[0]); + }) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isFurnaceModeOn, this::setFurnaceMode), builder) + .addTooltip(translateToLocal("fog.button.furnacemode.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(174, 91) + .setSize(16, 16); + return (ButtonWidget) button; + } + + private boolean isFurnaceModeOn() { + return furnaceMode; + } + + private void setFurnaceMode(boolean enabled) { + furnaceMode = enabled; + } + + @Override + public void saveNBTData(NBTTagCompound NBT) { + NBT.setBoolean("furnaceMode", furnaceMode); + super.saveNBTData(NBT); + } + + @Override + public void loadNBTData(final NBTTagCompound NBT) { + furnaceMode = NBT.getBoolean("furnaceMode"); + super.loadNBTData(NBT); + } + + @Override + public String[] getInfoData() { + ArrayList<String> str = new ArrayList<>(); + str.add( + "Progress: " + GREEN + + GT_Utility.formatNumbers(mProgresstime / 20) + + RESET + + " s / " + + YELLOW + + GT_Utility.formatNumbers(mMaxProgresstime / 20) + + RESET + + " s"); + str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t"); + str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); + str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel)); + str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat())); + str.add(YELLOW + "Effective Heat Capacity: " + RESET + formatNumbers(getHeatForOC())); + str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); + str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); + str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); + return str.toArray(new String[0]); + } + + @Override + public GT_Multiblock_Tooltip_Builder createTooltip() { + final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Blast Furnace, Furnace") + .addInfo("Controller block of the Smelting Module") + .addInfo("Uses a Star to Smelt Metals") + .addSeparator() + .beginStructureBlock(1, 4, 2, false) + .addEnergyHatch("Any Infinite Spacetime Casing", 1) + .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) + .toolTipFinisher(CommonValues.GODFORGE_MARK); + return tt; + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Data.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Data.java new file mode 100644 index 0000000000..6ba5dd753c --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Data.java @@ -0,0 +1,52 @@ +package com.github.technus.tectech.thing.metaTileEntity.pipe; + +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.ArrayUtils; + +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class GT_MetaTileEntity_PipeBlock_Data extends GT_MetaTileEntity_Pipe_Data { + + public GT_MetaTileEntity_PipeBlock_Data(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_PipeBlock_Data(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { + return new GT_MetaTileEntity_PipeBlock_Data(mName); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); + } + + @Override + public float getThickNess() { + return 1f; + } + + @Override + public float getExplosionResistance(ForgeDirection side) { + return 1000.0f; + } + + @Override + public String[] getDescription() { + return ArrayUtils.add( + super.getDescription(), + EnumChatFormatting.DARK_AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockmachines.pipe.desc.4")); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Energy.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Energy.java new file mode 100644 index 0000000000..469c5b786a --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_PipeBlock_Energy.java @@ -0,0 +1,52 @@ +package com.github.technus.tectech.thing.metaTileEntity.pipe; + +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.ArrayUtils; + +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class GT_MetaTileEntity_PipeBlock_Energy extends GT_MetaTileEntity_Pipe_Energy { + + public GT_MetaTileEntity_PipeBlock_Energy(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_PipeBlock_Energy(String aName) { + super(aName); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { + return new GT_MetaTileEntity_PipeBlock_Energy(mName); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + return AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1); + } + + @Override + public float getThickNess() { + return 1f; + } + + @Override + public float getExplosionResistance(ForgeDirection side) { + return 1000.0f; + } + + @Override + public String[] getDescription() { + return ArrayUtils.add( + super.getDescription(), + EnumChatFormatting.DARK_AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockmachines.pipe.desc.4")); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Data.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Data.java new file mode 100644 index 0000000000..b9428fcc1c --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Data.java @@ -0,0 +1,316 @@ +package com.github.technus.tectech.thing.metaTileEntity.pipe; + +import static gregtech.api.enums.Dyes.MACHINE_METAL; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.loader.NetworkDispatcher; +import com.github.technus.tectech.mechanics.pipe.IActivePipe; +import com.github.technus.tectech.mechanics.pipe.IConnectsToDataPipe; +import com.github.technus.tectech.mechanics.pipe.PipeActivityMessage; +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GT_Mod; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.MetaPipeEntity; +import gregtech.api.objects.GT_RenderedTexture; +import gregtech.common.GT_Client; + +/** + * Created by Tec on 26.02.2017. + */ +public class GT_MetaTileEntity_Pipe_Data extends MetaPipeEntity implements IConnectsToDataPipe, IActivePipe { + + private static Textures.BlockIcons.CustomIcon EMpipe; + private static Textures.BlockIcons.CustomIcon EMbar, EMbarActive; + public byte connectionCount = 0; + + private boolean active; + + public GT_MetaTileEntity_Pipe_Data(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, 0); + } + + public GT_MetaTileEntity_Pipe_Data(String aName) { + super(aName, 0); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { + return new GT_MetaTileEntity_Pipe_Data(mName); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + EMpipe = new Textures.BlockIcons.CustomIcon("iconsets/EM_DATA"); + EMbar = new Textures.BlockIcons.CustomIcon("iconsets/EM_BAR"); + EMbarActive = new Textures.BlockIcons.CustomIcon("iconsets/EM_BAR_ACTIVE"); + super.registerIcons(aBlockIconRegister); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections, + int colorIndex, boolean aConnected, boolean aRedstone) { + return new ITexture[] { new GT_RenderedTexture(EMpipe), + new GT_RenderedTexture( + getActive() ? EMbarActive : EMbar, + Dyes.getModulation(colorIndex, MACHINE_METAL.getRGBA())) }; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public void loadNBTData(NBTTagCompound nbtTagCompound) { + active = nbtTagCompound.getBoolean("eActive"); + } + + @Override + public void saveNBTData(NBTTagCompound nbtTagCompound) { + nbtTagCompound.setBoolean("eActive", active); + } + + @Override + public boolean renderInside(ForgeDirection side) { + return false; + } + + @Override + public byte getTileEntityBaseType() { + return 4; + } + + @Override + public String[] getDescription() { + return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.pipe.datastream.desc.0"), // Advanced + // data + // transmission + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockmachines.pipe.datastream.desc.1"), // Don't stare at the beam! + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.datastream.desc.2"), // Must be + // painted to + // work + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.datastream.desc.3") // Do not cross or + // split + }; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isClientSide()) { + NetworkDispatcher.INSTANCE.sendToServer(new PipeActivityMessage.PipeActivityQuery(this)); + } + onPostTick(aBaseMetaTileEntity, 31); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if ((aTick & 31) == 31) { + if (TecTech.RANDOM.nextInt(15) == 0) { + NetworkDispatcher.INSTANCE.sendToAllAround( + new PipeActivityMessage.PipeActivityData(this), + aBaseMetaTileEntity.getWorld().provider.dimensionId, + aBaseMetaTileEntity.getXCoord(), + aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord(), + 256); + } + if (active) { + active = false; + } + mConnections = 0; + connectionCount = 0; + byte myColor = aBaseMetaTileEntity.getColorization(); + if (aBaseMetaTileEntity.getColorization() < 0) { + return; + } + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + final ForgeDirection oppositeSide = side.getOpposite(); + TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side); + if (tTileEntity instanceof IConnectsToDataPipe) { + byte tColor = ((IConnectsToDataPipe) tTileEntity).getColorization(); + if (tColor != myColor) { + continue; + } + if (((IConnectsToDataPipe) tTileEntity).canConnectData(oppositeSide)) { + mConnections |= 1 << side.ordinal(); + connectionCount++; + } + } else if (tTileEntity instanceof IGregTechTileEntity) { + IMetaTileEntity meta = ((IGregTechTileEntity) tTileEntity).getMetaTileEntity(); + if (meta instanceof IConnectsToDataPipe) { + byte tColor = ((IConnectsToDataPipe) meta).getColorization(); + if (tColor != myColor) { + continue; + } + if (((IConnectsToDataPipe) meta).canConnectData(oppositeSide)) { + mConnections |= 1 << side.ordinal(); + connectionCount++; + } + } + } + } + } + } else if (aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) { + aBaseMetaTileEntity.issueTextureUpdate(); + } + } + + @Override + public boolean canConnectData(ForgeDirection side) { + return true; + } + + @Override + public IConnectsToDataPipe getNext(IConnectsToDataPipe source) { + if (connectionCount != 2) { + return null; + } + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if ((mConnections & 1 << side.ordinal()) == 0) { + continue; // if not connected continue + } + TileEntity next = getBaseMetaTileEntity().getTileEntityAtSide(side); + if (next instanceof IConnectsToDataPipe && next != source) { + if (((IConnectsToDataPipe) next).isDataInputFacing(side.getOpposite())) { + return (IConnectsToDataPipe) next; + } + } else if (next instanceof IGregTechTileEntity) { + IMetaTileEntity meta = ((IGregTechTileEntity) next).getMetaTileEntity(); + if (meta instanceof IConnectsToDataPipe connecsToPipe && meta != source) { + if (meta instanceof GT_MetaTileEntity_Pipe_Data pipeData && pipeData.connectionCount == 2) { + pipeData.markUsed(); + return connecsToPipe; + } + if (connecsToPipe.isDataInputFacing(side.getOpposite())) { + return connecsToPipe; + } + } + } + } + return null; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + float tSpace = (1f - 0.375f) / 2; + float tSide0 = tSpace; + float tSide1 = 1f - tSpace; + float tSide2 = tSpace; + float tSide3 = 1f - tSpace; + float tSide4 = tSpace; + float tSide5 = 1f - tSpace; + + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) { + tSide2 = tSide4 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide1 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) { + tSide0 = tSide4 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide1 = tSide3 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) { + tSide0 = tSide2 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + + byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; + if ((tConn & 1 << ForgeDirection.DOWN.ordinal()) != 0) { + tSide0 = 0f; + } + if ((tConn & 1 << ForgeDirection.UP.ordinal()) != 0) { + tSide1 = 1f; + } + if ((tConn & 1 << ForgeDirection.NORTH.ordinal()) != 0) { + tSide2 = 0f; + } + if ((tConn & 1 << ForgeDirection.SOUTH.ordinal()) != 0) { + tSide3 = 1f; + } + if ((tConn & 1 << ForgeDirection.WEST.ordinal()) != 0) { + tSide4 = 0f; + } + if ((tConn & 1 << ForgeDirection.EAST.ordinal()) != 0) { + tSide5 = 1f; + } + + return AxisAlignedBB + .getBoundingBox(aX + tSide4, aY + tSide0, aZ + tSide2, aX + tSide5, aY + tSide1, aZ + tSide3); + } + + @Override + public float getThickNess() { + if (GT_Mod.instance.isClientSide() && GT_Client.hideValue == 1) { + return 0.0625F; + } + return 0.375f; + } + + @Override + public boolean isDataInputFacing(ForgeDirection side) { + return true; + } + + @Override + public byte getColorization() { + return getBaseMetaTileEntity().getColorization(); + } + + @Override + public void markUsed() { + this.active = true; + } + + @Override + public void setActive(boolean state) { + if (state != active) { + active = state; + getBaseMetaTileEntity().issueTextureUpdate(); + } + } + + @Override + public boolean getActive() { + return active; + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Energy.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Energy.java new file mode 100644 index 0000000000..264bc77d4a --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/pipe/GT_MetaTileEntity_Pipe_Energy.java @@ -0,0 +1,285 @@ +package com.github.technus.tectech.thing.metaTileEntity.pipe; + +import static gregtech.api.enums.Dyes.MACHINE_METAL; +import static net.minecraft.util.StatCollector.translateToLocal; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.loader.NetworkDispatcher; +import com.github.technus.tectech.mechanics.pipe.IActivePipe; +import com.github.technus.tectech.mechanics.pipe.IConnectsToEnergyTunnel; +import com.github.technus.tectech.mechanics.pipe.PipeActivityMessage; +import com.github.technus.tectech.util.CommonValues; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.GT_Mod; +import gregtech.api.enums.Dyes; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IColoredTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.logic.PowerLogic; +import gregtech.api.logic.interfaces.PowerLogicHost; +import gregtech.api.metatileentity.BaseMetaPipeEntity; +import gregtech.api.metatileentity.MetaPipeEntity; +import gregtech.api.objects.GT_RenderedTexture; +import gregtech.common.GT_Client; + +public class GT_MetaTileEntity_Pipe_Energy extends MetaPipeEntity implements IConnectsToEnergyTunnel, IActivePipe { + + static Textures.BlockIcons.CustomIcon EMcandy, EMCandyActive; + private static Textures.BlockIcons.CustomIcon EMpipe; + public byte connectionCount = 0; + + private boolean active; + + public GT_MetaTileEntity_Pipe_Energy(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional, 0); + } + + public GT_MetaTileEntity_Pipe_Energy(String aName) { + super(aName, 0); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { + return new GT_MetaTileEntity_Pipe_Energy(mName); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + EMcandy = new Textures.BlockIcons.CustomIcon("iconsets/EM_CANDY"); + EMCandyActive = new Textures.BlockIcons.CustomIcon("iconsets/EM_CANDY_ACTIVE"); + EMpipe = new Textures.BlockIcons.CustomIcon("iconsets/EM_LASER"); + super.registerIcons(aBlockIconRegister); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, int aConnections, + int colorIndex, boolean aConnected, boolean aRedstone) { + return new ITexture[] { new GT_RenderedTexture(EMpipe), + new GT_RenderedTexture( + getActive() ? EMCandyActive : EMcandy, + Dyes.getModulation(colorIndex, MACHINE_METAL.getRGBA())) }; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public void loadNBTData(NBTTagCompound nbtTagCompound) { + active = nbtTagCompound.getBoolean("eActive"); + } + + @Override + public void saveNBTData(NBTTagCompound nbtTagCompound) { + nbtTagCompound.setBoolean("eActive", active); + } + + @Override + public boolean renderInside(ForgeDirection side) { + return false; + } + + @Override + public byte getTileEntityBaseType() { + return 4; + } + + @Override + public String[] getDescription() { + return new String[] { CommonValues.TEC_MARK_EM, translateToLocal("gt.blockmachines.pipe.energystream.desc.0"), // Laser + // tunneling + // device. + EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD + + translateToLocal("gt.blockmachines.pipe.energystream.desc.1"), // Bright Vacuum!!! + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.energystream.desc.2"), // Must be + // painted to + // work + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.pipe.energystream.desc.3") // Do not split + // or turn + }; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (getBaseMetaTileEntity().isClientSide()) { + NetworkDispatcher.INSTANCE.sendToServer(new PipeActivityMessage.PipeActivityQuery(this)); + } + onPostTick(aBaseMetaTileEntity, 31); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if ((aTick & 31) == 31) { + if (TecTech.RANDOM.nextInt(15) == 0) { + NetworkDispatcher.INSTANCE.sendToAllAround( + new PipeActivityMessage.PipeActivityData(this), + aBaseMetaTileEntity.getWorld().provider.dimensionId, + aBaseMetaTileEntity.getXCoord(), + aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord(), + 256); + } + if (active) { + active = false; + } + mConnections = 0; + connectionCount = 0; + if (aBaseMetaTileEntity.getColorization() < 0) { + return; + } + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + final ForgeDirection oppositeSide = side.getOpposite(); + // if (!aBaseMetaTileEntity.getCoverBehaviorAtSide(b0).alwaysLookConnected(b0, + // aBaseMetaTileEntity.getCoverIDAtSide(b0), aBaseMetaTileEntity.getCoverDataAtSide(b0), + // aBaseMetaTileEntity)) { + TileEntity tTileEntity = aBaseMetaTileEntity.getTileEntityAtSide(side); + if (tTileEntity instanceof IColoredTileEntity) { + // if (aBaseMetaTileEntity.getColorization() >= 0) { + byte tColor = ((IColoredTileEntity) tTileEntity).getColorization(); + if (tColor != aBaseMetaTileEntity.getColorization()) { + continue; + } + // } + } + if (tTileEntity instanceof PowerLogicHost) { + PowerLogic logic = ((PowerLogicHost) tTileEntity).getPowerLogic(oppositeSide); + if (logic != null && logic.canUseLaser()) { + mConnections |= 1 << side.ordinal(); + connectionCount++; + continue; + } + } + if (tTileEntity instanceof IConnectsToEnergyTunnel + && ((IConnectsToEnergyTunnel) tTileEntity).canConnect(oppositeSide)) { + mConnections |= 1 << side.ordinal(); + connectionCount++; + } else if (tTileEntity instanceof IGregTechTileEntity + && ((IGregTechTileEntity) tTileEntity).getMetaTileEntity() instanceof IConnectsToEnergyTunnel) { + if (((IConnectsToEnergyTunnel) ((IGregTechTileEntity) tTileEntity).getMetaTileEntity()) + .canConnect(oppositeSide)) { + mConnections |= 1 << side.ordinal(); + connectionCount++; + } + } + } + } + + } else if (aBaseMetaTileEntity.isClientSide() && GT_Client.changeDetected == 4) { + aBaseMetaTileEntity.issueTextureUpdate(); + } + } + + @Override + public void setActive(boolean state) { + if (state != active) { + active = state; + getBaseMetaTileEntity().issueTextureUpdate(); + } + } + + @Override + public boolean getActive() { + return active; + } + + @Override + public void markUsed() { + this.active = true; + } + + @Override + public boolean canConnect(ForgeDirection side) { + return true; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ) { + float tSpace = (1f - 0.5f) / 2; + float tSide0 = tSpace; + float tSide1 = 1f - tSpace; + float tSide2 = tSpace; + float tSide3 = 1f - tSpace; + float tSide4 = tSpace; + float tSide5 = 1f - tSpace; + + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.DOWN) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.UP) != 0) { + tSide2 = tSide4 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.NORTH) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide1 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.SOUTH) != 0) { + tSide0 = tSide4 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.WEST) != 0) { + tSide0 = tSide2 = tSide4 = 0; + tSide1 = tSide3 = 1; + } + if (getBaseMetaTileEntity().getCoverIDAtSide(ForgeDirection.EAST) != 0) { + tSide0 = tSide2 = 0; + tSide1 = tSide3 = tSide5 = 1; + } + + byte tConn = ((BaseMetaPipeEntity) getBaseMetaTileEntity()).mConnections; + if ((tConn & 1 << ForgeDirection.DOWN.ordinal()) != 0) { + tSide0 = 0f; + } + if ((tConn & 1 << ForgeDirection.UP.ordinal()) != 0) { + tSide1 = 1f; + } + if ((tConn & 1 << ForgeDirection.NORTH.ordinal()) != 0) { + tSide2 = 0f; + } + if ((tConn & 1 << ForgeDirection.SOUTH.ordinal()) != 0) { + tSide3 = 1f; + } + if ((tConn & 1 << ForgeDirection.WEST.ordinal()) != 0) { + tSide4 = 0f; + } + if ((tConn & 1 << ForgeDirection.EAST.ordinal()) != 0) { + tSide5 = 1f; + } + + return AxisAlignedBB + .getBoundingBox(aX + tSide4, aY + tSide0, aZ + tSide2, aX + tSide5, aY + tSide1, aZ + tSide3); + } + + @Override + public float getThickNess() { + if (GT_Mod.instance.isClientSide() && GT_Client.hideValue == 1) { + return 0.0625F; + } + return 0.5f; + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_BuckConverter.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_BuckConverter.java new file mode 100644 index 0000000000..f8ed346fa9 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_BuckConverter.java @@ -0,0 +1,271 @@ +package com.github.technus.tectech.thing.metaTileEntity.single; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_POWER_TT; +import static com.github.technus.tectech.util.CommonValues.VN; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.function.Consumer; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; +import gregtech.api.objects.GT_RenderedTexture; + +public class GT_MetaTileEntity_BuckConverter extends GT_MetaTileEntity_TieredMachineBlock + implements IAddUIWidgets, IAddGregtechLogo { + + private static GT_RenderedTexture BUCK, BUCK_ACTIVE; + public int EUT = 0, AMP = 0; + private static NumberFormatMUI numberFormat = new NumberFormatMUI(); + + public GT_MetaTileEntity_BuckConverter(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.machine.tt.buck.desc.0"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.machine.tt.buck.desc.1"), }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_BuckConverter(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + TT_Utility.setTier(aTier, this); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_BuckConverter(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + BUCK = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/BUCK")); + BUCK_ACTIVE = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/BUCK_ACTIVE")); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1], + side == facing ? (aActive ? BUCK_ACTIVE : BUCK) + : (side == facing.getOpposite() ? OVERLAYS_ENERGY_IN_POWER_TT[mTier] + : (aActive ? OVERLAYS_ENERGY_OUT_POWER_TT[mTier] : OVERLAYS_ENERGY_IN_POWER_TT[mTier])) }; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setInteger("eEUT", EUT); + aNBT.setInteger("eAMP", AMP); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + EUT = aNBT.getInteger("eEUT"); + AMP = aNBT.getInteger("eAMP"); + getBaseMetaTileEntity().setActive((long) AMP * EUT >= 0); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isElectric() { + return true; + } + + @Override + public boolean isEnetOutput() { + return true; + } + + @Override + public boolean isEnetInput() { + return true; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return side == getBaseMetaTileEntity().getBackFacing(); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return getBaseMetaTileEntity().isActive() && side != getBaseMetaTileEntity().getFrontFacing() + && side != getBaseMetaTileEntity().getBackFacing(); + } + + @Override + public long maxAmperesIn() { + return 2; + } + + @Override + public long maxAmperesOut() { + return getBaseMetaTileEntity().isActive() ? Math.min(Math.abs(AMP), 64) : 0; + } + + @Override + public long maxEUInput() { + return CommonValues.V[mTier]; + } + + @Override + public long maxEUOutput() { + return getBaseMetaTileEntity().isActive() ? Math.min(Math.abs(EUT), maxEUInput()) : 0; + } + + @Override + public long maxEUStore() { + return CommonValues.V[mTier] << 4; + } + + @Override + public long getMinimumStoredEU() { + return CommonValues.V[mTier] << 2; + } + + @Override + public int getProgresstime() { + return (int) getBaseMetaTileEntity().getUniversalEnergyStored(); + } + + @Override + public int maxProgresstime() { + return (int) getBaseMetaTileEntity().getUniversalEnergyCapacity(); + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY) + .setSize(17, 17) + .setPos(113, 56)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) + .setSize(90, 72) + .setPos(43, 4)) + .widget( + new TextWidget().setStringSupplier(() -> "EUT: " + numberFormat.format(EUT)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 8)) + .widget( + new TextWidget().setStringSupplier(() -> "TIER: " + VN[TT_Utility.getTier(Math.abs(EUT))]) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 16)) + .widget( + new TextWidget().setStringSupplier(() -> "AMP: " + numberFormat.format(AMP)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 24)) + .widget( + new TextWidget().setStringSupplier(() -> "SUM: " + numberFormat.format((long) AMP * EUT)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 32)); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> EUT -= val, 512, 64, 7, 4); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> EUT /= val, 512, 64, 7, 22); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> AMP -= val, 512, 64, 7, 40); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> AMP /= val, 512, 64, 7, 58); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> EUT -= val, 16, 1, 25, 4); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> EUT /= val, 16, 2, 25, 22); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> AMP -= val, 16, 1, 25, 40); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> AMP /= val, 16, 2, 25, 58); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> EUT += val, 16, 1, 133, 4); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> EUT *= val, 16, 2, 133, 22); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> AMP += val, 16, 1, 133, 40); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> AMP *= val, 16, 2, 133, 58); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> EUT += val, 512, 64, 151, 4); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> EUT *= val, 512, 64, 151, 22); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> AMP += val, 512, 64, 151, 40); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> AMP *= val, 512, 64, 151, 58); + } + + private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter, + int changeNumberShift, int changeNumber, int xPos, int yPos) { + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + setter.accept(clickData.shift ? changeNumberShift : changeNumber); + getBaseMetaTileEntity().setActive((long) AMP * EUT >= 0); + }) + .setBackground(GT_UITextures.BUTTON_STANDARD, overlay) + .setSize(18, 18) + .setPos(xPos, yPos)); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPollutor.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPollutor.java new file mode 100644 index 0000000000..9e2a5ced60 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPollutor.java @@ -0,0 +1,246 @@ +package com.github.technus.tectech.thing.metaTileEntity.single; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.function.Consumer; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; +import gregtech.api.objects.GT_RenderedTexture; +import gregtech.common.GT_Pollution; + +/** + * Created by Tec on 23.03.2017. + */ +public class GT_MetaTileEntity_DebugPollutor extends GT_MetaTileEntity_TieredMachineBlock + implements IAddUIWidgets, IAddGregtechLogo { + + private static GT_RenderedTexture POLLUTOR; + public int pollution = 0; + private static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + public GT_MetaTileEntity_DebugPollutor(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.debug.tt.pollutor.desc.0"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.pollutor.desc.1"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.pollutor.desc.2") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_DebugPollutor(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + TT_Utility.setTier(aTier, this); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_DebugPollutor(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + POLLUTOR = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/POLLUTOR")); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1], + (side == facing) ? POLLUTOR : OVERLAYS_ENERGY_OUT_LASER_TT[mTier] }; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setInteger("ePollution", pollution); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + pollution = aNBT.getInteger("ePollution"); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + if (pollution > 0) { + GT_Pollution.addPollution(aBaseMetaTileEntity, pollution); + } + } else if (aBaseMetaTileEntity.isClientSide() && aBaseMetaTileEntity.isActive()) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aBaseMetaTileEntity.getFrontFacing()) { + TecTech.proxy.em_particle(aBaseMetaTileEntity, side); + TecTech.proxy.pollutor_particle(aBaseMetaTileEntity, side); + } + } + } + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isElectric() { + return false; + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY) + .setSize(17, 17) + .setPos(113, 56)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) + .setSize(90, 72) + .setPos(43, 4)) + .widget( + new TextWidget().setStringSupplier(() -> "Pollution: " + numberFormat.format(pollution)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 8)); + + addChangeNumberButton( + builder, + GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, + val -> pollution -= val, + 512, + 64, + 7, + 4); + addChangeNumberButton( + builder, + GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, + val -> pollution /= val, + 512, + 64, + 7, + 22); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> pollution -= val, 16, 1, 25, 4); + addChangeNumberButton( + builder, + GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, + val -> pollution /= val, + 16, + 2, + 25, + 22); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> pollution += val, 16, 1, 133, 4); + addChangeNumberButton( + builder, + GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, + val -> pollution *= val, + 16, + 2, + 133, + 22); + + addChangeNumberButton( + builder, + GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, + val -> pollution += val, + 512, + 64, + 151, + 4); + addChangeNumberButton( + builder, + GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, + val -> pollution *= val, + 512, + 64, + 151, + 22); + + } + + private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter, + int changeNumberShift, int changeNumber, int xPos, int yPos) { + builder.widget( + new ButtonWidget() + .setOnClick((clickData, widget) -> setter.accept(clickData.shift ? changeNumberShift : changeNumber)) + .setBackground(GT_UITextures.BUTTON_STANDARD, overlay) + .setSize(18, 18) + .setPos(xPos, yPos)); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPowerGenerator.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPowerGenerator.java new file mode 100644 index 0000000000..342ca69864 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugPowerGenerator.java @@ -0,0 +1,392 @@ +package com.github.technus.tectech.thing.metaTileEntity.single; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_LASER_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_LASER_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_POWER_TT; +import static com.github.technus.tectech.util.CommonValues.TRANSFER_AT; +import static com.github.technus.tectech.util.CommonValues.VN; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.function.Consumer; +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.mechanics.pipe.IConnectsToEnergyTunnel; +import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_EnergyTunnel; +import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Energy; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizons.modularui.api.NumberFormatMUI; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; +import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; +import gregtech.api.objects.GT_RenderedTexture; +import gregtech.api.util.GT_Utility; + +/** + * Created by Tec on 23.03.2017. + */ +public class GT_MetaTileEntity_DebugPowerGenerator extends GT_MetaTileEntity_TieredMachineBlock + implements IConnectsToEnergyTunnel, IAddUIWidgets, IAddGregtechLogo { + + public static GT_RenderedTexture GENNY; + private boolean LASER = false; + public int EUT = 0, AMP = 0; + public boolean producing = true; + private static final NumberFormatMUI numberFormat = new NumberFormatMUI(); + + public GT_MetaTileEntity_DebugPowerGenerator(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.debug.tt.genny.desc.0"), + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.debug.tt.genny.desc.3"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.genny.desc.1"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.genny.desc.2") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_DebugPowerGenerator(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + TT_Utility.setTier(aTier, this); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_DebugPowerGenerator(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + LASER = !LASER; + GT_Utility.sendChatToPlayer( + aPlayer, + String.format(StatCollector.translateToLocal("tt.chat.debug.generator"), LASER ? "ON" : "OFF")); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + GENNY = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/GENNY")); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1], + side != facing + ? LASER ? (aActive ? OVERLAYS_ENERGY_OUT_LASER_TT[mTier] : OVERLAYS_ENERGY_IN_LASER_TT[mTier]) + : (aActive ? OVERLAYS_ENERGY_OUT_POWER_TT[mTier] : OVERLAYS_ENERGY_IN_POWER_TT[mTier]) + : GENNY }; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setInteger("eEUT", EUT); + aNBT.setInteger("eAMP", AMP); + aNBT.setBoolean("eLaser", LASER); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + EUT = aNBT.getInteger("eEUT"); + AMP = aNBT.getInteger("eAMP"); + LASER = aNBT.getBoolean("eLaser"); + producing = (long) AMP * EUT >= 0; + getBaseMetaTileEntity().setActive(producing); + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide()) { + aBaseMetaTileEntity.setActive(producing); + if (!LASER) { + if (aBaseMetaTileEntity.isActive()) { + setEUVar(maxEUStore()); + } else { + setEUVar(0); + } + } else { + byte Tick = (byte) (aTick % 20); + if (aBaseMetaTileEntity.isActive() && TRANSFER_AT == Tick) { + setEUVar(maxEUStore()); + moveAround(aBaseMetaTileEntity); + } else if (TRANSFER_AT == Tick) { + setEUVar(0); + } + } + } + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isElectric() { + return true; + } + + @Override + public boolean isEnetOutput() { + return !LASER; + } + + @Override + public boolean isEnetInput() { + return !LASER; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return !producing && side != getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return producing && side != getBaseMetaTileEntity().getFrontFacing(); + } + + @Override + public long maxAmperesIn() { + return producing ? 0 : Math.abs(AMP); + } + + @Override + public long maxAmperesOut() { + return producing ? Math.abs(AMP) : 0; + } + + @Override + public long maxEUInput() { + return producing ? 0 : Integer.MAX_VALUE; + } + + @Override + public long maxEUOutput() { + return producing ? Math.abs(EUT) : 0; + } + + @Override + public long maxEUStore() { + return LASER ? Math.abs((long) EUT * AMP * 24) : Math.abs((long) EUT * AMP) << 2; + } + + @Override + public long getMinimumStoredEU() { + return Math.abs((long) EUT * AMP); + } + + @Override + public int getProgresstime() { + return (int) getBaseMetaTileEntity().getUniversalEnergyStored(); + } + + @Override + public int maxProgresstime() { + return (int) getBaseMetaTileEntity().getUniversalEnergyCapacity(); + } + + public int getEUT() { + return EUT; + } + + public void setEUT(int EUT) { + this.EUT = EUT; + } + + public int getAMP() { + return AMP; + } + + public void setAMP(int AMP) { + this.AMP = AMP; + } + + @Override + public boolean canConnect(ForgeDirection side) { + return LASER && side != getBaseMetaTileEntity().getFrontFacing(); + } + + private void moveAround(IGregTechTileEntity aBaseMetaTileEntity) { + for (final ForgeDirection face : ForgeDirection.VALID_DIRECTIONS) { + if (face == aBaseMetaTileEntity.getFrontFacing()) continue; + final ForgeDirection opposite = face.getOpposite(); + for (short dist = 1; dist < 1000; dist++) { + IGregTechTileEntity tGTTileEntity = aBaseMetaTileEntity + .getIGregTechTileEntityAtSideAndDistance(face, dist); + if (tGTTileEntity != null) { + IMetaTileEntity aMetaTileEntity = tGTTileEntity.getMetaTileEntity(); + if (aMetaTileEntity != null) { + if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_EnergyTunnel + && opposite == tGTTileEntity.getFrontFacing()) { + if (maxEUOutput() > ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUInput()) { + aMetaTileEntity.doExplosion(maxEUOutput()); + } else { + long diff = Math.min( + AMP * 20L * maxEUOutput(), + Math.min( + ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).maxEUStore() + - aMetaTileEntity.getBaseMetaTileEntity() + .getStoredEU(), + aBaseMetaTileEntity.getStoredEU())); + ((GT_MetaTileEntity_Hatch_EnergyTunnel) aMetaTileEntity).setEUVar( + aMetaTileEntity.getBaseMetaTileEntity() + .getStoredEU() + diff); + } + } else if (aMetaTileEntity instanceof GT_MetaTileEntity_Pipe_Energy) { + if (((GT_MetaTileEntity_Pipe_Energy) aMetaTileEntity).connectionCount < 2) {} else { + ((GT_MetaTileEntity_Pipe_Energy) aMetaTileEntity).markUsed(); + } + } + } + } + } + } + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY) + .setSize(17, 17) + .setPos(113, 56)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) + .setSize(90, 72) + .setPos(43, 4)) + + .widget( + new TextWidget().setStringSupplier(() -> "TIER: " + VN[TT_Utility.getTier(Math.abs(EUT))]) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 22)) + + .widget( + new TextWidget().setStringSupplier(() -> "SUM: " + numberFormat.format((long) AMP * EUT)) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 46)); + + addLabelledIntegerTextField(builder, "EUT: ", 24, this::getEUT, this::setEUT, 46, 8); + addLabelledIntegerTextField(builder, "AMP: ", 24, this::getAMP, this::setAMP, 46, 34); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> EUT -= val, 512, 64, 7, 4); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> EUT /= val, 512, 64, 7, 22); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> AMP -= val, 512, 64, 7, 40); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, val -> AMP /= val, 512, 64, 7, 58); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> EUT -= val, 16, 1, 25, 4); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> EUT /= val, 16, 2, 25, 22); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> AMP -= val, 16, 1, 25, 40); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, val -> AMP /= val, 16, 2, 25, 58); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> EUT += val, 16, 1, 133, 4); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> EUT *= val, 16, 2, 133, 22); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> AMP += val, 16, 1, 133, 40); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, val -> AMP *= val, 16, 2, 133, 58); + + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> EUT += val, 512, 64, 151, 4); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> EUT *= val, 512, 64, 151, 22); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> AMP += val, 512, 64, 151, 40); + addChangeNumberButton(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, val -> AMP *= val, 512, 64, 151, 58); + } + + private void addLabelledIntegerTextField(ModularWindow.Builder builder, String label, int labelWidth, + IntSupplier getter, IntConsumer setter, int xPos, int yPos) { + builder.widget( + new TextWidget(label).setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(xPos, yPos)) + .widget( + new NumericWidget().setGetter(getter::getAsInt) + .setSetter(val -> setter.accept((int) val)) + .setTextColor(COLOR_TEXT_WHITE.get()) + .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD.withOffset(-1, -1, 2, 2)) + .setPos(xPos + labelWidth, yPos - 1) + .setSize(56, 10)); + } + + private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter, + int changeNumberShift, int changeNumber, int xPos, int yPos) { + builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> { + setter.accept(clickData.shift ? changeNumberShift : changeNumber); + producing = (long) AMP * EUT >= 0; + }) + .setBackground(GT_UITextures.BUTTON_STANDARD, overlay) + .setSize(18, 18) + .setPos(xPos, yPos)); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugStructureWriter.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugStructureWriter.java new file mode 100644 index 0000000000..519ea19641 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_DebugStructureWriter.java @@ -0,0 +1,300 @@ +package com.github.technus.tectech.thing.metaTileEntity.single; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT; +import static net.minecraft.util.StatCollector.translateToLocal; + +import java.util.function.Consumer; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; +import com.gtnewhorizon.structurelib.structure.StructureUtility; +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.TextWidget; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.modularui.IAddGregtechLogo; +import gregtech.api.interfaces.modularui.IAddUIWidgets; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; +import gregtech.api.objects.GT_RenderedTexture; + +/** + * Created by Tec on 23.03.2017. + */ +public class GT_MetaTileEntity_DebugStructureWriter extends GT_MetaTileEntity_TieredMachineBlock + implements IAddUIWidgets, IAddGregtechLogo { + + private static GT_RenderedTexture MARK; + public short[] numbers = new short[6]; + public boolean size = false; + public String[] result = new String[] { "Undefined" }; + + public GT_MetaTileEntity_DebugStructureWriter(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, translateToLocal("gt.blockmachines.debug.tt.writer.desc.0"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.writer.desc.1"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.debug.tt.writer.desc.2") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_DebugStructureWriter(String aName, int aTier, String[] aDescription, + ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + TT_Utility.setTier(aTier, this); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_DebugStructureWriter(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + MARK = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/MARK")); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1], + side != facing ? new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE) : MARK }; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + for (int i = 0; i < numbers.length; i++) { + aNBT.setShort("eData" + i, numbers[i]); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + for (int i = 0; i < numbers.length; i++) { + numbers[i] = aNBT.getShort("eData" + i); + } + } + + @Override + public boolean isSimpleMachine() { + return false; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + aBaseMetaTileEntity.disableWorking(); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isAllowedToWork()) { + + String pseudoJavaCode = StructureUtility.getPseudoJavaCode( + aBaseMetaTileEntity.getWorld(), + ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing()), + aBaseMetaTileEntity.getXCoord(), + aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord(), + numbers[0], + numbers[1], + numbers[2], + te -> te.getClass() + .getCanonicalName(), + numbers[3], + numbers[4], + numbers[5], + false); + TecTech.LOGGER.info(pseudoJavaCode); + result = pseudoJavaCode.split("\\n"); + aBaseMetaTileEntity.disableWorking(); + } + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity(); + + String pseudoJavaCode = StructureUtility.getPseudoJavaCode( + aBaseMetaTileEntity.getWorld(), + ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing()), + aBaseMetaTileEntity.getXCoord(), + aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord(), + numbers[0], + numbers[1], + numbers[2], + te -> te.getClass() + .getCanonicalName(), + numbers[3], + numbers[4], + numbers[5], + false); + TecTech.LOGGER.info(pseudoJavaCode); + result = pseudoJavaCode.split("\\n"); + aBaseMetaTileEntity.disableWorking(); + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + return true; + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isElectric() { + return false; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + return result; + } + + @Override + public boolean useModularUI() { + return true; + } + + @Override + public void addGregTechLogo(ModularWindow.Builder builder) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY) + .setSize(17, 17) + .setPos(113, 56)); + } + + @Override + public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + builder.widget( + new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK) + .setSize(90, 72) + .setPos(43, 4)) + .widget( + new TextWidget().setStringSupplier(() -> size ? "Structure size" : "My position") + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 8)) + .widget( + new TextWidget().setStringSupplier(() -> size ? "(Changing scan size)" : "(Moving origin)") + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 16)) + .widget( + new TextWidget().setStringSupplier(() -> "A: " + numbers[size ? 3 : 0]) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 24)) + .widget( + new TextWidget().setStringSupplier(() -> "B: " + numbers[size ? 4 : 1]) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 32)) + .widget( + new TextWidget().setStringSupplier(() -> "C: " + numbers[size ? 5 : 2]) + .setDefaultColor(COLOR_TEXT_WHITE.get()) + .setPos(46, 40)); + + addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7); + addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25); + addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133); + addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 16, 151); + } + + private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift, + int addNumber, int xPos) { + addChangeNumberButton( + builder, + overlay, + val -> numbers[size ? 3 : 0] += val, + addNumberShift, + addNumber, + xPos, + 4); + addChangeNumberButton( + builder, + overlay, + val -> numbers[size ? 4 : 1] += val, + addNumberShift, + addNumber, + xPos, + 22); + addChangeNumberButton( + builder, + overlay, + val -> numbers[size ? 5 : 2] += val, + addNumberShift, + addNumber, + xPos, + 40); + builder.widget( + new ButtonWidget().setOnClick((clickData, widget) -> { size = !size; }) + .setBackground(GT_UITextures.BUTTON_STANDARD, overlay) + .setSize(18, 18) + .setPos(xPos, 58)); + } + + private void addChangeNumberButton(ModularWindow.Builder builder, IDrawable overlay, Consumer<Integer> setter, + int changeNumberShift, int changeNumber, int xPos, int yPos) { + builder.widget( + new ButtonWidget() + .setOnClick( + (clickData, widget) -> { setter.accept(clickData.shift ? changeNumberShift : changeNumber); }) + .setBackground(GT_UITextures.BUTTON_STANDARD, overlay) + .setSize(18, 18) + .setPos(xPos, yPos)); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_OwnerDetector.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_OwnerDetector.java new file mode 100644 index 0000000000..8728a5d04f --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_OwnerDetector.java @@ -0,0 +1,239 @@ +package com.github.technus.tectech.thing.metaTileEntity.single; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT; +import static com.github.technus.tectech.util.CommonValues.RECIPE_AT; +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.enums.Textures; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; +import gregtech.api.objects.GT_RenderedTexture; +import gregtech.api.util.GT_Utility; + +/** + * Created by Tec on 23.03.2017. + */ +public class GT_MetaTileEntity_OwnerDetector extends GT_MetaTileEntity_TieredMachineBlock { + + private static GT_RenderedTexture OWNER_ONLINE, OWNER_OFFLINE; + private String uuid; + private boolean interdimensional = true; + + public GT_MetaTileEntity_OwnerDetector(int aID, String aName, String aNameRegional, int aTier) { + super( + aID, + aName, + aNameRegional, + aTier, + 0, + new String[] { CommonValues.TEC_MARK_GENERAL, + translateToLocal("gt.blockmachines.machine.tt.ownerdetector.desc.0"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.machine.tt.ownerdetector.desc.1"), + EnumChatFormatting.BLUE + translateToLocal("gt.blockmachines.machine.tt.ownerdetector.desc.2") }); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_OwnerDetector(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, 0, aDescription, aTextures); + TT_Utility.setTier(aTier, this); + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_OwnerDetector(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aBlockIconRegister) { + super.registerIcons(aBlockIconRegister); + OWNER_ONLINE = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/OWNER_ONLINE")); + OWNER_OFFLINE = new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("iconsets/OWNER_OFFLINE")); + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + return new ITexture[] { MACHINE_CASINGS_TT[mTier][colorIndex + 1], aActive ? OWNER_ONLINE : OWNER_OFFLINE }; + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + return null; + } + + @Override + public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection side, + ItemStack itemStack) { + return false; + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + aNBT.setString("eUUID", uuid); + aNBT.setBoolean("eInterDim", interdimensional); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + uuid = aNBT.getString("eUUID"); + interdimensional = aNBT.getBoolean("eInterDim"); + } + + @Override + public boolean isSimpleMachine() { + return true; + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.isServerSide()) { + if (uuid == null || uuid.length() == 0) { + String name = aBaseMetaTileEntity.getOwnerName(); + if (!("Player".equals(name))) { + uuid = TecTech.proxy.getUUID(name); + } + } + } + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + if (aBaseMetaTileEntity.isServerSide() && aTick % 20 == RECIPE_AT) { + boolean detected = TecTech.proxy.isOnlineUUID(uuid) || (uuid != null && uuid.length() > 0 + && TecTech.proxy.isOnlineName(aBaseMetaTileEntity.getOwnerName())); + aBaseMetaTileEntity.setActive(detected); + aBaseMetaTileEntity.setGenericRedstoneOutput(detected); + byte value = (byte) (detected ? 15 : 0); + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + aBaseMetaTileEntity.setStrongOutputRedstoneSignal(side, value); + } + } + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + String clientLocale; + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + interdimensional ^= true; + GT_Utility.sendChatToPlayer( + aPlayer, + interdimensional ? translateToLocalFormatted("tt.keyphrase.Running_interdimensional_scan", clientLocale) + : translateToLocalFormatted("tt.keyphrase.Running_local_dimension_scan", clientLocale)); + } + + @Override + public boolean isFacingValid(ForgeDirection facing) { + return true; + } + + @Override + public boolean isAccessAllowed(EntityPlayer aPlayer) { + return true; + } + + @Override + public boolean isElectric() { + return false; + } + + @Override + public boolean isEnetOutput() { + return false; + } + + @Override + public boolean isEnetInput() { + return false; + } + + @Override + public boolean isInputFacing(ForgeDirection side) { + return false; + } + + @Override + public boolean isOutputFacing(ForgeDirection side) { + return false; + } + + @Override + public long maxAmperesIn() { + return 0; + } + + @Override + public long maxAmperesOut() { + return 0; + } + + @Override + public long maxEUInput() { + return Integer.MAX_VALUE; + } + + @Override + public long maxEUOutput() { + return 0; + } + + @Override + public long maxEUStore() { + return 0; + } + + @Override + public long getMinimumStoredEU() { + return 0; + } + + @Override + public int getProgresstime() { + return interdimensional ? 1 : 0; + } + + @Override + public int maxProgresstime() { + return 1; + } + + @Override + public boolean hasSidedRedstoneOutputBehavior() { + return true; + } + + @Override + public boolean allowGeneralRedstoneOutput() { + return true; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TT_Transformer.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TT_Transformer.java new file mode 100644 index 0000000000..90114ea0f8 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TT_Transformer.java @@ -0,0 +1,73 @@ +package com.github.technus.tectech.thing.metaTileEntity.single; + +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_MULTI_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_IN_POWER_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_MULTI_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_POWER_TT; +import static net.minecraft.util.StatCollector.translateToLocal; + +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Transformer; + +public class GT_MetaTileEntity_TT_Transformer extends GT_MetaTileEntity_Transformer { + + public GT_MetaTileEntity_TT_Transformer(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, ""); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_TT_Transformer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + TT_Utility.setTier(aTier, this); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_TT_Transformer(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[12][17][]; + for (byte b = -1; b < 16; b++) { + rTextures[0][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_OUT_MULTI_TT[mTier] }; + rTextures[1][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_OUT_MULTI_TT[mTier] }; + rTextures[2][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_OUT_MULTI_TT[mTier] }; + rTextures[3][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_IN_POWER_TT[mTier + 1] }; + rTextures[4][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_IN_POWER_TT[mTier + 1] }; + rTextures[5][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_IN_POWER_TT[mTier + 1] }; + rTextures[6][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_IN_MULTI_TT[mTier] }; + rTextures[7][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_IN_MULTI_TT[mTier] }; + rTextures[8][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_IN_MULTI_TT[mTier] }; + rTextures[9][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_OUT_POWER_TT[mTier + 1] }; + rTextures[10][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_OUT_POWER_TT[mTier + 1] }; + rTextures[11][b + 1] = new ITexture[] { MACHINE_CASINGS_TT[mTier][b + 1], + OVERLAYS_ENERGY_OUT_POWER_TT[mTier + 1] }; + } + return rTextures; + } + + @Override + public String[] getDescription() { + return new String[] { + translateToLocal("gt.blockmachines.tt.transformer.tier." + (mTier > 9 ? "" : "0") + mTier + ".desc"), + CommonValues.TEC_MARK_GENERAL }; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java new file mode 100644 index 0000000000..e19ac1bf7d --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java @@ -0,0 +1,404 @@ +package com.github.technus.tectech.thing.metaTileEntity.single; + +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.generateTeslaNodeMap; +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.powerTeslaNodeMap; +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetAdd; +import static com.github.technus.tectech.mechanics.tesla.ITeslaConnectable.TeslaUtil.teslaSimpleNodeSetRemove; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.MACHINE_CASINGS_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_MULTI_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_POWER_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.OVERLAYS_ENERGY_OUT_TT; +import static com.github.technus.tectech.thing.metaTileEntity.Textures.TESLA_TRANSCEIVER_TOP_BA; +import static com.github.technus.tectech.util.CommonValues.V; +import static java.lang.Math.round; +import static net.minecraft.util.StatCollector.translateToLocal; +import static net.minecraft.util.StatCollector.translateToLocalFormatted; + +import java.util.Arrays; +import java.util.HashSet; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.common.util.ForgeDirection; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.reflect.FieldUtils; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.loader.NetworkDispatcher; +import com.github.technus.tectech.mechanics.spark.RendererMessage; +import com.github.technus.tectech.mechanics.spark.ThaumSpark; +import com.github.technus.tectech.mechanics.tesla.ITeslaConnectable; +import com.github.technus.tectech.mechanics.tesla.ITeslaConnectableSimple; +import com.github.technus.tectech.util.CommonValues; +import com.github.technus.tectech.util.TT_Utility; +import com.google.common.collect.Multimap; +import com.google.common.collect.MultimapBuilder; +import com.gtnewhorizon.structurelib.util.Vec3Impl; + +import eu.usrv.yamcore.auxiliary.PlayerChatHelper; +import gregtech.api.gui.modularui.GT_UIInfos; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicBatteryBuffer; + +public class GT_MetaTileEntity_TeslaCoil extends GT_MetaTileEntity_BasicBatteryBuffer implements ITeslaConnectable { + + // Interface fields + private final Multimap<Integer, ITeslaConnectableSimple> teslaNodeMap = MultimapBuilder.treeKeys() + .linkedListValues() + .build(); + private final HashSet<ThaumSpark> sparkList = new HashSet<>(); + private int sparkCount = 10; + + private static final int transferRadiusMax = TecTech.configTecTech.TESLA_SINGLE_RANGE; // Default is 20 + private static final int perBlockLoss = TecTech.configTecTech.TESLA_SINGLE_LOSS_PER_BLOCK; // Default is 1 + private static final float overDriveLoss = TecTech.configTecTech.TESLA_SINGLE_LOSS_FACTOR_OVERDRIVE; // Default is + // 0.25F + private static final int transferRadiusMin = 4; // Minimum user configurable + private int transferRadius = transferRadiusMax; // Default transferRadius setting + + public boolean powerPassToggle = false; // Power Pass for public viewing + private static final int histSteps = 20; // Hysteresis Resolution + private int histSettingLow = 3; // Hysteresis Low Limit + private int histSettingHigh = 15; // Hysteresis High Limit + private static final int histLowLimit = 1; // How low can you configure it? + private static final int histHighLimit = 19; // How high can you configure it? + private float histLow = (float) histSettingLow / histSteps; // Power pass is disabled if power is under this + // fraction + private float histHigh = (float) histSettingHigh / histSteps; // Power pass is enabled if power is over this + // fraction + + private final long outputVoltage = V[mTier]; + private boolean overdriveToggle = false; + + private String clientLocale = "en_US"; + + public GT_MetaTileEntity_TeslaCoil(int aID, String aName, String aNameRegional, int aTier, int aSlotCount) { + super(aID, aName, aNameRegional, aTier, "", aSlotCount); + TT_Utility.setTier(aTier, this); + } + + public GT_MetaTileEntity_TeslaCoil(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, + int aSlotCount) { + super(aName, aTier, aDescription, aTextures, aSlotCount); + } + + @Override + public String[] getDescription() { + String[] jargon = new String[] { CommonValues.THETA_MOVEMENT, + translateToLocal("gt.blockmachines.machine.tt.tesla.desc.0"), // Your Tesla I/O machine of choice + EnumChatFormatting.AQUA + translateToLocal("gt.blockmachines.machine.tt.tesla.desc.1") // Lightning + // stoves for the + // rich + }; + String[] sDesc = super.getDescription(); + sDesc = Arrays.copyOfRange(sDesc, 1, sDesc.length); // Removes first element from array + return ArrayUtils.addAll(jargon, sDesc); + } + + @Override + public boolean onSolderingToolRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + if (overdriveToggle) { + overdriveToggle = false; + PlayerChatHelper + .SendInfo(aPlayer, translateToLocalFormatted("tt.keyphrase.Overdrive_disengaged", clientLocale)); + } else { + overdriveToggle = true; + PlayerChatHelper + .SendInfo(aPlayer, translateToLocalFormatted("tt.keyphrase.Overdrive_engaged", clientLocale)); + } + return true; + } + + @Override + public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (aPlayer.isSneaking()) { + if (histSettingHigh < histHighLimit) { + histSettingHigh++; + } else { + histSettingHigh = histSettingLow + 1; + } + histHigh = (float) histSettingHigh / histSteps; + PlayerChatHelper.SendInfo( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Hysteresis_high_set_to", clientLocale) + " " + + round(histHigh * 100F) + + "%"); + } else { + if (histSettingLow > histLowLimit) { + histSettingLow--; + } else { + histSettingLow = histSettingHigh - 1; + } + histLow = (float) histSettingLow / histSteps; + PlayerChatHelper.SendInfo( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Hysteresis_low_set_to", clientLocale) + " " + + round(histLow * 100F) + + "%"); + } + } + + @Override + public boolean onWireCutterRightClick(ForgeDirection side, ForgeDirection wrenchingSide, EntityPlayer aPlayer, + float aX, float aY, float aZ) { + if (aPlayer.isSneaking()) { + if (transferRadius > transferRadiusMin) { + transferRadius--; + } + } else { + if (transferRadius < transferRadiusMax) { + transferRadius++; + } + } + PlayerChatHelper.SendInfo( + aPlayer, + translateToLocalFormatted("tt.keyphrase.Tesla_radius_set_to", clientLocale) + " " + transferRadius + "m"); + return false; + } + + // Cheeky skrub stuff to get machine to switch powerPass on soft mallet + @Override + public boolean hasAlternativeModeText() { + return true; + } + + @Override + public String getAlternativeModeText() { + // Hysteresis based ePowerPass Config + long energyMax = getStoredEnergy()[1]; + long energyStored = getStoredEnergy()[0]; + float energyFrac = (float) energyStored / energyMax; + + // ePowerPass hist toggle + if (energyFrac > histHigh) { + powerPassToggle = true; + } else if (energyFrac < histLow) { + powerPassToggle = false; + } else { + powerPassToggle = !powerPassToggle; + } + + // And after this cheeky-ness, toss the string XD + return powerPassToggle ? translateToLocalFormatted("tt.keyphrase.Sending_power", clientLocale) + "!" + : translateToLocalFormatted("tt.keyphrase.Receiving_power", clientLocale) + "!"; + } + + @Override + public boolean isFacingValid(ForgeDirection side) { + return side != ForgeDirection.UP; + } // Prevents output at the top side + + @Override + public ITexture[][][] getTextureSet(ITexture[] aTextures) { + ITexture[][][] rTextures = new ITexture[3][17][]; + for (byte i = -1; i < 16; ++i) { + rTextures[0][i + 1] = new ITexture[] { MACHINE_CASINGS_TT[this.mTier][i + 1] }; + rTextures[1][i + 1] = new ITexture[] { MACHINE_CASINGS_TT[this.mTier][i + 1], TESLA_TRANSCEIVER_TOP_BA }; + rTextures[2][i + 1] = new ITexture[] { MACHINE_CASINGS_TT[this.mTier][i + 1], + this.mInventory.length == 16 ? OVERLAYS_ENERGY_OUT_POWER_TT[this.mTier] + : (this.mInventory.length > 4 ? OVERLAYS_ENERGY_OUT_MULTI_TT[this.mTier] + : OVERLAYS_ENERGY_OUT_TT[this.mTier]) }; + } + return rTextures; + } + + @Override + public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, + int colorIndex, boolean aActive, boolean aRedstone) { + return this.mTextures[side == facing ? 2 : side == ForgeDirection.UP ? 1 : 0][colorIndex + 1]; + } + + @Override + public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_TeslaCoil(mName, mTier, mDescriptionArray, mTextures, mInventory.length); + } + + @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + super.onFirstTick(aBaseMetaTileEntity); + if (!aBaseMetaTileEntity.isClientSide()) { + teslaSimpleNodeSetAdd(this); + generateTeslaNodeMap(this); + } + } + + @Override + public void onRemoval() { + super.onRemoval(); + if (!this.getBaseMetaTileEntity() + .isClientSide()) { + teslaSimpleNodeSetRemove(this); + } + } + + @Override + public void onUnload() { + if (!this.getBaseMetaTileEntity() + .isClientSide()) { + teslaSimpleNodeSetRemove(this); + } + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + teslaSimpleNodeSetAdd(this); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isClientSide()) { + return; + } + + // Hysteresis based ePowerPass Config + long energyMax = getStoredEnergy()[1]; + long energyStored = getStoredEnergy()[0]; + float energyFrac = (float) energyStored / energyMax; + + // ePowerPass hist toggle + if (!powerPassToggle && energyFrac > histHigh) { + powerPassToggle = true; + } else if (powerPassToggle && energyFrac < histLow) { + powerPassToggle = false; + } + + // Send Power + powerTeslaNodeMap(this); + + // TODO Encapsulate the spark sender + sparkCount--; + if (sparkCount == 0) { + sparkCount = 10; + if (!sparkList.isEmpty()) { + NetworkDispatcher.INSTANCE.sendToAllAround( + new RendererMessage.RendererData(sparkList), + aBaseMetaTileEntity.getWorld().provider.dimensionId, + aBaseMetaTileEntity.getXCoord(), + aBaseMetaTileEntity.getYCoord(), + aBaseMetaTileEntity.getZCoord(), + 256); + sparkList.clear(); + } + } + } + + @Override + public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) { + if (aBaseMetaTileEntity.isServerSide()) { + try { + EntityPlayerMP player = (EntityPlayerMP) aPlayer; + clientLocale = (String) FieldUtils.readField(player, "translator", true); + } catch (Exception e) { + clientLocale = "en_US"; + } + GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer); + } + return true; + } + + @Override + public byte getTeslaReceptionCapability() { + return 1; + } + + @Override + public float getTeslaReceptionCoefficient() { + return 1; + } + + @Override + public Multimap<Integer, ITeslaConnectableSimple> getTeslaNodeMap() { + return teslaNodeMap; + } + + @Override + public HashSet<ThaumSpark> getSparkList() { + return sparkList; + } + + @Override + public byte getTeslaTransmissionCapability() { + return 2; + } + + @Override + public int getTeslaTransmissionRange() { + return transferRadius; + } + + @Override + public boolean isOverdriveEnabled() { + return overdriveToggle; + } + + @Override + public int getTeslaEnergyLossPerBlock() { + return perBlockLoss; + } + + @Override + public float getTeslaOverdriveLossCoefficient() { + return overDriveLoss; + } + + @Override + public long getTeslaOutputVoltage() { + return outputVoltage; + } + + @Override + public long getTeslaOutputCurrent() { + return mBatteryCount; + } + + @Override + public boolean teslaDrainEnergy(long teslaVoltageDrained) { + if (getEUVar() < teslaVoltageDrained) { + return false; + } + + setEUVar(getEUVar() - teslaVoltageDrained); + return true; + } + + @Override + public boolean isTeslaReadyToReceive() { + return !this.powerPassToggle; + } + + @Override + public long getTeslaStoredEnergy() { + return getEUVar(); + } + + @Override + public Vec3Impl getTeslaPosition() { + return new Vec3Impl( + this.getBaseMetaTileEntity() + .getXCoord(), + this.getBaseMetaTileEntity() + .getYCoord(), + this.getBaseMetaTileEntity() + .getZCoord()); + } + + @Override + public Integer getTeslaDimension() { + return this.getBaseMetaTileEntity() + .getWorld().provider.dimensionId; + } + + @Override + public boolean teslaInjectEnergy(long teslaVoltageInjected) { + return this.getBaseMetaTileEntity() + .injectEnergyUnits(ForgeDirection.UP, teslaVoltageInjected, 1L) > 0L; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_WetTransformer.java b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_WetTransformer.java new file mode 100644 index 0000000000..97facf1046 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_WetTransformer.java @@ -0,0 +1,49 @@ +package com.github.technus.tectech.thing.metaTileEntity.single; + +import static com.github.technus.tectech.util.CommonValues.V; +import static net.minecraft.util.StatCollector.translateToLocal; + +import com.github.technus.tectech.util.CommonValues; + +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; + +public class GT_MetaTileEntity_WetTransformer extends GT_MetaTileEntity_TT_Transformer { + + public GT_MetaTileEntity_WetTransformer(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) { + super(aName, aTier, aDescription, aTextures); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_WetTransformer(mName, mTier, mDescriptionArray, mTextures); + } + + @Override + public String[] getDescription() { + return new String[] { + translateToLocal("gt.blockmachines.wetransformer.tier." + (mTier > 9 ? "" : "0") + mTier + ".desc"), + "Accepts 16A and outputs 64A", CommonValues.TEC_MARK_GENERAL }; + } + + @Override + public long getMinimumStoredEU() { + return V[mTier + 1]; + } + + @Override + public long maxEUStore() { + return 512L + V[mTier + 1] * 128L; + } + + @Override + public long maxAmperesOut() { + return getBaseMetaTileEntity().isAllowedToWork() ? 64 : 16; + } + + @Override + public long maxAmperesIn() { + return getBaseMetaTileEntity().isAllowedToWork() ? 16 : 64; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java b/tectech/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java diff --git a/tectech/src/main/java/com/github/technus/tectech/thing/tileEntity/ReactorSimTileEntity.java b/tectech/src/main/java/com/github/technus/tectech/thing/tileEntity/ReactorSimTileEntity.java new file mode 100644 index 0000000000..ac24686d6a --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/thing/tileEntity/ReactorSimTileEntity.java @@ -0,0 +1,143 @@ +package com.github.technus.tectech.thing.tileEntity; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +import com.github.technus.tectech.Reference; + +import ic2.api.energy.event.EnergyTileUnloadEvent; +import ic2.core.IC2; +import ic2.core.block.reactor.tileentity.TileEntityNuclearReactorElectric; +import ic2.core.init.MainConfig; +import ic2.core.util.ConfigUtil; + +/** + * Created by danie_000 on 30.09.2017. + */ +public class ReactorSimTileEntity extends TileEntityNuclearReactorElectric { + + private boolean hadRedstone = true; + + @Override + public void onLoaded() { + super.onLoaded(); + if (IC2.platform.isSimulating() && addedToEnergyNet) { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); + // this.addedToEnergyNet = false; + } + } + + @Override + public void onUnloaded() { + addedToEnergyNet = false; + super.onUnloaded(); + } + + @Override + public String getInventoryName() { + return "Nuclear Reactor Simulator"; + } + + @Override + public boolean emitsEnergyTo(TileEntity receiver, ForgeDirection direction) { + return false; + } + + @Override + public double getOfferedEnergy() { + return 0; + } + + @Override + public double getReactorEUEnergyOutput() { + return getReactorEnergyOutput() * 5.0F + * ConfigUtil.getDouble(MainConfig.get(), "balance/energy/generator/nuclear"); + } + + @Override + protected void updateEntityServer() { + if (updateTicker++ % getTickRate() == 0) { + if (!worldObj.isRemote && worldObj.doChunksNearChunkExist(xCoord, yCoord, zCoord, 2)) { + if (hadRedstone && !receiveredstone()) { + hadRedstone = false; + } else if (!hadRedstone && receiveredstone()) { + doUpdates(); + hadRedstone = true; + } + markDirty(); + } + } + } + + @Override + public boolean calculateHeatEffects() { + if (heat >= 4000 && IC2.platform.isSimulating()) { + float power = (float) heat / (float) maxHeat; + if (power >= 1.0F) { + explode(); // ding + return true; + } else { + return false; + } + } + return false; + } + + // new method + private void doUpdates() { + heat = 0; + do { + dropAllUnfittingStuff(); + output = 0.0F; + maxHeat = 10000; + hem = 1.0F; + processChambers(); + } while (!calculateHeatEffects() && output > 0); + } + + @Override + public void explode() { + getWorld().playSoundEffect(xCoord, yCoord, zCoord, Reference.MODID + ":microwave_ding", 1, 1); + } + + @Override + public void addEmitHeat(int heat) {} + + @Override + public boolean isFluidCooled() { + return false; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return false; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return false; + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + return 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + return null; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/util/CommonValues.java b/tectech/src/main/java/com/github/technus/tectech/util/CommonValues.java new file mode 100644 index 0000000000..8e4539a17a --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/util/CommonValues.java @@ -0,0 +1,33 @@ +package com.github.technus.tectech.util; + +import net.minecraft.util.EnumChatFormatting; + +import gregtech.api.enums.GT_Values; + +/** + * Created by danie_000 on 11.01.2017. + */ +@SuppressWarnings("SpellCheckingInspection") +public final class CommonValues { + + public static final String TEC_MARK_SHORT = EnumChatFormatting.BLUE + "Tec" + EnumChatFormatting.DARK_BLUE + "Tech"; + public static final String TEC_MARK_GENERAL = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Interdimensional"; + public static final String TEC_MARK_EM = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Elemental Matter"; + public static final String THETA_MOVEMENT = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Theta Movement"; + public static final String COSMIC_MARK = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Cosmic"; + public static final String GODFORGE_MARK = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Project Godforge"; + + public static final byte MOVE_AT = 4; // move stuff around + public static final byte RECIPE_AT = 6; // move stuff around + // - in case some hatches are not in multiblock structure + public static final byte MULTI_CHECK_AT = 12; // multiblock checks its state + public static final byte TRANSFER_AT = 16; + + public static final String[] VN = GT_Values.VN; + public static final long[] V = GT_Values.V; + + public static final String[] EOH_TIER_FANCY_NAMES = { "Crude", "Primitive", "Stable", "Advanced", "Superb", + "Exotic", "Perfect", "Tipler", EnumChatFormatting.BOLD + "Gallifreyan" }; + + private CommonValues() {} +} diff --git a/tectech/src/main/java/com/github/technus/tectech/util/Converter.java b/tectech/src/main/java/com/github/technus/tectech/util/Converter.java new file mode 100644 index 0000000000..d0da11d405 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/util/Converter.java @@ -0,0 +1,41 @@ +package com.github.technus.tectech.util; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public final class Converter { + + private Converter() {} + + public static byte[] writeInts(int[] array) { + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(array.length * 4); + DataOutputStream dos = new DataOutputStream(bos); + for (int j : array) { + dos.writeInt(j); + } + + return bos.toByteArray(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static int[] readInts(byte[] array) { + try { + ByteArrayInputStream bis = new ByteArrayInputStream(array); + DataInputStream dataInputStream = new DataInputStream(bis); + int size = array.length / Integer.BYTES; + int[] res = new int[size]; + for (int i = 0; i < size; i++) { + res[i] = dataInputStream.readInt(); + } + return res; + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/util/FluidStackLong.java b/tectech/src/main/java/com/github/technus/tectech/util/FluidStackLong.java new file mode 100644 index 0000000000..abd0134e85 --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/util/FluidStackLong.java @@ -0,0 +1,29 @@ +package com.github.technus.tectech.util; + +import net.minecraftforge.fluids.FluidStack; + +public class FluidStackLong { + + public final FluidStack fluidStack; + public long amount; + + public FluidStackLong(FluidStack fluidStack, long amount) { + this.fluidStack = fluidStack; + this.amount = amount; + } + + // Copy constructor. + public FluidStackLong(FluidStackLong fluidStackLong) { + this.fluidStack = fluidStackLong.fluidStack; + this.amount = fluidStackLong.amount; + } + + public long getFluidAmount() { + return amount; + } + + public FluidStack getRegularFluidStack(FluidStackLong fluidStackLong, int amount) { + return new FluidStack(fluidStackLong.fluidStack, amount); + } + +} diff --git a/tectech/src/main/java/com/github/technus/tectech/util/GodforgeMath.java b/tectech/src/main/java/com/github/technus/tectech/util/GodforgeMath.java new file mode 100644 index 0000000000..7fda26a29c --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/util/GodforgeMath.java @@ -0,0 +1,308 @@ +package com.github.technus.tectech.util; + +import java.math.BigInteger; + +import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_ForgeOfGods; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_BaseModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule; +import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule; + +public class GodforgeMath { + + public static int getRandomIntInRange(int min, int max) { + return (int) (Math.random() * (max - min)) + min; + } + + public static double calculateFuelConsumption(GT_MetaTileEntity_EM_ForgeOfGods godforge) { + double upgradeFactor = 1; + if (godforge.isUpgradeActive(2)) { + upgradeFactor = 0.8; + } + if (godforge.getFuelType() == 0) { + return Math + .max(godforge.getFuelFactor() * 300 * Math.pow(1.15, godforge.getFuelFactor()) * upgradeFactor, 1); + } + if (godforge.getFuelType() == 1) { + return Math.max(godforge.getFuelFactor() * 2 * Math.pow(1.08, godforge.getFuelFactor()) * upgradeFactor, 1); + } else return Math.max(godforge.getFuelFactor() / 25 * upgradeFactor, 1); + } + + public static int calculateStartupFuelConsumption(GT_MetaTileEntity_EM_ForgeOfGods godforge) { + return (int) Math.max(godforge.getFuelFactor() * 25 * Math.pow(1.2, godforge.getFuelFactor()), 1); + } + + public static int calculateMaxFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) { + int fuelCap = 5; + if (godforge.isUpgradeActive(27)) { + fuelCap = Integer.MAX_VALUE; + } else { + if (godforge.isUpgradeActive(9)) { + fuelCap += godforge.getTotalActiveUpgrades(); + } + if (godforge.isUpgradeActive(3)) { + fuelCap *= 1.2; + } + } + return Math.max(fuelCap, 1); + } + + public static int calculateEffectiveFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) { + int fuelFactor = godforge.getFuelFactor(); + if (fuelFactor <= 43) { + return fuelFactor; + } else { + return 43 + (int) Math.floor(Math.pow((fuelFactor - 43), 0.4)); + } + } + + public static void calculateMaxHeatForModules(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + double logBase = 1.5; + int baseHeat = 12601; + if (godforge.isUpgradeActive(12)) { + if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) { + logBase = 1.12; + } else { + logBase = 1.18; + } + } + int recipeHeat = baseHeat + (int) (Math.log(godforge.getFuelFactor()) / Math.log(logBase) * 1000); + module.setHeatForOC(calculateOverclockHeat(module, godforge, recipeHeat)); + module.setHeat(recipeHeat); + } + + public static int calculateOverclockHeat(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge, Integer recipeHeat) { + int actualHeat; + double exponent; + if (godforge.isUpgradeActive(20)) { + if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) { + exponent = 0.85; + } else { + exponent = 0.8; + } + if (recipeHeat > 30000) { + actualHeat = (int) Math.floor(30000 + Math.pow(recipeHeat - 30000, exponent)); + } else { + actualHeat = recipeHeat; + } + } else if (godforge.isUpgradeActive(17)) { + actualHeat = Math.min(recipeHeat, 30000); + } else { + actualHeat = Math.min(recipeHeat, 15000); + } + return actualHeat; + } + + public static void calculateSpeedBonusForModules(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + double speedBonus = 1; + + if (godforge.isUpgradeActive(1)) { + speedBonus = Math.pow(module.getHeat(), -0.01); + } + + if (godforge.isUpgradeActive(22)) { + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { + speedBonus /= Math.pow(module.getMaxParallel(), 0.02); + } else { + speedBonus /= Math.pow(module.getMaxParallel(), 0.012); + } + } + + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (godforge.isUpgradeActive(25)) { + speedBonus = Math.sqrt(speedBonus); + } else { + speedBonus = 1; + } + } + + module.setSpeedBonus((float) speedBonus); + } + + public static void calculateMaxParallelForModules(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + int baseParallel = 0; + float fuelFactorMultiplier = 1; + float heatMultiplier = 1; + float upgradeAmountMultiplier = 1; + int node53 = 1; + boolean isMoltenOrSmeltingWithUpgrade = false; + + if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) { + baseParallel = 1024; + } + if (module instanceof GT_MetaTileEntity_EM_MoltenModule) { + baseParallel = 512; + } + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { + baseParallel = 256; + } + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + baseParallel = 36; + } + + if (module instanceof GT_MetaTileEntity_EM_MoltenModule + || (module instanceof GT_MetaTileEntity_EM_SmeltingModule && godforge.isUpgradeActive(16))) { + isMoltenOrSmeltingWithUpgrade = true; + } + + if (godforge.isUpgradeActive(10)) { + node53 = 2; + } + + if (godforge.isUpgradeActive(6)) { + if (godforge.isUpgradeActive(13)) { + if (isMoltenOrSmeltingWithUpgrade) { + fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f * 3; + } else { + fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f * 2; + } + } else { + fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f; + } + } + + if (godforge.isUpgradeActive(18)) { + if (isMoltenOrSmeltingWithUpgrade) { + heatMultiplier = 1 + module.getHeat() / 15000f; + } else { + heatMultiplier = 1 + module.getHeat() / 25000f; + } + } + + if (godforge.isUpgradeActive(21)) { + if (isMoltenOrSmeltingWithUpgrade) { + upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 5f; + } else { + upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 8f; + } + } + + int maxParallel = (int) (baseParallel * node53 + * fuelFactorMultiplier + * heatMultiplier + * upgradeAmountMultiplier); + + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (godforge.isUpgradeActive(25)) { + maxParallel = (int) Math.max(9 * Math.floor(Math.sqrt(maxParallel) / 9), 36); + } else { + maxParallel = baseParallel; + } + } + + module.setMaxParallel(maxParallel); + } + + public static void calculateEnergyDiscountForModules(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + double fillRatioDiscount = 1; + double maxBatteryDiscount = 1; + + if (godforge.isUpgradeActive(8)) { + maxBatteryDiscount = 1 - (1 - Math.pow(1.001, -0.01 * godforge.getMaxBatteryCharge())) / 20; + } + + if (godforge.isUpgradeActive(19)) { + double fillRatioMinusZeroPointFive = (double) godforge.getBatteryCharge() / godforge.getMaxBatteryCharge() + - 0.5; + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { + fillRatioDiscount = 1 - (Math.pow(fillRatioMinusZeroPointFive, 2) * (-0.6) + 0.15); + } else { + fillRatioDiscount = 1 - (Math.pow(fillRatioMinusZeroPointFive, 2) * (-0.6) + 0.15) * 2 / 3; + } + } + + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (!godforge.isUpgradeActive(25)) { + fillRatioDiscount = 1; + maxBatteryDiscount = 1; + } else { + fillRatioDiscount = Math.sqrt(fillRatioDiscount); + maxBatteryDiscount = Math.sqrt(maxBatteryDiscount); + } + } + + module.setEnergyDiscount((float) (fillRatioDiscount * maxBatteryDiscount)); + } + + public static void calculateProcessingVoltageForModules(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + long voltage = Integer.MAX_VALUE; + + if (godforge.isUpgradeActive(4)) { + voltage += calculateEffectiveFuelFactor(godforge) * 100_000_000L; + } + + if (godforge.isUpgradeActive(23)) { + voltage *= Math.pow(4, godforge.getRingAmount()); + } + + module.setProcessingVoltage(voltage); + } + + public static void setMiscModuleParameters(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + int plasmaTier = 0; + double overclockTimeFactor = 2; + + if (godforge.isUpgradeActive(30)) { + plasmaTier = 2; + } else if (godforge.isUpgradeActive(24)) { + plasmaTier = 1; + } + + if (godforge.isUpgradeActive(14)) { + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) { + overclockTimeFactor = 2.3; + } else { + overclockTimeFactor = 2.15; + } + if (module instanceof GT_MetaTileEntity_EM_ExoticModule) { + if (godforge.isUpgradeActive(25)) { + overclockTimeFactor = 2 + Math.pow(overclockTimeFactor - 2, 2); + } else { + overclockTimeFactor = 2; + } + } + } + + module.setUpgrade83(godforge.isUpgradeActive(19)); + module.setMultiStepPlasma(godforge.isUpgradeActive(15)); + module.setPlasmaTier(plasmaTier); + module.setMagmatterCapable(godforge.isUpgradeActive(30)); + module.setVoltageConfig(godforge.isUpgradeActive(28)); + module.setOverclockTimeFactor(overclockTimeFactor); + } + + public static boolean allowModuleConnection(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + + if (module instanceof GT_MetaTileEntity_EM_MoltenModule && godforge.isUpgradeActive(5)) { + return true; + } + + if (module instanceof GT_MetaTileEntity_EM_PlasmaModule && godforge.isUpgradeActive(7)) { + return true; + } + + if (module instanceof GT_MetaTileEntity_EM_ExoticModule && godforge.isUpgradeActive(11)) { + return true; + } + + return module instanceof GT_MetaTileEntity_EM_SmeltingModule; + } + + public static void queryMilestoneStats(GT_MetaTileEntity_EM_BaseModule module, + GT_MetaTileEntity_EM_ForgeOfGods godforge) { + godforge.addTotalPowerConsumed(module.getPowerTally()); + module.setPowerTally(BigInteger.ZERO); + godforge.addTotalRecipesProcessed(module.getRecipeTally()); + module.setRecipeTally(0); + + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/util/ItemStackLong.java b/tectech/src/main/java/com/github/technus/tectech/util/ItemStackLong.java new file mode 100644 index 0000000000..94b5dcb88a --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/util/ItemStackLong.java @@ -0,0 +1,28 @@ +package com.github.technus.tectech.util; + +import net.minecraft.item.ItemStack; + +public class ItemStackLong { + + public final ItemStack itemStack; + public long stackSize; + + public ItemStackLong(ItemStack itemStack, long stackSize) { + this.itemStack = itemStack; + this.stackSize = stackSize; + } + + // Copy constructor. + public ItemStackLong(ItemStackLong itemStackLong) { + this.itemStack = itemStackLong.itemStack; + this.stackSize = itemStackLong.stackSize; + } + + public long getStackSize() { + return stackSize; + } + + public long compareTo(ItemStackLong itemStackLong) { + return (stackSize - itemStackLong.stackSize); + } +} diff --git a/tectech/src/main/java/com/github/technus/tectech/util/TT_Utility.java b/tectech/src/main/java/com/github/technus/tectech/util/TT_Utility.java new file mode 100644 index 0000000000..0428c6cedf --- /dev/null +++ b/tectech/src/main/java/com/github/technus/tectech/util/TT_Utility.java @@ -0,0 +1,192 @@ +package com.github.technus.tectech.util; + +import java.lang.reflect.Field; +import java.math.BigInteger; +import java.util.Formatter; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import net.minecraft.item.ItemStack; + +import cpw.mods.fml.common.registry.GameRegistry; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock; + +/** + * Created by Tec on 21.03.2017. + */ +public final class TT_Utility { + + private TT_Utility() {} + + private static final StringBuilder STRING_BUILDER = new StringBuilder(); + private static final Map<Locale, Formatter> FORMATTER_MAP = new HashMap<>(); + + private static Formatter getFormatter() { + STRING_BUILDER.setLength(0); + return FORMATTER_MAP.computeIfAbsent( + Locale.getDefault(Locale.Category.FORMAT), + locale -> new Formatter(STRING_BUILDER, locale)); + } + + public static String formatNumberExp(double value) { + return getFormatter().format("%+.5E", value) + .toString(); + } + + // Formats to standard form. + public static String toStandardForm(long number) { + if (number == 0) { + return "0"; + } + + int exponent = (int) Math.floor(Math.log10(Math.abs(number))); + double mantissa = number / Math.pow(10, exponent); + + // Round the mantissa to two decimal places + mantissa = Math.round(mantissa * 100.0) / 100.0; + + return mantissa + "*10^" + exponent; + } + + public static String toStandardForm(BigInteger number) { + BigInteger abs = number.abs(); + if (abs.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0) { + return toStandardForm(number.longValue()); + } + String strNum = abs.toString(); + int exponent = strNum.length() - 1; + return (number.signum() == -1 ? "-" : "") + strNum.charAt(0) + "." + strNum.substring(1, 3) + "*10^" + exponent; + + } + + public static String toExponentForm(BigInteger number) { + BigInteger abs = number.abs(); + String strNum = abs.toString(); + int exponent = strNum.length() - 1; + return (number.signum() == -1 ? "-" : "") + strNum.charAt(0) + "." + strNum.substring(1, 3) + "e" + exponent; + + } + + public static int bitStringToInt(String bits) { + if (bits == null) { + return 0; + } + if (bits.length() > 32) { + throw new NumberFormatException("Too long!"); + } + return Integer.parseInt(bits, 2); + } + + public static int hexStringToInt(String hex) { + if (hex == null) { + return 0; + } + if (hex.length() > 8) { + throw new NumberFormatException("Too long!"); + } + return Integer.parseInt(hex, 16); + } + + public static double stringToDouble(String str) { + if (str == null) { + return 0; + } + return Double.parseDouble(str); + } + + public static String longBitsToShortString(long number) { + StringBuilder result = new StringBuilder(71); + + for (int i = 63; i >= 0; i--) { + long mask = 1L << i; + result.append((number & mask) != 0 ? ":" : "."); + + if (i % 8 == 0) { + result.append('|'); + } + } + result.replace(result.length() - 1, result.length(), ""); + + return result.toString(); + } + + public static float map(float x, float in_min, float in_max, float out_min, float out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + + public static String getUniqueIdentifier(ItemStack is) { + return GameRegistry.findUniqueIdentifierFor(is.getItem()).modId + ':' + is.getUnlocalizedName(); + } + + public static byte getTier(long l) { + byte b = -1; + + do { + ++b; + if (b >= CommonValues.V.length) { + return b; + } + } while (l > CommonValues.V[b]); + + return b; + } + + public static void setTier(int tier, Object me) { + try { + Field field = GT_MetaTileEntity_TieredMachineBlock.class.getField("mTier"); + field.setAccessible(true); + field.set(me, (byte) tier); + } catch (Exception e) { + // e.printStackTrace(); + } + } + + @Deprecated + public static double receiveDouble(double previousValue, int startIndex, int index, int value) { + return Double.longBitsToDouble(receiveLong(Double.doubleToLongBits(previousValue), startIndex, index, value)); + } + + public static long receiveLong(long previousValue, int startIndex, int index, int value) { + value &= 0xFFFF; + switch (index - startIndex) { + case 0 -> { + previousValue &= 0xFFFF_FFFF_FFFF_0000L; + previousValue |= value; + } + case 1 -> { + previousValue &= 0xFFFF_FFFF_0000_FFFFL; + previousValue |= (long) value << 16; + } + case 2 -> { + previousValue &= 0xFFFF_0000_FFFF_FFFFL; + previousValue |= (long) value << 32; + } + case 3 -> { + previousValue &= 0x0000_FFFF_FFFF_FFFFL; + previousValue |= (long) value << 48; + } + } + return previousValue; + } + + @Deprecated + public static float receiveFloat(float previousValue, int startIndex, int index, int value) { + return Float.intBitsToFloat(receiveInteger(Float.floatToIntBits(previousValue), startIndex, index, value)); + } + + public static int receiveInteger(int previousValue, int startIndex, int index, int value) { + value &= 0xFFFF; + switch (index - startIndex) { + case 0 -> { + previousValue &= 0xFFFF_0000; + previousValue |= value; + } + case 1 -> { + previousValue &= 0x0000_FFFF; + previousValue |= value << 16; + } + } + return previousValue; + } +} diff --git a/tectech/src/main/resources/META-INF/tectech_at.cfg b/tectech/src/main/resources/META-INF/tectech_at.cfg new file mode 100644 index 0000000000..fa76d13c1f --- /dev/null +++ b/tectech/src/main/resources/META-INF/tectech_at.cfg @@ -0,0 +1,17 @@ +public net.minecraft.block.Block field_149781_w #blockResistance +public net.minecraft.block.Block field_149782_v #blockHardness +protected net.minecraft.client.gui.FontRenderer field_111274_c #unicodePageLocations +protected net.minecraft.client.gui.FontRenderer field_78285_g #colorCode +protected net.minecraft.client.gui.FontRenderer field_78298_i #renderEngine +protected net.minecraft.client.gui.FontRenderer field_78293_l #unicodeFlag +protected net.minecraft.client.gui.FontRenderer field_78294_m #bidiFlag +protected net.minecraft.client.gui.FontRenderer field_78291_n #red +protected net.minecraft.client.gui.FontRenderer field_78292_o #blue +protected net.minecraft.client.gui.FontRenderer field_78306_p #green +protected net.minecraft.client.gui.FontRenderer field_78305_q #alpha +protected net.minecraft.client.gui.FontRenderer field_78304_r #textColor +protected net.minecraft.client.gui.FontRenderer field_78303_s #randomStyle +protected net.minecraft.client.gui.FontRenderer field_78302_t #boldStyle +protected net.minecraft.client.gui.FontRenderer field_78301_u #italicStyle +protected net.minecraft.client.gui.FontRenderer field_78300_v #underlineStyle +protected net.minecraft.client.gui.FontRenderer field_78299_w #strikethroughStyle diff --git a/tectech/src/main/resources/TecTechIcon.png b/tectech/src/main/resources/TecTechIcon.png Binary files differnew file mode 100644 index 0000000000..2e07b61e40 --- /dev/null +++ b/tectech/src/main/resources/TecTechIcon.png diff --git a/tectech/src/main/resources/TecTechIconSmall.png b/tectech/src/main/resources/TecTechIconSmall.png Binary files differnew file mode 100644 index 0000000000..e49439f14d --- /dev/null +++ b/tectech/src/main/resources/TecTechIconSmall.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK.png Binary files differnew file mode 100644 index 0000000000..6aa75eff68 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..b8333cd837 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/BUCK_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_.png Binary files differnew file mode 100644 index 0000000000..daa7f4a2cf --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_0.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_0.png Binary files differnew file mode 100644 index 0000000000..94fd31b985 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_0.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_1.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_1.png Binary files differnew file mode 100644 index 0000000000..bb23e9953e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_1.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_2.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_2.png Binary files differnew file mode 100644 index 0000000000..d9f3fbd2b7 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_2.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_3.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_3.png Binary files differnew file mode 100644 index 0000000000..016f84f8af --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_3.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_4.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_4.png Binary files differnew file mode 100644 index 0000000000..deab155c98 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_4.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_5.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_5.png Binary files differnew file mode 100644 index 0000000000..a6382d4475 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/DEBUG_5.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png Binary files differnew file mode 100644 index 0000000000..9448ea12bd --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png.mcmeta new file mode 100644 index 0000000000..5d86d73ad2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":5 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..63d8fda631 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..5d86d73ad2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ANNIHILATION_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":5 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR.png Binary files differnew file mode 100644 index 0000000000..48985ed510 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..53faf7d37c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BAR_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png Binary files differnew file mode 100644 index 0000000000..ccbc7a0f11 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png.mcmeta new file mode 100644 index 0000000000..7ab8340b0c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":16 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..fb4943a5c3 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..7ab8340b0c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_BHG_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":16 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png Binary files differnew file mode 100644 index 0000000000..54da4a849c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..bb123c5e6e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CANDY_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CASING.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CASING.png Binary files differnew file mode 100644 index 0000000000..3116b8973c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CASING.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL.png Binary files differnew file mode 100644 index 0000000000..4be4639f40 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL_NONSIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL_NONSIDE.png Binary files differnew file mode 100644 index 0000000000..2bb3f0f031 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COIL_NONSIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png Binary files differnew file mode 100644 index 0000000000..187394cf54 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..9d3bfe7284 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png Binary files differnew file mode 100644 index 0000000000..e76cd31b5e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_ACTIVE_SLAVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png Binary files differnew file mode 100644 index 0000000000..58cb0a9573 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COLLIDER_SLAVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png Binary files differnew file mode 100644 index 0000000000..bd9186a62f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..911ef96afa --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_COMPUTER_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png Binary files differnew file mode 100644 index 0000000000..bd0c9c427e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..093caca191 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CONTROLLER_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png Binary files differnew file mode 100644 index 0000000000..bd87d400e7 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png.mcmeta new file mode 100644 index 0000000000..82555396fa --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":7 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..b3d9c37a9a --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..82555396fa --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_CRAFTING_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":7 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA.png Binary files differnew file mode 100644 index 0000000000..c3b889dc79 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA_CONN.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA_CONN.png Binary files differnew file mode 100644 index 0000000000..222b9329ea --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DATA_CONN.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png Binary files differnew file mode 100644 index 0000000000..0166c9c7ad --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png.mcmeta new file mode 100644 index 0000000000..5d86d73ad2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":5 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..29bfd12031 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..5d86d73ad2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DECAY_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":5 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png Binary files differnew file mode 100644 index 0000000000..2686522d15 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png Binary files differnew file mode 100644 index 0000000000..1b451d601f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png.mcmeta new file mode 100644 index 0000000000..3bebb68ca0 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_0.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":9 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png Binary files differnew file mode 100644 index 0000000000..de94a87e1e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_1.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png Binary files differnew file mode 100644 index 0000000000..beb9b871dc --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png.mcmeta new file mode 100644 index 0000000000..82555396fa --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_2.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":7 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png Binary files differnew file mode 100644 index 0000000000..1dbee21f98 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png.mcmeta new file mode 100644 index 0000000000..021e6bc605 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_3.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":6 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png Binary files differnew file mode 100644 index 0000000000..31f204eb7d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png.mcmeta new file mode 100644 index 0000000000..5d86d73ad2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_4.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":5 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png Binary files differnew file mode 100644 index 0000000000..bdb1324c4c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_5.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png Binary files differnew file mode 100644 index 0000000000..b70bf59ee8 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png.mcmeta new file mode 100644 index 0000000000..24f863c95e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_6.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png Binary files differnew file mode 100644 index 0000000000..742c06e70d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_7.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png Binary files differnew file mode 100644 index 0000000000..c58676b7d7 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png.mcmeta new file mode 100644 index 0000000000..dfae8cae16 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_DIM_8.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":1 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png Binary files differnew file mode 100644 index 0000000000..61fc2a2e36 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png Binary files differnew file mode 100644 index 0000000000..aa70ba768c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png.mcmeta new file mode 100644 index 0000000000..3bebb68ca0 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_0.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":9 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png Binary files differnew file mode 100644 index 0000000000..b13397c596 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_1.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png Binary files differnew file mode 100644 index 0000000000..c11abbe912 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png.mcmeta new file mode 100644 index 0000000000..82555396fa --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_2.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":7 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png Binary files differnew file mode 100644 index 0000000000..b1ead1d500 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png.mcmeta new file mode 100644 index 0000000000..021e6bc605 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_3.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":6 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png Binary files differnew file mode 100644 index 0000000000..ad20bc1e1e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png.mcmeta new file mode 100644 index 0000000000..5d86d73ad2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_4.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":5 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png Binary files differnew file mode 100644 index 0000000000..2c34ada99c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_5.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png Binary files differnew file mode 100644 index 0000000000..4a6187d654 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png.mcmeta new file mode 100644 index 0000000000..24f863c95e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_6.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png Binary files differnew file mode 100644 index 0000000000..4e83937cd4 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_7.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png Binary files differnew file mode 100644 index 0000000000..937b1af7af --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png.mcmeta new file mode 100644 index 0000000000..dfae8cae16 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_8.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":1 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_CASING.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_CASING.png Binary files differnew file mode 100644 index 0000000000..02bbbc95f7 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_FIELD_CASING.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER.png Binary files differnew file mode 100644 index 0000000000..544c310bec --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..5c18d5317e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLDER_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLLOW.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLLOW.png Binary files differnew file mode 100644 index 0000000000..3970b1ec67 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_HOLLOW.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING.png Binary files differnew file mode 100644 index 0000000000..d956c9d8cc --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_INNER_SPACETIME_REINFORCED_EOH_CASING.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_LASER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_LASER.png Binary files differnew file mode 100644 index 0000000000..72e277673e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_LASER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING.png Binary files differnew file mode 100644 index 0000000000..798f7b6dbd --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_OUTER_SPACETIME_REINFORCED_EOH_CASING.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC.png Binary files differnew file mode 100644 index 0000000000..df6c3a0688 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV.png Binary files differnew file mode 100644 index 0000000000..8c3c5b621e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV_NONSIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV_NONSIDE.png Binary files differnew file mode 100644 index 0000000000..03d8bad1cd --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_ADV_NONSIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_NONSIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_NONSIDE.png Binary files differnew file mode 100644 index 0000000000..aa27ecdd29 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_NONSIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT.png Binary files differnew file mode 100644 index 0000000000..ee6a7079e2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT_NONSIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT_NONSIDE.png Binary files differnew file mode 100644 index 0000000000..c1a1d44471 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PC_VENT_NONSIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE.png Binary files differnew file mode 100644 index 0000000000..0be901b802 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE_CONN.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE_CONN.png Binary files differnew file mode 100644 index 0000000000..8754166137 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_PIPE_CONN.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER.png Binary files differnew file mode 100644 index 0000000000..a623e9f1d5 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER_INFINITE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER_INFINITE.png Binary files differnew file mode 100644 index 0000000000..a623e9f1d5 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_POWER_INFINITE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK.png Binary files differnew file mode 100644 index 0000000000..86c556706c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..9f016fecbd --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_RACK_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png Binary files differnew file mode 100644 index 0000000000..e4fe6bd313 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TELE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png Binary files differnew file mode 100644 index 0000000000..ed2770f533 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png.mcmeta new file mode 100644 index 0000000000..dfae8cae16 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_TIMESPACE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":1 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_CASING.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_CASING.png Binary files differnew file mode 100644 index 0000000000..798f7b6dbd --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_CASING.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png Binary files differnew file mode 100644 index 0000000000..4ab1c50315 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD_CASING.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD_CASING.png Binary files differnew file mode 100644 index 0000000000..d956c9d8cc --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_ULTIMATE_FIELD_CASING.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png Binary files differnew file mode 100644 index 0000000000..464121c8fe --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..cb4828ad05 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/EM_WH_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png Binary files differnew file mode 100644 index 0000000000..010bc0888d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/ENDERFLUIDLINK_OVERLAY.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GENNY.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GENNY.png Binary files differnew file mode 100644 index 0000000000..eef9051d61 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GENNY.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png Binary files differnew file mode 100644 index 0000000000..3266b1aec6 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta new file mode 100644 index 0000000000..7ab8340b0c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_CONTROLLER.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":16 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png Binary files differnew file mode 100644 index 0000000000..ef00e4b09b --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png Binary files differnew file mode 100644 index 0000000000..ee2cb09345 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..1158858086 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..0dab81071f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_MODULE_ACTIVE.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 3}}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.png Binary files differnew file mode 100644 index 0000000000..ea98b573e0 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png Binary files differnew file mode 100644 index 0000000000..0b93539126 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png Binary files differnew file mode 100644 index 0000000000..1c247db84b --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png Binary files differnew file mode 100644 index 0000000000..728b89f8fc --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png Binary files differnew file mode 100644 index 0000000000..d296edcad4 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..a21e6d941c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..af2b3b2037 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_SIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_SIDE.png Binary files differnew file mode 100644 index 0000000000..af2b3b2037 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_SIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_TOP.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_TOP.png Binary files differnew file mode 100644 index 0000000000..af2b3b2037 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_MAXV_TOP.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..ad519ab78d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_SIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_SIDE.png Binary files differnew file mode 100644 index 0000000000..ad519ab78d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_SIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_TOP.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_TOP.png Binary files differnew file mode 100644 index 0000000000..ad519ab78d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_OPV_TOP.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..27a092adf4 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_SIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_SIDE.png Binary files differnew file mode 100644 index 0000000000..27a092adf4 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_SIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_TOP.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_TOP.png Binary files differnew file mode 100644 index 0000000000..27a092adf4 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UEV_TOP.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..a2d780dc32 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_SIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_SIDE.png Binary files differnew file mode 100644 index 0000000000..a2d780dc32 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_SIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_TOP.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_TOP.png Binary files differnew file mode 100644 index 0000000000..a2d780dc32 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UIV_TOP.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..a401c3900d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_SIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_SIDE.png Binary files differnew file mode 100644 index 0000000000..a401c3900d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_SIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_TOP.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_TOP.png Binary files differnew file mode 100644 index 0000000000..a401c3900d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UMV_TOP.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..a3564826ac --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_SIDE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_SIDE.png Binary files differnew file mode 100644 index 0000000000..a3564826ac --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_SIDE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_TOP.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_TOP.png Binary files differnew file mode 100644 index 0000000000..a3564826ac --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MACHINE_UXV_TOP.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARK.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARK.png Binary files differnew file mode 100644 index 0000000000..5b9a8d85c6 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MARK.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png Binary files differnew file mode 100644 index 0000000000..63bea9502a --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM_IDLE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM_IDLE.png Binary files differnew file mode 100644 index 0000000000..bd9fef30a6 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/MUFFLER_EM_IDLE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..a931c65801 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png Binary files differnew file mode 100644 index 0000000000..c0851e234c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_D_SIDES.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..140a461f3c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png Binary files differnew file mode 100644 index 0000000000..e84a0364f9 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_EM_T_SIDES.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_LASER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_LASER.png Binary files differnew file mode 100644 index 0000000000..51f387ba35 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_LASER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_POWER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_POWER.png Binary files differnew file mode 100644 index 0000000000..02393fe829 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_IN_POWER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png Binary files differnew file mode 100644 index 0000000000..7db32095ce --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png.mcmeta new file mode 100644 index 0000000000..0dab81071f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_16A.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 3}}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png Binary files differnew file mode 100644 index 0000000000..531db420c7 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png.mcmeta new file mode 100644 index 0000000000..0dab81071f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_4A.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 3}}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png Binary files differnew file mode 100644 index 0000000000..aef6a37f1b --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png.mcmeta new file mode 100644 index 0000000000..0dab81071f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_ON_WIRELESS_LASER.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 3}}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_LASER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_LASER.png Binary files differnew file mode 100644 index 0000000000..4706e3cf6a --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_LASER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_POWER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_POWER.png Binary files differnew file mode 100644 index 0000000000..399b32696d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_ENERGY_OUT_POWER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png Binary files differnew file mode 100644 index 0000000000..6b554f2031 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png.mcmeta new file mode 100644 index 0000000000..24f863c95e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_FULLAUTOMAINTENANCE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_OFFLINE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_OFFLINE.png Binary files differnew file mode 100644 index 0000000000..ebf319261a --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_OFFLINE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_ONLINE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_ONLINE.png Binary files differnew file mode 100644 index 0000000000..ba8786cf7e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/OWNER_ONLINE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png Binary files differnew file mode 100644 index 0000000000..5c8823e743 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..43e88d959c --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/PARAM_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/POLLUTOR.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/POLLUTOR.png Binary files differnew file mode 100644 index 0000000000..c8c32d0ab4 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/POLLUTOR.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/POWERPASSUPGRADE_OVERLAY.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/POWERPASSUPGRADE_OVERLAY.png Binary files differnew file mode 100644 index 0000000000..a623e9f1d5 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/POWERPASSUPGRADE_OVERLAY.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png Binary files differnew file mode 100644 index 0000000000..ee04fde165 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_OFFLINE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png Binary files differnew file mode 100644 index 0000000000..cfb2f8aaa7 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/READER_ONLINE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png Binary files differnew file mode 100644 index 0000000000..af85482d1a --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/SCREEN_OFF.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png Binary files differnew file mode 100644 index 0000000000..e9ebbf32b5 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png.mcmeta new file mode 100644 index 0000000000..3bebb68ca0 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_0.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":9 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png Binary files differnew file mode 100644 index 0000000000..48e7b498fa --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_1.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png Binary files differnew file mode 100644 index 0000000000..37eb81e18d --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png.mcmeta new file mode 100644 index 0000000000..82555396fa --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_2.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":7 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png Binary files differnew file mode 100644 index 0000000000..8a19e7e378 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png.mcmeta new file mode 100644 index 0000000000..021e6bc605 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_3.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":6 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png Binary files differnew file mode 100644 index 0000000000..e678fb858e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png.mcmeta new file mode 100644 index 0000000000..5d86d73ad2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_4.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":5 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png Binary files differnew file mode 100644 index 0000000000..379a12d2ba --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_5.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png Binary files differnew file mode 100644 index 0000000000..495f936c59 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png.mcmeta new file mode 100644 index 0000000000..24f863c95e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_6.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png Binary files differnew file mode 100644 index 0000000000..0efa24aa1f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png.mcmeta new file mode 100644 index 0000000000..97596ba817 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_7.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png Binary files differnew file mode 100644 index 0000000000..41353dc3e8 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png.mcmeta new file mode 100644 index 0000000000..dfae8cae16 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/STABILITY_CASING_8.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":1 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY.png Binary files differnew file mode 100644 index 0000000000..fc16be01b0 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY_ULTIMATE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY_ULTIMATE.png Binary files differnew file mode 100644 index 0000000000..5acfa08654 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_OVERLAY_ULTIMATE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_TRANSCEIVER_TOP.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_TRANSCEIVER_TOP.png Binary files differnew file mode 100644 index 0000000000..c0de56149e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TESLA_TRANSCEIVER_TOP.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_SIDES.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_SIDES.png Binary files differnew file mode 100644 index 0000000000..52087f837e --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_SIDES.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_TOP_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_TOP_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..5ba1e61487 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_BASE_TOP_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS.png Binary files differnew file mode 100644 index 0000000000..4401341ad7 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..9ce6223110 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_CAPS_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOROID.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOROID.png Binary files differnew file mode 100644 index 0000000000..aa804773fe --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOROID.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER.png Binary files differnew file mode 100644 index 0000000000..5f996ca2ed --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..14423d1741 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_TOWER_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0.png Binary files differnew file mode 100644 index 0000000000..266a300698 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_0.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1.png Binary files differnew file mode 100644 index 0000000000..2f547cf220 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_1.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2.png Binary files differnew file mode 100644 index 0000000000..f36d636040 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_2.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3.png Binary files differnew file mode 100644 index 0000000000..503abed157 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_3.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4.png Binary files differnew file mode 100644 index 0000000000..ccfb85c4cd --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_4.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5.png Binary files differnew file mode 100644 index 0000000000..7f2fb33e5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_5.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6.png Binary files differnew file mode 100644 index 0000000000..833597130b --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_SIDES_6.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0.png Binary files differnew file mode 100644 index 0000000000..fed9a8e282 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_0.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1.png Binary files differnew file mode 100644 index 0000000000..35a58c88b1 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_1.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2.png Binary files differnew file mode 100644 index 0000000000..737b5e7a33 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_2.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3.png Binary files differnew file mode 100644 index 0000000000..ad847ef247 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_3.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4.png Binary files differnew file mode 100644 index 0000000000..2842d9ce1a --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_4.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5.png Binary files differnew file mode 100644 index 0000000000..00e30e13fe --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_5.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6.png Binary files differnew file mode 100644 index 0000000000..de4ce136e7 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_PRIMARY_TOP_BOTTOM_6.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_SIDES.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_SIDES.png Binary files differnew file mode 100644 index 0000000000..55d9bb5d23 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_SIDES.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM.png Binary files differnew file mode 100644 index 0000000000..b77b4b1e53 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TM_TESLA_WINDING_SECONDARY_TOP_BOTTOM.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TRANSPARENT.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TRANSPARENT.png Binary files differnew file mode 100644 index 0000000000..6175e8622a --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/TRANSPARENT.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png Binary files differnew file mode 100644 index 0000000000..c437e992e2 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png Binary files differnew file mode 100644 index 0000000000..dc5dcd1af0 --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png diff --git a/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png.mcmeta b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png.mcmeta new file mode 100644 index 0000000000..5e86a7cd5f --- /dev/null +++ b/tectech/src/main/resources/assets/gregtech/textures/blocks/iconsets/UC_ACTIVE.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/tectech/lang/en_US.lang b/tectech/src/main/resources/assets/tectech/lang/en_US.lang new file mode 100644 index 0000000000..511def2331 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/lang/en_US.lang @@ -0,0 +1,1675 @@ +#Creative Tab Name +itemGroup.TecTech=TecTech Interdimensional +itemGroup.EM=TecTech Elemental Matter + +#Blocks +tile.quantumStuff.name=Quantum Stuff +tile.Eye of Harmony Renderer.name=Eye of Harmony Renderer + +tile.quantumGlass.name=Quantum Glass +tile.quantumGlass.desc.0=Dense yet transparent +tile.quantumGlass.desc.1=Glassy & Classy + +tile.spatiallyTranscendentGravitationalLens.name=Spatially Transcendent Gravitational Lens Block +tile.godforgeGlass.desc.0=Gravitational lensing taken literal +tile.godforgeGlass.desc.1=GraviLens 9000! + +tile.reactorSim.name=Reactor Simulator +tile.reactorSim.desc.0=Fission Reaction Uncertainty Resolver 9001 +tile.reactorSim.desc.1=Explodes, but not as much... + +#Items +item.em.programmer.name=AVR programmer +item.em.programmer.desc.0=Current PC +item.em.programmer.desc.1=Awoken +item.em.programmer.desc.2=Active +item.em.programmer.desc.3=Debug +item.em.programmer.desc.4=Delay + +item.em.debugContainer.name=Debug EM Container +item.em.debugContainer.desc.0=Contains +item.em.debugContainer.desc.1=Container for elemental matter +item.em.debugContainer.desc.2=Right click on elemental hatches +item.em.debugContainer.desc.3=---Unexpected Termination--- + +item.em.definitionContainer.name=EM Recipe Hint +item.em.definitionContainer.desc.0=Should Contain +item.em.definitionContainer.desc.1=Recipe Hint +item.em.definitionContainer.desc.2=---Unexpected Termination--- + +item.em.definitionScanStorage.name=EM Scan Storage +item.em.definitionScanStorage.desc.0=Contains scan result +item.em.definitionScanStorage.desc.1=Use to read +item.em.definitionScanStorage.desc.2=Storage for matter scan data +item.em.definitionScanStorage.desc.3=---Unexpected Termination--- + +item.em.constructable.name=Multiblock Machine Blueprint +item.em.constructable.desc.0=Triggers Constructable Interface +item.em.constructable.desc.1=Shows multiblock construction details, +item.em.constructable.desc.2=just Use on a multiblock controller. +item.em.constructable.desc.3=(Sneak Use in creative to build) +item.em.constructable.desc.4=Quantity affects tier/mode/type + +item.em.EuMeterGT.name=GT EU meter +item.em.EuMeterGT.desc.0=Measures basic EU related stuff +item.em.EuMeterGT.desc.1=Just right click on blocks. + +item.em.frontRotate.name=Front Rotation Scrench +item.em.frontRotate.desc.0=Triggers Front Rotation Interface +item.em.frontRotate.desc.1=Rotates only the front panel, +item.em.frontRotate.desc.2=which allows structure rotation. + +item.em.parametrizerMemoryCard.name=Parametrizer Memory Card +item.em.parametrizerMemoryCard.name.paste=Parametrizer Memory Card (Paste Mode) +item.em.parametrizerMemoryCard.name.copy=Parametrizer Memory Card (Copy Mode) +item.em.parametrizerMemoryCard.desc.0=Stores Parameters +item.em.parametrizerMemoryCard.desc.1=Use on Multiblock Controller to configure it +item.em.parametrizerMemoryCard.desc.2=Use on Multiblock Controller to store parameters +item.em.parametrizerMemoryCard.desc.3=Sneak right click to lock/unlock + +item.tm.teslaCoilCapacitor.0.name=LV Tesla Capacitor +item.tm.teslaCoilCapacitor.1.name=MV Tesla Capacitor +item.tm.teslaCoilCapacitor.2.name=HV Tesla Capacitor +item.tm.teslaCoilCapacitor.3.name=EV Tesla Capacitor +item.tm.teslaCoilCapacitor.4.name=IV Tesla Capacitor +item.tm.teslaCoilCapacitor.5.name=LuV Tesla Capacitor +item.tm.teslaCoilCapacitor.6.name=ZPM Tesla Capacitor +item.tm.teslaCoilCapacitor.desc.0=Stores +item.tm.teslaCoilCapacitor.desc.1=EU in a tesla tower at +item.tm.teslaCoilCapacitor.desc.2=Yeet this broken item into some spicy water! +item.tm.teslaCoilCapacitor.desc.3=Insert into a Capacitor hatch of a Tesla Tower +item.tm.teslaCoilCapacitor.desc.4=Capacitors are the same thing as batteries, right? + +item.tm.itemTeslaComponent.0.name=Electrum Tesla Windings +item.tm.itemTeslaComponent.1.name=Superconductive Tesla Windings +item.tm.itemTeslaComponent.desc=Tesla bois need these! + +item.tm.teslaCover.0.name=Tesla Coil Cover +item.tm.teslaCover.1.name=Tesla Coil Cover Rich Edition +item.tm.teslaCover.desc.0=Tesla-Enables Machines! +item.tm.teslaCover.desc.1=Tesla-Enables Machines! (BUT LOUDER!!) +item.tm.teslaCover.desc.2=Yeet this broken item into some spicy water! +item.tm.teslaCover.desc.3=Use on top of a machine to enable Tesla capabilities +item.tm.teslaCover.desc.4=Who the hell uses cables anyway? + +item.tm.teslaStaff.name=Tesla Staff +item.tm.teslaStaff.desc=Power of the gods, at the whim of a mortal! + +item.tm.enderfluidlinkcover.name=Ender Fluid Link Cover +item.tm.enderfluidlinkcover.desc.0=Ender-Fluid-Enables Machines! +item.tm.enderfluidlinkcover.desc.1=Use on any side of a fluid tank to link it to the Ender +item.tm.enderfluidlinkcover.desc.2=Ender Tanks so are laggy -Bot from the Chads of NH + +item.tm.powerpassupgradecover.name=Power Pass Upgrade Cover +item.tm.powerpassupgradecover.desc.0=Add power pass functionality to TecTech Multiblocks +item.tm.powerpassupgradecover.desc.1=Active transformer in a can?? +item.tm.powerpassupgradecover.desc.2=Chain them up like Christmas lights! + +item.tm.itemAstralArrayFabricator.name=Astral Array Fabricator +item.tm.itemAstralArrayFabricator.desc0=Parallel dimensions?! +item.tm.itemAstralArrayFabricator.desc1=Device capable of enhancing the Eye of Harmony's spatial compression, +item.tm.itemAstralArrayFabricator.desc2=reaching into the space beyond. +item.tm.itemAstralArrayFabricator.desc3=Allows for recipe parallelism. + +#Death Messages +death.attack.microwaving=%1$s was dehydrated by radiation. +death.attack.microwaving.player=%1$s was dehydrated by radiation while fighting %2$s. +death.attack.elementalPollution=%1$s was vaping from the wrong hole. +death.attack.elementalPollution.player=%1$s was vaping from the wrong hole while fighting %2$s. +death.attack.subspace=%1$s was N-th dimensionally displeased. +death.attack.subspace.player=%1$s N-th dimensionally displeased while fighting %2$s. + +#Machine hulls +gt.blockmachines.hull.tier.10.name=UEV Machine Hull +gt.blockmachines.hull.tier.11.name=UIV Machine Hull +gt.blockmachines.hull.tier.12.name=UMV Machine Hull +gt.blockmachines.hull.tier.13.name=UXV Machine Hull +gt.blockmachines.hull.tier.14.name=MAX Machine Hull + +#Transformers +gt.blockmachines.wetransformer.tier.00.name=Ultra Low Voltage Power Transformer +gt.blockmachines.wetransformer.tier.00.desc=LV -> ULV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.01.name=Low Voltage Power Transformer +gt.blockmachines.wetransformer.tier.01.desc=MV -> LV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.02.name=Medium Voltage Power Transformer +gt.blockmachines.wetransformer.tier.02.desc=HV -> MV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.03.name=High Voltage Power Transformer +gt.blockmachines.wetransformer.tier.03.desc=EV -> HV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.04.name=Extreme Power Transformer +gt.blockmachines.wetransformer.tier.04.desc=IV -> EV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.05.name=Insane Power Transformer +gt.blockmachines.wetransformer.tier.05.desc=LuV -> IV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.06.name=Ludicrous Power Transformer +gt.blockmachines.wetransformer.tier.06.desc=ZPM -> LuV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.07.name=ZPM Voltage Power Transformer +gt.blockmachines.wetransformer.tier.07.desc=UV -> ZPM (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.08.name=Ultimate Power Transformer +gt.blockmachines.wetransformer.tier.08.desc=UHV -> UV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.09.name=Highly Ultimate Power Transformer +gt.blockmachines.wetransformer.tier.09.desc=UEV -> UHV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.10.name=Extremely Ultimate Power Transformer +gt.blockmachines.wetransformer.tier.10.desc=UIV -> UEV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.11.name=Insanely Ultimate Power Transformer +gt.blockmachines.wetransformer.tier.11.desc=UMV -> UIV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.12.name=Mega Ultimate Power Transformer +gt.blockmachines.wetransformer.tier.12.desc=UXV -> UMV (Use Soft Mallet to invert) +gt.blockmachines.wetransformer.tier.13.name=Extended Mega Ultimate Power Transformer +gt.blockmachines.wetransformer.tier.13.desc=MAX -> UXV (Use Soft Mallet to invert) + +gt.blockmachines.tt.transformer.tier.09.name=Highly Ultimate Transformer +gt.blockmachines.tt.transformer.tier.09.desc=UEV -> UHV (Use Soft Mallet to invert) +gt.blockmachines.tt.transformer.tier.10.name=Extremely Ultimate Transformer +gt.blockmachines.tt.transformer.tier.10.desc=UIV -> UEV (Use Soft Mallet to invert) +gt.blockmachines.tt.transformer.tier.11.name=Insanely Ultimate Transformer +gt.blockmachines.tt.transformer.tier.11.desc=UMV -> UIV (Use Soft Mallet to invert) +gt.blockmachines.tt.transformer.tier.12.name=Mega Ultimate Transformer +gt.blockmachines.tt.transformer.tier.12.desc=UXV -> UMV (Use Soft Mallet to invert) +gt.blockmachines.tt.transformer.tier.13.name=Extended Mega Ultimate Transformer +gt.blockmachines.tt.transformer.tier.13.desc=MAX -> UXV (Use Soft Mallet to invert) + +gt.blockmachines.transformer.ha.tier.09.name=Highly Ultimate Hi-Amp Transformer +gt.blockmachines.transformer.ha.tier.09.desc=UEV -> UHV (Use Soft Mallet to invert +gt.blockmachines.transformer.ha.tier.10.name=Extremely Ultimate Hi-Amp Transformer +gt.blockmachines.transformer.ha.tier.10.desc=UIV -> UEV (Use Soft Mallet to invert) +gt.blockmachines.transformer.ha.tier.11.name=Insanely Ultimate Hi-Amp Transformer +gt.blockmachines.transformer.ha.tier.11.desc=UMV -> UIV (Use Soft Mallet to invert) +gt.blockmachines.transformer.ha.tier.12.name=Mega Ultimate Hi-Amp Transformer +gt.blockmachines.transformer.ha.tier.12.desc=UXV -> UMV (Use Soft Mallet to invert) +gt.blockmachines.transformer.ha.tier.13.name=Extended Mega Ultimate Hi-Amp Transformer +gt.blockmachines.transformer.ha.tier.13.desc=MAX -> UXV (Use Soft Mallet to invert) + +#Hatches +tt.base.emhatch.desc.0=Max stacks amount: +tt.base.emhatch.desc.1=Stack capacity: +tt.base.emhatch.desc.2=Place Overflow Hatch behind,on top or below +tt.base.emhatch.desc.3=to provide overflow protection while this block +tt.base.emhatch.desc.4=is not attached to multi block. +tt.base.emhatch.desc.5=Transport range can be extended in straight +tt.base.emhatch.desc.6=line up to 15 blocks with quantum tunnels. +tt.base.emhatch.desc.7=Must be painted to work + +gt.blockmachines.hatch.emmuffler.tier.08.name=UV Overflow Output Hatch +gt.blockmachines.hatch.emmuffler.tier.09.name=UHV Overflow Output Hatch +gt.blockmachines.hatch.emmuffler.tier.10.name=UEV Overflow Output Hatch +gt.blockmachines.hatch.emmuffler.tier.11.name=UIV Overflow Output Hatch +gt.blockmachines.hatch.emmuffler.tier.12.name=UMV Overflow Output Hatch +gt.blockmachines.hatch.emmuffler.tier.13.name=UXV Overflow Output Hatch +gt.blockmachines.hatch.emmuffler.desc.0=Disposes excess elemental Matter +gt.blockmachines.hatch.emmuffler.desc.1=Mass capacity +gt.blockmachines.hatch.emmuffler.desc.2=Disposal Speed +gt.blockmachines.hatch.emmuffler.desc.3=DO NOT OBSTRUCT THE OUTPUT! + +gt.blockmachines.hatch.energymulti04.tier.05.name=IV 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.05.name=IV 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.05.name=IV 64A Energy Hatch +gt.blockmachines.hatch.energymulti04.tier.06.name=LuV 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.06.name=LuV 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.06.name=LuV 64A Energy Hatch +gt.blockmachines.hatch.energymulti04.tier.07.name=ZPM 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.07.name=ZPM 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.07.name=ZPM 64A Energy Hatch +gt.blockmachines.hatch.energymulti04.tier.08.name=UV 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.08.name=UV 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.08.name=UV 64A Energy Hatch +gt.blockmachines.hatch.energymulti04.tier.09.name=UHV 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.09.name=UHV 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.09.name=UHV 64A Energy Hatch +gt.blockmachines.hatch.energymulti04.tier.10.name=UEV 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.10.name=UEV 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.10.name=UEV 64A Energy Hatch +gt.blockmachines.hatch.energymulti04.tier.11.name=UIV 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.11.name=UIV 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.11.name=UIV 64A Energy Hatch +gt.blockmachines.hatch.energymulti04.tier.12.name=UMV 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.12.name=UMV 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.12.name=UMV 64A Energy Hatch +gt.blockmachines.hatch.energymulti04.tier.13.name=UXV 4A Energy Hatch +gt.blockmachines.hatch.energymulti16.tier.13.name=UXV 16A Energy Hatch +gt.blockmachines.hatch.energymulti64.tier.13.name=UXV 64A Energy Hatch +gt.blockmachines.hatch.energymulti.desc.0=Multiple Ampere Energy Injector for Multiblocks +gt.blockmachines.hatch.energymulti.desc.1=Amperes In +gt.blockmachines.hatch.energymulti.desc.2=Accepts up to %d Amps from energy network +gt.blockmachines.hatch.energymulti.desc.3=Provides up to %d Amps to the multiblock + +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.04=EV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.04=EV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.04=EV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.05=IV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.05=IV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.05=IV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.06=LuV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.06=LuV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.06=LuV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.07=ZPM 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.07=ZPM 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.07=ZPM 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.08=UV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.08=UV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.08=UV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.09=UHV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.09=UHV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.09=UHV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.10=UEV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.10=UEV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.10=UEV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.11=UIV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.11=UIV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.11=UIV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.12=UMV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.12=UMV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.12=UMV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.13=UXV 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.13=UXV 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.13=UXV 64A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.14=MAX 4A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.14=MAX 16A Wireless Energy Hatch +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.14=MAX 64A Wireless Energy Hatch + +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.04.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.04.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.04.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.05.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.05.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.05.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.06.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.06.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.06.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.07.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.07.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.07.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.08.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.08.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.08.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.09.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.09.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.09.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.10.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.10.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.10.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.11.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.11.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.11.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.12.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.12.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.12.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.13.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.13.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.13.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti04.tier.14.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti16.tier.14.desc=Multi Amp Wireless Energy! +achievement.gt.blockmachines.hatch.energywirelessmulti64.tier.14.desc=Multi Amp Wireless Energy! + +gt.blockmachines.hatch.energywirelesstunnel1.tier.13.name=UXV 256A Wireless Energy Hatch +gt.blockmachines.hatch.energywirelesstunnel2.tier.13.name=UXV 1,024A Wireless Energy Hatch +gt.blockmachines.hatch.energywirelesstunnel3.tier.13.name=UXV 4,096A Wireless Energy Hatch +gt.blockmachines.hatch.energywirelesstunnel4.tier.13.name=UXV 16,384A Wireless Energy Hatch +gt.blockmachines.hatch.energywirelesstunnel5.tier.13.name=UXV 65,536A Wireless Energy Hatch +gt.blockmachines.hatch.energywirelesstunnel6.tier.13.name=UXV 262,144A Wireless Energy Hatch +gt.blockmachines.hatch.energywirelesstunnel7.tier.13.name=UXV 1,048,576A Wireless Energy Hatch + +achievement.gt.blockmachines.hatch.energywirelesstunnel1.tier.13.desc=High Amp Wireless Energy at last! +achievement.gt.blockmachines.hatch.energywirelesstunnel2.tier.13.desc=High Amp Wireless Energy at last! +achievement.gt.blockmachines.hatch.energywirelesstunnel3.tier.13.desc=High Amp Wireless Energy at last! +achievement.gt.blockmachines.hatch.energywirelesstunnel4.tier.13.desc=High Amp Wireless Energy at last! +achievement.gt.blockmachines.hatch.energywirelesstunnel5.tier.13.desc=High Amp Wireless Energy at last! +achievement.gt.blockmachines.hatch.energywirelesstunnel6.tier.13.desc=High Amp Wireless Energy at last! +achievement.gt.blockmachines.hatch.energywirelesstunnel7.tier.13.desc=High Amp Wireless Energy at last! + +gt.blockmachines.hatch.energytunnel1.tier.05.name=IV 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.05.name=IV 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.05.name=IV 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.05.name=IV 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.05.name=IV 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.05.name=IV 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.05.name=IV 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel1.tier.06.name=LuV 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.06.name=LuV 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.06.name=LuV 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.06.name=LuV 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.06.name=LuV 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.06.name=LuV 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.06.name=LuV 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel1.tier.07.name=ZPM 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.07.name=ZPM 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.07.name=ZPM 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.07.name=ZPM 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.07.name=ZPM 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.07.name=ZPM 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.07.name=ZPM 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel1.tier.08.name=UV 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.08.name=UV 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.08.name=UV 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.08.name=UV 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.08.name=UV 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.08.name=UV 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.08.name=UV 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel1.tier.09.name=UHV 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.09.name=UHV 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.09.name=UHV 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.09.name=UHV 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.09.name=UHV 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.09.name=UHV 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.09.name=UHV 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel1.tier.10.name=UEV 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.10.name=UEV 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.10.name=UEV 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.10.name=UEV 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.10.name=UEV 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.10.name=UEV 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.10.name=UEV 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel1.tier.11.name=UIV 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.11.name=UIV 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.11.name=UIV 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.11.name=UIV 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.11.name=UIV 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.11.name=UIV 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.11.name=UIV 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel1.tier.12.name=UMV 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.12.name=UMV 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.12.name=UMV 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.12.name=UMV 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.12.name=UMV 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.12.name=UMV 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.12.name=UMV 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel1.tier.13.name=UXV 256A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel2.tier.13.name=UXV 1,024A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel3.tier.13.name=UXV 4,096A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel4.tier.13.name=UXV 16,384A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel5.tier.13.name=UXV 65,536A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel6.tier.13.name=UXV 262,144A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel7.tier.13.name=UXV 1,048,576A/t Laser Target Hatch +gt.blockmachines.hatch.energytunnel.tier.14.name=Legendary Laser Target Hatch +gt.blockmachines.hatch.energytunnel.desc.0=Energy injecting terminal for Multiblocks +gt.blockmachines.hatch.energytunnel.desc.1=Throughput + +gt.blockmachines.hatch.dynamomulti04.tier.05.name=IV 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.05.name=IV 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.05.name=IV 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti04.tier.06.name=LuV 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.06.name=LuV 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.06.name=LuV 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti04.tier.07.name=ZPM 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.07.name=ZPM 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.07.name=ZPM 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti04.tier.08.name=UV 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.08.name=UV 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.08.name=UV 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti04.tier.09.name=UHV 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.09.name=UHV 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.09.name=UHV 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti04.tier.10.name=UEV 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.10.name=UEV 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.10.name=UEV 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti04.tier.11.name=UIV 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.11.name=UIV 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.11.name=UIV 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti04.tier.12.name=UMV 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.12.name=UMV 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.12.name=UMV 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti04.tier.13.name=UXV 4A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti16.tier.13.name=UXV 16A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti64.tier.13.name=UXV 64A Dynamo Hatch +gt.blockmachines.hatch.dynamomulti.desc.0=Multiple Ampere Energy Extractor for Multiblocks +gt.blockmachines.hatch.dynamomulti.desc.1=Amperes Out + +gt.blockmachines.hatch.dynamotunnel1.tier.05.name=IV 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.05.name=IV 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.05.name=IV 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.05.name=IV 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.05.name=IV 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.05.name=IV 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.05.name=IV 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel1.tier.06.name=LuV 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.06.name=LuV 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.06.name=LuV 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.06.name=LuV 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.06.name=LuV 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.06.name=LuV 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.06.name=LuV 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel1.tier.07.name=ZPM 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.07.name=ZPM 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.07.name=ZPM 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.07.name=ZPM 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.07.name=ZPM 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.07.name=ZPM 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.07.name=ZPM 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel1.tier.08.name=UV 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.08.name=UV 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.08.name=UV 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.08.name=UV 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.08.name=UV 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.08.name=UV 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.08.name=UV 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel1.tier.09.name=UHV 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.09.name=UHV 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.09.name=UHV 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.09.name=UHV 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.09.name=UHV 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.09.name=UHV 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.09.name=UHV 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel1.tier.10.name=UEV 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.10.name=UEV 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.10.name=UEV 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.10.name=UEV 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.10.name=UEV 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.10.name=UEV 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.10.name=UEV 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel1.tier.11.name=UIV 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.11.name=UIV 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.11.name=UIV 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.11.name=UIV 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.11.name=UIV 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.11.name=UIV 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.11.name=UIV 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel1.tier.12.name=UMV 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.12.name=UMV 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.12.name=UMV 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.12.name=UMV 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.12.name=UMV 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.12.name=UMV 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.12.name=UMV 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel1.tier.13.name=UXV 256A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel2.tier.13.name=UXV 1,024A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel3.tier.13.name=UXV 4,096A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel4.tier.13.name=UXV 16,384A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel5.tier.13.name=UXV 65,536A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel6.tier.13.name=UXV 262,144A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel7.tier.13.name=UXV 1,048,576A/t Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel.tier.14.name=Legendary Laser Source Hatch +gt.blockmachines.hatch.dynamotunnel.desc.0=Energy extracting terminal for Multiblocks +gt.blockmachines.hatch.dynamotunnel.desc.1=Throughput + +gt.blockmachines.emin.tier.08.name=UV Elemental Input Hatch +gt.blockmachines.emin.tier.09.name=UHV Elemental Input Hatch +gt.blockmachines.emin.tier.10.name=UEV Elemental Input Hatch +gt.blockmachines.emin.tier.11.name=UIV Elemental Input Hatch +gt.blockmachines.emin.tier.12.name=UMV Elemental Input Hatch +gt.blockmachines.emin.tier.13.name=UXV Elemental Input Hatch +gt.blockmachines.emin.desc=Elemental Input for Multiblocks + +gt.blockmachines.emout.tier.08.name=UV Elemental Output Hatch +gt.blockmachines.emout.tier.09.name=UHV Elemental Output Hatch +gt.blockmachines.emout.tier.10.name=UEV Elemental Output Hatch +gt.blockmachines.emout.tier.11.name=UIV Elemental Output Hatch +gt.blockmachines.emout.tier.12.name=UMV Elemental Output Hatch +gt.blockmachines.emout.tier.13.name=UXV Elemental Output Hatch +gt.blockmachines.emout.desc=Elemental Output for Multiblocks + +#TODO change tier.05 to tier.04 +gt.blockmachines.hatch.param.tier.05.name=Parametrizer +gt.blockmachines.hatch.param.tier.07.name=Parametrizer X +gt.blockmachines.hatch.param.tier.10.name=Parametrizer tXt +gt.blockmachines.hatch.param.desc.0=For parametrization of Multiblocks +gt.blockmachines.hatch.param.desc.1=E=mine*craft + +gt.blockmachines.hatch.certain.tier.07.name=Uncertainty Resolver +gt.blockmachines.hatch.certain.tier.10.name=Uncertainty Resolver X +gt.blockmachines.hatch.certain.desc.0=Feeling certain, or not? +gt.blockmachines.hatch.certain.desc.1=Schrödinger equation in a box + +gt.blockmachines.hatch.datain.tier.07.name=Optical Slave Connector +gt.blockmachines.hatch.datain.desc.0=Quantum Data Input for Multiblocks +gt.blockmachines.hatch.datain.desc.1=High speed fibre optics connector. +gt.blockmachines.hatch.datain.desc.2=Must be painted to work + +gt.blockmachines.hatch.dataout.tier.07.name=Optical Master Connector +gt.blockmachines.hatch.dataout.desc.0=Quantum Data Output for Multiblocks +gt.blockmachines.hatch.dataout.desc.1=High speed fibre optics connector. +gt.blockmachines.hatch.dataout.desc.2=Must be painted to work + +gt.blockmachines.hatch.datainass.tier.07.name=Assembly line Slave Connector +gt.blockmachines.hatch.datainass.desc.0=ItemStack Data Input for Multiblocks +gt.blockmachines.hatch.datainass.desc.1=High speed fibre optics connector. +gt.blockmachines.hatch.datainass.desc.2=Must be painted to work + +gt.blockmachines.hatch.dataoutass.tier.07.name=Data Bank Master Connector +gt.blockmachines.hatch.dataoutass.desc.0=ItemStack Data Output for Multiblocks +gt.blockmachines.hatch.dataoutass.desc.1=High speed fibre optics connector. +gt.blockmachines.hatch.dataoutass.desc.2=Must be painted to work + +gt.blockmachines.hatch.rack.tier.08.name=Computer Rack +gt.blockmachines.hatch.rack.desc.0=4 Slot Rack +gt.blockmachines.hatch.rack.desc.1=Holds Computer Components +gt.blockmachines.hatch.holder.tier.09.name=Object Holder +gt.blockmachines.hatch.holder.desc.0=For Research Station +gt.blockmachines.hatch.holder.desc.1=Advanced Holding Mechanism! +gt.blockmachines.hatch.capacitor.tier.03.name=Capacitor Hatch +gt.blockmachines.hatch.capacitor.desc.0=For Tesla Tower +gt.blockmachines.hatch.capacitor.desc.1=Stores 'nergy! (for a while) + +#Casings +gt.blockcasingsNH.10.name=UEV Machine Casing +gt.blockcasingsNH.11.name=UIV Machine Casing +gt.blockcasingsNH.12.name=UMV Machine Casing +gt.blockcasingsNH.13.name=UXV Machine Casing +gt.blockcasingsNH.14.name=MAX Machine Casing + +gt.blockhintTT.desc.0=Helps while building +gt.blockhintTT.0.name=Hint 1 dot +gt.blockhintTT.1.name=Hint 2 dot +gt.blockhintTT.2.name=Hint 3 dot +gt.blockhintTT.3.name=Hint 4 dot +gt.blockhintTT.4.name=Hint 5 dot +gt.blockhintTT.5.name=Hint 6 dot +gt.blockhintTT.6.name=Hint 7 dot +gt.blockhintTT.7.name=Hint 8 dot +gt.blockhintTT.8.name=Hint 9 dot +gt.blockhintTT.9.name=Hint 10 dot +gt.blockhintTT.10.name=Hint 11 dot +gt.blockhintTT.11.name=Hint 12 dot +gt.blockhintTT.desc.1=Placeholder for a certain group. +gt.blockhintTT.12.name=Hint general +gt.blockhintTT.desc.2=General placeholder. +gt.blockhintTT.13.name=Hint air +gt.blockhintTT.desc.3=Make sure it contains Air material. +gt.blockhintTT.14.name=Hint no air +gt.blockhintTT.desc.4=Make sure it does not contain Air material. +gt.blockhintTT.15.name=Hint error +gt.blockhintTT.desc.5=ERROR, what did u expect? + +gt.blockcasingsTT.0.name=High Power Casing +gt.blockcasingsTT.0.desc.0=Well suited for high power applications. +gt.blockcasingsTT.0.desc.1=The power levels are rising! +gt.blockcasingsTT.1.name=Computer Casing +gt.blockcasingsTT.1.desc.0=Nice and clean casing. +gt.blockcasingsTT.1.desc.1=Dust can break it!? +gt.3blockcasingsTT.2.name=Computer Heat Vent +gt.blockcasingsTT.2.desc.0=Air vent with a filter. +gt.blockcasingsTT.2.desc.1=Perfectly muffled sound! +gt.blockcasingsTT.3.name=Advanced Computer Casing +gt.blockcasingsTT.3.desc.0=Contains high bandwidth bus +gt.blockcasingsTT.3.desc.1=couple thousand qubits wide. +gt.blockcasingsTT.4.name=Molecular Casing +gt.blockcasingsTT.4.desc.0=Stops elemental things. +gt.blockcasingsTT.4.desc.1=Radiation and emotions too... +gt.blockcasingsTT.5.name=Advanced Molecular Casing +gt.blockcasingsTT.5.desc.0=Cooling and stabilization. +gt.blockcasingsTT.5.desc.1=A comfortable machine bed. +gt.blockcasingsTT.6.name=Containment Field Generator +gt.blockcasingsTT.6.desc.0=Creates a field that... +gt.blockcasingsTT.6.desc.1=can stop even force carriers. +gt.blockcasingsTT.7.name=Molecular Coil +gt.blockcasingsTT.7.desc.0=Well it does things too... +gt.blockcasingsTT.7.desc.1=[Use this coil!] +gt.blockcasingsTT.8.name=Hollow Casing +gt.blockcasingsTT.8.desc.0=Reinforced accelerator tunnel. +gt.blockcasingsTT.8.desc.1=Most advanced pipe ever. +gt.blockcasingsTT.9.name=Spacetime Altering Casing +gt.blockcasingsTT.9.desc.0=c is no longer the limit. +gt.blockcasingsTT.9.desc.1=Wibbly wobbly timey wimey stuff. +gt.blockcasingsTT.10.name=Teleportation Casing +gt.blockcasingsTT.10.desc.0=Remote connection. +gt.blockcasingsTT.10.desc.1=Better touch with a stick. +gt.blockcasingsTT.11.name=Dimensional Bridge Generator +gt.blockcasingsTT.11.desc.0=Interdimensional Operations. +gt.blockcasingsTT.11.desc.1=Around the universe and other places too. +gt.blockcasingsTT.12.name=Ultimate Molecular Casing +gt.blockcasingsTT.12.desc.0=Ultimate in every way. +gt.blockcasingsTT.12.desc.1=I don't know what it can't do. +gt.blockcasingsTT.13.name=Ultimate Advanced Molecular Casing +gt.blockcasingsTT.13.desc.0=More Ultimate in every way. +gt.blockcasingsTT.13.desc.1=I don't know what I am doing! +gt.blockcasingsTT.14.name=Ultimate Containment Field Generator +gt.blockcasingsTT.14.desc.0=Black Hole... +gt.blockcasingsTT.14.desc.1=Meh... +gt.blockcasingsTT.15.name=Debug Sides +gt.blockcasingsTT.15.desc.0=Lazy man way of determining sides. +gt.blockcasingsTT.15.desc.1=0, 1, 2, 3, 4, 5, 6?! + +gt.blockcasingsBA0.0.name=Redstone Alloy Primary Tesla Windings +gt.blockcasingsBA0.1.name=MV Superconductor Primary Tesla Windings +gt.blockcasingsBA0.2.name=HV Superconductor Primary Tesla Windings +gt.blockcasingsBA0.3.name=EV Superconductor Primary Tesla Windings +gt.blockcasingsBA0.4.name=IV Superconductor Primary Tesla Windings +gt.blockcasingsBA0.5.name=LuV Superconductor Primary Tesla Windings +gt.blockcasingsBA0.9.name=ZPM Superconductor Primary Tesla Windings +gt.blockcasingsBA0.0.desc.0=Handles up to +gt.blockcasingsBA0.0.desc.1=What one man calls God, another calls the laws of physics. +gt.blockcasingsBA0.6.name=Tesla Base Casing +gt.blockcasingsBA0.6.desc.0=The base of a wondrous contraption +gt.blockcasingsBA0.6.desc.1=it's alive, IT'S ALIVE! +gt.blockcasingsBA0.7.name=Tesla Toroid Casing +gt.blockcasingsBA0.7.desc.0=Made out of the finest tin foil! +gt.blockcasingsBA0.7.desc.1=Faraday suits might come later +gt.blockcasingsBA0.8.name=Tesla Secondary Windings +gt.blockcasingsBA0.8.desc.0=Picks up power from a primary coil +gt.blockcasingsBA0.8.desc.1=Who wouldn't want a 32k epoxy multi? + +#Multiblocks +gt.blockmachines.multimachine.em.transformer.name=Active Transformer +gt.blockmachines.multimachine.em.transformer.hint=1 - Energy IO Hatches or High Power Casing +gt.blockmachines.multimachine.em.transformer.desc.0=Controller block of the Active Transformer +gt.blockmachines.multimachine.em.transformer.desc.1=Can transform to and from any voltage +gt.blockmachines.multimachine.em.transformer.desc.2=Only 0.004% power loss, HAYO! +gt.blockmachines.multimachine.em.transformer.desc.3=Will explode if broken while running + +gt.blockmachines.multimachine.tm.microwave.name=Microwave Grinder +gt.blockmachines.multimachine.tm.microwave.hint.0=1 - Classic Hatches or Clean Stainless Steel Casing +gt.blockmachines.multimachine.tm.microwave.hint.1=Also acts like a hopper so give it an Output Bus +gt.blockmachines.multimachine.tm.microwave.desc.0=Controller block of the Microwave Grinder +gt.blockmachines.multimachine.tm.microwave.desc.1=Starts a timer when enabled +gt.blockmachines.multimachine.tm.microwave.desc.2=While the timer is running anything inside the machine will take damage +gt.blockmachines.multimachine.tm.microwave.desc.3=The machine will also collect any items inside of it +gt.blockmachines.multimachine.tm.microwave.desc.4=Can be configured with a Parametrizer +gt.blockmachines.multimachine.tm.microwave.desc.5=(Do not insert a Wither) +gt.blockmachines.multimachine.tm.microwave.cfgi.0=Power setting +gt.blockmachines.multimachine.tm.microwave.cfgi.1=Timer setting +gt.blockmachines.multimachine.tm.microwave.cfgo.0=Timer value +gt.blockmachines.multimachine.tm.microwave.cfgo.1=Timer remaining + +gt.blockmachines.multimachine.tm.teslaCoil.name=Tesla Tower +gt.blockmachines.multimachine.tm.teslaCoil.hint.0=1 - Classic Hatches, Capacitor Hatches or Tesla Base Casing +gt.blockmachines.multimachine.tm.teslaCoil.hint.1=2 - Titanium Frames +gt.blockmachines.multimachine.tm.teslaCoil.desc.0=Controller block of the Tesla Tower +gt.blockmachines.multimachine.tm.teslaCoil.desc.1=Used to transmit power to Tesla Coil Covers and Tesla Transceivers +gt.blockmachines.multimachine.tm.teslaCoil.desc.2=Can be fed with Helium/Nitrogen/Radon Plasma to increase the range +gt.blockmachines.multimachine.tm.teslaCoil.desc.3=Transmitted voltage depends on the used Tesla Capacitor tier +gt.blockmachines.multimachine.tm.teslaCoil.desc.4=Primary Tesla Windings need to be at least the same tier as the Tesla Capacitor +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.0=Hysteresis low setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.1=Hysteresis high setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.2=Tesla Towers transfer radius setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.3=Tesla Transceiver transfer radius setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.4=Tesla Ultimate Cover transfer radius setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.5=Output voltage setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.6=Output current setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.7=Scan time Min setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.8=Overdrive setting +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.9=Unused +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.0=Tesla Towers transfer radius display +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.1=Tesla Transceiver transfer radius display +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.2=Tesla Ultimate Cover transfer radius display +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.3=Output voltage display +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.4=Output current display +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.5=Energy Capacity display +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.6=Energy Stored display +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.7=Energy Fraction display +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.8=Scan time display + +gt.blockmachines.multimachine.em.switch.name=Network Switch With QoS +gt.blockmachines.multimachine.em.switch.hint=1 - Classic/Data Hatches or Computer casing +gt.blockmachines.multimachine.em.switch.desc.0=Controller block of the Network Switch With QoS +gt.blockmachines.multimachine.em.switch.desc.1=Used to route and distribute computation +gt.blockmachines.multimachine.em.switch.desc.2=Needs a Parametrizer to be configured + + +gt.blockmachines.multimachine.em.computer.name=Quantum Computer +gt.blockmachines.multimachine.em.computer.hint.0=1 - Classic/Data Hatches or Computer casing +gt.blockmachines.multimachine.em.computer.hint.1=2 - Rack Hatches or Advanced computer casing +gt.blockmachines.multimachine.em.computer.desc=You need it to process the number above +gt.blockmachines.multimachine.em.computer.cfgi.0=Overclock ratio +gt.blockmachines.multimachine.em.computer.cfgi.1=Overvoltage ratio +gt.blockmachines.multimachine.em.computer.cfgo.0=Current max. heat +gt.blockmachines.multimachine.em.computer.cfgo.1=Produced computation +gt.blockmachines.multimachine.em.computer.desc.0=Controller block of the Quantum Computer +gt.blockmachines.multimachine.em.computer.desc.1=Used to generate computation (and heat) + +gt.blockmachines.multimachine.em.databank.name=Data Bank +gt.blockmachines.multimachine.em.databank.hint.0=1 - Classic Hatches or high power casing +gt.blockmachines.multimachine.em.databank.hint.1=2 - Data Access/Data Bank Master Hatches or computer casing +gt.blockmachines.multimachine.em.databank.desc.0=Controller block of the Data Bank +gt.blockmachines.multimachine.em.databank.desc.1=Used to supply Assembling Lines with more Data Sticks +gt.blockmachines.multimachine.em.databank.desc.2=and give multiple Assembling Lines access to the same Data Stick + +gt.blockmachines.multimachine.em.junction.name=Matter Junction +gt.blockmachines.multimachine.em.junction.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.junction.hint.1=2 - Elemental Hatches or Molecular Casing +gt.blockmachines.multimachine.em.junction.desc.0=Controller block of the Matter Junction +gt.blockmachines.multimachine.em.junction.desc.1=Used to route and distribute elemental matter +gt.blockmachines.multimachine.em.junction.desc.2=Needs a Parametrizer to be configured + +gt.blockmachines.multimachine.em.mattertoem.name=Matter Quantizer +gt.blockmachines.multimachine.em.mattertoem.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.mattertoem.hint.1=2 - Elemental Output Hatch +gt.blockmachines.multimachine.em.mattertoem.hint.2=3 - Elemental Overflow Hatches or Molecular Casing +gt.blockmachines.multimachine.em.mattertoem.desc.0=Controller block of the Matter Quantizer +gt.blockmachines.multimachine.em.mattertoem.desc.1=Transforms items into their elemental form + +gt.blockmachines.multimachine.em.emtomatter.name=Matter Dequantizer +gt.blockmachines.multimachine.em.emtomatter.hint.0=1 - Classic Hatches or High Power Casing" +gt.blockmachines.multimachine.em.emtomatter.hint.1=2 - Elemental Input Hatch +gt.blockmachines.multimachine.em.emtomatter.hint.2=3 - Elemental Overflow Hatches or Molecular Casing +gt.blockmachines.multimachine.em.emtomatter.desc.0=Controller block of the Matter Dequantizer +gt.blockmachines.multimachine.em.emtomatter.desc.1=Transforms elemental matter back into items + +gt.blockmachines.multimachine.em.emtoessentia.name=Essentia Dequantizer +gt.blockmachines.multimachine.em.emtoessentia.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.emtoessentia.hint.1=2 - Elemental Input Hatch +gt.blockmachines.multimachine.em.emtoessentia.hint.2=3 - Elemental Overflow Hatches or Elemental Casing +gt.blockmachines.multimachine.em.emtoessentia.hint.3=General - Some sort of Essentia Storage +gt.blockmachines.multimachine.em.emtoessentia.desc.0=Controller block of the Essentia Dequantizer +gt.blockmachines.multimachine.em.emtoessentia.desc.1=Transforms elemental matter back into essentia + +gt.blockmachines.multimachine.em.essentiatoem.name=Essentia Quantizer +gt.blockmachines.multimachine.em.essentiatoem.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.essentiatoem.hint.1=2 - Elemental Output Hatch +gt.blockmachines.multimachine.em.essentiatoem.hint.2=3 - Elemental Overflow Hatches or Elemental Casing +gt.blockmachines.multimachine.em.essentiatoem.hint.3=General - Some sort of Essentia Storage +gt.blockmachines.multimachine.em.essentiatoem.desc.0=Controller block of the Essentia Quantizer +gt.blockmachines.multimachine.em.essentiatoem.desc.1=Transforms essentia into their elemental form + +gt.blockmachines.multimachine.em.scanner.name=Elemental Scanner +gt.blockmachines.multimachine.em.scanner.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.scanner.hint.1=2 - Elemental Input Hatches or Molecular Casing +gt.blockmachines.multimachine.em.scanner.hint.2=3 - Elemental Output Hatches or Molecular Casing +gt.blockmachines.multimachine.em.scanner.hint.3=4 - Elemental Overflow Hatches or Molecular Casing +gt.blockmachines.multimachine.em.scanner.desc.0=Controller block of the Elemental Scanner + +gt.blockmachines.multimachine.em.research.name=Research Station +gt.blockmachines.multimachine.em.research.hint.0=1 - Classic/Data Hatches or Computer casing +gt.blockmachines.multimachine.em.research.hint.1=2 - Holder Hatch +gt.blockmachines.multimachine.em.research.desc.0=Controller block of the Research Station +gt.blockmachines.multimachine.em.research.desc.1=Used to scan Data Sticks for Assembling Line Recipes +gt.blockmachines.multimachine.em.research.desc.2=Needs to be fed with computation to work +gt.blockmachines.multimachine.em.research.desc.3=Does not consume the item until the Data Stick is written +gt.blockmachines.multimachine.em.research.mode.Assembly_line=Mode: Research Station +gt.blockmachines.multimachine.em.research.mode.Scanner=Mode: Scanner + +gt.blockmachines.multimachine.em.collider.name=Matter Collider +gt.blockmachines.multimachine.em.collider.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.collider.hint.1=2 - Elemental Input Hatches or Molecular Casing +gt.blockmachines.multimachine.em.collider.hint.2=3 - Elemental Output Hatches or Molecular Casing +gt.blockmachines.multimachine.em.collider.hint.3=4 - Elemental Overflow Hatches or Molecular Casing +gt.blockmachines.multimachine.em.collider.hint.4=General - Another Controller facing opposite direction +gt.blockmachines.multimachine.em.collider.desc.0=Controller block of the Matter Collider +gt.blockmachines.multimachine.em.collider.desc.1=This machine needs a mirrored copy of it to work +gt.blockmachines.multimachine.em.collider.desc.2=One needs to be set to 'Fuse Mode' and the other to 'Collide Mode' +gt.blockmachines.multimachine.em.collider.desc.3=Fuses two elemental matter to create another (and power) +gt.blockmachines.multimachine.em.collider.mode.0=Mode: Fuse +gt.blockmachines.multimachine.em.collider.mode.1=Mode: Collide +gt.blockmachines.multimachine.em.collider.mode.2=Mode: Undefined +gt.blockmachines.multimachine.em.collider.mode.3=Currently Slaves... +gt.blockmachines.multimachine.em.collider.Structure.AdditionalCollider=Needs another Matter Collider that is mirrored to this one + +gt.blockmachines.multimachine.em.infuser.name=Energy Infuser +gt.blockmachines.multimachine.em.infuser.hint=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.infuser.desc.0=Controller block of the Energy Infuser +gt.blockmachines.multimachine.em.infuser.desc.1=Can be used to charge items (lossless) +gt.blockmachines.multimachine.em.infuser.desc.2=Can be fed with UU-Matter to repair items +gt.blockmachines.multimachine.em.infuser.desc.3=Stocking Bus is not supported +gt.blockmachines.multimachine.em.infuser.Structure.HighPowerCasing=Layer 1 and 5 +gt.blockmachines.multimachine.em.infuser.Structure.MolecularCoil=Layer 2 and 4 +gt.blockmachines.multimachine.em.infuser.Structure.MolecularCasing=Layer 3 + + +gt.blockmachines.multimachine.em.processing.name=Quantum Processing Machine +gt.blockmachines.multimachine.em.processing.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.processing.hint.1=2 - Elemental Hatches or Molecular Casing +gt.blockmachines.multimachine.em.processing.desc.0=Controller block of the Quantum Processing machine + +gt.blockmachines.multimachine.em.crafter.name=Matter Assembler +gt.blockmachines.multimachine.em.crafter.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.crafter.hint.1=2 - Elemental Hatches or Molecular Casing +gt.blockmachines.multimachine.em.crafter.desc.0=Controller block of the Matter Assembler + +gt.blockmachines.multimachine.em.stabilizer.name=Elemental Stabilizer +gt.blockmachines.multimachine.em.stabilizer.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.stabilizer.hint.1=2 - Elemental Hatches or Molecular Casing +gt.blockmachines.multimachine.em.stabilizer.desc.0=Controller block of the Elemental Stabilizer + +gt.blockmachines.multimachine.em.wormhole.name=Wormhole +gt.blockmachines.multimachine.em.wormhole.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.wormhole.hint.1=2 - Elemental Hatches or Molecular Casing +gt.blockmachines.multimachine.em.wormhole.desc.0=Controller block of the Wormhole + +gt.blockmachines.multimachine.em.decay.name=Decay Generator +gt.blockmachines.multimachine.em.decay.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.decay.hint.1=2 - Elemental Hatches or Molecular Casing +gt.blockmachines.multimachine.em.decay.desc.0=Controller block of the Decay Generator +gt.blockmachines.multimachine.em.decay.desc.1=Decays elemental matter to generate power + +gt.blockmachines.multimachine.em.decay.conf=Ampere divider + +gt.blockmachines.multimachine.em.annihilation.name=Annihilation Generator +gt.blockmachines.multimachine.em.annihilation.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.annihilation.hint.1=2 - Elemental Hatches or Molecular Casing +gt.blockmachines.multimachine.em.annihilation.desc.0=Controller block of the Annihilation Generator + +gt.blockmachines.multimachine.em.blackholegenerator.name=Black Hole Generator +gt.blockmachines.multimachine.em.blackholegenerator.hint.0=1 - Classic Hatches or High Power Casing +gt.blockmachines.multimachine.em.blackholegenerator.hint.1=2 - Elemental Hatches or Molecular Casing +gt.blockmachines.multimachine.em.blackholegenerator.desc.0=Controller block of the Black Hole Generator +gt.blockmachines.multimachine.em.blackholegenerator.desc.1=Uses a black hole to generate power + +# Eye of Harmony +achievement.gt.blockmachines.multimachine.em.eye_of_harmony=Eye of Harmony Controller +achievement.gt.blockcasingsBA0.12=Infinite Spacetime Energy Boundary Casing +gt.blockcasingsBA0.12.desc.0=Provides a stable bridge between spacetime regions. +achievement.gt.blockcasingsBA0.11=Reinforced Spatial Structure Casing +gt.blockcasingsBA0.11.desc.0=Designed to resist spatial shearing from internal volume expansion. +gt.blockcasingsBA0.11.desc.1=Can survive at least one big bang, maybe two... +achievement.gt.blockcasingsBA0.10=Reinforced Temporal Structure Casing +gt.blockcasingsBA0.10.desc.0=Resistant to temporal shearing from time dilation differences. +gt.blockcasingsBA0.10.desc.1=This block can last an eternity without any decay. + + +achievement.gt.spacetime_compression_field_generator.0=Crude Spacetime Compression Field Generator +achievement.gt.spacetime_compression_field_generator.1=Primitive Spacetime Compression Field Generator +achievement.gt.spacetime_compression_field_generator.2=Stable Spacetime Compression Field Generator +achievement.gt.spacetime_compression_field_generator.3=Advanced Spacetime Compression Field Generator +achievement.gt.spacetime_compression_field_generator.4=Superb Spacetime Compression Field Generator +achievement.gt.spacetime_compression_field_generator.5=Exotic Spacetime Compression Field Generator +achievement.gt.spacetime_compression_field_generator.6=Perfect Spacetime Compression Field Generator +achievement.gt.spacetime_compression_field_generator.7=Tipler Spacetime Compression Field Generator +achievement.gt.spacetime_compression_field_generator.8=Gallifreyan Spacetime Compression Field Generator + +achievement.gt.time_acceleration_field_generator.0=Crude Time Dilation Field Generator +achievement.gt.time_acceleration_field_generator.1=Primitive Time Dilation Field Generator +achievement.gt.time_acceleration_field_generator.2=Stable Time Dilation Field Generator +achievement.gt.time_acceleration_field_generator.3=Advanced Time Dilation Field Generator +achievement.gt.time_acceleration_field_generator.4=Superb Time Dilation Field Generator +achievement.gt.time_acceleration_field_generator.5=Exotic Time Dilation Field Generator +achievement.gt.time_acceleration_field_generator.6=Perfect Time Dilation Field Generator +achievement.gt.time_acceleration_field_generator.7=Tipler Time Dilation Field Generator +achievement.gt.time_acceleration_field_generator.8=Gallifreyan Time Dilation Field Generator + +achievement.gt.stabilisation_field_generator.0=Crude Stabilisation Field Generator +achievement.gt.stabilisation_field_generator.1=Primitive Stabilisation Field Generator +achievement.gt.stabilisation_field_generator.2=Stable Stabilisation Field Generator +achievement.gt.stabilisation_field_generator.3=Advanced Stabilisation Field Generator +achievement.gt.stabilisation_field_generator.4=Superb Stabilisation Field Generator +achievement.gt.stabilisation_field_generator.5=Exotic Stabilisation Field Generator +achievement.gt.stabilisation_field_generator.6=Perfect Stabilisation Field Generator +achievement.gt.stabilisation_field_generator.7=Tipler Stabilisation Field Generator +achievement.gt.stabilisation_field_generator.8=Gallifreyan Stabilisation Field Generator + +# Forge of the Gods / Godforge +fog.upgrade.confirm=Construct + +fog.upgrade.tt.0=upgrade start +fog.upgrade.tt.1=upgrade 11 +fog.upgrade.tt.2=upgrade 21 +fog.upgrade.tt.3=upgrade 22 +fog.upgrade.tt.4=upgrade 31 +fog.upgrade.tt.5=upgrade 32 +fog.upgrade.tt.6=upgrade 33 +fog.upgrade.tt.7=upgrade 41 +fog.upgrade.tt.8=upgrade 51 +fog.upgrade.tt.9=upgrade 52 +fog.upgrade.tt.10=upgrade 53 +fog.upgrade.tt.11=upgrade 61 +fog.upgrade.tt.12=upgrade 71 +fog.upgrade.tt.13=upgrade 72 +fog.upgrade.tt.14=upgrade 73 +fog.upgrade.tt.15=upgrade 74 +fog.upgrade.tt.16=upgrade 80 +fog.upgrade.tt.17=upgrade 81 +fog.upgrade.tt.18=upgrade 82 +fog.upgrade.tt.19=upgrade 83 +fog.upgrade.tt.20=upgrade 91 +fog.upgrade.tt.21=upgrade 92 +fog.upgrade.tt.22=upgrade 93 +fog.upgrade.tt.23=upgrade 101 +fog.upgrade.tt.24=upgrade 111 +fog.upgrade.tt.25=upgrade 121 +fog.upgrade.tt.26=upgrade 131 +fog.upgrade.tt.27=upgrade 141 +fog.upgrade.tt.28=upgrade 151 +fog.upgrade.tt.29=upgrade 161 +fog.upgrade.tt.30=upgrade end + +fog.upgrade.lore.0=The Forge of the Gods is an immensely powerful structure constructed around a stabilized neutron star – it is so advanced that its full capabilities are not yet understood. However, through continued use one can slowly upgrade and expand the range of abilities of the Forge, and learn the power hidden in the most extreme parts of the universe: graviton shards. This esoteric material can only be found where conventional matter and degenerate neutronium crust matter on the surface of a neutron star meet. At this point in space, gravitons are far more common and irradiate this material mixture to create highly unstable graviton shards, which can be used to internally upgrade the Forge. While these shards cannot yet exist outside the extreme conditions of the Forge, with continued research and utilization it may be possible to eventually isolate and extract them outside the Forge – but for what purpose? +fog.upgrade.lore.1=The first major upgrade of the Forge of the Gods has allowed for greater processing speeds as the heat increases, thanks to the space warping effects of graviton shards. This is the first of many applications of the shards, which will be discovered through continuous use of the Forge. +fog.upgrade.lore.2=Graviton shards warp the surface area of fuels used in the Forge, increasing efficiency as more material can be processed per unit of fuel. Graviton shards will prove crucial for further efficiency increases to offset the ever-increasing demands of the Forge. +fog.upgrade.lore.3=Through use of graviton shards, the space within the Forge’s fuel chambers can be increased, allowing for greater quantities of fuel to be burned, thus reaching higher temperatures. Don’t forget to reserve fuel to keep the star at the centre of the Forge alive. +fog.upgrade.lore.4=Graviton shards not only affect matter, but also energy: depending on the fuel burn rate, the Forge may now accept more energy input, allowing for greater processing capacity. What other properties do these Graviton shards hold? +fog.upgrade.lore.5=As usage of the Forge continues, more data on graviton shards is gathered. It has been found that they can stabilize the outputs of the Forge, allowing for the direct extraction of molten material while it is still close to the heart of the star. +fog.upgrade.lore.6=As stellar fuel consumption continues to increase the size and energy of the star, the amount of material that can be processed at once also increases. Graviton shards facilitate the manipulation of increased quantities of materials near the star in the core of the Forge. +fog.upgrade.lore.7=As understanding of graviton shards continues to improve, better control over the materials they manipulate can be achieved. Graviton shards provide an alternative to electromagnetic containment of plasma using spacetime manipulation instead, allowing the Forge to directly output processed materials as plasma. +fog.upgrade.lore.8=Adding graviton shards to the Forge’s internal energy storage allows for greater quantities of energy stored in a smaller area. By increasing energy density to relativistic levels, the Forge can be run more efficiently and store essentially infinite energy. +fog.upgrade.lore.9=Simply adding more graviton shards to the fuel chamber continues to amplify the ability for the Forge to consume increased quantities of stellar fuel. It even benefits from graviton shards invested in different parts of the Forge entirely – it seems shards exhibit quantum entanglement-like properties. +fog.upgrade.lore.10=Increasing the concentration of graviton shards near the material processing regions of the Forge warps spacetime so significantly that it doubles the material input and processing possible. As the Forge’s capabilities increase, the amount of graviton shard data collected increases too, allowing for further expansion. +fog.upgrade.lore.11=Using large quantities of graviton shards creates regions of space so extreme that exotic forms of matter can exist with far greater stability than usual. Unfortunately, this region is so extreme that it is essentially spatially disconnected from the rest of the Forge, unable to utilize existing upgrades to the structure and its other modules. +fog.upgrade.lore.12=Graviton shards can further compress stellar fuel, increasing its ability to fuel the star at the centre of the Forge through higher energy fusion reactions than usually possible in a natural star. As a result, greater heat is produced, increasing processing efficiency of the Forge. +fog.upgrade.lore.13=Increasing the concentration of graviton shards in the fuel chamber allows for a further increase in material processing capacity, so long as the Forge receives enough stellar fuel to maintain the unnaturally powerful state of the star. +fog.upgrade.lore.14=Utilising the unique energy-manipulating properties of graviton shards, electricity can be more efficiently utilised within the Forge. This sort of improvement is not possible with conventional matter, but also would not be possible outside the extreme environments near the star in the Forge. +fog.upgrade.lore.15=Similar to the Quantum Force Transformer, the quantum-mechanical properties of graviton shards facilitate the ability for the Forge to complete a complex series of nuclear fusion processes in a single event by directly manipulating the subatomic particles of the materials themselves. +fog.upgrade.lore.16=Another instance of the entanglement-like effects of graviton shards, the simple Power Forge module now also exhibits the improvements made to the Melting Core module of the Forge. This allows for greater efficiency in both processing and allocation of the precious few graviton shards that can be obtained. +fog.upgrade.lore.17=Typical smelting techniques become too inefficient at extreme temperatures. Graviton shards allow for new methods of processing that can better take advantage of the abundant heat available within the Forge, such as manipulating spacetime to better transfer heat to the processed materials than regular matter ever could. +fog.upgrade.lore.18=As the heat available within the Forge continues to increase, it becomes possible for more material to be processed as it requires less proximity to the star’s surface. Graviton shards facilitate the manipulation of increased material quantities across larger regions of space within the Forge. +fog.upgrade.lore.19=Continual improvements to energy storage density using graviton shards improves both the efficiency of the Forge and improvements to heat utilisation for processing. Reaching this threshold of energy density allows the extreme spacetime bending to transfer the heat of the star more directly to the processed materials, increasing the effectiveness of heat in the smelting process. +fog.upgrade.lore.20=Normally increasing heat indefinitely has extreme diminishing returns when processing materials, but graviton shards allow for heat to more acutely affect input materials by manipulating them ever closer to the star at the centre of the Forge. At such levels of heat, the bonds between atoms are broken, allowing for the most quick and pure processing possible. +fog.upgrade.lore.21=Using the entanglement-like properties of graviton shards, it is possible to utilize the increasingly extreme differences in spacetime between regions of the Forge to improve the processing capacity of the molten module. As space becomes more warped, more material can be moved closer to the star, increasing production capacity. +fog.upgrade.lore.22=Returning to the first upgrade of the Forge with the myriad discoveries about the graviton shards allows it to run much faster than previously possible. As a result of excessive spacetime manipulation, greater heat and larger quantities of material paradoxically result in faster processing times as larger surface areas of the processed material are available to the Forge. +fog.upgrade.lore.23=The stress of maintaining such a large structure around such a gravitationally dense object as a neutron star is alleviated through graviton shards. A larger Forge allows for more machinery and better electricity utilisation, effectively increasing processing capabilities. +fog.upgrade.lore.24=Improvements in understanding of the gravitational containment effects of graviton shards allow the Forge to process and handle more exotic and unstable plasma. With this, a new age of fusion processing and power is possible. +fog.upgrade.lore.25=Further utilisation of the quantum entanglement-like properties of graviton shards allows the effects of other module upgrades to also apply to the exotic module. However, because of the extreme nature of spacetime within this module and the materials it handles, these benefits are reduced as per the inverse square law. +fog.upgrade.lore.26=As additional rings are placed closer to the star at the centre of the Forge, the gravitational stress drastically increases on the structure. Graviton shards alleviate these stresses and also allow for upgrades made in other similar modules to apply to the new ring’s modules through the use of localized spacetime bridges. +fog.upgrade.lore.27=A huge development in the capabilities of the Forge has been achieved with the use of large quantities of graviton shards – the ability to indefinitely feed the star with stellar fuel. Obviously, this has diminishing returns but the processing potential is immense thanks to extreme gravitational distortion containing the star regardless of its energy level. +fog.upgrade.lore.28=The usage of graviton shards in electrical systems to create localised miniature energy wormholes has allowed for such efficient power transfer that effectively unlimited electricity may be utilized by the Forge. More power means faster processing, quicker material movement, and better utilization of graviton shard related upgrades. +fog.upgrade.lore.29=The final structural upgrade to the Forge required the most advanced understanding of graviton shards and their applications in extreme environments. With this, the last 4 module slots of the Forge of the Gods are available to construct, completing the single greatest structure in human history. The power of the sun in the palm of your hand. +fog.upgrade.lore.30=*insert lore here* upgrade end + +fog.upgrade.text.0=Unlocks the base functionality of the Forge of the Gods, meaning 8 module slots, 1 ring and the Helioflare Power Forge module. +fog.upgrade.text.1=Unlocks a recipe time reduction multiplier based on the current heat the multi is running at. This bonus is calculated via following formula: Multiplier = 1 / (Heat^0.01) +fog.upgrade.text.2=Increases fuel efficiency by multiplying the actual fuel consumption by 0.8 +fog.upgrade.text.3=Multiplies the maximum fuel consumption by 1.2 +fog.upgrade.text.4=Increases the base processing voltage of the multi by: Stellar Fuel Units/sec * 10^8 EU/t +fog.upgrade.text.5=Unlocks the Helioflux Melting Core module. +fog.upgrade.text.6=Unlocks a multiplier to maximum parallel based on fuel consumption rate. This bonus is calculated via this formula: Multiplier = 1 + (Stellar Fuel Units/sec) / 15 +fog.upgrade.text.7=Unlocks the Heliothermal Plasma Fabricator module and basic element -> plasma processing (1 step plasmas, T3 fusion maximum). +fog.upgrade.text.8=Unlocks a configuration window for maximum battery size and increases the limit to max int. Furthermore, an energy discount multiplier is unlocked that scales with battery size (capped to 0.05, or 5%). The discount is calculated as follows: Discount = (1 - 1.05^(-0.05 * Max Battery Capacity)) / 20 +fog.upgrade.text.9=Increases maximum fuel consumption by 1 Stellar Fuel Unit/sec for every purchased upgrade. +fog.upgrade.text.10=Adds a x2 multiplier to maximum parallel. +fog.upgrade.text.11=Unlocks the Heliofusion Exoticizer module and quark gluon plasma creation. At this point this module is not affected by any other multipliers or bonuses from other upgrades. +fog.upgrade.text.12=Improves the fuel consumption -> heat conversion formula. Improved formula: Heat = log1.2(Stellar Fuel Units/sec) * 1000 + 12601 +fog.upgrade.text.13=Improves the formula of N33 to: Multiplier = 1 + (Stellar Fuel Units/sec) / 5 +fog.upgrade.text.14=Improves the OC formula from 4/2 OCs to 4/2.3 OCs. +fog.upgrade.text.15=Allows the Heliothermal Plasma Fabricator to process multi step plasmas. Tier restriction still applies. +fog.upgrade.text.16=Allows the Helioflare Power Forge to receive the full benefits of the Helioflux Melting Core upgrade path. +fog.upgrade.text.17=Increases the cap of EBF heat bonuses to 30,000K. +fog.upgrade.text.18=Unlocks a multiplier to maximum parallel based on current heat. This bonus is calculated via this formula: Multiplier = 1 + Heat / 15000 +fog.upgrade.text.19=Improves the EBF energy reduction heat bonus from 5% to 8% and adds an energy discount based on the fill level of the internal battery. This bonus is calculated via this formula: Discount = (Current fill level / Max Capacity - 0.5)^2 * (-0,6) + 0,15 +fog.upgrade.text.20=EBF heat bonuses are granted above 30,000K, but the heat value used in heat bonus calculations is determined by this formula: Actual Heat = 30000 + (Current Heat - 30000)^0.85 +fog.upgrade.text.21=Unlocks a multiplier to maximum parallel based on total amount of purchased upgrades. This bonus is calculated via this formula: Multiplier = 1 + Upgrade Amount / 5 +fog.upgrade.text.22=Improves N11 based on current maximum parallel. Improved Formula: Multiplier = (1 / Heat^0.01) / (Parallel^0.02) +fog.upgrade.text.23=Increases maximum processing voltage by 1 per active ring. +fog.upgrade.text.24=Allows the Heliothermal Plasma Fabricator to process up to T5 plasmas. +fog.upgrade.text.25=Allows the Heliofusion Exoticizer to be affected by other upgrade benefits, but those benefits are square rooted first. The overclock bonus is adjusted via the following formula: OC Factor = 2 + (Base OC Factor - 2)^2 +fog.upgrade.text.26=Allows construction of the second ring and adds 4 module slots. +fog.upgrade.text.27=Uncaps maximum fuel consumption, but fuel consumption used in bonus calculations scales according to this formula: Actual FC = Current Max FC + (Current FC - Current Max FC)^0.75, where FC refers to fuel consumption and max FC refers to the max fuel consumption without this upgrade. +fog.upgrade.text.28=Uncaps maximum processing voltage. Voltage can be set in each module's GUI. +fog.upgrade.text.29=Allows construction of the third ring and adds 4 module slots. +fog.upgrade.text.30=*insert text here* upgrade end + +fog.debug.resetbutton.text=Reset +fog.debug.resetbutton.tooltip=Resets all upgrades to zero +fog.debug.unlockall.text=Unlock all upgrades +fog.debug.gravitonshardsetter.tooltip=Set the amount of availabe graviton shards + +fog.button.fuelconfig.tooltip=Fuel Configuration Menu +fog.button.furnacemode.tooltip=Toggle Furnace Mode +fog.button.magmattermode.tooltip.01=Toggle Magmatter Mode +fog.button.magmattermode.tooltip.02=Magmatter Mode locked, missing upgrade +fog.button.battery.tooltip.01=Toggle Battery Charging +fog.button.battery.tooltip.02=Right click to open configuration menu (if unlocked) +fog.button.voltageconfig.tooltip.01=Open voltage config +fog.button.voltageconfig.tooltip.02=Voltage config locked, missing upgrade +fog.button.structurecheck.tooltip=Refresh module connection status +fog.button.milestones.tooltip=Milestone Overview + + +achievement.gt.blockmachines.multimachine.em.forge_of_gods=Forge of the Gods +achievement.gt.godforgecasing.0=Singularity Reinforced Stellar Shielding Casing +achievement.gt.godforgecasing.1=Celestial Matter Guidance Casing +achievement.gt.godforgecasing.2=Boundless Gravitationally Severed Structure Casing +achievement.gt.godforgecasing.3=Transcendentally Amplified Magnetic Confinement Casing +achievement.gt.godforgecasing.4=Stellar Energy Siphon Casing +achievement.gt.godforgecasing.5=Remote Graviton Flow Modulator +achievement.gt.godforgecasing.6=Medial Graviton Flow Modulator +achievement.gt.godforgecasing.7=Central Graviton Flow Modulator + +gt.blockmachines.multimachine.FOG.parallel=Parallel +gt.blockmachines.multimachine.FOG.batch=Batch Size +gt.blockmachines.multimachine.FOG.fuelconsumption=Stellar Fuel Consumption Factor +gt.blockmachines.multimachine.FOG.fuelinfo.0=The Stellar Fuel Consumption Factor is the main determining factor in calculating the total stellar fuel consumption per second. Each fuel type has different scaling, which is as follows: +gt.blockmachines.multimachine.FOG.fuelinfo.1=Dimensionally Transcendent Residue: factor*300*1.15^factor +gt.blockmachines.multimachine.FOG.fuelinfo.2=Condensed Raw Stellar Plasma Mixture: factor*2*1.08^factor +gt.blockmachines.multimachine.FOG.fuelinfo.3=Magnetohydrodynamically Constrained Star Matter: factor/25 +gt.blockmachines.multimachine.FOG.fuelinfo.4=Upgrades can influence these formulas, the changes are listed in the respective upgrades' descriptions. +gt.blockmachines.multimachine.FOG.fueltype=Click to Select Fuel Type +gt.blockmachines.multimachine.FOG.fuelusage=Fuel Usage +gt.blockmachines.multimachine.FOG.plasmamultistep=Multi-Step plasma +gt.blockmachines.multimachine.FOG.plasmarecipetier=Fusion Tier +gt.blockmachines.multimachine.FOG.storedfuel=Stored fuel amount: +gt.blockmachines.multimachine.FOG.storedstartupfuel=Star Fuel amount: +gt.blockmachines.multimachine.FOG.batteryinfo=Set battery size +gt.blockmachines.multimachine.FOG.shardcost=Graviton Shard cost: +gt.blockmachines.multimachine.FOG.availableshards=Available Graviton Shards: +gt.blockmachines.multimachine.FOG.modulestatus=Status: +gt.blockmachines.multimachine.FOG.modulestatus.true=Connected +gt.blockmachines.multimachine.FOG.modulestatus.false=Disconnected +gt.blockmachines.multimachine.FOG.voltageinfo=Set processing voltage +gt.blockmachines.multimachine.FOG.totalprogress=Total Progress +gt.blockmachines.multimachine.FOG.milestoneprogress=Current Milestone Level +gt.blockmachines.multimachine.FOG.progress=Next Milestone at +gt.blockmachines.multimachine.FOG.milestonecomplete=Milestone Complete +gt.blockmachines.multimachine.FOG.milestoneinfo=View Milestone Progress +gt.blockmachines.multimachine.FOG.inversion=Inversion Active +gt.blockmachines.multimachine.FOG.powermilestone=Charge +gt.blockmachines.multimachine.FOG.recipemilestone=Conversion +gt.blockmachines.multimachine.FOG.fuelmilestone=Catalyst +gt.blockmachines.multimachine.FOG.purchasablemilestone=Composition +gt.blockmachines.multimachine.FOG.power=EU Consumed +gt.blockmachines.multimachine.FOG.recipes=Recipes Processed +gt.blockmachines.multimachine.FOG.fuel=Fuel Units Consumed +gt.blockmachines.multimachine.FOG.extensions=Extensions Built +gt.blockmachines.multimachine.FOG.shardgain=Graviton Shards gained + +# Optical Circuits +achievement.gt.metaitem.03.32155=Optical Assembly +achievement.gt.metaitem.03.32156=Optical Computer +achievement.gt.metaitem.03.32157=Optical Mainframe + +# Parts +achievement.gt.metaitem.01.32017=Electric Motor UIV +achievement.gt.metaitem.01.32021=Electric Piston UIV +achievement.gt.metaitem.01.32025=Electric Pump UIV +achievement.gt.metaitem.01.32029=Conveyor Module UIV +achievement.gt.metaitem.01.32033=Robot Arm UIV +achievement.gt.metaitem.01.32037=Emitter UIV +achievement.gt.metaitem.01.32041=Sensor UIV +achievement.gt.metaitem.01.32045=Field Generator UIV + +achievement.gt.metaitem.01.32018=Electric Motor UMV +achievement.gt.metaitem.01.32022=Electric Piston UMV +achievement.gt.metaitem.01.32026=Electric Pump UMV +achievement.gt.metaitem.01.32030=Conveyor Module UMV +achievement.gt.metaitem.01.32034=Robot Arm UMV +achievement.gt.metaitem.01.32038=Emitter UMV +achievement.gt.metaitem.01.32042=Sensor UMV +achievement.gt.metaitem.01.32046=Field Generator UMV + +#Pipes +gt.blockmachines.pipe.elementalmatter.name=Quantum "Tunnel" +gt.blockmachines.pipe.elementalmatter.desc.0=Quantum tunneling device. +gt.blockmachines.pipe.elementalmatter.desc.1=Not a portal!!! +gt.blockmachines.pipe.elementalmatter.desc.2=Must be painted to work +gt.blockmachines.pipe.elementalmatter.desc.3=Do not cross, split or turn + +gt.blockmachines.pipe.energystream.name=Laser Vacuum Pipe +gt.blockmachines.pipe.energystream.desc.0=Laser tunneling device. +gt.blockmachines.pipe.energystream.desc.1=Bright Vacuum!!! +gt.blockmachines.pipe.energystream.desc.2=Must be painted to work +gt.blockmachines.pipe.energystream.desc.3=Do not split or turn + +gt.blockmachines.pipe.datastream.name=Optical Fiber Cable +gt.blockmachines.pipe.datastream.desc.0=Advanced data transmission +gt.blockmachines.pipe.datastream.desc.1=Don't stare at the beam! +gt.blockmachines.pipe.datastream.desc.2=Must be painted to work +gt.blockmachines.pipe.datastream.desc.3=Do not cross or split + +gt.blockmachines.pipe.desc.4=Explosion proof + +#Single blocks +gt.blockmachines.machine.tt.ownerdetector.name=Owner detector +gt.blockmachines.machine.tt.ownerdetector.desc.0=Screwdrive to change mode +gt.blockmachines.machine.tt.ownerdetector.desc.1=Looks for his pa +gt.blockmachines.machine.tt.ownerdetector.desc.2=Emits signal when happy + +gt.blockmachines.machine.tt.datareader.name=Data Reader +gt.blockmachines.machine.tt.datareader.desc.0=Reads Data Sticks and Orbs +gt.blockmachines.machine.tt.datareader.desc.1=Power it up and +gt.blockmachines.machine.tt.datareader.desc.2=Put the data storage in + +gt.blockmachines.machine.tt.buck.05.name=Insane Buck Converter +gt.blockmachines.machine.tt.buck.06.name=Ludicrous Buck Converter +gt.blockmachines.machine.tt.buck.07.name=ZPM Voltage Buck Converter +gt.blockmachines.machine.tt.buck.08.name=Ultimate Power Buck Converter +gt.blockmachines.machine.tt.buck.09.name=Highly Ultimate Buck Converter +gt.blockmachines.machine.tt.buck.10.name=Extremely Ultimate Buck Converter +gt.blockmachines.machine.tt.buck.11.name=Insanely Ultimate Buck Converter +gt.blockmachines.machine.tt.buck.12.name=Mega Ultimate Buck Converter +gt.blockmachines.machine.tt.buck.13.name=Extended Mega Ultimate Buck Converter +gt.blockmachines.machine.tt.buck.desc.0=Electronic voltage regulator +gt.blockmachines.machine.tt.buck.desc.1=Adjustable step down transformer +gt.blockmachines.machine.tt.buck.desc.2=Switching power supply... + +gt.blockmachines.machine.tt.tesla.01.name=Basic Tesla Transceiver +gt.blockmachines.machine.tt.tesla.02.name=Advanced Tesla Transceiver +gt.blockmachines.machine.tt.tesla.03.name=Epyc Tesla Transceiver +gt.blockmachines.machine.tt.tesla.04.name=Ultimate Power Tesla Transceiver +gt.blockmachines.machine.tt.tesla.05.name=Insane Tesla Transceiver +gt.blockmachines.machine.tt.tesla.desc.0=Your Tesla I/O machine of choice +gt.blockmachines.machine.tt.tesla.desc.1=Lightning stoves for the rich + +#Debug blocks +gt.blockmachines.debug.tt.pollutor.name=Debug Pollution Generator +gt.blockmachines.debug.tt.pollutor.desc.0=Shit genny broke! +gt.blockmachines.debug.tt.pollutor.desc.1=Infinite Producer/Consumer +gt.blockmachines.debug.tt.pollutor.desc.2=Since i wanted one? +gt.blockmachines.debug.tt.data.name=Debug Data Hatch +gt.blockmachines.debug.tt.data.desc.0=Quantum Data Output +gt.blockmachines.debug.tt.data.desc.1=High speed fibre optics connector. +gt.blockmachines.debug.tt.data.desc.2=Must be painted to work +gt.blockmachines.debug.tt.maintenance.name=Auto-Taping Maintenance Hatch +gt.blockmachines.debug.tt.maintenance.desc.0=For automatically maintaining Multiblocks +gt.blockmachines.debug.tt.maintenance.desc.1=Does fix everything but itself. +gt.blockmachines.debug.tt.maintenance.desc.2=Fixing is for plebs! +gt.blockmachines.debug.tt.genny.name=Debug Power Generator +gt.blockmachines.debug.tt.genny.desc.0=Power from nothing +gt.blockmachines.debug.tt.genny.desc.1=Infinite Producer/Consumer +gt.blockmachines.debug.tt.genny.desc.2=Since i wanted one... +gt.blockmachines.debug.tt.genny.desc.3=Change it to Laser mode with a screwdriver. +gt.blockmachines.debug.tt.writer.name=Debug Structure Writer +gt.blockmachines.debug.tt.writer.desc.0=Scans Blocks Around +gt.blockmachines.debug.tt.writer.desc.1=Prints Multiblock NonTE structure check code +gt.blockmachines.debug.tt.writer.desc.2=ABC axises aligned to machine front +gt.blockmachines.debug.tt.certain.desc.0=Feeling certain, for sure +gt.blockmachines.debug.tt.certain.desc.1=Schrödinger's cat escaped the box + +GT5U.gui.text.computing=§aComputing +GT5U.gui.text.providing_data=§aProviding Data +GT5U.gui.text.routing=§aRouting +GT5U.gui.text.researching=§aResearching +GT5U.gui.text.wrongRequirements=§7Incorrect scanning item +GT5U.gui.text.scanning=§aScanning +GT5U.gui.text.charging=§aCharging +GT5U.gui.text.microwaving=§aMicrowaving +GT5U.gui.text.no_routing=§7Can't route +GT5U.gui.text.invalid_timer=§7Invalid timer +GT5U.gui.text.no_research_item=§7No valid item to research +GT5U.gui.text.no_chargeable_item=§7No chargeable item +GT5U.gui.text.no_computing=§7Can't compute +GT5U.gui.text.no_data=§7Can't output data +GT5U.gui.text.no_planet_block=§7Missing planet block +GT5U.gui.text.no_helium=§7Not enough Helium +GT5U.gui.text.no_hydrogen=§7Not enough Hydrogen +GT5U.gui.text.no_stellar_plasma=§7Not enough Stellar Plasma +GT5U.gui.text.invalid_hysteresis=§7Invalid hysteresis settings +GT5U.gui.text.invalid_transfer_radius=§7Invalid transfer radius settings +GT5U.gui.text.invalid_voltage_setting=§7Invalid voltage setting +GT5U.gui.text.invalid_current_setting=§7Invalid current setting +GT5U.gui.text.invalid_time_setting=§7Invalid time setting +GT5U.gui.text.invalid_overdrive_setting=§7Invalid overdrive setting +GT5U.gui.text.insufficient_power_no_val=§7Insufficient power +GT5U.gui.text.missing_upgrades=§7Missing upgrades +GT5U.gui.text.waiting_for_inputs=§7Waiting for inputs +GT5U.gui.text.computation_loss=§4Shut down due to computation loss. + +# RecipeMaps +gt.recipe.eyeofharmony=Eye of Harmony +gt.recipe.researchStation=Research Station +gt.recipe.fog_plasma=Heliothermal Plasma Fabricator +gt.recipe.fog_exotic=Heliofusion Exoticizer + + +# NEI +tt.nei.eoh.total_items=Total Items: %s +tt.nei.eoh.solid_mass=Percentage of Solid Mass: %s%% +tt.nei.eoh.item_count=Item Count: %s +tt.nei.research.max_eu=Max EU: %s EU +tt.nei.research.computation=Computation: %s +tt.nei.research.min_computation=Min Computation: %s /s + +#Keywords and phrases +#Example: ID:3 +tt.keyword.ID=ID +#Example: 32EU at 1A +tt.keyword.at=at +# Structure is too complex +tt.keyword.Structure.StructureTooComplex=The structure is too complex! +# Any X +tt.keyword.Structure.AnyComputerCasing=Any Computer Casing +tt.keyword.Structure.AnyHighPowerCasing=Any High Power Casing +tt.keyword.Structure.AnyHighPowerCasing1D=Any High Power Casing with 1 dot +tt.keyword.Structure.AnyHighPowerCasing2D=Any High Power Casing with 2 dots +tt.keyword.Structure.AnyHighPowerCasingFront=Any High Power Casing on the front side +tt.keyword.Structure.AnyTeslaBaseCasingOuter=Any outer Tesla Base Casing +tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice=Any Computer Casing on the first or last slice +tt.keyword.Structure.AnyComputerCasingBackMain=Any Computer Casing on the backside of the main body +tt.keyword.Structure.AnyAdvComputerCasingExceptOuter=Any Advanced Computer Casing, except the outer ones +tt.keyword.Structure.AnyMolecularCasing=Any Molecular Casing +tt.keyword.Structure.AnyMolecularCasing2D=Any Molecular Casing with 2 dots +tt.keyword.Structure.AnyMolecularCasing3D=Any Molecular Casing with 3 dots +tt.keyword.Structure.AnyMolecularCasing4D=Any Molecular Casing with 4 dots +tt.keyword.Structure.AnyOuterMolecularCasing3rd=Any outer Molecular Casing on the 3rd slice +tt.keyword.Structure.AnyOuterMolecularCasing4th=Any outer Molecular Casing on the 4th slice +tt.keyword.Structure.AnyOuterMolecularCasing3rd4th=Any outer Molecular Casing on the 3rd or 4th slice +tt.keyword.Structure.AnyOuterCasingOnBottom=Any outer casing on the bottom layer +# Optional +tt.keyword.Structure.Optional=(optional) +# Placement specification +tt.keyword.Structure.FrontCenter=Front center +tt.keyword.Structure.BackCenter=Back center +tt.keyword.Structure.SideCenter=Side center +tt.keyword.Structure.FrontCenter3rd=Front 3rd layer center +tt.keyword.Structure.CenterPillar=Center of the front pillar +tt.keyword.Structure.Center=Center +# Additional structure components +tt.keyword.Structure.DataAccessHatch=Data Access Hatch +tt.keyword.Structure.ElementalOutput=Elemental Output Hatch +tt.keyword.Structure.Elemental=Elemental Hatch +tt.keyword.Structure.ElementalOverflow=Elemental Overflow Hatch +tt.keyword.Structure.ElementalInput=Elemental Input Hatch +tt.keyword.Structure.EssentiaStorage=Essentia Storage +tt.keyword.Structure.DataConnector=Data Connector +tt.keyword.Structure.SuperconductingCoilBlock=Superconducting Coil Block +tt.keyword.Structure.StainlessSteelCasing=Stainless Steel Casing + + +tt.keyphrase.Hint_Details=Hint Details + +#debug boom +tt.keyword.BOOM=BOOM! +tt.keyword.Destination=Destination +tt.keyword.Weight=Weight +tt.keyword.Source=Source +tt.keyword.Progress=Progress +tt.keyword.Computation=Computation +#Problemns as in maintanance issues +tt.keyword.Problems=Problems +tt.keyword.Efficiency=Efficiency +#Button that allows to pass power to other machines +tt.keyword.PowerPass=PowerPass +#Button that vents EM +tt.keyword.SafeVoid=SafeVoid +tt.keyword.Parametrizer=Parametrizer +tt.keyword.Value=Value +tt.keyword.Input=Input +tt.keyword.input=input +tt.keyword.output=output +tt.keyword.Status=Status +tt.keyword.Content=Content +tt.keyword.PacketHistory=PacketHistory + +#Used when 0 Elemental Matter Stacks +tt.keyphrase.No_Stacks=No Stacks +tt.keyphrase.Contains_EM=Contains EM +tt.keyphrase.Contained_mass=Contained mass +tt.keyphrase.Mass_Disposal_speed=Mass Disposal speed +tt.keyphrase.Muffler_BOOM=Muffler BOOM! +tt.keyphrase.Energy_Hatches=Energy Hatches +tt.keyphrase.Probably_uses=Probably uses +tt.keyphrase.Probably_makes=Probably makes +tt.keyphrase.Tier_Rating=Tier Rating +tt.keyphrase.Amp_Rating=Amp Rating +tt.keyphrase.Computation_Available=Computation Available +tt.keyphrase.Computation_Remaining=Computation Remaining +tt.keyphrase.Content_Stack_Count=Content: Stack Count +tt.keyphrase.Base_computation=Base computation +tt.keyphrase.After_overclocking=After overclocking +tt.keyphrase.Heat_Accumulated=Heat Accumulated +tt.keyphrase.Running_interdimensional_scan=Running interdimensional scan +tt.keyphrase.Running_local_dimension_scan=Running local dimension scan +tt.keyphrase.Overdrive_disengaged=Overdrive disengaged +tt.keyphrase.Overdrive_engaged=Overdrive engaged +tt.keyphrase.Hysteresis_high_set_to=Hysteresis high set to +tt.keyphrase.Hysteresis_low_set_to=Hysteresis low set to +tt.keyphrase.Tesla_radius_set_to=Tesla radius set to +tt.keyphrase.Sending_power=Sending power +tt.keyphrase.Receiving_power=Receiving power +tt.keyphrase.Stored_energy=Stored energy +tt.keyphrase.Stored_EU=Stored EU +tt.keyphrase.Average_IO=Average I/O +tt.keyphrase.Average_IO_(max)=Voltage I/O (max) +tt.keyphrase.Average_IO_max=Voltage I/O max +tt.keyphrase.Amperage_IO_(max)=Amperage I/O (max) +tt.keyphrase.Side_capabilities=Side capabilities +tt.keyphrase.Ass_line_recipe=Assembly Line Recipe + +#OpenTurrets compatibility +tile.turretHeadEM.name=Elemental Matter Turret +tile.turretBaseEM.name=Elemental Turret Base + +#EM scan result +tt.keyword.scan.depth=Depth +tt.keyword.scan.class=Class +tt.keyword.scan.name=Name +tt.keyword.scan.symbol=Symbol + +tt.keyword.scan.mass=Mass +tt.keyword.scan.count=Count +tt.keyword.scan.amount=Amount +tt.keyword.scan.energy=Energy +tt.keyword.scan.energyLevel=Energy Level +tt.keyword.scan.charge=Charge +tt.keyword.scan.life_mult=Life multiplier +tt.keyword.scan.half_life=Half life +tt.keyword.scan.life_time=Life time +tt.keyword.scan.age=Age +tt.keyphrase.scan.at_current_energy_level=At current energy level +tt.keyword.scan.color=Colorless +tt.keyword.scan.colorless=Colorless +tt.keyword.scan.colored=Colored + +tt.keyword.short.mass=M +tt.keyword.short.count=Qty +tt.keyword.short.amount=Qty +tt.keyword.short.energy=E +tt.keyword.short.energyLevel=EL +tt.keyword.short.charge=C +tt.keyword.short.time=T + +tt.keyword.unit.mass=eV/c² +tt.keyword.unit.massFlux=eV/c²s +tt.keyword.unit.count= +tt.keyword.unit.mol=mol +tt.keyword.unit.itemMols=item(s) +tt.keyword.unit.mbMols=mb +tt.keyword.unit.energy=eV +tt.keyword.unit.charge=e +tt.keyword.unit.time=s +tt.keyword.unit.tick=t +#that the thing wont decay +tt.keyword.stable=STABLE + +#EM types +tt.keyword.Primitive=Primitive +tt.keyword.Element=Element +tt.keyword.Atom=Atom +tt.keyword.Isotope=Isotope +tt.keyword.Boson=Boson +tt.keyword.Fermion=Fermion +tt.keyword.GaugeBoson=Gauge boson +tt.keyword.Meson=Meson +tt.keyword.Baryon=Baryon +tt.keyword.Tetraquark=Tetraquark +tt.keyword.Pentaquark=Pentaquark +tt.keyword.Hexaquark=Hexaquark +tt.keyword.Hadron=Hadron +tt.keyword.Neutrino=Neutrino +tt.keyword.Quark=Quark +tt.keyword.ScalarBoson=Scalar boson +#em definitions +tt.keyword.PrimitiveNBTERROR=NBT ERROR +tt.keyword.PrimitiveNULLPOINTER=NULL POINTER +tt.keyword.PrimitiveSpace=Space +tt.keyword.PrimitivePresence=Presence +tt.keyword.PrimitiveMass=Mass +tt.keyword.PrimitiveDarkMass=DarkMass +tt.keyword.PrimitiveEnergy=Energy +tt.keyword.PrimitiveDarkEnergy=DarkEnergy +tt.keyword.PrimitiveMagic=Magic +tt.keyword.PrimitiveAntimagic=Antimagic +tt.keyword.Gluon=Gluon +tt.keyword.Photon=Photon +tt.keyword.Weak0=Weak +tt.keyword.WeakPlus=Weak+ +tt.keyword.WeakMinus=Weak- +tt.keyword.Proton=Proton +tt.keyword.AntiProton=Antiproton +tt.keyword.Neutron=Neutron +tt.keyword.AntiNeutron=Antineutron +tt.keyword.Lepton=Lepton +tt.keyword.Electron=Electron +tt.keyword.Muon=Muon +tt.keyword.Tauon=Tauon +tt.keyword.Positron=Positron +tt.keyword.Antimuon=Antimuon +tt.keyword.Antitauon=Antitauon +tt.keyword.ElectronNeutrino=Electron neutrino +tt.keyword.MuonNeutrino=Muon neutrino +tt.keyword.TauonNeutrino=Tauon neutrino +tt.keyword.PositronNeutrino=Positron neutrino +tt.keyword.AntimuonNeutrino=Antimuon neutrino +tt.keyword.AntitauonNeutrino=Antitauon neutrino +tt.keyword.QuarkUp=Up +tt.keyword.QuarkCharm=Charm +tt.keyword.QuarkTop=Top +tt.keyword.QuarkDown=Down +tt.keyword.QuarkStrange=Strange +tt.keyword.QuarkBottom=Bottom +tt.keyword.QuarkAntiUp=Antiup +tt.keyword.QuarkAntiCharm=Anticharm +tt.keyword.QuarkAntiTop=Antitop +tt.keyword.QuarkAntiDown=Antidown +tt.keyword.QuarkAntiStrange=Antistrange +tt.keyword.QuarkAntiBottom=Antibottom +tt.keyword.Higgs=Higgs +#These are Thaumcraft aspects +tt.keyword.Air=Air +tt.keyword.Earth=Earth +tt.keyword.Fire=Fire +tt.keyword.Water=Water +tt.keyword.Order=Order +tt.keyword.Entropy=Entropy +tt.keyword.Chaos=Chaos + +tt.keyword.Primal=Primal +tt.keyword.Aspect=Aspect + +tt.element.Neutronium=Neutronium +tt.element.Hydrogen=Hydrogen +tt.element.Helium=Helium +tt.element.Lithium=Lithium +tt.element.Beryllium=Beryllium +tt.element.Boron=Boron +tt.element.Carbon=Carbon +tt.element.Nitrogen=Nitrogen +tt.element.Oxygen=Oxygen +tt.element.Fluorine=Fluorine +tt.element.Neon=Neon +tt.element.Sodium=Sodium +tt.element.Magnesium=Magnesium +tt.element.Aluminium=Aluminium +tt.element.Silicon=Silicon +tt.element.Phosphorus=Phosphorus +tt.element.Sulfur=Sulfur +tt.element.Chlorine=Chlorine +tt.element.Argon=Argon +tt.element.Potassium=Potassium +tt.element.Calcium=Calcium +tt.element.Scandium=Scandium +tt.element.Titanium=Titanium +tt.element.Vanadium=Vanadium +tt.element.Chromium=Chromium +tt.element.Manganese=Manganese +tt.element.Iron=Iron +tt.element.Cobalt=Cobalt +tt.element.Nickel=Nickel +tt.element.Copper=Copper +tt.element.Zinc=Zinc +tt.element.Gallium=Gallium +tt.element.Germanium=Germanium +tt.element.Arsenic=Arsenic +tt.element.Selenium=Selenium +tt.element.Bromine=Bromine +tt.element.Krypton=Krypton +tt.element.Rubidium=Rubidium +tt.element.Strontium=Strontium +tt.element.Yttrium=Yttrium +tt.element.Zirconium=Zirconium +tt.element.Niobium=Niobium +tt.element.Molybdenum=Molybdenum +tt.element.Technetium=Technetium +tt.element.Ruthenium=Ruthenium +tt.element.Rhodium=Rhodium +tt.element.Palladium=Palladium +tt.element.Silver=Silver +tt.element.Cadmium=Cadmium +tt.element.Indium=Indium +tt.element.Tin=Tin +tt.element.Antimony=Antimony +tt.element.Tellurium=Tellurium +tt.element.Iodine=Iodine +tt.element.Xenon=Xenon +tt.element.Caesium=Caesium +tt.element.Barium=Barium +tt.element.Lanthanum=Lanthanum +tt.element.Cerium=Cerium +tt.element.Praseodymium=Praseodymium +tt.element.Neodymium=Neodymium +tt.element.Promethium=Promethium +tt.element.Samarium=Samarium +tt.element.Europium=Europium +tt.element.Gadolinium=Gadolinium +tt.element.Terbium=Terbium +tt.element.Dysprosium=Dysprosium +tt.element.Holmium=Holmium +tt.element.Erbium=Erbium +tt.element.Thulium=Thulium +tt.element.Ytterbium=Ytterbium +tt.element.Lutetium=Lutetium +tt.element.Hafnium=Hafnium +tt.element.Tantalum=Tantalum +tt.element.Tungsten=Tungsten +tt.element.Rhenium=Rhenium +tt.element.Osmium=Osmium +tt.element.Iridium=Iridium +tt.element.Platinum=Platinum +tt.element.Gold=Gold +tt.element.Mercury=Mercury +tt.element.Thallium=Thallium +tt.element.Lead=Lead +tt.element.Bismuth=Bismuth +tt.element.Polonium=Polonium +tt.element.Astatine=Astatine +tt.element.Radon=Radon +tt.element.Francium=Francium +tt.element.Radium=Radium +tt.element.Actinium=Actinium +tt.element.Thorium=Thorium +tt.element.Protactinium=Protactinium +tt.element.Uranium=Uranium +tt.element.Neptunium=Neptunium +tt.element.Plutonium=Plutonium +tt.element.Americium=Americium +tt.element.Curium=Curium +tt.element.Berkelium=Berkelium +tt.element.Californium=Californium +tt.element.Einsteinium=Einsteinium +tt.element.Fermium=Fermium +tt.element.Mendelevium=Mendelevium +tt.element.Nobelium=Nobelium +tt.element.Lawrencium=Lawrencium +tt.element.Rutherfordium=Rutherfordium +tt.element.Dubnium=Dubnium +tt.element.Seaborgium=Seaborgium +tt.element.Bohrium=Bohrium +tt.element.Hassium=Hassium +tt.element.Meitnerium=Meitnerium +tt.element.Darmstadtium=Darmstadtium +tt.element.Roentgenium=Roentgenium +tt.element.Copernicium=Copernicium +tt.element.Nihonium=Nihonium +tt.element.Flerovium=Flerovium +tt.element.Moscovium=Moscovium +tt.element.Livermorium=Livermorium +tt.element.Tennessine=Tennessine +tt.element.Oganesson=Oganesson + +tt.element.AntiNeutronium=Antineutronium +tt.element.AntiHydrogen=Antihydrogen +tt.element.AntiHelium=Antihelium +tt.element.AntiLithium=Antilithium +tt.element.AntiBeryllium=Antiberyllium +tt.element.AntiBoron=Antiboron +tt.element.AntiCarbon=Anticarbon +tt.element.AntiNitrogen=Antinitrogen +tt.element.AntiOxygen=Antioxygen +tt.element.AntiFluorine=Antifluorine +tt.element.AntiNeon=Antineon +tt.element.AntiSodium=Antisodium +tt.element.AntiMagnesium=Antimagnesium +tt.element.AntiAluminium=Antialuminium +tt.element.AntiSilicon=Antisilicon +tt.element.AntiPhosphorus=Antiphosphorus +tt.element.AntiSulfur=Antisulfur +tt.element.AntiChlorine=Antichlorine +tt.element.AntiArgon=Antiargon +tt.element.AntiPotassium=Antipotassium +tt.element.AntiCalcium=Anticalcium +tt.element.AntiScandium=Antiscandium +tt.element.AntiTitanium=Antititanium +tt.element.AntiVanadium=Antivanadium +tt.element.AntiChromium=Antichromium +tt.element.AntiManganese=Antimanganese +tt.element.AntiIron=Antiiron +tt.element.AntiCobalt=Anticobalt +tt.element.AntiNickel=Antinickel +tt.element.AntiCopper=Anticopper +tt.element.AntiZinc=Antizinc +tt.element.AntiGallium=Antigallium +tt.element.AntiGermanium=Antigermanium +tt.element.AntiArsenic=Antiarsenic +tt.element.AntiSelenium=Antiselenium +tt.element.AntiBromine=Antibromine +tt.element.AntiKrypton=Antikrypton +tt.element.AntiRubidium=Antirubidium +tt.element.AntiStrontium=Antistrontium +tt.element.AntiYttrium=Antiyttrium +tt.element.AntiZirconium=Antizirconium +tt.element.AntiNiobium=Antiniobium +tt.element.AntiMolybdenum=Antimolybdenum +tt.element.AntiTechnetium=Antitechnetium +tt.element.AntiRuthenium=Antiruthenium +tt.element.AntiRhodium=Antirhodium +tt.element.AntiPalladium=Antipalladium +tt.element.AntiSilver=Antisilver +tt.element.AntiCadmium=Anticadmium +tt.element.AntiIndium=Antiindium +tt.element.AntiTin=Antitin +tt.element.AntiAntimony=Antiantimony +tt.element.AntiTellurium=Antitellurium +tt.element.AntiIodine=Antiiodine +tt.element.AntiXenon=Antixenon +tt.element.AntiCaesium=Anticaesium +tt.element.AntiBarium=Antibarium +tt.element.AntiLanthanum=Antilanthanum +tt.element.AntiCerium=Anticerium +tt.element.AntiPraseodymium=Antipraseodymium +tt.element.AntiNeodymium=Antineodymium +tt.element.AntiPromethium=Antipromethium +tt.element.AntiSamarium=Antisamarium +tt.element.AntiEuropium=Antieuropium +tt.element.AntiGadolinium=Antigadolinium +tt.element.AntiTerbium=Antiterbium +tt.element.AntiDysprosium=Antidysprosium +tt.element.AntiHolmium=Antiholmium +tt.element.AntiErbium=Antierbium +tt.element.AntiThulium=Antithulium +tt.element.AntiYtterbium=Antiytterbium +tt.element.AntiLutetium=Antilutetium +tt.element.AntiHafnium=Antihafnium +tt.element.AntiTantalum=Antitantalum +tt.element.AntiTungsten=Antitungsten +tt.element.AntiRhenium=Antirhenium +tt.element.AntiOsmium=Antiosmium +tt.element.AntiIridium=Antiiridium +tt.element.AntiPlatinum=Antiplatinum +tt.element.AntiGold=Antigold +tt.element.AntiMercury=Antimercury +tt.element.AntiThallium=Antithallium +tt.element.AntiLead=Antilead +tt.element.AntiBismuth=Antibismuth +tt.element.AntiPolonium=Antipolonium +tt.element.AntiAstatine=Antiastatine +tt.element.AntiRadon=Antiradon +tt.element.AntiFrancium=Antifrancium +tt.element.AntiRadium=Antiradium +tt.element.AntiActinium=Antiactinium +tt.element.AntiThorium=Antithorium +tt.element.AntiProtactinium=Antiprotactinium +tt.element.AntiUranium=Antiuranium +tt.element.AntiNeptunium=Antineptunium +tt.element.AntiPlutonium=Antiplutonium +tt.element.AntiAmericium=Antiamericium +tt.element.AntiCurium=Anticurium +tt.element.AntiBerkelium=Antiberkelium +tt.element.AntiCalifornium=Antibalifornium +tt.element.AntiEinsteinium=Antieinsteinium +tt.element.AntiFermium=Antifermium +tt.element.AntiMendelevium=Antimendelevium +tt.element.AntiNobelium=Antinobelium +tt.element.AntiLawrencium=Antilawrencium +tt.element.AntiRutherfordium=Antirutherfordium +tt.element.AntiDubnium=Antidubnium +tt.element.AntiSeaborgium=Antiseaborgium +tt.element.AntiBohrium=Antibohrium +tt.element.AntiHassium=Antihassium +tt.element.AntiMeitnerium=Antimeitnerium +tt.element.AntiDarmstadtium=Antidarmstadtium +tt.element.AntiRoentgenium=Antiroentgenium +tt.element.AntiCopernicium=Anticopernicium +tt.element.AntiNihonium=Antinihonium +tt.element.AntiFlerovium=Antiflerovium +tt.element.AntiMoscovium=Antimoscovium +tt.element.AntiLivermorium=Antilivermorium +tt.element.AntiTennessine=Antitennessine +tt.element.AntiOganesson=Antioganesson + +tt.IUPAC.n=nil +tt.IUPAC.u=un +tt.IUPAC.b=bi +tt.IUPAC.t=tri +tt.IUPAC.q=quad +tt.IUPAC.p=pent +tt.IUPAC.h=hex +tt.IUPAC.s=sept +tt.IUPAC.o=oct +tt.IUPAC.e=enn +tt.IUPAC.N=Nil +tt.IUPAC.U=Un +tt.IUPAC.B=Bi +tt.IUPAC.T=Tri +tt.IUPAC.Q=Quad +tt.IUPAC.P=Pent +tt.IUPAC.H=Hex +tt.IUPAC.S=Sept +tt.IUPAC.O=Oct +tt.IUPAC.E=Enn +tt.IUPAC.ium=ium +tt.IUPAC.Anti=Anti +tt.keyword.Weird=* + +tt.chat.debug.generator=Laser mode: %s diff --git a/tectech/src/main/resources/assets/tectech/lang/zh_CN.lang b/tectech/src/main/resources/assets/tectech/lang/zh_CN.lang new file mode 100644 index 0000000000..dd32b7a6ec --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/lang/zh_CN.lang @@ -0,0 +1,1296 @@ +#Creative Tab Name +itemGroup.TecTech=TecTech +itemGroup.EM=TecTech元物质 + +#Blocks +tile.quantumStuff.name=量子物质 + +tile.quantumGlass.name=量子玻璃 +tile.quantumGlass.desc.0=致密但透明 +tile.quantumGlass.desc.1=玻璃&优雅(Glassy & Classy) + +tile.reactorSim.name=反应堆模拟器 +tile.reactorSim.desc.0=裂变反应不确定度解析器9001 +tile.reactorSim.desc.1=爆炸,但没有那么多... + +#Items +item.em.programmer.name=AVR编程器 +item.em.programmer.desc.0=当前PC +item.em.programmer.desc.1=唤醒 +item.em.programmer.desc.2=激活 +item.em.programmer.desc.3=Debug +item.em.programmer.desc.4=延迟 + +item.em.debugContainer.name=调试元物质容器 +item.em.debugContainer.desc.0=包含 +item.em.debugContainer.desc.1=元物质的容器 +item.em.debugContainer.desc.2=右键元物质仓室 +item.em.debugContainer.desc.3=---意外终止--- + +item.em.definitionContainer.name=元物质配方提示 +item.em.definitionContainer.desc.0=需要包含 +item.em.definitionContainer.desc.1=配方提示 +item.em.definitionContainer.desc.2=---意外终止--- + +item.em.definitionScanStorage.name=元物质容器扫描 +item.em.definitionScanStorage.desc.0=包含扫描结果 +item.em.definitionScanStorage.desc.1=用于阅读 +item.em.definitionScanStorage.desc.2=存储元物质扫描数据 +item.em.definitionScanStorage.desc.3=---意外终止--- + +item.em.constructable.name=多方块机器蓝图 +item.em.constructable.desc.0=触发可构造界面 +item.em.constructable.desc.1=显示多方块结构全息投影, +item.em.constructable.desc.2=请对多方块控制器使用. +item.em.constructable.desc.3=(在创造模式下潜行右键可直接构造) +item.em.constructable.desc.4=堆叠数量影响等级/模式/类型 + +item.em.EuMeterGT.name=GT EU电表 +item.em.EuMeterGT.desc.0=测量EU相关的基本内容 +item.em.EuMeterGT.desc.1=只需右键方块. + +item.em.frontRotate.name=正面旋转扳手 +item.em.frontRotate.desc.0=触发正面旋转界面 +item.em.frontRotate.desc.1=可以旋转多方块控制器, +item.em.frontRotate.desc.2=从而使整个结构可以旋转. + +item.em.parametrizerMemoryCard.name=数据化储存卡 +item.em.parametrizerMemoryCard.desc.0=存储参数 +item.em.parametrizerMemoryCard.desc.1=在参数仪/控制器上使用以对其进行配置 +item.em.parametrizerMemoryCard.desc.2=在参数仪上使用以存储参数 +item.em.parametrizerMemoryCard.desc.3=潜行右键以锁定/解锁 + +item.tm.teslaCoilCapacitor.0.name=LV特斯拉电容 +item.tm.teslaCoilCapacitor.1.name=MV特斯拉电容 +item.tm.teslaCoilCapacitor.2.name=HV特斯拉电容 +item.tm.teslaCoilCapacitor.3.name=EV特斯拉电容 +item.tm.teslaCoilCapacitor.4.name=IV特斯拉电容 +item.tm.teslaCoilCapacitor.5.name=LuV特斯拉电容 +item.tm.teslaCoilCapacitor.6.name=ZPM特斯拉电容 +item.tm.teslaCoilCapacitor.desc.0=存储量: +item.tm.teslaCoilCapacitor.desc.1=EU;充能速度: +item.tm.teslaCoilCapacitor.desc.2=把这个破碎的东西浸入某种辛辣的水中! +item.tm.teslaCoilCapacitor.desc.3=插入特斯拉电塔的电容仓中 +item.tm.teslaCoilCapacitor.desc.4=电容器就像电池一样,对吗? + +item.tm.itemTeslaComponent.0.name=琥珀金特斯拉绕组 +item.tm.itemTeslaComponent.1.name=超导特斯拉绕组 +item.tm.itemTeslaComponent.desc=特斯拉需要这些! + +item.tm.teslaCover.0.name=特斯拉线圈帽 +item.tm.teslaCover.1.name=豪华特斯拉线圈帽 +item.tm.teslaCover.desc.0=特斯拉使能机器! +item.tm.teslaCover.desc.1=特斯拉使能机器! (但非常吵!!) +item.tm.teslaCover.desc.2=把这个破碎的东西浸入某种辛辣的水中! +item.tm.teslaCover.desc.3=对机器顶部右键使用,启用机器的特斯拉供电功能 +item.tm.teslaCover.desc.4=到底谁在用电缆? + +item.tm.teslaStaff.name=特斯拉权杖 +item.tm.teslaStaff.desc=狂妄之人窃取了众神的权柄! + +item.tm.enderfluidlinkcover.name=末影流体覆盖板 +item.tm.enderfluidlinkcover.desc.0=在机器间无线传输流体! +item.tm.enderfluidlinkcover.desc.1=可贴在储罐/机器/管道的任意面以将其与末影相连 +item.tm.enderfluidlinkcover.desc.2=末影储罐太逊了! -来自Chads-of-NH的Bot + +item.tm.powerpassupgradecover.name=导能升级覆盖板 +item.tm.powerpassupgradecover.desc.0=为TecTech多方块机器添加导能功能 +item.tm.powerpassupgradecover.desc.1=罐中的有源变压器?? +item.tm.powerpassupgradecover.desc.2=将它们像圣诞彩灯一样串起来! + +#Death Messages +death.attack.microwaving=%1$s被辐射脱水。 +death.attack.microwaving.player=%1$s在与%2$s的战斗中被辐射脱水。 +death.attack.elementalPollution=%1$s在错误的空洞中被汽化。 +death.attack.elementalPollution.player=%1$s在与%2$s的战斗中被错误的空洞汽化。 +death.attack.subspace=%1$s受到了降维打击。 +death.attack.subspace.player=%1$s在与%2$s的战斗中受到了降维打击。 + +#Machine hulls +gt.blockmachines.hull.tier.10.name=UEV机器外壳 +gt.blockmachines.hull.tier.11.name=UIV机器外壳 +gt.blockmachines.hull.tier.12.name=UMV机器外壳 +gt.blockmachines.hull.tier.13.name=UXV机器外壳 +gt.blockmachines.hull.tier.14.name=MAX机器外壳 + +#Transformers +gt.blockmachines.wetransformer.tier.00.name=ULV高能变压器 +gt.blockmachines.wetransformer.tier.00.desc=LV -> ULV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.01.name=LV高能变压器 +gt.blockmachines.wetransformer.tier.01.desc=MV -> LV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.02.name=MV高能变压器 +gt.blockmachines.wetransformer.tier.02.desc=HV -> MV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.03.name=HV高能变压器 +gt.blockmachines.wetransformer.tier.03.desc=EV -> HV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.04.name=EV高能变压器 +gt.blockmachines.wetransformer.tier.04.desc=IV -> EV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.05.name=IV高能变压器 +gt.blockmachines.wetransformer.tier.05.desc=LuV -> IV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.06.name=LuV高能变压器 +gt.blockmachines.wetransformer.tier.06.desc=ZPM -> LuV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.07.name=ZPM高能变压器 +gt.blockmachines.wetransformer.tier.07.desc=UV -> ZPM (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.08.name=UV高能变压器 +gt.blockmachines.wetransformer.tier.08.desc=UHV -> UV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.09.name=UHV高能变压器 +gt.blockmachines.wetransformer.tier.09.desc=UEV -> UHV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.10.name=UEV高能变压器 +gt.blockmachines.wetransformer.tier.10.desc=UIV -> UEV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.11.name=UIV高能变压器 +gt.blockmachines.wetransformer.tier.11.desc=UMV -> UIV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.12.name=UMV高能变压器 +gt.blockmachines.wetransformer.tier.12.desc=UXV -> UMV (用软锤右击以反转) +gt.blockmachines.wetransformer.tier.13.name=UXV高能变压器 +gt.blockmachines.wetransformer.tier.13.desc=MAX -> UXV (用软锤右击以反转) + +gt.blockmachines.tt.transformer.tier.09.name=UHV变压器 +gt.blockmachines.tt.transformer.tier.09.desc=UEV -> UHV (用软锤右击以反转) +gt.blockmachines.tt.transformer.tier.10.name=UEV变压器 +gt.blockmachines.tt.transformer.tier.10.desc=UIV -> UEV (用软锤右击以反转) +gt.blockmachines.tt.transformer.tier.11.name=UIV变压器 +gt.blockmachines.tt.transformer.tier.11.desc=UMV -> UIV (用软锤右击以反转) +gt.blockmachines.tt.transformer.tier.12.name=UMV变压器 +gt.blockmachines.tt.transformer.tier.12.desc=UXV -> UMV (用软锤右击以反转) +gt.blockmachines.tt.transformer.tier.13.name=UXV变压器 +gt.blockmachines.tt.transformer.tier.13.desc=MAX -> UXV (用软锤右击以反转) + +gt.blockmachines.transformer.ha.tier.09.name=UHV高电流变压器 +gt.blockmachines.transformer.ha.tier.09.desc=UEV -> UHV (用软锤右击以反转 +gt.blockmachines.transformer.ha.tier.10.name=UEV高电流变压器 +gt.blockmachines.transformer.ha.tier.10.desc=UIV -> UEV (用软锤右击以反转) +gt.blockmachines.transformer.ha.tier.11.name=UIV高电流变压器 +gt.blockmachines.transformer.ha.tier.11.desc=UMV -> UIV (用软锤右击以反转) +gt.blockmachines.transformer.ha.tier.12.name=UMV高电流变压器 +gt.blockmachines.transformer.ha.tier.12.desc=UXV -> UMV (用软锤右击以反转) +gt.blockmachines.transformer.ha.tier.13.name=UXV高电流变压器 +gt.blockmachines.transformer.ha.tier.13.desc=MAX -> UXV (用软锤右击以反转) + +#Hatches +tt.base.emhatch.desc.0=最大元物质组数: +tt.base.emhatch.desc.1=最大容量: +tt.base.emhatch.desc.2=在这个仓室不处于多方块结构 +tt.base.emhatch.desc.3=中时,在后侧、上侧或下侧放 +tt.base.emhatch.desc.4=置溢流仓以提供过载保护。 +tt.base.emhatch.desc.5=使用量子隧道时,传输距离 +tt.base.emhatch.desc.6=可以沿直线拓展至最多15格 +tt.base.emhatch.desc.7=启用前必须涂色 + +gt.blockmachines.hatch.emmuffler.tier.08.name=UV溢流仓 +gt.blockmachines.hatch.emmuffler.tier.09.name=UHV溢流仓 +gt.blockmachines.hatch.emmuffler.tier.10.name=UEV溢流仓 +gt.blockmachines.hatch.emmuffler.tier.11.name=UIV溢流仓 +gt.blockmachines.hatch.emmuffler.tier.12.name=UMV溢流仓 +gt.blockmachines.hatch.emmuffler.tier.13.name=UXV溢流仓 +gt.blockmachines.hatch.emmuffler.desc.0=清理过剩的元物质 +gt.blockmachines.hatch.emmuffler.desc.1=物质缓存 +gt.blockmachines.hatch.emmuffler.desc.2=清理速度 +gt.blockmachines.hatch.emmuffler.desc.3=请勿阻塞输出! + +gt.blockmachines.hatch.energymulti04.tier.05.name=4安IV能源仓 +gt.blockmachines.hatch.energymulti16.tier.05.name=16安IV能源仓 +gt.blockmachines.hatch.energymulti64.tier.05.name=64安IV能源仓 +gt.blockmachines.hatch.energymulti04.tier.06.name=4安LuV能源仓 +gt.blockmachines.hatch.energymulti16.tier.06.name=16安LuV能源仓 +gt.blockmachines.hatch.energymulti64.tier.06.name=64安LuV能源仓 +gt.blockmachines.hatch.energymulti04.tier.07.name=4安ZPM能源仓 +gt.blockmachines.hatch.energymulti16.tier.07.name=16安ZPM能源仓 +gt.blockmachines.hatch.energymulti64.tier.07.name=64安ZPM能源仓 +gt.blockmachines.hatch.energymulti04.tier.08.name=4安UV能源仓 +gt.blockmachines.hatch.energymulti16.tier.08.name=16安UV能源仓 +gt.blockmachines.hatch.energymulti64.tier.08.name=64安UV能源仓 +gt.blockmachines.hatch.energymulti04.tier.09.name=4安UHV能源仓 +gt.blockmachines.hatch.energymulti16.tier.09.name=16安UHV能源仓 +gt.blockmachines.hatch.energymulti64.tier.09.name=64安UHV能源仓 +gt.blockmachines.hatch.energymulti04.tier.10.name=4安UEV能源仓 +gt.blockmachines.hatch.energymulti16.tier.10.name=16安UEV能源仓 +gt.blockmachines.hatch.energymulti64.tier.10.name=64安UEV能源仓 +gt.blockmachines.hatch.energymulti04.tier.11.name=4安UIV能源仓 +gt.blockmachines.hatch.energymulti16.tier.11.name=16安UIV能源仓 +gt.blockmachines.hatch.energymulti64.tier.11.name=64安UIV能源仓 +gt.blockmachines.hatch.energymulti04.tier.12.name=4安UMV能源仓 +gt.blockmachines.hatch.energymulti16.tier.12.name=16安UMV能源仓 +gt.blockmachines.hatch.energymulti64.tier.12.name=64安UMV能源仓 +gt.blockmachines.hatch.energymulti04.tier.13.name=4安UXV能源仓 +gt.blockmachines.hatch.energymulti16.tier.13.name=16安UXV能源仓 +gt.blockmachines.hatch.energymulti64.tier.13.name=64安UXV能源仓 +gt.blockmachines.hatch.energymulti.desc.0=为多方块机器以高电流输入能源 +gt.blockmachines.hatch.energymulti.desc.1=输入电流 + +gt.blockmachines.hatch.energytunnel1.tier.05.name=IV 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.05.name=IV 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.05.name=IV 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.05.name=IV 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.05.name=IV 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.05.name=IV 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.05.name=IV 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel1.tier.06.name=LuV 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.06.name=LuV 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.06.name=LuV 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.06.name=LuV 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.06.name=LuV 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.06.name=LuV 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.06.name=LuV 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel1.tier.07.name=ZPM 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.07.name=ZPM 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.07.name=ZPM 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.07.name=ZPM 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.07.name=ZPM 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.07.name=ZPM 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.07.name=ZPM 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel1.tier.08.name=UV 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.08.name=UV 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.08.name=UV 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.08.name=UV 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.08.name=UV 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.08.name=UV 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.08.name=UV 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel1.tier.09.name=UHV 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.09.name=UHV 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.09.name=UHV 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.09.name=UHV 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.09.name=UHV 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.09.name=UHV 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.09.name=UHV 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel1.tier.10.name=UEV 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.10.name=UEV 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.10.name=UEV 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.10.name=UEV 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.10.name=UEV 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.10.name=UEV 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.10.name=UEV 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel1.tier.11.name=UIV 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.11.name=UIV 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.11.name=UIV 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.11.name=UIV 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.11.name=UIV 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.11.name=UIV 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.11.name=UIV 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel1.tier.12.name=UMV 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.12.name=UMV 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.12.name=UMV 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.12.name=UMV 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.12.name=UMV 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.12.name=UMV 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.12.name=UMV 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel1.tier.13.name=UXV 256A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel2.tier.13.name=UXV 1024A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel3.tier.13.name=UXV 4096A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel4.tier.13.name=UXV 16384A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel5.tier.13.name=UXV 65536A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel6.tier.13.name=UXV 262144A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel7.tier.13.name=UXV 1048576A/t 激光靶仓 +gt.blockmachines.hatch.energytunnel.tier.14.name=传奇激光靶仓 +gt.blockmachines.hatch.energytunnel.desc.0=多方块机器的能量输入端 +gt.blockmachines.hatch.energytunnel.desc.1=通量 + +gt.blockmachines.hatch.dynamomulti04.tier.05.name=4安IV动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.05.name=16安IV动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.05.name=64安IV动力仓 +gt.blockmachines.hatch.dynamomulti04.tier.06.name=4安LuV动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.06.name=16安LuV动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.06.name=64安LuV动力仓 +gt.blockmachines.hatch.dynamomulti04.tier.07.name=4安ZPM动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.07.name=16安ZPM动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.07.name=64安ZPM动力仓 +gt.blockmachines.hatch.dynamomulti04.tier.08.name=4安UV动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.08.name=16安UV动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.08.name=64安UV动力仓 +gt.blockmachines.hatch.dynamomulti04.tier.09.name=4安UHV动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.09.name=16安UHV动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.09.name=64安UHV动力仓 +gt.blockmachines.hatch.dynamomulti04.tier.10.name=4安UEV动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.10.name=16安UEV动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.10.name=64安UEV动力仓 +gt.blockmachines.hatch.dynamomulti04.tier.11.name=4安UIV动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.11.name=16安UIV动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.11.name=64安UIV动力仓 +gt.blockmachines.hatch.dynamomulti04.tier.12.name=4安UMV动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.12.name=16安UMV动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.12.name=64安UMV动力仓 +gt.blockmachines.hatch.dynamomulti04.tier.13.name=4安UXV动力仓 +gt.blockmachines.hatch.dynamomulti16.tier.13.name=16安UXV动力仓 +gt.blockmachines.hatch.dynamomulti64.tier.13.name=64安UXV动力仓 +gt.blockmachines.hatch.dynamomulti.desc.0=从多方块机器以高电流输出能源 +gt.blockmachines.hatch.dynamomulti.desc.1=输出电流 + +gt.blockmachines.hatch.dynamotunnel1.tier.05.name=IV 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.05.name=IV 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.05.name=IV 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.05.name=IV 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.05.name=IV 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.05.name=IV 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.05.name=IV 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel1.tier.06.name=LuV 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.06.name=LuV 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.06.name=LuV 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.06.name=LuV 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.06.name=LuV 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.06.name=LuV 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.06.name=LuV 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel1.tier.07.name=ZPM 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.07.name=ZPM 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.07.name=ZPM 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.07.name=ZPM 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.07.name=ZPM 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.07.name=ZPM 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.07.name=ZPM 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel1.tier.08.name=UV 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.08.name=UV 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.08.name=UV 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.08.name=UV 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.08.name=UV 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.08.name=UV 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.08.name=UV 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel1.tier.09.name=UHV 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.09.name=UHV 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.09.name=UHV 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.09.name=UHV 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.09.name=UHV 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.09.name=UHV 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.09.name=UHV 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel1.tier.10.name=UEV 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.10.name=UEV 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.10.name=UEV 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.10.name=UEV 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.10.name=UEV 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.10.name=UEV 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.10.name=UEV 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel1.tier.11.name=UIV 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.11.name=UIV 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.11.name=UIV 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.11.name=UIV 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.11.name=UIV 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.11.name=UIV 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.11.name=UIV 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel1.tier.12.name=UMV 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.12.name=UMV 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.12.name=UMV 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.12.name=UMV 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.12.name=UMV 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.12.name=UMV 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.12.name=UMV 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel1.tier.13.name=UXV 256A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel2.tier.13.name=UXV 1024A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel3.tier.13.name=UXV 4096A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel4.tier.13.name=UXV 16384A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel5.tier.13.name=UXV 65536A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel6.tier.13.name=UXV 262144A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel7.tier.13.name=UXV 1048576A/t 激光源仓 +gt.blockmachines.hatch.dynamotunnel.tier.14.name=传奇激光源仓 +gt.blockmachines.hatch.dynamotunnel.desc.0=多方块机器的能量输出端 +gt.blockmachines.hatch.dynamotunnel.desc.1=通量 + +gt.blockmachines.emin.tier.08.name=UV元物质输入仓 +gt.blockmachines.emin.tier.09.name=UHV元物质输入仓 +gt.blockmachines.emin.tier.10.name=UEV元物质输入仓 +gt.blockmachines.emin.tier.11.name=UIV元物质输入仓 +gt.blockmachines.emin.tier.12.name=UMV元物质输入仓 +gt.blockmachines.emin.tier.13.name=UXV元物质输入仓 +gt.blockmachines.emin.desc=多方块机器的元物质输入 + +gt.blockmachines.emout.tier.08.name=UV元物质输出仓 +gt.blockmachines.emout.tier.09.name=UHV元物质输出仓 +gt.blockmachines.emout.tier.10.name=UEV元物质输出仓 +gt.blockmachines.emout.tier.11.name=UIV元物质输出仓 +gt.blockmachines.emout.tier.12.name=UMV元物质输出仓 +gt.blockmachines.emout.tier.13.name=UXV元物质输出仓 +gt.blockmachines.emout.desc=多方块机器的元物质输出 + +#TODO change tier.05 to tier.04 +gt.blockmachines.hatch.param.tier.05.name=参数仪 +gt.blockmachines.hatch.param.tier.07.name=参数仪 X +gt.blockmachines.hatch.param.tier.10.name=参数仪 tXt +gt.blockmachines.hatch.param.desc.0=多方块机器的参数化 +gt.blockmachines.hatch.param.desc.1=E=mine*craft² + +gt.blockmachines.hatch.certain.tier.07.name=未定元解析器 +gt.blockmachines.hatch.certain.tier.10.name=未定元解析器 X +gt.blockmachines.hatch.certain.desc.0=你真的很确定吗? +gt.blockmachines.hatch.certain.desc.1=盒子里的薛定谔方程 + +gt.blockmachines.hatch.datain.tier.07.name=副光学接口 +gt.blockmachines.hatch.datain.desc.0=多方块机器的数据输入 +gt.blockmachines.hatch.datain.desc.1=高速光纤接口 +gt.blockmachines.hatch.datain.desc.2=启用前必须涂色 + +gt.blockmachines.hatch.dataout.tier.07.name=主光学接口 +gt.blockmachines.hatch.dataout.desc.0=多方块机器的数据输出 +gt.blockmachines.hatch.dataout.desc.1=高速光纤接口 +gt.blockmachines.hatch.dataout.desc.2=启用前必须涂色 + +gt.blockmachines.hatch.datainass.tier.07.name=装配线数据库接口 +gt.blockmachines.hatch.datainass.desc.0=多方块机器的数据输入 +gt.blockmachines.hatch.datainass.desc.1=高速光纤接口 +gt.blockmachines.hatch.datainass.desc.2=启用前必须涂色 + +gt.blockmachines.hatch.dataoutass.tier.07.name=数据库主接口 +gt.blockmachines.hatch.dataoutass.desc.0=多方块机器的数据输出 +gt.blockmachines.hatch.dataoutass.desc.1=高速光纤接口 +gt.blockmachines.hatch.dataoutass.desc.2=启用前必须涂色 + +gt.blockmachines.hatch.rack.tier.08.name=计算机箱 +gt.blockmachines.hatch.rack.desc.0=4插槽机箱 +gt.blockmachines.hatch.rack.desc.1=容纳计算机组件 +gt.blockmachines.hatch.holder.tier.09.name=物品固定容器 +gt.blockmachines.hatch.holder.desc.0=用于研究站 +gt.blockmachines.hatch.holder.desc.1=先进的固定机制! +gt.blockmachines.hatch.capacitor.tier.03.name=电容仓 +gt.blockmachines.hatch.capacitor.desc.0=用于特斯拉电塔 +gt.blockmachines.hatch.capacitor.desc.1=存储'䏍量! (就一会儿) 原文:store 'nergy'(for a while) + +#Casings +gt.blockcasingsNH.10.name=UEV机械方块 +gt.blockcasingsNH.11.name=UIV机械方块 +gt.blockcasingsNH.12.name=UMV机械方块 +gt.blockcasingsNH.13.name=UXV机械方块 +gt.blockcasingsNH.14.name=MAX机械方块 + +gt.blockhintTT.desc.0=构造时的帮助 +gt.blockhintTT.0.name=提示方块:1号 +gt.blockhintTT.1.name=提示方块:2号 +gt.blockhintTT.2.name=提示方块:3号 +gt.blockhintTT.3.name=提示方块:4号 +gt.blockhintTT.4.name=提示方块:5号 +gt.blockhintTT.5.name=提示方块:6号 +gt.blockhintTT.6.name=提示方块:7号 +gt.blockhintTT.7.name=提示方块:8号 +gt.blockhintTT.8.name=提示方块:9号 +gt.blockhintTT.9.name=提示方块:10号 +gt.blockhintTT.10.name=提示方块:11号 +gt.blockhintTT.11.name=提示方块:12号 +gt.blockhintTT.desc.1=特定组的占位符. +gt.blockhintTT.12.name=提示方块:一般 +gt.blockhintTT.desc.2=一般占位符. +gt.blockhintTT.13.name=提示方块:空气 +gt.blockhintTT.desc.3=确保其中包含空气方块. +gt.blockhintTT.14.name=提示方块:非空气 +gt.blockhintTT.desc.4=确保其中不含空气方块. +gt.blockhintTT.15.name=提示方块:错误 +gt.blockhintTT.desc.5=错误,你希望做什么? + +gt.blockcasingsTT.0.name=超能机械方块 +gt.blockcasingsTT.0.desc.0=非常适合高能应用. +gt.blockcasingsTT.0.desc.1=能量等级正在上升! +gt.blockcasingsTT.1.name=电子计算机械方块 +gt.blockcasingsTT.1.desc.0=又好又干净的外壳. +gt.blockcasingsTT.1.desc.1=灰尘会破坏它!? +gt.3blockcasingsTT.2.name=计算机散热风扇 +gt.blockcasingsTT.2.desc.0=带过滤器的散热风扇. +gt.blockcasingsTT.2.desc.1=完美静音! +gt.blockcasingsTT.3.name=进阶电子计算机械方块 +gt.blockcasingsTT.3.desc.0=包含高带宽总线 +gt.blockcasingsTT.3.desc.1=带宽数千量子比特. +gt.blockcasingsTT.4.name=分子机械方块 +gt.blockcasingsTT.4.desc.0=阻止元物质. +gt.blockcasingsTT.4.desc.1=也阻止了辐射和情绪... +gt.blockcasingsTT.5.name=进阶分子机械方块 +gt.blockcasingsTT.5.desc.0=冷却并稳定. +gt.blockcasingsTT.5.desc.1=舒适的机器基础. +gt.blockcasingsTT.6.name=遏制场发生器 +gt.blockcasingsTT.6.desc.0=产生一个场... +gt.blockcasingsTT.6.desc.1=甚至可以阻止高能粒子. +gt.blockcasingsTT.7.name=分子线圈 +gt.blockcasingsTT.7.desc.0=好吧,它太... +gt.blockcasingsTT.7.desc.1=[用这个线圈!] +gt.blockcasingsTT.8.name=中空机械方块 +gt.blockcasingsTT.8.desc.0=强化加速器通道. +gt.blockcasingsTT.8.desc.1=有史以来最先进的管道. +gt.blockcasingsTT.9.name=时空扭曲机械方块 +gt.blockcasingsTT.9.desc.0=光速不再是限制. +gt.blockcasingsTT.9.desc.1=Wibbly wobbly timey wimey stuff.(欣赏原文吧,表示给跪了,大意是时空摇摆不定) +gt.blockcasingsTT.10.name=传输机械方块 +gt.blockcasingsTT.10.desc.0=远程连接. +gt.blockcasingsTT.10.desc.1=最好别用手碰它. +gt.blockcasingsTT.11.name=维度联络机械方块 +gt.blockcasingsTT.11.desc.0=多维运算. +gt.blockcasingsTT.11.desc.1=宇宙或别的地方. +gt.blockcasingsTT.12.name=终极分子机械方块 +gt.blockcasingsTT.12.desc.0=各方面的终极. +gt.blockcasingsTT.12.desc.1=我不知道它不能做什么. +gt.blockcasingsTT.13.name=究极分子机械方块 +gt.blockcasingsTT.13.desc.0=各方面的究极. +gt.blockcasingsTT.13.desc.1=我不知道自己在做什么! +gt.blockcasingsTT.14.name=终极遏制场发生器 +gt.blockcasingsTT.14.desc.0=黑洞... +gt.blockcasingsTT.14.desc.1=嗯... +gt.blockcasingsTT.15.name=[调试方块] +gt.blockcasingsTT.15.desc.0=懒人确定边的方式. +gt.blockcasingsTT.15.desc.1=0, 1, 2, 3, 4, 5, 6?! + +gt.blockcasingsBA0.0.name=红石合金初级特斯拉绕组 +gt.blockcasingsBA0.1.name=MV超导初级特斯拉绕组 +gt.blockcasingsBA0.2.name=HV超导初级特斯拉绕组 +gt.blockcasingsBA0.3.name=EV超导初级特斯拉绕组 +gt.blockcasingsBA0.4.name=IV超导初级特斯拉绕组 +gt.blockcasingsBA0.5.name=LuV超导初级特斯拉绕组 +gt.blockcasingsBA0.9.name=ZPM超导初级特斯拉绕组 +gt.blockcasingsBA0.0.desc.0=最高电圧 +gt.blockcasingsBA0.0.desc.1=有的人称这为神迹,另一些人把这叫做物理. +gt.blockcasingsBA0.6.name=特斯拉基座机械方块 +gt.blockcasingsBA0.6.desc.0=一种奇妙机器的基础 +gt.blockcasingsBA0.6.desc.1=它是活的,它是活的! +gt.blockcasingsBA0.7.name=特斯拉线圈机械方块 +gt.blockcasingsBA0.7.desc.0=用最好的铝箔制成! +gt.blockcasingsBA0.7.desc.1=法拉第套装稍晚到来 +gt.blockcasingsBA0.8.name=特斯拉次级绕组 +gt.blockcasingsBA0.8.desc.0=从初级绕组获取能量 +gt.blockcasingsBA0.8.desc.1=谁不想要32k的环氧树脂? + +#Multiblocks +gt.blockmachines.multimachine.em.transformer.name=有源变压器 +gt.blockmachines.multimachine.em.transformer.hint=1 - 能源仓、动力仓或超能机械方块 +gt.blockmachines.multimachine.em.transformer.desc.0=有源变压器的控制器方块 +gt.blockmachines.multimachine.em.transformer.desc.1=任意电压间的相互转换! +gt.blockmachines.multimachine.em.transformer.desc.2=只有0.004%的能量损失, HAYO! +gt.blockmachines.multimachine.em.transformer.desc.3=运行时被破坏会发生爆炸 + +gt.blockmachines.multimachine.tm.microwave.name=微波发生仪 +gt.blockmachines.multimachine.tm.microwave.hint.0=1 - 基础仓室或洁净不锈钢机械方块 +gt.blockmachines.multimachine.tm.microwave.hint.1=也像个漏斗,所以给它个输出总线吧 +gt.blockmachines.multimachine.tm.microwave.desc.0=微波发生仪的控制器方块 +gt.blockmachines.multimachine.tm.microwave.desc.1=机器启动时开启一个计时器 +gt.blockmachines.multimachine.tm.microwave.desc.2=计时器运行时, 机器中的一切都会受到伤害 +gt.blockmachines.multimachine.tm.microwave.desc.3=机器也会自动收集内部掉落物 +gt.blockmachines.multimachine.tm.microwave.desc.4=可通过参数仪进行配置 +gt.blockmachines.multimachine.tm.microwave.desc.5=(别塞只凋灵进去) +gt.blockmachines.multimachine.tm.microwave.cfgi.0=功率设置 +gt.blockmachines.multimachine.tm.microwave.cfgi.1=时间设置 +gt.blockmachines.multimachine.tm.microwave.cfgo.0=时间 +gt.blockmachines.multimachine.tm.microwave.cfgo.1=剩余时间 + +gt.blockmachines.multimachine.tm.teslaCoil.name=特斯拉电塔 +gt.blockmachines.multimachine.tm.teslaCoil.hint.0=1 - 基础仓室, 电容仓或特斯拉基座机械方块 +gt.blockmachines.multimachine.tm.teslaCoil.hint.1=2 - 钛框架 +gt.blockmachines.multimachine.tm.teslaCoil.desc.0=特斯拉电塔的控制器方块 +gt.blockmachines.multimachine.tm.teslaCoil.desc.1=用于向特斯拉线圈帽和特斯拉收发器传输电力 +gt.blockmachines.multimachine.tm.teslaCoil.desc.2=可加入氦/氮/氡等离子体增大范围 +gt.blockmachines.multimachine.tm.teslaCoil.desc.3=传输电压取决于使用的特斯拉电容等级 +gt.blockmachines.multimachine.tm.teslaCoil.desc.4=需要至少与特斯拉电容相同等级的初级特斯拉绕组 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.0=迟滞低设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.1=迟滞高设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.2=特斯拉电塔传输半径设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.3=特斯拉收发器传输半径设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.4=加强特斯拉线圈帽传输半径设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.5=输出电压设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.6=输出电流设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.7=最小扫描时间设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.8=过载设置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgi.9=闲置 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.0=特斯拉电塔传输半径显示 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.1=特斯拉收发器传输半径显示 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.2=加强特斯拉线圈帽传输半径显示 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.3=输出电压显示 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.4=输出电流显示 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.5=能量容量显示 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.6=已存储能量显示 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.7=充能进度显示 +gt.blockmachines.multimachine.tm.teslaCoil.cfgo.8=扫描时间显示 + +gt.blockmachines.multimachine.em.switch.name=QoS网络交换机 +gt.blockmachines.multimachine.em.switch.hint=1 - 基础仓室、光学接口或电子计算机机械方块 +gt.blockmachines.multimachine.em.switch.desc.0=QoS网络交换机的控制器方块 +gt.blockmachines.multimachine.em.switch.desc.1=用于路由和分发算力 +gt.blockmachines.multimachine.em.switch.desc.2=需要通过参数仪进行配置 + + +gt.blockmachines.multimachine.em.computer.name=量子计算机 +gt.blockmachines.multimachine.em.computer.hint.0=1 - 基础仓室、光学接口或电子计算机机械方块 +gt.blockmachines.multimachine.em.computer.hint.1=2 - 计算机箱或进阶电子计算机械方块 +gt.blockmachines.multimachine.em.computer.desc=你需要它来处理上面的这串数字 +gt.blockmachines.multimachine.em.computer.cfgi.0=超频比 +gt.blockmachines.multimachine.em.computer.cfgi.1=过压比 +gt.blockmachines.multimachine.em.computer.cfgo.0=当前最大热量 +gt.blockmachines.multimachine.em.computer.cfgo.1=生成算力 +gt.blockmachines.multimachine.em.computer.desc.0=量子计算机的控制器方块 +gt.blockmachines.multimachine.em.computer.desc.1=用于生成算力(以及热量) + +gt.blockmachines.multimachine.em.databank.name=数据库 +gt.blockmachines.multimachine.em.databank.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.databank.hint.1=2 - 数据访问仓、数据库主接口或电子计算机械方块 +gt.blockmachines.multimachine.em.databank.desc.0=数据库的控制器方块 +gt.blockmachines.multimachine.em.databank.desc.1=为装配线提供更多闪存 +gt.blockmachines.multimachine.em.databank.desc.2=还可使多条装配线访问同一闪存 + +gt.blockmachines.multimachine.em.junction.name=物质流枢纽 +gt.blockmachines.multimachine.em.junction.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.junction.hint.1=2 - 元物质输入/出仓或分子机械方块 +gt.blockmachines.multimachine.em.junction.desc.0=物质流枢纽的控制器方块 +gt.blockmachines.multimachine.em.junction.desc.1=用于路由和分配元物质 +gt.blockmachines.multimachine.em.junction.desc.2=需要通过参数仪进行配置 + +gt.blockmachines.multimachine.em.mattertoem.name=物质量子化仪 +gt.blockmachines.multimachine.em.mattertoem.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.mattertoem.hint.1=2 - 元物质输出仓 +gt.blockmachines.multimachine.em.mattertoem.hint.2=3 - 元物质溢流仓或分子机械方块 +gt.blockmachines.multimachine.em.mattertoem.desc.0=物质量子化仪的控制器方块 +gt.blockmachines.multimachine.em.mattertoem.desc.1=将物品转化为它们的元素形态 + +gt.blockmachines.multimachine.em.emtomatter.name=物质反量子化仪 +gt.blockmachines.multimachine.em.emtomatter.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.emtomatter.hint.1=2 - 元物质输入仓 +gt.blockmachines.multimachine.em.emtomatter.hint.2=3 - 元物质溢流仓或分子机械方块 +gt.blockmachines.multimachine.em.emtomatter.desc.0=物质反量子化仪的控制器方块 +gt.blockmachines.multimachine.em.emtomatter.desc.1=将元物质还原为常规物品形态 + +gt.blockmachines.multimachine.em.emtoessentia.name=源质反量子化仪 +gt.blockmachines.multimachine.em.emtoessentia.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.emtoessentia.hint.1=2 - 元物质输入仓 +gt.blockmachines.multimachine.em.emtoessentia.hint.2=3 - 元物质溢流仓或分子机械方块 +gt.blockmachines.multimachine.em.emtoessentia.hint.3=通用 - 某种源质的储存方块 +gt.blockmachines.multimachine.em.emtoessentia.desc.0=源质反量子化仪的控制器方块 +gt.blockmachines.multimachine.em.emtoessentia.desc.1=将元物质还原为源质形态 + +gt.blockmachines.multimachine.em.essentiatoem.name=源质量子化仪 +gt.blockmachines.multimachine.em.essentiatoem.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.essentiatoem.hint.1=2 - 元物质输出仓 +gt.blockmachines.multimachine.em.essentiatoem.hint.2=3 - 元物质溢流仓或分子机械方块 +gt.blockmachines.multimachine.em.essentiatoem.hint.3=通用 - 某种源质的储存方块 +gt.blockmachines.multimachine.em.essentiatoem.desc.0=源质量子化仪的控制器方块 +gt.blockmachines.multimachine.em.essentiatoem.desc.1=将源质转化为它们的元素形态 + +gt.blockmachines.multimachine.em.scanner.name=元物质扫描仪 +gt.blockmachines.multimachine.em.scanner.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.scanner.hint.1=2 - 元物质输入仓或分子机械方块 +gt.blockmachines.multimachine.em.scanner.hint.2=3 - 元物质输出仓或分子机械方块 +gt.blockmachines.multimachine.em.scanner.hint.3=4 - 元物质溢流仓或分子机械方块 +gt.blockmachines.multimachine.em.scanner.desc.0=元物质扫描仪的控制器方块 + +gt.blockmachines.multimachine.em.research.name=研究站 +gt.blockmachines.multimachine.em.research.hint.0=1 - 基础仓室、光学接口或电子计算机械方块 +gt.blockmachines.multimachine.em.research.hint.1=2 - 物品固定容器 +gt.blockmachines.multimachine.em.research.desc.0=研究站的控制器方块 +gt.blockmachines.multimachine.em.research.desc.1=用于扫描物品, 生成装配线配方闪存 +gt.blockmachines.multimachine.em.research.desc.2=需要为其提供算力 +gt.blockmachines.multimachine.em.research.desc.3=在完成闪存写入之前不会消耗物品 + +gt.blockmachines.multimachine.em.collider.name=物质对撞机 +gt.blockmachines.multimachine.em.collider.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.collider.hint.1=2 - 元物质输入仓或分子机械方块 +gt.blockmachines.multimachine.em.collider.hint.2=3 - 元物质输出仓或分子机械方块 +gt.blockmachines.multimachine.em.collider.hint.3=4 - 元物质溢流仓或分子机械方块 +gt.blockmachines.multimachine.em.collider.hint.4=通用 - 另一个控制器面向相反的方向 +gt.blockmachines.multimachine.em.collider.desc.0=物质对撞机的控制器方块 +gt.blockmachines.multimachine.em.collider.desc.1=需要一台镜像机器方可正常工作 +gt.blockmachines.multimachine.em.collider.desc.2=一台设为 '聚变模式', 另一台设为 '对撞模式' +gt.blockmachines.multimachine.em.collider.desc.3=将两种元物质聚变, 产生另一种元物质(以及能量) +gt.blockmachines.multimachine.em.collider.mode.0=模式:聚变 +gt.blockmachines.multimachine.em.collider.mode.1=模式:对撞 +gt.blockmachines.multimachine.em.collider.mode.2=模式:未定义 +gt.blockmachines.multimachine.em.collider.mode.3=从属于其他控制器 +gt.blockmachines.multimachine.em.collider.Structure.AdditionalCollider=需要与之镜像的另一台物质对撞机 + +gt.blockmachines.multimachine.em.infuser.name=能量注入仪 +gt.blockmachines.multimachine.em.infuser.hint=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.infuser.desc.0=能量注入仪的控制器方块 +gt.blockmachines.multimachine.em.infuser.desc.1=可用于为物品充电(无损) +gt.blockmachines.multimachine.em.infuser.desc.2=提供UU物质可修复物品 +gt.blockmachines.multimachine.em.infuser.Structure.HighPowerCasing=第1、5层 +gt.blockmachines.multimachine.em.infuser.Structure.MolecularCoil=第2、4层 +gt.blockmachines.multimachine.em.infuser.Structure.MolecularCasing=第3层(中空) + + +gt.blockmachines.multimachine.em.processing.name=量子加工机 +gt.blockmachines.multimachine.em.processing.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.processing.hint.1=2 - 元物质输入/出仓或分子机械方块 +gt.blockmachines.multimachine.em.processing.desc.0=量子加工机的控制器方块 + +gt.blockmachines.multimachine.em.crafter.name=物质组装机 +gt.blockmachines.multimachine.em.crafter.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.crafter.hint.1=2 - 元物质输入/出仓或分子机械方块 +gt.blockmachines.multimachine.em.crafter.desc.0=物质组装机的控制器方块 + +gt.blockmachines.multimachine.em.stabilizer.name=元物质稳定器 +gt.blockmachines.multimachine.em.stabilizer.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.stabilizer.hint.1=2 - 元物质输入/出仓或分子机械方块 +gt.blockmachines.multimachine.em.stabilizer.desc.0=元物质稳定器的控制器方块 + +gt.blockmachines.multimachine.em.wormhole.name=虫洞 +gt.blockmachines.multimachine.em.wormhole.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.wormhole.hint.1=2 - 元物质输入/出仓或分子机械方块 +gt.blockmachines.multimachine.em.wormhole.desc.0=虫洞的控制器方块 + +gt.blockmachines.multimachine.em.decay.name=衰变发电机 +gt.blockmachines.multimachine.em.decay.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.decay.hint.1=2 - 元物质输入/出仓或分子机械方块 +gt.blockmachines.multimachine.em.decay.desc.0=衰变发电机的控制器方块 +gt.blockmachines.multimachine.em.decay.desc.1=通过元物质衰变产生能量 + +gt.blockmachines.multimachine.em.decay.conf=分流器 + +gt.blockmachines.multimachine.em.annihilation.name=湮灭发电机 +gt.blockmachines.multimachine.em.annihilation.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.annihilation.hint.1=2 - 元物质输入/出仓或分子机械方块 +gt.blockmachines.multimachine.em.annihilation.desc.0=湮灭发电机的控制器方块 + +gt.blockmachines.multimachine.em.blackholegenerator.name=黑洞发生器 +gt.blockmachines.multimachine.em.blackholegenerator.hint.0=1 - 基础仓室或超能机械方块 +gt.blockmachines.multimachine.em.blackholegenerator.hint.1=2 - 元物质输入/出仓或分子机械方块 +gt.blockmachines.multimachine.em.blackholegenerator.desc.0=黑洞发生器的控制器方块 +gt.blockmachines.multimachine.em.blackholegenerator.desc.1=使用一颗黑洞产生能量 + +#Pipes +gt.blockmachines.pipe.elementalmatter.name=量子隧道 +gt.blockmachines.pipe.elementalmatter.desc.0=量子隧道设备. +gt.blockmachines.pipe.elementalmatter.desc.1=不是传送门!!! +gt.blockmachines.pipe.elementalmatter.desc.2=启用前必须涂色 +gt.blockmachines.pipe.elementalmatter.desc.3=请勿交叉、分流或转弯 + +gt.blockmachines.pipe.energystream.name=激光真空管 +gt.blockmachines.pipe.energystream.desc.0=激光隧道设备. +gt.blockmachines.pipe.energystream.desc.1=要有光!!! +gt.blockmachines.pipe.energystream.desc.2=启用前必须涂色 +gt.blockmachines.pipe.energystream.desc.3=请勿分流或转弯 + +gt.blockmachines.pipe.datastream.name=光缆 +gt.blockmachines.pipe.datastream.desc.0=高级数据传输设备 +gt.blockmachines.pipe.datastream.desc.1=请勿直视激光! +gt.blockmachines.pipe.datastream.desc.2=启用前必须涂色 +gt.blockmachines.pipe.datastream.desc.3=请勿交叉或分流 + +#Single blocks +gt.blockmachines.machine.tt.ownerdetector.name=所有者检测机 +gt.blockmachines.machine.tt.ownerdetector.desc.0=使用螺丝刀以变更模式 +gt.blockmachines.machine.tt.ownerdetector.desc.1=寻找他的PaPa +gt.blockmachines.machine.tt.ownerdetector.desc.2=高兴时发出信号 + +gt.blockmachines.machine.tt.datareader.name=数据读取机 +gt.blockmachines.machine.tt.datareader.desc.0=读取闪存和数据球 +gt.blockmachines.machine.tt.datareader.desc.1=给它通电,然后 +gt.blockmachines.machine.tt.datareader.desc.2=将数据存储物放进去 + +gt.blockmachines.machine.tt.buck.05.name=IV降压变压器 +gt.blockmachines.machine.tt.buck.06.name=LuV降压变压器 +gt.blockmachines.machine.tt.buck.07.name=ZPM降压变压器 +gt.blockmachines.machine.tt.buck.08.name=UV降压变压器 +gt.blockmachines.machine.tt.buck.09.name=UHV降压变压器 +gt.blockmachines.machine.tt.buck.10.name=UEV降压变压器 +gt.blockmachines.machine.tt.buck.11.name=UIV降压变压器 +gt.blockmachines.machine.tt.buck.12.name=UMV降压变压器 +gt.blockmachines.machine.tt.buck.13.name=UXV降压变压器 +gt.blockmachines.machine.tt.buck.desc.0=电压调节器 +gt.blockmachines.machine.tt.buck.desc.1=可调降压变压器 +gt.blockmachines.machine.tt.buck.desc.2=开关电源... + +gt.blockmachines.machine.tt.tesla.01.name=基础特斯拉收发器 +gt.blockmachines.machine.tt.tesla.02.name=进阶特斯拉收发器 +gt.blockmachines.machine.tt.tesla.03.name=霄龙特斯拉收发器 +gt.blockmachines.machine.tt.tesla.04.name=极限特斯拉收发器 +gt.blockmachines.machine.tt.tesla.05.name=疯狂特斯拉收发器 +gt.blockmachines.machine.tt.tesla.desc.0=你选择的特斯拉I/O机器 +gt.blockmachines.machine.tt.tesla.desc.1=富人的闪电洪炉 + +#Debug blocks +gt.blockmachines.debug.tt.pollutor.name=Debug污染生成机 +gt.blockmachines.debug.tt.pollutor.desc.0=该死的genny破产了! +gt.blockmachines.debug.tt.pollutor.desc.1=无限的生产者/消费者 +gt.blockmachines.debug.tt.pollutor.desc.2=因为我需要一个? +gt.blockmachines.debug.tt.data.name=Debug数据仓 +gt.blockmachines.debug.tt.data.desc.0=量子数据输出 +gt.blockmachines.debug.tt.data.desc.1=高速光纤接口 +gt.blockmachines.debug.tt.data.desc.2=启用前必须涂色 +gt.blockmachines.debug.tt.maintenance.name=Debug维护仓 +gt.blockmachines.debug.tt.maintenance.desc.0=自动维护多方块机器 +gt.blockmachines.debug.tt.maintenance.desc.1=它能修好一切,除了自己. +gt.blockmachines.debug.tt.maintenance.desc.2=为人民服务! +gt.blockmachines.debug.tt.genny.name=Debug发电机 +gt.blockmachines.debug.tt.genny.desc.0=凭空而生的能量 +gt.blockmachines.debug.tt.genny.desc.1=一个无限的能源生产/消耗设备 +gt.blockmachines.debug.tt.genny.desc.2=我只是想要一个... +gt.blockmachines.debug.tt.genny.desc.3=使用螺丝刀将其切换为激光模式. +gt.blockmachines.debug.tt.writer.name=Debug结构打印机 +gt.blockmachines.debug.tt.writer.desc.0=扫描周围的方块 +gt.blockmachines.debug.tt.writer.desc.1=打印多方块非实体的结构样式编码 +gt.blockmachines.debug.tt.writer.desc.2=ABC轴沿机器正面确定 + +#Keywords and phrases +#Example: ID:3 +tt.keyword.ID=ID +#Example: 32EU at 1A +tt.keyword.at= +# Structure is too complex +tt.keyword.Structure.StructureTooComplex=结构太复杂了! +# Any X +tt.keyword.Structure.AnyComputerCasing=任意电子计算机械方块 +tt.keyword.Structure.AnyHighPowerCasing=任意超能机械方块 +tt.keyword.Structure.AnyHighPowerCasing1D=任意提示方块:1号的超能机械方块 +tt.keyword.Structure.AnyHighPowerCasing2D=任意提示方块:2号的超能机械方块 +tt.keyword.Structure.AnyHighPowerCasingFront=任意正面超能机械方块 +tt.keyword.Structure.AnyTeslaBaseCasingOuter=任意外侧特斯拉基座机械方块 +tt.keyword.Structure.AnyComputerCasingFirstOrLastSlice=任意最前或最后一片电子计算机械方块 +tt.keyword.Structure.AnyComputerCasingBackMain=任意主体背面电子计算机械方块 +tt.keyword.Structure.AnyAdvComputerCasingExceptOuter=除外部的任意进阶电子计算机械方块 +tt.keyword.Structure.AnyMolecularCasing=任意分子机械方块 +tt.keyword.Structure.AnyMolecularCasing2D=任意提示方块:2号分子机械方块 +tt.keyword.Structure.AnyMolecularCasing3D=任意提示方块:3号分子机械方块 +tt.keyword.Structure.AnyMolecularCasing4D=任意提示方块:4号分子机械方块 +tt.keyword.Structure.AnyOuterMolecularCasing3rd=任意第3片外侧分子机械方块 +tt.keyword.Structure.AnyOuterMolecularCasing4th=任意第4片外侧分子机械方块 +tt.keyword.Structure.AnyOuterMolecularCasing3rd4th=任意第3/4片外侧分子机械方块 +tt.keyword.Structure.AnyOuterCasingOnBottom=任意底层外侧机械方块 +# Optional +tt.keyword.Structure.Optional=(可选) +# Placement specification +tt.keyword.Structure.FrontCenter=正面中央 +tt.keyword.Structure.BackCenter=背面中央 +tt.keyword.Structure.SideCenter=侧面中央 +tt.keyword.Structure.FrontCenter3rd=正面第三层中央 +tt.keyword.Structure.CenterPillar=正面立柱中央 +tt.keyword.Structure.Center=中央 +# Additional structure components +tt.keyword.Structure.DataAccessHatch=数据访问仓 +tt.keyword.Structure.ElementalOutput=元物质输出仓 +tt.keyword.Structure.Elemental=元物质仓 +tt.keyword.Structure.ElementalOverflow=元物质溢流仓 +tt.keyword.Structure.ElementalInput=元物质输入仓 +tt.keyword.Structure.EssentiaStorage=源质存储装置 +tt.keyword.Structure.DataConnector=光学接口 +tt.keyword.Structure.SuperconductingCoilBlock=超导线圈方块 +tt.keyword.Structure.StainlessSteelCasing=不锈钢机械方块 + + +tt.keyphrase.Hint_Details=提示细节 + +#debug boom +tt.keyword.BOOM=BOOM! +tt.keyword.Destination=目标 +tt.keyword.Weight=质量 +tt.keyword.Source=来源 +tt.keyword.Progress=过程 +tt.keyword.Computation=算力 +#Problemns as in maintanance issues +tt.keyword.Problems=故障 +tt.keyword.Efficiency=效率 +#Button that allows to pass power to other machines +tt.keyword.PowerPass=导能 +#Button that vents EM +tt.keyword.SafeVoid=安全销毁 +tt.keyword.Parametrizer=参数仪 +tt.keyword.Value=值 +tt.keyword.Input=输入 +tt.keyword.input=输入 +tt.keyword.output=输出 +tt.keyword.Status=状态 +tt.keyword.Content=内含 +tt.keyword.PacketHistory=封包记录 + +#Used when 0 Elemental Matter Stacks +tt.keyphrase.No_Stacks=空 +tt.keyphrase.Contains_EM=存储元物质 +tt.keyphrase.Contained_mass=存储物质 +tt.keyphrase.Mass_Disposal_speed=清理速度 +tt.keyphrase.Muffler_BOOM=溢流BOOM! +tt.keyphrase.Energy_Hatches=能源仓 +tt.keyphrase.Probably_uses=可能用到 +tt.keyphrase.Probably_makes=可能制作 +tt.keyphrase.Tier_Rating=等级 +tt.keyphrase.Amp_Rating=电流 +tt.keyphrase.Computation_Available=可用算力 +tt.keyphrase.Computation_Remaining=剩余算力 +tt.keyphrase.Content_Stack_Count=内含:堆数 +tt.keyphrase.Base_computation=基础算力 +tt.keyphrase.After_overclocking=超频后 +tt.keyphrase.Heat_Accumulated=热量累积 +tt.keyphrase.Running_interdimensional_scan=多维度扫描进行中 +tt.keyphrase.Running_local_dimension_scan=本维度扫描进行中 +tt.keyphrase.Overdrive_disengaged=过载未占用 +tt.keyphrase.Overdrive_engaged=过载已占用 +tt.keyphrase.Hysteresis_high_set_to=滞后高通设置为 +tt.keyphrase.Hysteresis_low_set_to=滞后低通设置为 +tt.keyphrase.Tesla_radius_set_to=特斯拉半径设置为 +tt.keyphrase.Sending_power=发送功率 +tt.keyphrase.Receiving_power=接收功率 +tt.keyphrase.Stored_energy=已存储能量 +tt.keyphrase.Stored_EU=已存储EU +tt.keyphrase.Average_IO=平均I/O +tt.keyphrase.Average_IO_(max)=电压I/O(最大) +tt.keyphrase.Average_IO_max=电压I/O 最大 +tt.keyphrase.Amperage_IO_(max)=电流I/O(最大) +tt.keyphrase.Side_capabilities=辅助功能 +tt.keyphrase.Ass_line_recipe=装配线合成表 + +#OpenTurrets compatibility +tile.turretHeadEM.name=元物质炮塔 +tile.turretBaseEM.name=元物质炮塔基座 + +#EM scan result +tt.keyword.scan.depth=深度 +tt.keyword.scan.class=种类 +tt.keyword.scan.name=名称 +tt.keyword.scan.symbol=符号 + +tt.keyword.scan.mass=质量 +tt.keyword.scan.count=粒子数 +tt.keyword.scan.amount=物质的量 +tt.keyword.scan.energy=能量 +tt.keyword.scan.energyLevel=能级 +tt.keyword.scan.charge=电荷 +tt.keyword.scan.life_mult=寿命系数 +tt.keyword.scan.half_life=半衰期 +tt.keyword.scan.life_time=寿命 +tt.keyword.scan.age=元物质衰变期 +tt.keyphrase.scan.at_current_energy_level=在当前能级 +tt.keyword.scan.color=色荷 +tt.keyword.scan.colorless=无色荷 +tt.keyword.scan.colored=有色荷 + +tt.keyword.short.mass=M +tt.keyword.short.count=Qty +tt.keyword.short.amount=Qty +tt.keyword.short.energy=E +tt.keyword.short.energyLevel=EL +tt.keyword.short.charge=C +tt.keyword.short.time=T + +tt.keyword.unit.mass=eV/c² +tt.keyword.unit.massFlux=eV/c²s +tt.keyword.unit.count= +tt.keyword.unit.mol=mol +tt.keyword.unit.itemMols=item(s) +tt.keyword.unit.mbMols=mb +tt.keyword.unit.energy=eV +tt.keyword.unit.charge=e +tt.keyword.unit.time=s +tt.keyword.unit.tick=t +#that the thing wont decay +tt.keyword.stable=不衰变 + +#EM types +tt.keyword.Primitive=原始 +tt.keyword.Element=元素 +tt.keyword.Atom=原子 +tt.keyword.Isotope=同位素 +tt.keyword.Boson=玻色子 +tt.keyword.Fermion=费米子 +tt.keyword.GaugeBoson=规范玻色子 +tt.keyword.Meson=介子 +tt.keyword.Baryon=重子 +tt.keyword.Tetraquark=四夸克粒子 +tt.keyword.Pentaquark=五夸克粒子 +tt.keyword.Hexaquark=六夸克粒子 +tt.keyword.Hadron=强子 +tt.keyword.Neutrino=中微子 +tt.keyword.Quark=夸克 +tt.keyword.ScalarBoson=标量玻色子 +#em definitions +tt.keyword.PrimitiveNBTERROR=NBT错误 +tt.keyword.PrimitiveNULLPOINTER=空指针 +tt.keyword.PrimitiveSpace=空间 +tt.keyword.PrimitivePresence=存在 +tt.keyword.PrimitiveMass=物质 +tt.keyword.PrimitiveDarkMass=暗物质 +tt.keyword.PrimitiveEnergy=能量 +tt.keyword.PrimitiveDarkEnergy=暗能量 +tt.keyword.PrimitiveMagic=魔法 +tt.keyword.PrimitiveAntimagic=反魔法 +tt.keyword.Gluon=胶子 +tt.keyword.Photon=光子 +tt.keyword.Weak0=Z玻色子 +tt.keyword.WeakPlus=W+玻色子 +tt.keyword.WeakMinus=W-玻色子 +tt.keyword.Proton=质子 +tt.keyword.AntiProton=反质子 +tt.keyword.Neutron=中子 +tt.keyword.AntiNeutron=反中子 +tt.keyword.Lepton=轻子 +tt.keyword.Electron=电子 +tt.keyword.Muon=μ子 +tt.keyword.Tauon=τ子 +tt.keyword.Positron=正电子 +tt.keyword.Antimuon=反μ子 +tt.keyword.Antitauon=反τ子 +tt.keyword.ElectronNeutrino=电子中微子 +tt.keyword.MuonNeutrino=μ子中微子 +tt.keyword.TauonNeutrino=τ子中微子 +tt.keyword.PositronNeutrino=正电子中微子 +tt.keyword.AntimuonNeutrino=反μ子中微子 +tt.keyword.AntitauonNeutrino=反τ子中微子 +tt.keyword.QuarkUp=上夸克 +tt.keyword.QuarkCharm=粲夸克 +tt.keyword.QuarkTop=顶夸克 +tt.keyword.QuarkDown=下夸克 +tt.keyword.QuarkStrange=奇夸克 +tt.keyword.QuarkBottom=底夸克 +tt.keyword.QuarkAntiUp=反上夸克 +tt.keyword.QuarkAntiCharm=反粲夸克 +tt.keyword.QuarkAntiTop=反顶夸克 +tt.keyword.QuarkAntiDown=反下夸克 +tt.keyword.QuarkAntiStrange=反奇夸克 +tt.keyword.QuarkAntiBottom=反底夸克 +tt.keyword.Higgs=希格斯玻色子 +#These are Thaumcraft aspects +tt.keyword.Air=风 +tt.keyword.Earth=地 +tt.keyword.Fire=火 +tt.keyword.Water=水 +tt.keyword.Order=秩序 +tt.keyword.Entropy=混沌 +tt.keyword.Chaos=Chaos + +tt.keyword.Primal=元始 +tt.keyword.Aspect=要素 + +tt.element.Neutronium=中子 +tt.element.Hydrogen=氢 +tt.element.Helium=氦 +tt.element.Lithium=锂 +tt.element.Beryllium=铍 +tt.element.Boron=硼 +tt.element.Carbon=碳 +tt.element.Nitrogen=氮 +tt.element.Oxygen=氧 +tt.element.Fluorine=氟 +tt.element.Neon=氖 +tt.element.Sodium=钠 +tt.element.Magnesium=镁 +tt.element.Aluminium=铝 +tt.element.Silicon=硅 +tt.element.Phosphorus=磷 +tt.element.Sulfur=硫 +tt.element.Chlorine=氯 +tt.element.Argon=氩 +tt.element.Potassium=钾 +tt.element.Calcium=钙 +tt.element.Scandium=钪 +tt.element.Titanium=钛 +tt.element.Vanadium=钒 +tt.element.Chromium=铬 +tt.element.Manganese=锰 +tt.element.Iron=铁 +tt.element.Cobalt=钴 +tt.element.Nickel=镍 +tt.element.Copper=铜 +tt.element.Zinc=锌 +tt.element.Gallium=镓 +tt.element.Germanium=锗 +tt.element.Arsenic=砷 +tt.element.Selenium=硒 +tt.element.Bromine=溴 +tt.element.Krypton=氪 +tt.element.Rubidium=铷 +tt.element.Strontium=锶 +tt.element.Yttrium=钇 +tt.element.Zirconium=锆 +tt.element.Niobium=铌 +tt.element.Molybdenum=钼 +tt.element.Technetium=锝 +tt.element.Ruthenium=钌 +tt.element.Rhodium=铑 +tt.element.Palladium=钯 +tt.element.Silver=银 +tt.element.Cadmium=镉 +tt.element.Indium=铟 +tt.element.Tin=锡 +tt.element.Antimony=锑 +tt.element.Tellurium=碲 +tt.element.Iodine=碘 +tt.element.Xenon=氙 +tt.element.Caesium=铯 +tt.element.Barium=钡 +tt.element.Lanthanum=镧 +tt.element.Cerium=铈 +tt.element.Praseodymium=镨 +tt.element.Neodymium=钕 +tt.element.Promethium=钷 +tt.element.Samarium=钐 +tt.element.Europium=铕 +tt.element.Gadolinium=钆 +tt.element.Terbium=铽 +tt.element.Dysprosium=镝 +tt.element.Holmium=钬 +tt.element.Erbium=铒 +tt.element.Thulium=铥 +tt.element.Ytterbium=镱 +tt.element.Lutetium=镥 +tt.element.Hafnium=铪 +tt.element.Tantalum=钽 +tt.element.Tungsten=钨 +tt.element.Rhenium=铼 +tt.element.Osmium=锇 +tt.element.Iridium=铱 +tt.element.Platinum=铂 +tt.element.Gold=金 +tt.element.Mercury=汞 +tt.element.Thallium=铊 +tt.element.Lead=铅 +tt.element.Bismuth=铋 +tt.element.Polonium=钋 +tt.element.Astatine=砹 +tt.element.Radon=氡 +tt.element.Francium=钫 +tt.element.Radium=镭 +tt.element.Actinium=锕 +tt.element.Thorium=钍 +tt.element.Protactinium=镤 +tt.element.Uranium=铀 +tt.element.Neptunium=镎 +tt.element.Plutonium=钚 +tt.element.Americium=镅 +tt.element.Curium=锔 +tt.element.Berkelium=锫 +tt.element.Californium=锎 +tt.element.Einsteinium=锿 +tt.element.Fermium=镄 +tt.element.Mendelevium=钔 +tt.element.Nobelium=锘 +tt.element.Lawrencium=铹 +tt.element.Rutherfordium= +tt.element.Dubnium= +tt.element.Seaborgium= +tt.element.Bohrium= +tt.element.Hassium= +tt.element.Meitnerium=鿏 +tt.element.Darmstadtium= +tt.element.Roentgenium= +tt.element.Copernicium=鿔 +tt.element.Nihonium=鿭 +tt.element.Flerovium= +tt.element.Moscovium=镆 +tt.element.Livermorium= +tt.element.Tennessine=鿬 +tt.element.Oganesson=鿫 + +tt.element.AntiNeutronium=反中子 +tt.element.AntiHydrogen=反氢 +tt.element.AntiHelium=反氦 +tt.element.AntiLithium=反锂 +tt.element.AntiBeryllium=反铍 +tt.element.AntiBoron=反硼 +tt.element.AntiCarbon=反碳 +tt.element.AntiNitrogen=反氮 +tt.element.AntiOxygen=反氧 +tt.element.AntiFluorine=反氟 +tt.element.AntiNeon=反氖 +tt.element.AntiSodium=反钠 +tt.element.AntiMagnesium=反镁 +tt.element.AntiAluminium=反铝 +tt.element.AntiSilicon=反硅 +tt.element.AntiPhosphorus=反磷 +tt.element.AntiSulfur=反硫 +tt.element.AntiChlorine=反氯 +tt.element.AntiArgon=反氩 +tt.element.AntiPotassium=反钾 +tt.element.AntiCalcium=反钙 +tt.element.AntiScandium=反钪 +tt.element.AntiTitanium=反钛 +tt.element.AntiVanadium=反钒 +tt.element.AntiChromium=反铬 +tt.element.AntiManganese=反锰 +tt.element.AntiIron=反铁 +tt.element.AntiCobalt=反钴 +tt.element.AntiNickel=反镍 +tt.element.AntiCopper=反铜 +tt.element.AntiZinc=反锌 +tt.element.AntiGallium=反镓 +tt.element.AntiGermanium=反锗 +tt.element.AntiArsenic=反砷 +tt.element.AntiSelenium=反硒 +tt.element.AntiBromine=反溴 +tt.element.AntiKrypton=反氪 +tt.element.AntiRubidium=反铷 +tt.element.AntiStrontium=反锶 +tt.element.AntiYttrium=反钇 +tt.element.AntiZirconium=反锆 +tt.element.AntiNiobium=反铌 +tt.element.AntiMolybdenum=反钼 +tt.element.AntiTechnetium=反锝 +tt.element.AntiRuthenium=反钌 +tt.element.AntiRhodium=反铑 +tt.element.AntiPalladium=反钯 +tt.element.AntiSilver=反银 +tt.element.AntiCadmium=反镉 +tt.element.AntiIndium=反铟 +tt.element.AntiTin=反锡 +tt.element.AntiAntimony=反锑 +tt.element.AntiTellurium=反碲 +tt.element.AntiIodine=反碘 +tt.element.AntiXenon=反氙 +tt.element.AntiCaesium=反铯 +tt.element.AntiBarium=反钡 +tt.element.AntiLanthanum=反镧 +tt.element.AntiCerium=反铈 +tt.element.AntiPraseodymium=反镨 +tt.element.AntiNeodymium=反钕 +tt.element.AntiPromethium=反钷 +tt.element.AntiSamarium=反钐 +tt.element.AntiEuropium=反铕 +tt.element.AntiGadolinium=反钆 +tt.element.AntiTerbium=反铽 +tt.element.AntiDysprosium=反镝 +tt.element.AntiHolmium=反钬 +tt.element.AntiErbium=反铒 +tt.element.AntiThulium=反铥 +tt.element.AntiYtterbium=反镱 +tt.element.AntiLutetium=反镥 +tt.element.AntiHafnium=反铪 +tt.element.AntiTantalum=反钽 +tt.element.AntiTungsten=反钨 +tt.element.AntiRhenium=反铼 +tt.element.AntiOsmium=反锇 +tt.element.AntiIridium=反铱 +tt.element.AntiPlatinum=反铂 +tt.element.AntiGold=反金 +tt.element.AntiMercury=反汞 +tt.element.AntiThallium=反铊 +tt.element.AntiLead=反铅 +tt.element.AntiBismuth=反铋 +tt.element.AntiPolonium=反钋 +tt.element.AntiAstatine=反砹 +tt.element.AntiRadon=反氡 +tt.element.AntiFrancium=反钫 +tt.element.AntiRadium=反镭 +tt.element.AntiActinium=反锕 +tt.element.AntiThorium=反钍 +tt.element.AntiProtactinium=反镤 +tt.element.AntiUranium=反铀 +tt.element.AntiNeptunium=反镎 +tt.element.AntiPlutonium=反钚 +tt.element.AntiAmericium=反镅 +tt.element.AntiCurium=反锔 +tt.element.AntiBerkelium=反锫 +tt.element.AntiCalifornium=反锎 +tt.element.AntiEinsteinium=反锿 +tt.element.AntiFermium=反镄 +tt.element.AntiMendelevium=反钔 +tt.element.AntiNobelium=反锘 +tt.element.AntiLawrencium=反铹 +tt.element.AntiRutherfordium=反 +tt.element.AntiDubnium=反 +tt.element.AntiSeaborgium=反 +tt.element.AntiBohrium=反 +tt.element.AntiHassium=反 +tt.element.AntiMeitnerium=反鿏 +tt.element.AntiDarmstadtium=反 +tt.element.AntiRoentgenium=反 +tt.element.AntiCopernicium=反鿔 +tt.element.AntiNihonium=反鿭 +tt.element.AntiFlerovium=反 +tt.element.AntiMoscovium=反镆 +tt.element.AntiLivermorium=反 +tt.element.AntiTennessine=反鿬 +tt.element.AntiOganesson=反鿫 + +tt.IUPAC.n=0 +tt.IUPAC.u=1 +tt.IUPAC.b=2 +tt.IUPAC.t=3 +tt.IUPAC.q=4 +tt.IUPAC.p=5 +tt.IUPAC.h=6 +tt.IUPAC.s=7 +tt.IUPAC.o=8 +tt.IUPAC.e=9 +tt.IUPAC.N=〇 +tt.IUPAC.U=一 +tt.IUPAC.B=二 +tt.IUPAC.T=三 +tt.IUPAC.Q=四 +tt.IUPAC.P=五 +tt.IUPAC.H=六 +tt.IUPAC.S=七 +tt.IUPAC.O=八 +tt.IUPAC.E=九 +tt.IUPAC.ium=元素 +tt.IUPAC.Anti=反 +tt.keyword.Weird=* + +tt.chat.debug.generator=激光模式:%s
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/tectech/models/Space.obj b/tectech/src/main/resources/assets/tectech/models/Space.obj new file mode 100644 index 0000000000..083beee1f6 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/models/Space.obj @@ -0,0 +1,8442 @@ +# Blender 3.4.1 +# www.blender.org +mtllib Space.mtl +o Sphere +v 0.000000 61.528759 -41.112186 +v 0.000000 41.112209 -61.528744 +v 0.000000 14.436695 -72.578110 +v 0.000000 0.000012 -74.000000 +v 0.000000 -14.436672 -72.578110 +v 0.000000 -41.112186 -61.528759 +v 2.816457 72.578110 -14.159274 +v 5.524680 68.367088 -27.774431 +v 8.020593 61.528759 -40.322227 +v 10.208277 52.325909 -51.320465 +v 12.003664 41.112209 -60.346481 +v 13.337756 28.318586 -67.053421 +v 14.159286 14.436695 -71.183540 +v 14.436684 0.000012 -72.578110 +v 14.159286 -14.436672 -71.183540 +v 13.337756 -28.318563 -67.053436 +v 12.003664 -41.112186 -60.346497 +v 10.208277 -52.325893 -51.320480 +v 8.020593 -61.528744 -40.322250 +v 5.524680 -68.367073 -27.774454 +v 2.816457 -72.578110 -14.159297 +v 5.524679 72.578110 -13.337745 +v 10.837049 68.367088 -26.162941 +v 15.732958 61.528759 -37.982700 +v 20.024256 52.325909 -48.342819 +v 23.546032 41.112206 -56.845139 +v 26.162949 28.318584 -63.162945 +v 27.774441 14.436694 -67.053429 +v 28.318573 0.000011 -68.367081 +v 27.774441 -14.436673 -67.053429 +v 26.162949 -28.318565 -63.162952 +v 23.546032 -41.112190 -56.845154 +v 20.024256 -52.325893 -48.342834 +v 15.732958 -61.528744 -37.982723 +v 10.837049 -68.367073 -26.162964 +v 5.524679 -72.578110 -13.337768 +v 8.020591 72.578110 -12.003651 +v 15.732958 68.367088 -23.546022 +v 22.840712 61.528755 -34.183525 +v 29.070713 52.325909 -43.507389 +v 34.183537 41.112206 -51.159267 +v 37.982712 28.318584 -56.845146 +v 40.322239 14.436693 -60.346485 +v 41.112198 0.000010 -61.528740 +v 40.322239 -14.436674 -60.346493 +v 37.982712 -28.318565 -56.845154 +v 34.183537 -41.112190 -51.159283 +v 29.070713 -52.325893 -43.507404 +v 22.840712 -61.528748 -34.183548 +v 15.732958 -68.367073 -23.546045 +v 8.020591 -72.578110 -12.003674 +v 10.208276 72.578110 -10.208263 +v 20.024256 68.367081 -20.024242 +v 29.070711 61.528755 -29.070698 +v 37.000000 52.325909 -36.999992 +v 43.507389 41.112206 -43.507378 +v 48.342823 28.318583 -48.342823 +v 51.320473 14.436692 -51.320465 +v 52.325901 0.000009 -52.325890 +v 51.320473 -14.436675 -51.320473 +v 48.342823 -28.318567 -48.342831 +v 43.507389 -41.112190 -43.507393 +v 37.000000 -52.325893 -37.000008 +v 29.070711 -61.528748 -29.070717 +v 20.024256 -68.367081 -20.024265 +v 10.208276 -72.578110 -10.208286 +v 12.003662 72.578110 -8.020578 +v 23.546034 68.367081 -15.732944 +v 34.183540 61.528755 -22.840698 +v 43.507397 52.325905 -29.070705 +v 51.159283 41.112202 -34.183525 +v 56.845146 28.318581 -37.982716 +v 60.346489 14.436690 -40.322227 +v 61.528748 0.000007 -41.112179 +v 60.346489 -14.436677 -40.322235 +v 56.845146 -28.318569 -37.982723 +v 51.159283 -41.112194 -34.183540 +v 43.507397 -52.325897 -29.070721 +v 34.183540 -61.528748 -22.840717 +v 23.546034 -68.367081 -15.732966 +v 12.003662 -72.578110 -8.020601 +v 0.000000 74.000000 0.000012 +v 13.337753 72.578110 -5.524666 +v 26.162949 68.367081 -10.837036 +v 37.982712 61.528755 -15.732942 +v 48.342827 52.325905 -20.024248 +v 56.845146 41.112202 -23.546015 +v 63.162945 28.318579 -26.162949 +v 67.053421 14.436688 -27.774429 +v 68.367073 0.000005 -28.318558 +v 67.053421 -14.436679 -27.774433 +v 63.162945 -28.318571 -26.162956 +v 56.845146 -41.112194 -23.546030 +v 48.342827 -52.325897 -20.024263 +v 37.982712 -61.528748 -15.732963 +v 26.162949 -68.367081 -10.837059 +v 13.337753 -72.578110 -5.524690 +v 14.159284 72.578110 -2.816444 +v 27.774437 68.367081 -5.524667 +v 40.322235 61.528751 -8.020576 +v 51.320473 52.325901 -10.208270 +v 60.346481 41.112202 -12.003650 +v 67.053421 28.318577 -13.337754 +v 71.183533 14.436686 -14.159277 +v 72.578094 0.000002 -14.436669 +v 71.183533 -14.436682 -14.159281 +v 67.053421 -28.318573 -13.337764 +v 60.346481 -41.112194 -12.003663 +v 51.320473 -52.325901 -10.208287 +v 40.322235 -61.528751 -8.020597 +v 27.774437 -68.367081 -5.524689 +v 14.159284 -72.578110 -2.816468 +v 14.436680 72.578110 0.000013 +v 28.318571 68.367081 0.000013 +v 41.112190 61.528751 0.000014 +v 52.325897 52.325901 0.000008 +v 61.528736 41.112198 0.000014 +v 68.367081 28.318575 0.000002 +v 72.578102 14.436684 0.000009 +v 73.999977 -0.000000 0.000012 +v 72.578102 -14.436684 0.000005 +v 68.367081 -28.318575 -0.000008 +v 61.528736 -41.112198 0.000000 +v 52.325897 -52.325901 -0.000010 +v 41.112190 -61.528751 -0.000006 +v 28.318571 -68.367081 -0.000009 +v 14.436680 -72.578110 -0.000011 +v 14.159283 72.578110 2.816469 +v 27.774437 68.367081 5.524692 +v 40.322231 61.528751 8.020604 +v 51.320469 52.325901 10.208283 +v 60.346478 41.112194 12.003675 +v 67.053421 28.318573 13.337757 +v 71.183525 14.436682 14.159293 +v 72.578079 -0.000002 14.436691 +v 71.183525 -14.436686 14.159289 +v 67.053421 -28.318577 13.337748 +v 60.346478 -41.112202 12.003661 +v 51.320469 -52.325901 10.208266 +v 40.322231 -61.528751 8.020583 +v 27.774437 -68.367081 5.524670 +v 14.159283 -72.578110 2.816445 +v 13.337751 72.578110 5.524691 +v 26.162949 68.367081 10.837060 +v 37.982704 61.528748 15.732968 +v 48.342823 52.325897 20.024260 +v 56.845135 41.112194 23.546041 +v 63.162945 28.318571 26.162949 +v 67.053413 14.436679 27.774445 +v 68.367050 -0.000005 28.318575 +v 67.053413 -14.436688 27.774441 +v 63.162945 -28.318579 26.162941 +v 56.845135 -41.112202 23.546026 +v 48.342823 -52.325905 20.024244 +v 37.982704 -61.528755 15.732947 +v 26.162949 -68.367081 10.837037 +v 13.337751 -72.578110 5.524667 +v 12.003658 72.578110 8.020600 +v 23.546030 68.367081 15.732967 +v 34.183529 61.528748 22.840719 +v 43.507389 52.325897 29.070717 +v 51.159267 41.112194 34.183544 +v 56.845146 28.318569 37.982712 +v 60.346478 14.436677 40.322239 +v 61.528713 -0.000007 41.112194 +v 60.346478 -14.436690 40.322231 +v 56.845146 -28.318581 37.982704 +v 51.159267 -41.112202 34.183529 +v 43.507389 -52.325905 29.070702 +v 34.183529 -61.528755 22.840700 +v 23.546030 -68.367081 15.732944 +v 12.003658 -72.578110 8.020577 +v 10.208272 72.578110 10.208284 +v 20.024250 68.367081 20.024265 +v 29.070698 61.528748 29.070719 +v 36.999996 52.325893 37.000004 +v 43.507378 41.112190 43.507393 +v 48.342823 28.318567 48.342823 +v 51.320457 14.436675 51.320473 +v 52.325863 -0.000009 52.325893 +v 51.320457 -14.436692 51.320465 +v 48.342823 -28.318583 48.342815 +v 43.507378 -41.112206 43.507378 +v 36.999996 -52.325909 36.999989 +v 29.070698 -61.528755 29.070700 +v 20.024250 -68.367081 20.024242 +v 10.208272 -72.578110 10.208261 +v 8.020587 72.578110 12.003670 +v 15.732951 68.367073 23.546043 +v 22.840698 61.528748 34.183548 +v 29.070709 52.325893 43.507397 +v 34.183525 41.112190 51.159279 +v 37.982712 28.318565 56.845142 +v 40.322220 14.436674 60.346485 +v 41.112160 -0.000010 61.528732 +v 40.322220 -14.436693 60.346478 +v 37.982712 -28.318584 56.845135 +v 34.183525 -41.112206 51.159264 +v 29.070709 -52.325909 43.507381 +v 22.840698 -61.528755 34.183525 +v 15.732951 -68.367088 23.546021 +v 8.020587 -72.578110 12.003647 +v 5.524676 72.578110 13.337760 +v 10.837043 68.367073 26.162958 +v 15.732944 61.528744 37.982716 +v 20.024252 52.325893 48.342831 +v 23.546019 41.112190 56.845142 +v 26.162949 28.318565 63.162937 +v 27.774422 14.436673 67.053413 +v 28.318539 -0.000011 68.367058 +v 27.774422 -14.436694 67.053413 +v 26.162949 -28.318584 63.162930 +v 23.546019 -41.112206 56.845127 +v 20.024252 -52.325909 48.342815 +v 15.732944 -61.528759 37.982693 +v 10.837043 -68.367088 26.162935 +v 5.524676 -72.578110 13.337737 +v 2.816455 72.578110 14.159289 +v 5.524674 68.367073 27.774445 +v 8.020581 61.528744 40.322231 +v 10.208275 52.325893 51.320477 +v 12.003653 41.112186 60.346481 +v 13.337756 28.318563 67.053421 +v 14.159272 14.436672 71.183517 +v 14.436653 -0.000012 72.578072 +v 14.159272 -14.436695 71.183517 +v 13.337756 -28.318586 67.053406 +v 12.003653 -41.112209 60.346466 +v 10.208275 -52.325909 51.320461 +v 8.020581 -61.528759 40.322208 +v 5.524674 -68.367088 27.774422 +v 2.816455 -72.578110 14.159266 +v -0.000001 72.578110 14.436686 +v -0.000004 68.367073 28.318579 +v -0.000007 61.528744 41.112186 +v -0.000001 52.325893 52.325901 +v -0.000008 41.112186 61.528736 +v 0.000002 28.318563 68.367073 +v -0.000010 14.436672 72.578087 +v -0.000024 -0.000012 73.999954 +v -0.000010 -14.436695 72.578087 +v 0.000002 -28.318586 68.367058 +v -0.000008 -41.112209 61.528721 +v -0.000001 -52.325909 52.325886 +v -0.000007 -61.528759 41.112164 +v -0.000004 -68.367088 28.318556 +v -0.000001 -72.578110 14.436663 +v -2.816456 72.578110 14.159288 +v -5.524682 68.367073 27.774445 +v -8.020595 61.528744 40.322227 +v -10.208276 52.325893 51.320469 +v -12.003667 41.112186 60.346474 +v -13.337750 28.318563 67.053413 +v -14.159292 14.436672 71.183517 +v -14.436698 -0.000012 72.578056 +v -14.159292 -14.436695 71.183517 +v -13.337750 -28.318586 67.053398 +v -12.003667 -41.112209 60.346458 +v -10.208276 -52.325909 51.320454 +v -8.020595 -61.528759 40.322205 +v -5.524682 -68.367088 27.774422 +v -2.816456 -72.578110 14.159266 +v -5.524676 72.578110 13.337759 +v -10.837049 68.367073 26.162956 +v -15.732955 61.528744 37.982704 +v -20.024252 52.325893 48.342827 +v -23.546032 41.112190 56.845135 +v -26.162939 28.318565 63.162933 +v -27.774441 14.436673 67.053398 +v -28.318579 -0.000011 68.367027 +v -27.774441 -14.436694 67.053398 +v -26.162939 -28.318584 63.162926 +v -23.546032 -41.112206 56.845119 +v -20.024252 -52.325909 48.342812 +v -15.732955 -61.528759 37.982681 +v -10.837049 -68.367088 26.162933 +v -5.524676 -72.578110 13.337736 +v -8.020586 72.578110 12.003665 +v -15.732955 68.367073 23.546038 +v -22.840706 61.528748 34.183525 +v -29.070709 52.325893 43.507393 +v -34.183533 41.112190 51.159267 +v -37.982700 28.318565 56.845139 +v -40.322235 14.436674 60.346466 +v -41.112190 -0.000010 61.528687 +v -40.322235 -14.436693 60.346458 +v -37.982700 -28.318584 56.845131 +v -34.183533 -41.112206 51.159252 +v -29.070709 -52.325909 43.507378 +v -22.840706 -61.528755 34.183502 +v -15.732955 -68.367088 23.546015 +v -8.020586 -72.578110 12.003642 +v -10.208269 72.578110 10.208280 +v -20.024252 68.367081 20.024258 +v -29.070700 61.528748 29.070696 +v -36.999992 52.325893 37.000000 +v -43.507381 41.112190 43.507378 +v -48.342812 28.318567 48.342819 +v -51.320461 14.436675 51.320450 +v -52.325878 -0.000009 52.325840 +v -51.320461 -14.436692 51.320442 +v -48.342812 -28.318583 48.342812 +v -43.507381 -41.112206 43.507362 +v -36.999992 -52.325909 36.999985 +v -29.070700 -61.528755 29.070677 +v -20.024252 -68.367081 20.024235 +v -10.208269 -72.578110 10.208257 +v 0.000000 -74.000000 -0.000012 +v -12.003654 72.578110 8.020596 +v -23.546028 68.367081 15.732960 +v -34.183525 61.528748 22.840698 +v -43.507385 52.325897 29.070713 +v -51.159267 41.112194 34.183525 +v -56.845131 28.318569 37.982708 +v -60.346478 14.436677 40.322212 +v -61.528713 -0.000007 41.112137 +v -60.346478 -14.436690 40.322205 +v -56.845131 -28.318581 37.982700 +v -51.159267 -41.112202 34.183510 +v -43.507385 -52.325905 29.070698 +v -34.183525 -61.528755 22.840679 +v -23.546028 -68.367081 15.732937 +v -12.003654 -72.578110 8.020573 +v -13.337746 72.578110 5.524686 +v -26.162941 68.367081 10.837053 +v -37.982693 61.528748 15.732945 +v -48.342819 52.325897 20.024258 +v -56.845127 41.112194 23.546017 +v -63.162926 28.318571 26.162945 +v -67.053406 14.436679 27.774414 +v -68.367035 -0.000005 28.318518 +v -67.053406 -14.436688 27.774410 +v -63.162926 -28.318579 26.162937 +v -56.845127 -41.112202 23.546001 +v -48.342819 -52.325905 20.024242 +v -37.982693 -61.528755 15.732924 +v -26.162941 -68.367081 10.837030 +v -13.337746 -72.578110 5.524662 +v -14.159275 72.578110 2.816465 +v -27.774429 68.367081 5.524685 +v -40.322208 61.528751 8.020586 +v -51.320461 52.325901 10.208282 +v -60.346462 41.112194 12.003653 +v -67.053406 28.318573 13.337756 +v -71.183517 14.436682 14.159265 +v -72.578049 -0.000002 14.436638 +v -71.183517 -14.436686 14.159261 +v -67.053406 -28.318577 13.337747 +v -60.346462 -41.112202 12.003639 +v -51.320461 -52.325901 10.208264 +v -40.322208 -61.528751 8.020565 +v -27.774429 -68.367081 5.524663 +v -14.159275 -72.578110 2.816441 +v -14.436670 72.578110 0.000011 +v -28.318560 68.367081 0.000007 +v -41.112164 61.528751 -0.000001 +v -52.325890 52.325901 0.000007 +v -61.528721 41.112198 -0.000005 +v -68.367058 28.318575 0.000004 +v -72.578079 14.436684 -0.000018 +v -73.999931 0.000000 -0.000033 +v -72.578079 -14.436684 -0.000022 +v -68.367058 -28.318575 -0.000006 +v -61.528721 -41.112198 -0.000019 +v -52.325890 -52.325901 -0.000011 +v -41.112164 -61.528751 -0.000021 +v -28.318560 -68.367081 -0.000015 +v -14.436670 -72.578110 -0.000013 +v -14.159273 72.578110 -2.816444 +v -27.774427 68.367081 -5.524670 +v -40.322205 61.528751 -8.020587 +v -51.320457 52.325901 -10.208268 +v -60.346455 41.112202 -12.003664 +v -67.053398 28.318577 -13.337748 +v -71.183502 14.436686 -14.159298 +v -72.578033 0.000002 -14.436703 +v -71.183502 -14.436682 -14.159302 +v -67.053398 -28.318573 -13.337757 +v -60.346455 -41.112194 -12.003677 +v -51.320457 -52.325901 -10.208285 +v -40.322205 -61.528751 -8.020608 +v -27.774427 -68.367081 -5.524692 +v -14.159273 -72.578110 -2.816468 +v -13.337744 72.578110 -5.524664 +v -26.162937 68.367081 -10.837036 +v -37.982677 61.528755 -15.732944 +v -48.342815 52.325905 -20.024244 +v -56.845112 41.112202 -23.546024 +v -63.162922 28.318579 -26.162935 +v -67.053391 14.436688 -27.774443 +v -68.367004 0.000005 -28.318579 +v -67.053391 -14.436679 -27.774446 +v -63.162922 -28.318571 -26.162943 +v -56.845112 -41.112194 -23.546040 +v -48.342815 -52.325897 -20.024260 +v -37.982677 -61.528748 -15.732965 +v -26.162937 -68.367081 -10.837059 +v -13.337744 -72.578110 -5.524688 +v -12.003652 72.578110 -8.020575 +v -23.546019 68.367081 -15.732941 +v -34.183502 61.528755 -22.840694 +v -43.507381 52.325905 -29.070700 +v -51.159245 41.112202 -34.183525 +v -56.845127 28.318581 -37.982697 +v -60.346451 14.436690 -40.322231 +v -61.528667 0.000007 -41.112186 +v -60.346451 -14.436677 -40.322239 +v -56.845127 -28.318569 -37.982704 +v -51.159245 -41.112194 -34.183540 +v -43.507381 -52.325897 -29.070715 +v -34.183502 -61.528748 -22.840714 +v -23.546019 -68.367081 -15.732964 +v -12.003652 -72.578110 -8.020597 +v -10.208266 72.578110 -10.208257 +v -20.024242 68.367081 -20.024235 +v -29.070673 61.528755 -29.070686 +v -36.999989 52.325909 -36.999985 +v -43.507355 41.112206 -43.507370 +v -48.342804 28.318583 -48.342800 +v -51.320431 14.436692 -51.320454 +v -52.325821 0.000009 -52.325871 +v -51.320431 -14.436675 -51.320461 +v -48.342804 -28.318567 -48.342808 +v -43.507355 -41.112190 -43.507385 +v -36.999989 -52.325893 -37.000000 +v -29.070673 -61.528748 -29.070705 +v -20.024242 -68.367081 -20.024258 +v -10.208266 -72.578110 -10.208280 +v -8.020582 72.578110 -12.003641 +v -15.732945 68.367088 -23.546011 +v -22.840677 61.528755 -34.183506 +v -29.070700 52.325909 -43.507378 +v -34.183506 41.112206 -51.159252 +v -37.982697 28.318584 -56.845123 +v -40.322197 14.436693 -60.346462 +v -41.112122 0.000010 -61.528702 +v -40.322197 -14.436674 -60.346470 +v -37.982697 -28.318565 -56.845131 +v -34.183506 -41.112190 -51.159267 +v -29.070700 -52.325893 -43.507393 +v -22.840677 -61.528748 -34.183529 +v -15.732945 -68.367073 -23.546034 +v -8.020582 -72.578110 -12.003664 +v -5.524673 72.578110 -13.337731 +v -10.837040 68.367088 -26.162928 +v -15.732925 61.528759 -37.982670 +v -20.024244 52.325909 -48.342812 +v -23.546001 41.112206 -56.845112 +v -26.162935 28.318584 -63.162918 +v -27.774405 14.436694 -67.053398 +v -28.318510 0.000011 -68.367020 +v -27.774405 -14.436673 -67.053398 +v -26.162935 -28.318565 -63.162926 +v -23.546001 -41.112190 -56.845127 +v -20.024244 -52.325893 -48.342827 +v -15.732925 -61.528744 -37.982693 +v -10.837040 -68.367073 -26.162951 +v -5.524673 -72.578110 -13.337754 +v -2.816453 72.578110 -14.159260 +v -5.524672 68.367088 -27.774416 +v -8.020567 61.528759 -40.322182 +v -10.208268 52.325909 -51.320454 +v -12.003638 41.112209 -60.346443 +v -13.337746 28.318586 -67.053391 +v -14.159258 14.436695 -71.183502 +v -14.436632 0.000012 -72.578026 +v -14.159258 -14.436672 -71.183502 +v -13.337746 -28.318563 -67.053406 +v -12.003638 -41.112186 -60.346458 +v -10.208268 -52.325893 -51.320469 +v -8.020567 -61.528744 -40.322205 +v -5.524672 -68.367073 -27.774439 +v -2.816453 -72.578110 -14.159283 +v 0.000001 72.578110 -14.436656 +v 0.000005 68.367088 -28.318546 +v 0.000007 52.325909 -52.325882 +v 0.000004 28.318586 -68.367043 +v 0.000004 -28.318563 -68.367058 +v 0.000007 -52.325893 -52.325897 +v 0.000016 -61.528744 -41.112156 +v 0.000005 -68.367073 -28.318569 +v 0.000001 -72.578110 -14.436679 +v -6.668874 -28.318586 67.710228 +v -11.105971 -46.719055 55.833458 +v -7.218316 7.218354 -72.578064 +v -2.762338 73.289055 6.668886 +v 2.762340 64.947922 -34.443310 +v 4.010296 61.528759 -40.717205 +v -19.083303 -34.715397 61.754696 +v -17.774849 -41.112209 58.595787 +v 11.105970 -46.719040 -55.833488 +v -17.878603 -56.927334 43.162750 +v -4.010293 73.289055 6.001839 +v -22.401810 64.947922 -26.308348 +v -40.717159 7.218352 -60.937584 +v 17.774849 -41.112186 -58.595825 +v 16.013960 -46.719040 -54.344666 +v 17.878607 -56.927319 -43.162777 +v -19.286831 -64.947922 28.864758 +v -5.104135 73.289055 5.104146 +v 27.103897 -46.719040 -49.751060 +v 24.547485 -52.325893 -45.925117 +v -25.955704 -61.528755 31.627090 +v 19.286835 -64.947906 -28.864796 +v -15.116261 -70.472595 15.116245 +v 5.104138 -73.289055 -5.104149 +v -6.001827 73.289055 4.010304 +v -1.408226 -72.578110 -14.297981 +v 25.955711 -61.528748 -31.627131 +v 21.432484 -64.947906 -27.103907 +v 15.116266 -70.472595 -15.116276 +v -16.013952 -70.472595 14.022404 +v -6.668873 73.289055 2.762349 +v -16.877148 70.472595 12.970619 +v -5.104135 -73.289055 5.104122 +v 27.103897 -64.947914 -21.432491 +v 21.785145 -68.367081 -17.878616 +v 16.013958 -70.472595 -14.022433 +v -18.441887 -70.472595 10.628799 +v -7.079638 73.289055 1.408238 +v 19.083305 -70.472595 -9.428830 +v 12.670708 -72.578110 -6.772646 +v -7.218335 73.289055 0.000011 +v -21.377615 70.472595 0.000009 +v -34.048302 14.436694 -63.699928 +v -10.628798 -64.947906 -32.878567 +v 13.748518 -72.578110 -4.170579 +v -14.297972 72.578110 -1.408217 +v 21.377625 70.472595 0.000013 +v -34.048317 64.947914 -6.772629 +v -24.854477 -68.367081 -13.285011 +v -19.083294 -70.472595 -9.428828 +v -40.745026 34.715393 -50.176250 +v 14.297981 72.578110 1.408241 +v 21.105558 70.472595 2.762352 +v 34.048332 64.947914 6.772648 +v -43.162746 56.927330 -17.878593 +v -67.710228 28.318577 -6.668872 +v -49.831635 -52.325897 -15.116273 +v -6.001826 73.289055 -4.010281 +v 26.968693 68.367081 8.180876 +v -36.083092 61.528755 -19.286819 +v 43.162766 56.927322 17.878614 +v -47.333313 46.719051 -31.627113 +v -51.823174 52.325901 5.104144 +v -30.173233 -64.947914 16.838854 +v -5.104133 73.289055 -5.104122 +v 30.764366 64.947914 15.732967 +v 36.083115 61.528748 19.286844 +v 40.745049 56.927322 22.401842 +v 47.333328 46.719044 31.627131 +v -45.925079 34.715393 -45.925087 +v -45.821331 56.927326 -9.114428 +v -4.010291 73.289055 -6.001814 +v -40.253689 -52.325905 33.035339 +v 40.253693 52.325897 33.035362 +v -38.845428 41.112206 -47.333313 +v 45.925102 34.715378 45.925106 +v -39.152447 21.377638 -58.595791 +v 52.593987 -46.719044 -21.785147 +v -24.547482 52.325893 45.925110 +v -2.762336 73.289055 -6.668859 +v 36.289043 46.719040 43.507393 +v 38.845451 41.112190 47.333336 +v 40.745045 34.715378 50.176266 +v 39.152466 21.377619 58.595814 +v -28.046457 7.218353 -67.710205 +v 40.253693 46.719055 -40.253685 +v 17.774836 41.112186 58.595810 +v -1.408226 73.289055 -7.079624 +v -6.001819 41.112209 -60.937592 +v 32.072830 28.318565 60.004040 +v -20.966831 14.436695 -69.118454 +v 28.046480 7.218331 67.710236 +v -14.297945 -7.218330 -71.880768 +v 0.000000 73.289055 -7.218322 +v 0.000004 46.719055 -56.927315 +v 0.000002 34.715397 -64.947891 +v 5.104142 -52.325893 -51.823189 +v 20.966846 14.436672 69.118469 +v 14.297962 -7.218354 71.880798 +v 7.218322 7.218330 72.578079 +v 7.218315 -0.000012 73.289017 +v 7.218322 -7.218354 72.578079 +v -0.000004 -21.377640 70.472580 +v -7.079651 -14.436695 71.880798 +v -6.668880 -21.377640 69.815750 +v -12.670709 -34.715397 63.699932 +v 5.104138 46.719055 -56.424606 +v 6.001832 41.112209 -60.937614 +v -19.750345 -28.318586 65.108162 +v -21.785141 -46.719055 52.593964 +v 9.114435 -56.927319 -45.821365 +v -30.764366 -34.715393 56.845127 +v -28.864782 -41.112206 54.002186 +v 15.116266 -52.325893 -49.831657 +v -25.955708 -56.927334 38.845444 +v 13.285004 -64.947906 -32.072842 +v 22.401836 -56.927319 -40.745064 +v 19.286835 -61.528744 -36.083134 +v 15.732958 -64.947906 -30.764385 +v 11.876774 -70.472595 -17.774860 +v 6.001831 -73.289055 -4.010307 +v -21.238884 -7.218330 -69.775261 +v -33.035347 56.927322 33.035347 +v -36.289043 -56.927330 29.070686 +v 17.878607 -68.367081 -21.785156 +v 12.970617 -70.472595 -16.877167 +v -9.428818 70.472595 19.083311 +v -5.104131 52.325909 -51.823166 +v -32.072815 28.318584 -60.004021 +v -19.750340 -70.472595 -8.180873 +v -41.263172 -56.927330 21.432459 +v -36.083107 -61.528755 19.286802 +v 11.105968 -72.578110 -9.114444 +v -19.750343 -70.472595 8.180846 +v 6.668877 73.289055 -2.762327 +v -69.118446 14.436687 -20.966871 +v -26.968685 -68.367081 8.180846 +v -20.161108 -70.472595 6.826736 +v 7.079642 73.289055 -1.408216 +v 20.966860 70.472595 -4.170556 +v -56.424591 46.719048 -5.104136 +v -64.291061 34.715385 -6.668876 +v -14.297973 -72.578110 1.408214 +v 14.297981 72.578110 -1.408216 +v -20.966850 70.472595 -4.170557 +v 34.715382 64.947914 0.000014 +v -54.082794 21.377621 44.651577 +v -45.925102 -52.325905 24.547470 +v -55.833469 14.436676 45.821331 +v 7.079641 73.289055 1.408240 +v 28.046505 68.367081 2.762353 +v 34.320400 64.947914 4.010308 +v 45.821350 56.927326 9.114444 +v -19.083294 70.472595 -9.428805 +v -35.591763 46.719040 44.079636 +v -38.845459 41.112190 47.333321 +v 67.710251 -7.218337 -28.046495 +v 6.668876 73.289055 2.762352 +v 33.242592 64.947914 9.428832 +v 39.152466 61.528748 11.876786 +v 44.332527 56.927322 14.022432 +v 52.593979 46.719044 21.785151 +v 43.162769 -56.927322 -17.878614 +v 6.001829 73.289055 4.010306 +v -27.103872 64.947914 -21.432465 +v -31.627087 61.528755 -25.955690 +v 45.925106 52.325897 24.547489 +v -40.253670 46.719055 -40.253677 +v 54.002205 34.715378 36.083126 +v 5.104136 73.289055 5.104148 +v -10.628809 70.472595 -18.441872 +v 44.079632 46.719040 35.591774 +v 47.333321 41.112190 38.845467 +v 49.751045 34.715378 41.263180 +v 49.831642 21.377621 49.831646 +v 4.010293 73.289055 6.001841 +v -27.103874 46.719055 -49.751030 +v -28.864754 41.112206 -54.002182 +v 43.162766 28.318567 52.593983 +v -26.968670 21.377640 -65.108162 +v 40.717190 7.218332 60.937607 +v 2.762338 73.289055 6.668886 +v -4.010283 61.528759 -40.717182 +v -5.104134 56.927334 -46.216324 +v 33.242584 21.377619 61.754711 +v 34.048321 14.436673 63.699951 +v -14.297945 7.218354 -71.880768 +v 28.046480 -7.218353 67.710236 +v 1.408227 73.289055 7.079651 +v 0.000002 64.947922 -34.715366 +v 0.000004 56.927334 -46.719036 +v -7.079627 21.377640 -69.775276 +v 6.001834 -34.715374 -64.356773 +v 21.238905 7.218330 69.775284 +v 21.377596 -0.000011 70.472565 +v 0.000003 -70.472595 -21.377625 +v 13.748514 -21.377640 69.118469 +v -0.000000 73.289055 7.218349 +v 7.079631 -14.436695 71.880798 +v 7.079637 -21.377640 69.775291 +v -0.000003 -34.715397 64.947891 +v -1.408228 73.289055 7.079650 +v -60.937595 7.218335 40.717171 +v -5.104138 -52.325909 51.823170 +v 0.000000 7.218354 -73.289055 +v -6.772638 -64.947922 34.048313 +v 6.668878 21.377640 -69.815765 +v 7.079643 14.436695 -71.880829 +v 7.218342 7.218354 -72.578110 +v -14.022423 -56.927334 44.332512 +v -11.876775 -61.528759 39.152443 +v -9.428822 -64.947922 33.242569 +v -8.180862 -70.472595 19.750336 +v -6.772628 72.578110 -12.670687 +v 14.022425 -56.927319 -44.332542 +v 11.876776 -61.528744 -39.152485 +v -13.285002 -68.367088 24.854473 +v 8.180864 -70.472595 -19.750366 +v -21.785130 -68.367081 -17.878611 +v 9.114428 56.927319 45.821350 +v 13.285004 -68.367073 -24.854504 +v 9.428820 -70.472595 -19.083319 +v 2.762340 -73.289055 -6.668890 +v -65.108162 28.318579 -19.750341 +v -32.072807 64.947914 -13.284990 +v 9.114433 -72.578110 -11.105980 +v -6.001827 -73.289055 4.010280 +v 17.774849 70.472595 -11.876760 +v -19.750343 70.472595 8.180869 +v -39.152451 -61.528755 11.876744 +v -32.878563 -64.947914 10.628794 +v 6.001831 73.289055 -4.010283 +v 12.670708 72.578110 -6.772622 +v 19.083305 70.472595 -9.428807 +v -34.048317 64.947914 6.772635 +v -52.593971 28.318567 43.162762 +v -7.079638 -73.289055 1.408215 +v 13.748518 72.578110 -4.170555 +v -28.046494 68.367081 2.762346 +v 34.048336 64.947914 -6.772622 +v -46.719025 56.927326 0.000003 +v 60.004044 34.715389 -24.854483 +v -7.218335 -73.289055 -0.000012 +v 21.105558 70.472595 -2.762327 +v 28.046505 68.367081 -2.762327 +v 34.443314 64.947914 -2.762327 +v 46.719044 56.927326 0.000011 +v -55.833458 46.719048 -11.105967 +v -45.821335 56.927326 9.114433 +v -7.079637 -73.289055 -1.408240 +v 40.717209 61.528751 4.010309 +v 46.216331 56.927326 5.104148 +v 55.833473 46.719048 11.105979 +v -60.004017 34.715389 -24.854479 +v -6.668872 -73.289055 -2.762350 +v 49.831646 52.325897 15.116272 +v -54.002178 41.112202 -28.864775 +v 60.004040 34.715382 24.854494 +v -58.595787 21.377634 -39.152462 +v -6.001826 -73.289055 -4.010305 +v -36.289028 46.719055 -43.507374 +v 50.176262 46.719044 26.308380 +v 54.002201 41.112194 28.864792 +v 56.845139 34.715382 30.764376 +v 58.595810 21.377623 39.152477 +v -51.823128 7.218350 -51.823166 +v -2.762338 -73.289055 6.668862 +v -5.104133 -73.289055 -5.104146 +v -58.595787 -21.377623 -39.152470 +v 52.593987 28.318567 43.162769 +v -45.821312 14.436693 -55.833458 +v 51.823158 7.218333 51.823181 +v -40.717159 -7.218332 -60.937584 +v -4.010291 -73.289055 -6.001838 +v -7.079627 -21.377617 -69.775276 +v 44.651585 21.377619 54.082806 +v 45.821339 14.436674 55.833477 +v -34.715317 0.000011 -64.947861 +v 40.717190 -7.218352 60.937607 +v -26.968670 -21.377617 -65.108162 +v -56.424549 -7.218334 -46.216324 +v -36.289043 56.927322 29.070705 +v 34.443291 7.218331 64.291077 +v 34.715347 -0.000011 64.947891 +v 34.443291 -7.218352 64.291077 +v 26.968685 -21.377640 65.108170 +v -12.670692 -34.715374 -63.699928 +v -1.408226 -73.289055 -7.079648 +v -28.864761 -64.947914 -19.286839 +v -6.668871 -28.318563 -67.710228 +v 2.762348 -64.947906 -34.443306 +v 2.762342 -68.367073 -28.046513 +v 0.000000 -73.289055 -7.218346 +v 20.556089 -21.377640 67.053413 +v 12.670704 -34.715397 63.699940 +v -31.627102 46.719055 -47.333313 +v 6.668879 -28.318586 67.710228 +v -0.000004 -46.719055 56.927303 +v -54.344627 -21.377621 -44.332523 +v -6.668880 -34.715397 64.291061 +v -6.001838 -41.112209 60.937592 +v -5.104142 -46.719055 56.424587 +v -9.114435 -56.927334 45.821331 +v 0.000000 -7.218330 -73.289055 +v -13.748508 72.578110 -4.170554 +v -63.699921 14.436689 -34.048336 +v 7.218342 0.000012 -73.289055 +v 7.079643 -7.218330 -72.591766 +v -15.116264 -52.325909 49.831635 +v -13.285002 -64.947922 32.072807 +v 4.170568 -70.472595 -20.966875 +v -21.105549 -70.472595 2.762325 +v -22.401833 -56.927334 40.745033 +v 10.628819 -64.947906 -32.878590 +v 8.180864 -68.367073 -26.968708 +v 5.524680 -70.472595 -20.556110 +v 20.966860 -70.472595 4.170557 +v -63.699928 34.715389 -12.670706 +v -11.105961 72.578110 9.114437 +v -7.079629 14.436695 -71.880806 +v -17.878603 -68.367081 21.785126 +v 6.772635 -72.578110 -12.670721 +v 4.010295 -73.289055 -6.001843 +v 15.116266 70.472595 -15.116253 +v 32.072830 64.947914 -13.284989 +v 11.105968 72.578110 -9.114421 +v 16.877155 70.472595 -12.970604 +v 28.864788 64.947914 -19.286819 +v 5.104138 73.289055 -5.104125 +v 24.854492 68.367081 -13.284990 +v 30.764374 64.947914 -15.732944 +v 20.161116 70.472595 -6.826740 +v 26.968693 68.367081 -8.180851 +v 33.242592 64.947914 -9.428807 +v 45.821354 56.927326 -9.114424 +v -5.104131 -52.325893 -51.823181 +v -63.699936 34.715382 12.670704 +v -9.114418 56.927334 -45.821320 +v -28.046494 68.367081 -2.762331 +v 40.717213 61.528751 -4.010282 +v 46.324066 56.927326 -4.010285 +v 56.927315 46.719048 0.000011 +v -46.324009 7.218351 -56.336166 +v -33.242569 64.947914 -9.428812 +v -39.152443 61.528755 -11.876765 +v 51.823181 52.325901 5.104146 +v -52.593964 46.719051 -21.785133 +v 63.699951 34.715382 12.670715 +v 54.344650 46.719044 16.013968 +v 58.595806 41.112194 17.774858 +v 61.754711 34.715382 19.083311 +v 65.108177 21.377625 26.968697 +v -44.079617 46.719055 -35.591755 +v -47.333298 41.112206 -38.845448 +v 60.004044 28.318569 32.072830 +v -49.831619 21.377636 -49.831627 +v 60.937595 7.218335 40.717216 +v 54.344650 21.377621 44.332531 +v 55.833466 14.436676 45.821354 +v -17.774841 70.472595 11.876778 +v 51.823158 -7.218350 51.823181 +v -45.925095 34.715378 45.925098 +v -33.242565 21.377638 -61.754688 +v 46.324043 7.218333 56.336189 +v 46.719009 -0.000009 56.927315 +v 46.324043 -7.218351 56.336189 +v 39.152466 -21.377638 58.595806 +v -43.162750 -28.318567 -52.593967 +v -17.774836 70.472595 -11.876758 +v -5.524673 70.472595 -20.556074 +v -21.238884 7.218353 -69.775261 +v -21.377571 0.000011 -70.472519 +v 34.048321 -14.436694 63.699944 +v 33.242584 -21.377638 61.754704 +v 24.854485 -34.715397 60.004032 +v -56.424549 7.218349 -46.216324 +v -24.854477 68.367081 -13.284988 +v 0.000002 21.377640 -70.472580 +v -30.173220 64.947914 -16.838863 +v 4.010300 -56.927319 -46.324074 +v 4.010304 -61.528744 -40.717205 +v 19.750353 -28.318586 65.108162 +v 11.105964 -46.719055 55.833466 +v -14.297972 -72.578110 -1.408240 +v -69.775284 -21.377630 7.079628 +v 6.001827 -34.715397 64.356758 +v 6.001822 -41.112209 60.937592 +v 6.001826 -46.719055 56.336174 +v -0.000004 -56.927334 46.719025 +v -67.053406 21.377625 20.556086 +v -69.118462 14.436680 20.966839 +v -19.083298 70.472595 9.428824 +v -2.762343 -68.367088 28.046490 +v -1.408230 -70.472595 21.238911 +v -14.022419 -70.472595 16.013939 +v -9.114428 -72.578110 11.105949 +v 7.079643 -14.436672 -71.880829 +v 6.668878 -21.377617 -69.815765 +v -4.010293 -73.289055 6.001815 +v -6.668873 34.715397 -64.291069 +v -4.170566 -72.578110 13.748501 +v -11.876770 70.472595 17.774851 +v 4.170568 -72.578110 -13.748532 +v -9.114428 72.578110 11.105972 +v 11.876774 70.472595 -17.774837 +v -24.547476 64.947906 24.547478 +v 9.114433 72.578110 -11.105957 +v 14.022423 70.472595 -16.013947 +v 24.547483 64.947922 -24.547470 +v -27.103889 64.947914 21.432480 +v 21.785145 68.367081 -17.878593 +v 27.103897 64.947914 -21.432468 +v 38.845467 56.927330 -25.955702 +v -43.162758 56.927322 17.878603 +v 4.010295 73.289055 -6.001819 +v 36.083126 61.528755 -19.286821 +v 41.263184 56.927330 -21.432472 +v -55.833462 46.719048 11.105967 +v -38.845444 56.927330 -25.955696 +v 39.152473 61.528755 -11.876760 +v 44.651592 56.927330 -12.970606 +v 55.833477 46.719048 -11.105960 +v -64.947891 34.715385 -0.000001 +v 51.823185 52.325901 -5.104131 +v -60.937588 41.112198 -6.001834 +v 64.947906 34.715385 0.000008 +v -69.118454 21.377630 -13.748522 +v -56.845119 -34.715382 -30.764372 +v 56.424603 46.719048 5.104149 +v 60.937607 41.112198 6.001844 +v 64.291077 34.715385 6.668886 +v 69.118469 21.377626 13.748526 +v -67.710197 7.218347 -28.046511 +v -32.878571 -21.377638 61.949261 +v 65.108185 28.318571 19.750353 +v -36.083115 -34.715393 54.002193 +v 67.710236 7.218337 28.046511 +v -60.937561 -7.218335 -40.717209 +v -2.762334 68.367088 -28.046482 +v -27.103874 -46.719040 -49.751045 +v 61.949280 21.377623 32.878578 +v 63.699944 14.436678 34.048344 +v -56.927246 0.000008 -46.719028 +v 60.937595 -7.218349 40.717216 +v -49.831619 -21.377621 -49.831635 +v -45.821312 -14.436674 -55.833466 +v -35.591743 56.927330 -29.920340 +v -44.651566 -21.377619 -54.082798 +v 56.424583 7.218334 46.216331 +v 56.927288 -0.000008 46.719044 +v 56.424583 -7.218349 46.216331 +v 49.831642 -21.377636 49.831638 +v -36.083099 -34.715378 -54.002197 +v -2.762336 70.472595 -21.105536 +v -67.710228 -28.318573 -6.668881 +v -12.670692 34.715397 -63.699921 +v 45.821339 -14.436693 55.833469 +v 44.651585 -21.377638 54.082798 +v 36.083118 -34.715393 54.002201 +v -21.785122 -46.719040 -52.593979 +v -72.578064 7.218341 7.218310 +v -72.578064 -7.218343 7.218308 +v 32.072830 -28.318584 60.004032 +v -17.774820 -41.112186 -58.595795 +v 21.785135 -46.719055 52.593971 +v -9.114418 -56.927319 -45.821335 +v -43.162758 -28.318583 52.593971 +v 0.000002 -34.715374 -64.947906 +v 0.000004 -46.719040 -56.927330 +v 18.441887 -34.715397 61.949268 +v 17.774836 -41.112209 58.595795 +v 16.877148 -46.719055 54.082794 +v 9.114428 -56.927334 45.821335 +v -34.320408 7.218331 64.356743 +v -34.715385 -0.000011 64.947861 +v 5.104137 -52.325909 51.823174 +v -0.000006 -64.947922 34.715359 +v 20.966846 -14.436695 69.118469 +v -6.668872 73.289055 -2.762326 +v -5.104142 -56.927334 46.216309 +v -4.010301 -61.528759 40.717182 +v -2.762344 -64.947922 34.443295 +v -4.170569 -70.472595 20.966843 +v 6.001832 -41.112186 -60.937630 +v 5.104138 -46.719040 -56.424622 +v -8.180865 -68.367088 26.968678 +v -5.524679 -70.472595 20.556080 +v 8.180864 70.472595 -19.750343 +v -28.046457 -7.218331 -67.710205 +v -44.651566 21.377638 -54.082790 +v -10.628815 -70.472595 18.441875 +v -6.772631 -72.578110 12.670689 +v 6.772635 72.578110 -12.670698 +v 10.628819 70.472595 -18.441883 +v 19.286835 64.947922 -28.864773 +v -6.668873 -73.289055 2.762325 +v 1.408229 -73.289055 -7.079655 +v 17.878607 68.367081 -21.785133 +v 22.401834 64.947922 -26.308359 +v 33.035355 56.927330 -33.035347 +v -12.670700 72.578110 6.772641 +v 31.627125 61.528755 -25.955698 +v 36.289055 56.927330 -29.070700 +v 47.333340 46.719051 -31.627115 +v -38.845455 56.927322 25.955706 +v 2.762340 73.289055 -6.668866 +v -26.968685 68.367081 8.180869 +v -33.242577 64.947914 9.428819 +v 45.925110 52.325905 -24.547478 +v 52.593987 46.719051 -21.785131 +v -34.320385 64.947914 4.010296 +v -40.717186 61.528751 4.010292 +v 49.831650 52.325905 -15.116259 +v -56.927307 46.719048 0.000001 +v 63.699951 34.715389 -12.670702 +v -15.116257 -52.325893 -49.831650 +v 56.336189 46.719048 -6.001821 +v 60.937607 41.112198 -6.001818 +v 64.356781 34.715385 -6.001824 +v 70.472595 21.377628 0.000005 +v -33.035343 52.325909 -40.253681 +v -32.072815 -28.318565 -60.004028 +v -54.344635 46.719051 -16.013954 +v -58.595783 41.112202 -17.774843 +v 67.710251 28.318573 6.668880 +v -65.108154 21.377632 -26.968689 +v 71.880798 7.218339 14.297992 +v -21.785130 68.367081 -17.878588 +v -29.920349 56.927319 35.591759 +v 67.173233 21.377625 20.161121 +v 69.118469 14.436680 20.966869 +v -60.937561 7.218349 -40.717209 +v 67.710236 -7.218347 28.046507 +v -71.880791 -14.436683 -7.079662 +v -46.324051 56.927326 4.010296 +v -34.048317 -64.947914 6.772614 +v -54.344627 21.377636 -44.332516 +v 64.356766 7.218336 34.320404 +v 64.947884 -0.000006 34.715385 +v 64.356766 -7.218348 34.320404 +v 58.595810 -21.377634 39.152470 +v -13.748510 72.578110 4.170576 +v -47.333324 -41.112206 38.845436 +v -20.556087 70.472595 5.524685 +v -46.718971 0.000009 -56.927284 +v 55.833466 -14.436691 45.821346 +v 54.344650 -21.377636 44.332523 +v 45.925102 -34.715393 45.925098 +v -22.401833 56.927319 40.745049 +v -44.332523 -21.377638 54.344635 +v 43.162766 -28.318583 52.593975 +v -24.854469 -34.715374 -60.004025 +v 31.627117 -46.719055 47.333321 +v -7.218316 -7.218330 -72.578064 +v -7.079629 -14.436672 -71.880806 +v 30.173237 -34.715393 57.161098 +v 28.864773 -41.112206 54.002197 +v 27.103889 -46.719055 49.751038 +v 17.878597 -56.927334 43.162758 +v 0.000002 -21.377617 -70.472580 +v -6.001816 -46.719040 -56.336178 +v 1.408231 -70.472595 -21.238934 +v 1.408229 -72.578110 -14.297988 +v 15.116263 -52.325909 49.831638 +v 6.772628 -64.947922 34.048313 +v -6.772619 -64.947906 -34.048321 +v 4.010290 -56.927334 46.324051 +v 4.010287 -61.528759 40.717186 +v 4.010289 -64.947922 34.320381 +v -0.000002 -70.472595 21.377609 +v -20.556076 21.377640 -67.053398 +v -31.627102 -46.719040 -47.333328 +v -4.170566 72.578110 13.748524 +v 4.170568 70.472595 -20.966852 +v -13.285002 64.947906 32.072830 +v 4.170568 72.578110 -13.748509 +v 6.826753 70.472595 -20.161108 +v 13.285004 64.947922 -32.072819 +v -25.955708 56.927319 38.845459 +v 13.285004 68.367088 -24.854481 +v 16.838881 64.947922 -30.173233 +v 25.955711 56.927334 -38.845459 +v -40.253685 46.719040 40.253689 +v 1.408227 -73.289055 7.079627 +v 25.955711 61.528755 -31.627111 +v 29.920357 56.927334 -35.591759 +v -40.253689 52.325897 33.035355 +v -47.333328 46.719044 31.627119 +v -51.823170 7.218333 51.823143 +v 40.253700 52.325905 -33.035347 +v -31.627121 46.719040 47.333328 +v 54.002213 34.715393 -36.083122 +v -60.004028 34.715382 24.854481 +v -30.173222 34.715393 -57.161087 +v -16.877134 -46.719040 -54.082798 +v 1.408229 73.289055 -7.079631 +v 49.751053 46.719051 -27.103886 +v 54.002213 41.112202 -28.864769 +v 57.161114 34.715389 -30.173237 +v -69.118462 21.377626 13.748510 +v -45.925098 -52.325897 -24.547487 +v -25.955675 61.528755 -31.627096 +v -29.070686 56.927334 -36.289032 +v 54.082809 46.719051 -16.877144 +v 58.595814 41.112202 -17.774832 +v 61.949284 34.715389 -18.441885 +v 69.118477 21.377630 -13.748515 +v -73.289001 7.218342 -0.000025 +v -51.823174 52.325901 -5.104131 +v -65.108162 -28.318571 -19.750349 +v 67.710251 28.318577 -6.668876 +v -71.880791 14.436685 -7.079658 +v 73.289040 7.218342 0.000011 +v -71.880768 -7.218339 -14.298002 +v -20.161106 70.472595 -6.826740 +v -49.751045 -46.719051 27.103876 +v 69.815765 21.377626 6.668883 +v 71.880814 14.436683 7.079652 +v -70.472519 0.000003 -21.377640 +v 71.880798 -7.218344 14.297990 +v -65.108154 -21.377625 -26.968697 +v -52.593971 -28.318583 43.162754 +v 69.815750 7.218338 21.105570 +v 70.472565 -0.000003 21.377632 +v 69.815750 -7.218345 21.105566 +v 65.108177 -21.377632 26.968689 +v -54.002186 -34.715378 -36.083118 +v 65.108185 -21.377625 -26.968697 +v -13.285002 68.367073 24.854496 +v -16.838877 64.947906 30.173241 +v 63.699944 -14.436689 34.048336 +v 61.949280 -21.377634 32.878571 +v 54.002205 -34.715393 36.083118 +v -40.253670 -46.719040 -40.253693 +v 52.593987 -28.318583 43.162762 +v -38.845428 -41.112190 -47.333328 +v 40.253685 -46.719055 40.253685 +v -25.955688 -56.927319 -38.845459 +v 40.745045 -34.715393 50.176258 +v 38.845451 -41.112206 47.333321 +v 36.289043 -46.719055 43.507378 +v 25.955704 -56.927334 38.845455 +v -13.284983 -64.947906 -32.072823 +v 24.547482 -52.325909 45.925098 +v -11.876746 -61.528744 -39.152447 +v 13.284993 -64.947922 32.072815 +v -4.170563 -70.472595 -20.966862 +v 2.762342 68.367088 -28.046490 +v -2.762334 -68.367073 -28.046505 +v -2.762336 -70.472595 -21.105558 +v 12.970610 -56.927334 44.651581 +v 11.876762 -61.528759 39.152451 +v 10.628809 -64.947922 32.878559 +v 4.170565 -70.472595 20.966845 +v -15.116255 -70.472595 -15.116268 +v 2.762335 -68.367088 28.046490 +v -40.745029 -56.927322 -22.401840 +v -1.408229 -72.578110 14.297964 +v -8.180862 70.472595 19.750359 +v 6.772636 64.947922 -34.048328 +v -6.772631 72.578110 12.670712 +v 8.180864 68.367088 -26.968685 +v 10.628819 64.947922 -32.878567 +v 17.878607 56.927334 -43.162762 +v -19.750340 28.318586 -65.108154 +v -17.878603 68.367081 21.785149 +v 19.286835 61.528759 -36.083111 +v 22.401836 56.927334 -40.745049 +v 31.627125 46.719055 -47.333328 +v -24.547472 52.325909 -45.925095 +v -27.103872 -64.947914 -21.432487 +v -0.000000 -73.289055 7.218325 +v 33.035355 52.325909 -40.253693 +v 36.289051 46.719055 -43.507385 +v 45.925106 34.715393 -45.925102 +v -61.754688 34.715389 -19.083300 +v -50.176247 -46.719044 -26.308376 +v 43.507393 46.719055 -36.289040 +v 47.333336 41.112206 -38.845451 +v 50.176270 34.715393 -40.745049 +v 58.595818 21.377634 -39.152470 +v -34.443295 64.947914 -2.762336 +v -49.831642 -52.325905 15.116253 +v -40.717186 61.528751 -4.010294 +v -46.216309 56.927326 -5.104135 +v -49.831642 52.325897 15.116270 +v 60.004044 28.318581 -32.072834 +v 65.108185 21.377632 -26.968689 +v -47.333324 41.112190 38.845451 +v -56.336174 46.719048 6.001830 +v -60.937592 41.112198 6.001823 +v 65.108185 28.318579 -19.750351 +v -70.472565 21.377628 -0.000007 +v 71.880814 7.218344 -14.297973 +v -20.161116 -21.377640 67.173225 +v -25.955704 61.528748 31.627110 +v 69.775307 21.377630 -7.079638 +v 71.880814 14.436685 -7.079634 +v -71.880768 7.218344 -14.298000 +v 73.289040 -7.218342 0.000008 +v -67.173210 21.377632 -20.161116 +v 72.591751 7.218341 7.079652 +v 73.289032 -0.000001 7.218351 +v 72.591751 -7.218343 7.079650 +v 69.118469 -21.377630 13.748518 +v -64.356728 7.218348 -34.320408 +v -64.947838 0.000006 -34.715382 +v 69.118469 -14.436687 20.966866 +v 67.173233 -21.377632 20.161114 +v 60.004040 -34.715389 24.854483 +v -7.079637 73.289055 -1.408216 +v -55.833443 -14.436676 -45.821350 +v 60.004044 -28.318581 32.072823 +v -45.925079 -34.715378 -45.925095 +v 47.333328 -46.719051 31.627115 +v 49.751045 -34.715393 41.263172 +v 47.333321 -41.112206 38.845451 +v 44.079632 -46.719055 35.591759 +v 33.035347 -56.927330 33.035347 +v -30.173222 -34.715378 -57.161095 +v -28.864754 -41.112190 -54.002197 +v 33.035355 -52.325909 40.253685 +v -17.878586 -56.927319 -43.162758 +v 19.286825 -64.947922 28.864773 +v -54.002197 34.715378 36.083115 +v 21.432476 -56.927334 41.263172 +v 19.286821 -61.528759 36.083111 +v 16.838871 -64.947922 30.173229 +v 8.180860 -70.472595 19.750336 +v 1.408229 72.578110 -14.297965 +v 1.408231 70.472595 -21.238911 +v -4.010280 -56.927319 -46.324051 +v -4.010275 -61.528744 -40.717182 +v -4.010281 -64.947906 -34.320385 +v 8.180859 -68.367088 26.968678 +v 6.826749 -70.472595 20.161100 +v 1.408225 -70.472595 21.238911 +v 1.408227 -72.578110 14.297964 +v -16.877134 46.719055 -54.082783 +v -17.878593 -68.367081 -21.785145 +v -14.022412 -70.472595 -16.013962 +v -18.441874 34.715397 -61.949253 +v -11.876775 61.528744 39.152466 +v 9.114435 56.927334 -45.821350 +v -21.785141 46.719040 52.593979 +v -60.004025 28.318581 -32.072815 +v -40.253685 -52.325897 -33.035358 +v 15.116261 70.472595 15.116275 +v -41.263172 34.715378 49.751041 +v 11.876776 61.528759 -39.152462 +v 14.022425 56.927334 -44.332527 +v 21.785145 46.719055 -52.593979 +v -36.083115 34.715378 54.002201 +v -40.717186 -61.528751 4.010272 +v -49.831635 52.325905 -15.116256 +v -64.356728 -7.218336 -34.320408 +v -34.320385 -64.947914 4.010275 +v -67.710220 -7.218347 28.046463 +v -30.764360 64.947914 15.732952 +v 24.547485 52.325909 -45.925102 +v 27.103897 46.719055 -49.751045 +v 36.083122 34.715393 -54.002209 +v -49.831635 21.377621 49.831635 +v -69.118454 -21.377626 -13.748529 +v -5.524673 -70.472595 -20.556097 +v -54.002197 41.112194 28.864771 +v -58.595795 -41.112202 17.774820 +v 4.010293 -73.289055 6.001817 +v -54.082794 -46.719051 16.877132 +v 38.845463 41.112206 -47.333321 +v 41.263180 34.715393 -49.751049 +v 49.831650 21.377636 -49.831646 +v -58.595802 21.377623 39.152462 +v -19.286831 -61.528759 36.083092 +v -15.732955 -64.947922 30.764347 +v -6.668873 -34.715374 -64.291084 +v 52.593987 28.318583 -43.162769 +v -60.004028 28.318569 32.072826 +v 60.937618 7.218349 -40.717205 +v -67.710220 7.218337 28.046467 +v -6.001819 -41.112186 -60.937607 +v 43.162769 56.927330 -17.878595 +v -16.013960 -46.719055 54.344635 +v 61.754715 21.377634 -33.242588 +v 63.699955 14.436689 -34.048328 +v 67.710251 7.218347 -28.046492 +v -71.880783 -7.218344 14.297950 +v 67.053421 21.377632 -20.556091 +v 69.118477 14.436687 -20.966852 +v -73.288986 -0.000001 7.218302 +v 71.880814 -7.218339 -14.297975 +v -70.472565 -21.377628 -0.000014 +v -36.083099 34.715393 -54.002190 +v 72.578094 7.218343 -7.218330 +v 73.289032 0.000001 -7.218328 +v 72.578094 -7.218341 -7.218332 +v 70.472595 -21.377628 -0.000001 +v -63.699928 -34.715382 -12.670717 +v 71.880814 -14.436685 7.079647 +v 69.815765 -21.377630 6.668877 +v 63.699951 -34.715389 12.670704 +v -52.593964 -46.719044 -21.785149 +v 65.108185 -28.318579 19.750345 +v -54.002178 -41.112194 -28.864790 +v 52.593979 -46.719051 21.785135 +v -38.845444 -56.927322 -25.955715 +v 56.845139 -34.715389 30.764364 +v 54.002201 -41.112202 28.864777 +v 50.176262 -46.719051 26.308365 +v 38.845459 -56.927330 25.955700 +v -24.547459 -64.947906 -24.547482 +v 40.253693 -52.325905 33.035347 +v 36.289043 -56.927330 29.070700 +v 24.547474 -64.947922 24.547470 +v -11.876764 -70.472595 -17.774849 +v -49.831635 -21.377636 49.831627 +v 29.070704 -56.927334 36.289040 +v 25.955698 -61.528755 31.627113 +v 22.401825 -64.947922 26.308359 +v 11.876769 -70.472595 17.774834 +v 13.284997 -68.367088 24.854477 +v 10.628814 -70.472595 18.441879 +v -29.070686 -56.927319 -36.289047 +v 0.000003 70.472595 -21.377602 +v 5.104142 52.325909 -51.823174 +v -55.833443 14.436691 -45.821342 +v -25.955675 -61.528748 -31.627115 +v -22.401810 -64.947906 -26.308371 +v 4.170566 -72.578110 13.748502 +v -0.000002 70.472595 21.377632 +v -50.176247 46.719051 -26.308361 +v -21.238916 -70.472595 -1.408242 +v -56.845119 34.715389 -30.764360 +v -1.408229 72.578110 14.297987 +v -2.762341 70.472595 21.105564 +v -6.772638 64.947906 34.048336 +v -51.823174 -52.325901 5.104127 +v -5.524679 70.472595 20.556103 +v -8.180865 68.367073 26.968700 +v -10.628819 64.947906 32.878574 +v 6.668877 -73.289055 -2.762351 +v 11.105970 46.719055 -55.833473 +v -45.925102 52.325897 24.547485 +v -50.176254 46.719044 26.308365 +v -19.286831 61.528744 36.083115 +v 15.116266 52.325909 -49.831642 +v 16.877155 46.719055 -54.082802 +v 24.854490 34.715397 -60.004044 +v -24.547482 -52.325909 45.925095 +v -61.949265 -34.715389 18.441874 +v -33.035351 52.325893 40.253696 +v 28.864784 41.112206 -54.002205 +v 30.764372 34.715393 -56.845142 +v 39.152473 21.377638 -58.595814 +v -13.748502 -21.377617 -69.118454 +v 2.762338 -73.289055 6.668862 +v -43.507385 46.719040 36.289047 +v 43.162766 28.318583 -52.593983 +v -50.176254 34.715378 40.745041 +v 51.823189 7.218350 -51.823181 +v 54.082809 21.377636 -44.651592 +v 55.833481 14.436691 -45.821346 +v -65.108170 21.377625 26.968681 +v 60.937618 -7.218335 -40.717205 +v -57.161095 34.715382 30.173235 +v -4.170563 70.472595 -20.966839 +v -65.108170 28.318571 19.750351 +v 64.291084 7.218348 -34.443306 +v 64.947906 0.000006 -34.715370 +v 64.291084 -7.218336 -34.443306 +v -69.775284 21.377626 7.079634 +v 69.775299 7.218345 -21.238916 +v 70.472580 0.000003 -21.377613 +v 69.775299 -7.218338 -21.238920 +v 69.118477 -21.377626 -13.748523 +v -72.591721 7.218343 -7.079665 +v -73.288986 0.000001 -7.218368 +v 71.880814 -14.436683 -7.079638 +v 69.775307 -21.377626 -7.079644 +v 64.947906 -34.715385 -0.000004 +v -69.118446 -14.436680 -20.966875 +v 67.710251 -28.318577 6.668870 +v -60.004017 -34.715382 -24.854490 +v 55.833473 -46.719048 11.105964 +v 61.754711 -34.715389 19.083300 +v 58.595806 -41.112202 17.774843 +v 54.344650 -46.719051 16.013952 +v 43.162766 -56.927330 17.878595 +v -49.751022 -34.715378 -41.263172 +v -47.333298 -41.112190 -38.845463 +v 45.925106 -52.325905 24.547474 +v -33.035332 -56.927322 -33.035351 +v 28.864780 -64.947914 19.286821 +v -13.284992 -68.367073 -24.854492 +v -46.324009 -7.218333 -56.336166 +v -10.628809 -70.472595 -18.441895 +v -33.035343 -52.325893 -40.253696 +v 31.627113 -61.528755 25.955700 +v -19.286812 -64.947906 -28.864780 +v 15.116261 -70.472595 15.116252 +v 7.218340 73.289055 0.000012 +v -52.593964 28.318583 -43.162746 +v -67.710197 -7.218337 -28.046515 +v -21.432461 -56.927319 -41.263176 +v -19.286800 -61.528744 -36.083111 +v 17.878601 -68.367081 21.785131 +v 14.022419 -70.472595 16.013945 +v -46.216309 -56.927326 -5.104153 +v -71.880798 14.436683 7.079624 +v -34.443295 -64.947914 -2.762357 +v -8.180856 -68.367073 -26.968695 +v 6.772632 -72.578110 12.670692 +v 4.170565 70.472595 20.966867 +v 4.010300 56.927334 -46.324059 +v -54.082794 46.719044 16.877148 +v -58.595795 41.112194 17.774836 +v -11.105961 -72.578110 9.114414 +v -61.949265 34.715382 18.441885 +v 1.408227 72.578110 14.297987 +v 1.408225 70.472595 21.238934 +v -0.000006 64.947906 34.715382 +v -29.920349 -56.927334 35.591743 +v -21.432480 -64.947922 27.103868 +v -2.762343 68.367073 28.046513 +v -4.010299 64.947906 34.320404 +v -9.114435 56.927319 45.821346 +v -19.083303 34.715374 61.754704 +v -16.013960 46.719040 54.344650 +v -17.774849 41.112186 58.595802 +v 12.670710 34.715397 -63.699955 +v -26.968689 21.377617 65.108162 +v 17.774849 41.112209 -58.595810 +v 19.083305 34.715397 -61.754715 +v 26.968695 21.377640 -65.108185 +v -40.717213 7.218332 60.937576 +v -21.377615 -70.472595 -0.000014 +v -40.745026 -34.715378 -50.176258 +v 32.072830 28.318584 -60.004047 +v 33.242592 21.377638 -61.754715 +v 40.717216 7.218352 -60.937614 +v -51.823170 -7.218350 51.823143 +v 6.001829 -73.289055 4.010283 +v -39.152447 -21.377619 -58.595798 +v 44.332531 21.377638 -54.344654 +v 45.821358 14.436693 -55.833477 +v -56.336178 7.218334 46.324024 +v 51.823189 -7.218333 -51.823181 +v -56.336178 -7.218349 46.324024 +v 56.336197 7.218349 -46.324059 +v 56.927322 0.000008 -46.719032 +v 56.336197 -7.218334 -46.324059 +v 58.595818 -21.377623 -39.152477 +v -65.108170 -21.377632 26.968674 +v -20.966852 70.472595 4.170575 +v -73.289001 -7.218342 -0.000028 +v 63.699955 -14.436678 -34.048336 +v 61.754715 -21.377623 -33.242596 +v -63.699936 -34.715389 12.670692 +v 69.118477 -14.436680 -20.966856 +v 67.053421 -21.377625 -20.556099 +v 63.699951 -34.715382 -12.670713 +v -56.927307 -46.719048 -0.000015 +v 67.710251 -28.318573 -6.668886 +v -40.717213 -7.218352 60.937576 +v 56.927315 -46.719048 -0.000005 +v -45.821331 -56.927326 -9.114447 +v -34.048302 -14.436673 -63.699936 +v -4.170563 -72.578110 -13.748518 +v -33.242565 -21.377619 -61.754696 +v 64.291077 -34.715385 6.668874 +v 60.937607 -41.112198 6.001831 +v 56.424603 -46.719048 5.104134 +v 45.821350 -56.927326 9.114425 +v -32.072807 -64.947914 -13.285011 +v -16.013947 70.472595 -14.022405 +v 49.831646 -52.325905 15.116255 +v -36.083092 -61.528748 -19.286839 +v 32.072826 -64.947914 13.284993 +v -17.774836 -70.472595 -11.876781 +v -26.968681 -68.367081 -8.180876 +v -72.591721 -7.218341 -7.079667 +v 40.745049 -56.927330 22.401823 +v 36.083115 -61.528755 19.286825 +v 30.764366 -64.947914 15.732946 +v -16.877142 -70.472595 -12.970621 +v 17.774845 -70.472595 11.876760 +v -55.833458 -46.719048 -11.105982 +v -12.670700 -72.578110 6.772617 +v -67.710236 28.318573 6.668880 +v 26.308365 -64.947914 22.401821 +v 21.785141 -68.367081 17.878593 +v -9.114424 -72.578110 -11.105972 +v -8.180857 70.472595 -19.750330 +v -46.719032 -0.000009 56.927261 +v -46.216324 -7.218351 56.424568 +v -21.785141 -68.367081 17.878586 +v 9.114429 -72.578110 11.105954 +v -4.170563 72.578110 -13.748495 +v 8.180860 70.472595 19.750359 +v -6.772619 64.947922 -34.048298 +v 32.072830 -64.947914 -13.285010 +v -32.072819 28.318565 60.004036 +v 4.170566 72.578110 13.748525 +v 5.524675 70.472595 20.556103 +v 6.772628 64.947906 34.048336 +v 6.668880 28.318586 -67.710228 +v 20.556089 21.377617 67.053413 +v 2.762335 68.367073 28.046513 +v -0.000004 56.927319 46.719040 +v 6.772636 -64.947906 -34.048351 +v -4.010301 61.528744 40.717205 +v -5.104142 56.927319 46.216324 +v -11.105971 46.719040 55.833473 +v -15.116264 52.325893 49.831650 +v -24.854485 34.715374 60.004032 +v 13.748521 21.377640 -69.118484 +v -26.308371 46.719040 50.176262 +v -28.864782 41.112190 54.002201 +v 19.750353 28.318586 -65.108177 +v -39.152466 21.377619 58.595802 +v 28.046507 7.218353 -67.710251 +v -43.162758 28.318567 52.593979 +v 34.048340 14.436694 -63.699955 +v 34.443321 7.218352 -64.291084 +v 40.717216 -7.218332 -60.937614 +v 5.104136 -73.289055 5.104125 +v 46.216335 7.218351 -56.424606 +v 46.719048 0.000009 -56.927315 +v 46.216335 -7.218333 -56.424606 +v 49.831650 -21.377621 -49.831654 +v -61.754700 21.377623 33.242580 +v -63.699944 14.436678 34.048313 +v 55.833481 -14.436676 -45.821354 +v 54.082809 -21.377621 -44.651600 +v 54.002213 -34.715378 -36.083130 +v -17.774841 -70.472595 11.876755 +v -19.750340 -28.318563 -65.108170 +v -69.775276 7.218338 21.238892 +v -70.472542 -0.000003 21.377579 +v -69.775276 -7.218345 21.238888 +v 60.004044 -28.318569 -32.072842 +v 60.004044 -34.715382 -24.854494 +v -34.443264 -7.218331 -64.291046 +v -71.880798 -14.436685 7.079619 +v 65.108185 -28.318571 -19.750359 +v -64.947891 -34.715385 -0.000012 +v 55.833477 -46.719048 -11.105975 +v -67.173210 -21.377625 -20.161123 +v 64.356781 -34.715385 -6.001835 +v 60.937607 -41.112198 -6.001832 +v 56.336189 -46.719048 -6.001836 +v 46.719044 -56.927326 -0.000008 +v -69.815735 21.377630 -6.668883 +v -14.297973 72.578110 1.408238 +v -21.238918 70.472595 1.408236 +v -61.754688 -34.715382 -19.083311 +v -58.595783 -41.112194 -17.774858 +v 51.823181 -52.325901 5.104128 +v -43.162746 -56.927322 -17.878613 +v 34.048332 -64.947914 6.772627 +v -17.878603 56.927319 43.162766 +v -24.854485 -68.367081 13.284984 +v -55.833469 -14.436691 45.821323 +v 44.332527 -56.927330 14.022413 +v 39.152466 -61.528755 11.876765 +v 33.242592 -64.947914 9.428811 +v 19.750351 -70.472595 8.180853 +v -12.970596 -56.927319 -44.651581 +v -44.332523 21.377619 54.344643 +v -45.821350 14.436674 55.833458 +v -35.591743 -56.927322 -29.920359 +v -31.627087 -61.528748 -25.955709 +v 24.854488 -68.367081 13.284990 +v 19.083303 -70.472595 9.428807 +v 16.013954 -70.472595 14.022409 +v 11.105965 -72.578110 9.114420 +v 11.876769 70.472595 17.774857 +v -6.772628 -72.578110 -12.670710 +v 6.772632 72.578110 12.670715 +v 9.428815 70.472595 19.083313 +v 13.284993 64.947906 32.072838 +v -11.105953 -46.719040 -55.833466 +v -1.408226 72.578110 -14.297958 +v 8.180859 68.367073 26.968700 +v 9.428812 64.947906 33.242596 +v 6.001834 34.715397 -64.356758 +v 4.010289 64.947906 34.320404 +v 4.010287 61.528744 40.717209 +v 4.010290 56.927319 46.324066 +v -0.000005 46.719040 56.927319 +v -25.955688 56.927334 -38.845444 +v -5.104138 52.325893 51.823185 +v -12.670709 34.715374 63.699940 +v -20.161116 21.377617 67.173225 +v -20.966866 14.436672 69.118454 +v 14.297985 7.218354 -71.880829 +v -28.046509 -7.218353 67.710213 +v 20.161118 21.377640 -67.173248 +v 20.966864 14.436695 -69.118484 +v 21.238930 7.218353 -69.775314 +v -34.320408 -7.218352 64.356743 +v -39.152466 -21.377638 58.595795 +v -54.344635 -46.719044 -16.013969 +v 34.715385 0.000011 -64.947906 +v -45.821350 -14.436693 55.833450 +v 39.152473 -21.377619 -58.595821 +v -45.925095 -34.715393 45.925091 +v -20.966831 -14.436672 -69.118454 +v 7.079641 -73.289055 1.408217 +v -21.432461 56.927334 -41.263161 +v -11.876770 -70.472595 17.774828 +v 45.821358 -14.436674 -55.833485 +v 44.332531 -21.377619 -54.344662 +v 45.925106 -34.715378 -45.925110 +v -54.002197 -34.715393 36.083107 +v -60.004025 -28.318569 -32.072823 +v -6.668871 28.318586 -67.710213 +v 52.593987 -28.318567 -43.162777 +v -60.004028 -28.318581 32.072819 +v 47.333340 -46.719044 -31.627131 +v -52.593971 -46.719051 21.785122 +v -69.815712 -7.218338 -21.105576 +v 57.161114 -34.715382 -30.173248 +v 54.002213 -41.112194 -28.864784 +v 49.751053 -46.719044 -27.103901 +v -45.821335 -56.927326 9.114414 +v -63.699944 -14.436689 34.048306 +v -13.748510 -72.578110 4.170552 +v -61.754700 -21.377634 33.242573 +v 61.949284 -34.715382 -18.441896 +v 58.595814 -41.112194 -17.774847 +v 54.082809 -46.719044 -16.877159 +v 45.821354 -56.927326 -9.114443 +v -34.715363 -64.947914 -0.000018 +v -22.401827 64.947906 26.308369 +v -56.927296 -0.000008 46.718987 +v 51.823185 -52.325901 -5.104148 +v -40.717186 -61.528751 -4.010314 +v 34.715382 -64.947914 -0.000008 +v -20.966850 -70.472595 -4.170580 +v -69.815735 -21.377626 -6.668890 +v -32.072815 64.947914 13.284999 +v -69.118462 -21.377630 13.748503 +v 46.216331 -56.927326 5.104130 +v 40.717209 -61.528751 4.010289 +v 34.443314 -64.947914 2.762332 +v -20.556086 -70.472595 -5.524690 +v -34.715363 64.947914 0.000003 +v 26.968693 -68.367081 8.180853 +v -12.670698 -72.578110 -6.772643 +v -15.116255 70.472595 -15.116245 +v 12.670705 -72.578110 6.772622 +v -9.114424 72.578110 -11.105949 +v -12.970606 70.472595 -16.877134 +v -19.286812 64.947922 -28.864758 +v 9.114429 72.578110 11.105977 +v -13.284992 68.367088 -24.854469 +v 19.286825 64.947906 28.864796 +v -17.878586 56.927334 -43.162743 +v -47.333313 -46.719044 -31.627129 +v 13.284997 68.367073 24.854500 +v 15.732947 64.947906 30.764380 +v 17.878597 56.927319 43.162773 +v -11.105953 46.719055 -55.833450 +v -43.507385 -46.719055 36.289032 +v -58.595802 -21.377634 39.152454 +v 11.876762 61.528744 39.152473 +v 12.970610 56.927319 44.651596 +v 11.105964 46.719040 55.833481 +v -10.628798 64.947922 -32.878544 +v 5.104137 52.325893 51.823189 +v -60.004028 -34.715389 24.854469 +v -0.000003 34.715374 64.947906 +v -5.104142 46.719040 56.424603 +v -6.001838 41.112186 60.937607 +v -6.668880 34.715374 64.291077 +v -13.748522 21.377617 69.118462 +v -60.937595 -7.218349 40.717171 +v -15.116257 52.325909 -49.831635 +v -19.750345 28.318563 65.108177 +v -28.046509 7.218331 67.710213 +v 14.297985 -7.218330 -71.880829 +v -44.079617 -46.719040 -35.591770 +v -15.732935 64.947922 -30.764339 +v -32.878571 21.377619 61.949268 +v -34.048340 14.436673 63.699932 +v 21.377628 0.000011 -70.472595 +v 21.105562 -7.218330 -69.815765 +v 26.968695 -21.377617 -65.108185 +v -1.408228 -73.289055 7.079627 +v -19.286831 64.947906 28.864780 +v -63.699921 -14.436678 -34.048344 +v -51.823128 -7.218333 -51.823166 +v -44.332512 56.927330 -14.022415 +v -61.949257 -21.377623 -32.878574 +v -46.216324 7.218333 56.424568 +v 34.443321 -7.218331 -64.291084 +v 34.048340 -14.436673 -63.699963 +v 32.878578 -21.377619 -61.949291 +v 36.083122 -34.715378 -54.002216 +v -34.048317 -64.947914 -6.772650 +v -65.108170 -28.318579 19.750343 +v 6.668876 -73.289055 2.762328 +v -21.105549 70.472595 -2.762330 +v 43.162766 -28.318567 -52.593990 +v -54.082794 -21.377636 44.651569 +v 40.253693 -46.719040 -40.253700 +v -64.291061 7.218336 34.443275 +v -64.947876 -0.000006 34.715328 +v -31.627113 61.528748 25.955698 +v -64.291061 -7.218348 34.443275 +v 50.176270 -34.715378 -40.745056 +v 47.333336 -41.112190 -38.845467 +v 43.507393 -46.719040 -36.289055 +v 38.845467 -56.927322 -25.955721 +v -14.022419 70.472595 16.013962 +v 45.925110 -52.325897 -24.547493 +v 40.745056 -56.927322 -22.401842 +v -2.762336 -73.289055 -6.668883 +v -64.356758 -34.715385 6.001817 +v -60.937592 -41.112198 6.001810 +v 49.831650 -52.325897 -15.116276 +v -46.719025 -56.927326 -0.000016 +v 34.048336 -64.947914 -6.772643 +v 28.046507 -7.218331 -67.710251 +v -55.833462 -46.719048 11.105951 +v 46.324066 -56.927326 -4.010303 +v 40.717213 -61.528751 -4.010302 +v 34.320404 -64.947914 -4.010303 +v 21.377625 -70.472595 -0.000010 +v -20.556076 -21.377617 -67.053398 +v -44.332512 -56.927322 -14.022434 +v -39.152443 -61.528748 -11.876786 +v 28.046505 -68.367081 2.762330 +v 21.238926 -70.472595 1.408218 +v -30.173220 -64.947914 -16.838886 +v 20.161116 -70.472595 6.826741 +v 13.748517 -72.578110 4.170556 +v 17.774845 70.472595 11.876783 +v -11.105959 -72.578110 -9.114439 +v 11.105965 72.578110 9.114443 +v 16.013954 70.472595 14.022432 +v 24.547474 64.947906 24.547493 +v 14.022419 70.472595 16.013968 +v 17.878601 68.367081 21.785154 +v -13.284983 64.947922 -32.072800 +v 25.955704 56.927319 38.845470 +v -6.001816 46.719055 -56.336163 +v -8.180856 68.367088 -26.968672 +v 19.286821 61.528744 36.083134 +v 21.432476 56.927319 41.263187 +v 21.785135 46.719040 52.593987 +v -4.010281 64.947922 -34.320362 +v 15.116263 52.325893 49.831654 +v 12.670704 34.715374 63.699947 +v -11.876746 61.528759 -39.152424 +v -69.815712 7.218345 -21.105572 +v -12.970596 56.927334 -44.651566 +v 6.001826 46.719040 56.336189 +v 6.001822 41.112186 60.937607 +v 6.001827 34.715374 64.356773 +v -0.000004 21.377617 70.472580 +v -45.925098 52.325905 -24.547472 +v -52.593964 -28.318567 -43.162754 +v -6.668874 28.318563 67.710243 +v -14.297995 7.218330 71.880783 +v -13.748522 -21.377640 69.118462 +v -26.968681 68.367081 -8.180853 +v -56.336174 -46.719048 6.001814 +v -20.966866 -14.436695 69.118454 +v 13.748521 -21.377617 -69.118484 +v -24.854485 -34.715397 60.004025 +v -36.083107 61.528748 19.286821 +v -69.118462 -14.436687 20.966835 +v -41.263172 56.927322 21.432478 +v -67.053406 -21.377632 20.556078 +v 20.966864 -14.436672 -69.118484 +v 20.161118 -21.377617 -67.173248 +v 24.854490 -34.715374 -60.004051 +v -31.627121 -46.719055 47.333313 +v -34.443264 7.218352 -64.291046 +v -26.308371 -46.719055 50.176247 +v -21.785141 68.367081 17.878609 +v -7.218316 0.000012 -73.289017 +v 32.072830 -28.318565 -60.004055 +v -38.845459 -41.112206 47.333305 +v 31.627125 -46.719040 -47.333344 +v -33.035347 -56.927330 33.035332 +v 19.750351 70.472595 -8.180851 +v 7.079642 -73.289055 -1.408240 +v 41.263180 -34.715378 -49.751057 +v 38.845463 -41.112190 -47.333336 +v 35.591766 -46.719040 -44.079643 +v 33.035355 -56.927322 -33.035362 +v -38.845455 -56.927330 25.955687 +v 40.253700 -52.325897 -33.035362 +v 35.591770 -56.927322 -29.920362 +v 28.864788 -64.947914 -19.286842 +v -32.072815 -64.947914 13.284978 +v -44.651577 -56.927330 12.970594 +v 36.083126 -61.528748 -19.286840 +v 30.173244 -64.947914 -16.838890 +v -20.966852 -70.472595 4.170552 +v 44.651592 -56.927322 -12.970625 +v 39.152473 -61.528748 -11.876781 +v -28.046494 -68.367081 2.762324 +v 20.966860 -70.472595 -4.170578 +v -54.002186 34.715393 -36.083111 +v 28.046505 -68.367081 -2.762349 +v 21.105558 -70.472595 -2.762350 +v -19.750340 70.472595 -8.180850 +v 14.297981 -72.578110 1.408217 +v -12.670698 72.578110 -6.772619 +v 19.750351 70.472595 8.180876 +v -28.864761 64.947914 -19.286816 +v 12.670705 72.578110 6.772646 +v 18.441891 70.472595 10.628829 +v 28.864780 64.947914 19.286844 +v -33.035332 56.927330 -33.035336 +v 21.785141 68.367081 17.878616 +v 26.308365 64.947914 22.401844 +v 33.035347 56.927322 33.035362 +v -28.864777 64.947914 19.286831 +v -16.838860 -64.947906 -30.173241 +v -15.116261 70.472595 15.116268 +v 22.401825 64.947906 26.308382 +v 25.955698 61.528748 31.627132 +v 29.070704 56.927319 36.289055 +v 31.627117 46.719040 47.333336 +v -24.854469 34.715397 -60.004017 +v -49.751022 34.715393 -41.263165 +v -36.289028 -46.719040 -43.507389 +v 24.547482 52.325893 45.925114 +v -17.774820 41.112209 -58.595779 +v 24.854485 34.715374 60.004040 +v -13.748502 21.377640 -69.118454 +v -51.823174 -52.325901 -5.104148 +v -40.745029 56.927330 -22.401821 +v 16.877148 46.719040 54.082809 +v 6.668880 -28.318563 -67.710243 +v 18.441887 34.715374 61.949276 +v 13.748514 21.377617 69.118469 +v 0.000010 -64.947906 -34.715363 +v -67.710236 -28.318577 6.668870 +v 6.668879 28.318563 67.710243 +v -0.000017 7.218330 73.289017 +v -33.035351 -52.325909 40.253681 +v -24.854485 68.367081 13.285007 +v -6.668880 21.377617 69.815750 +v -7.079651 14.436672 71.880798 +v -14.297995 -7.218354 71.880783 +v -32.072819 -28.318584 60.004028 +v -28.864777 -64.947914 19.286808 +v -52.593971 46.719044 21.785137 +v -21.105570 7.218330 69.815727 +v -21.377638 -0.000011 70.472542 +v -21.105570 -7.218353 69.815727 +v -26.968689 -21.377640 65.108162 +v 12.670710 -34.715374 -63.699963 +v -18.441874 -34.715374 -61.949261 +v -34.048340 -14.436694 63.699924 +v 19.750353 -28.318563 -65.108192 +v 18.441895 -34.715374 -61.949291 +v 21.785145 -46.719040 -52.593994 +v 30.764372 -34.715378 -56.845150 +v 28.864784 -41.112190 -54.002220 +v -40.253685 -46.719055 40.253674 +v 25.955711 -56.927319 -38.845474 +v 7.218340 -73.289055 -0.000011 +v -8.180857 -70.472595 -19.750353 +v -50.176254 -34.715393 40.745033 +v 33.035355 -52.325893 -40.253708 +v 29.070713 -56.927319 -36.289059 +v 24.547483 -64.947906 -24.547493 +v -57.161095 -34.715389 30.173223 +v -54.002197 -41.112202 28.864756 +v 31.627125 -61.528748 -25.955717 +v -43.162758 -56.927330 17.878584 +v 17.774849 -70.472595 -11.876783 +v -11.876764 70.472595 -17.774826 +v -47.333328 -46.719051 31.627104 +v -26.308365 -64.947914 22.401806 +v 24.854492 -68.367081 -13.285013 +v 19.750351 -70.472595 -8.180874 +v -46.324051 -56.927326 4.010278 +v 33.242592 -64.947914 -9.428828 +v 26.968693 -68.367081 -8.180874 +v 20.161116 -70.472595 -6.826763 +v -61.949257 21.377634 -32.878567 +v -28.046494 -68.367081 -2.762354 +v 14.297981 -72.578110 -1.408239 +v -24.547476 -64.947922 24.547455 +v 20.966860 70.472595 4.170580 +v -13.748508 -72.578110 -4.170578 +v 13.748517 72.578110 4.170580 +v 20.161116 70.472595 6.826764 +v 32.072826 64.947914 13.285014 +v -43.162750 28.318583 -52.593960 +v -24.547472 -52.325893 -45.925110 +v -4.170569 70.472595 20.966866 +v -11.105959 72.578110 -9.114416 +v 24.854488 68.367081 13.285013 +v -24.547459 64.947922 -24.547459 +v 38.845459 56.927322 25.955719 +v -40.253685 52.325905 -33.035343 +v -33.242569 -64.947914 -9.428833 +v -17.878593 68.367081 -21.785122 +v 31.627113 61.528748 25.955719 +v 35.591763 56.927322 29.920362 +v 40.253685 46.719040 40.253700 +v -64.291061 -34.715385 -6.668888 +v -60.937588 -41.112198 -6.001848 +v -64.356758 34.715385 6.001828 +v -56.424591 -46.719048 -5.104152 +v -19.286800 61.528759 -36.083088 +v 33.035355 52.325893 40.253700 +v -21.785122 46.719055 -52.593964 +v 36.083118 34.715378 54.002209 +v -39.152451 61.528748 11.876765 +v -31.627113 -61.528755 25.955679 +v -44.651577 56.927322 12.970613 +v 27.103889 46.719040 49.751053 +v 28.864773 41.112190 54.002213 +v 30.173237 34.715378 57.161106 +v 26.968685 21.377617 65.108170 +v -41.263172 -34.715393 49.751034 +v -30.764366 34.715378 56.845135 +v -35.591763 -46.719055 44.079620 +v 19.750353 28.318563 65.108177 +v 0.000012 -56.927319 -46.719025 +v 14.297962 7.218330 71.880798 +v -14.022423 56.927319 44.332527 +v 7.079637 21.377617 69.775291 +v 7.079631 14.436672 71.880798 +v -0.000017 -7.218354 73.289017 +v 21.238905 -7.218353 69.775284 +v -71.880783 7.218339 14.297952 +v -7.079658 7.218330 72.591736 +v -7.218361 -0.000012 73.289001 +v -7.079658 -7.218354 72.591736 +vn -0.0097 0.9951 0.0980 +vn -0.0976 0.0975 0.9904 +vn -0.0286 -0.9565 0.2902 +vn -0.0938 0.2890 0.9527 +vn -0.0464 -0.8810 0.4709 +vn -0.0865 0.4696 0.8786 +vn -0.0624 -0.7715 0.6332 +vn -0.0759 0.6326 0.7708 +vn -0.0759 -0.6326 0.7708 +vn -0.0624 0.7715 0.6332 +vn -0.0865 -0.4696 0.8786 +vn -0.0464 0.8810 0.4709 +vn -0.0938 -0.2890 0.9527 +vn -0.0286 0.9565 0.2902 +vn -0.0975 -0.0975 0.9904 +vn -0.0097 -0.9951 0.0980 +vn -0.0846 0.9565 0.2790 +vn -0.2889 -0.0976 0.9524 +vn -0.0286 -0.9951 0.0942 +vn -0.0286 0.9951 0.0942 +vn -0.2889 0.0975 0.9524 +vn -0.0846 -0.9565 0.2790 +vn -0.2779 0.2890 0.9161 +vn -0.1374 -0.8810 0.4528 +vn -0.2563 0.4696 0.8448 +vn -0.1847 -0.7715 0.6088 +vn -0.2248 0.6326 0.7412 +vn -0.2248 -0.6326 0.7412 +vn -0.1847 0.7715 0.6088 +vn -0.2563 -0.4696 0.8448 +vn -0.1374 0.8810 0.4528 +vn -0.2779 -0.2890 0.9161 +vn -0.2999 -0.7715 0.5611 +vn -0.3651 0.6326 0.6831 +vn -0.3651 -0.6326 0.6831 +vn -0.2999 0.7715 0.5611 +vn -0.4162 -0.4696 0.7786 +vn -0.2230 0.8810 0.4173 +vn -0.4513 -0.2890 0.8443 +vn -0.1374 0.9565 0.2571 +vn -0.4691 -0.0975 0.8777 +vn -0.0464 -0.9951 0.0869 +vn -0.0464 0.9951 0.0869 +vn -0.4691 0.0975 0.8777 +vn -0.1374 -0.9565 0.2571 +vn -0.4513 0.2890 0.8443 +vn -0.2230 -0.8810 0.4173 +vn -0.4162 0.4696 0.7786 +vn -0.6314 -0.0975 0.7693 +vn -0.0625 -0.9951 0.0761 +vn -0.0625 0.9951 0.0761 +vn -0.6314 0.0975 0.7693 +vn -0.1850 -0.9565 0.2254 +vn -0.6073 0.2890 0.7400 +vn -0.3002 -0.8810 0.3658 +vn -0.5601 0.4696 0.6825 +vn -0.4036 -0.7715 0.4918 +vn -0.4913 0.6326 0.5987 +vn -0.4913 -0.6326 0.5987 +vn -0.4036 0.7715 0.4918 +vn -0.5601 -0.4696 0.6825 +vn -0.3002 0.8810 0.3658 +vn -0.6073 -0.2890 0.7400 +vn -0.1850 0.9565 0.2254 +vn -0.5987 0.6326 0.4913 +vn -0.5987 -0.6326 0.4913 +vn -0.4918 0.7715 0.4036 +vn -0.6825 -0.4696 0.5601 +vn -0.3658 0.8810 0.3002 +vn -0.7400 -0.2890 0.6073 +vn -0.2254 0.9565 0.1850 +vn -0.7693 -0.0975 0.6314 +vn -0.0761 -0.9951 0.0625 +vn -0.0761 0.9951 0.0625 +vn -0.7693 0.0975 0.6314 +vn -0.2254 -0.9565 0.1850 +vn -0.7400 0.2890 0.6073 +vn -0.3658 -0.8810 0.3002 +vn -0.6825 0.4696 0.5601 +vn -0.4918 -0.7715 0.4036 +vn -0.0869 0.9951 0.0464 +vn -0.8777 0.0975 0.4691 +vn -0.2571 -0.9565 0.1374 +vn -0.8443 0.2890 0.4513 +vn -0.4173 -0.8810 0.2231 +vn -0.7786 0.4696 0.4162 +vn -0.5611 -0.7715 0.2999 +vn -0.6831 0.6326 0.3651 +vn -0.6831 -0.6326 0.3651 +vn -0.5611 0.7715 0.2999 +vn -0.7786 -0.4696 0.4162 +vn -0.4173 0.8810 0.2231 +vn -0.8443 -0.2890 0.4513 +vn -0.2571 0.9565 0.1374 +vn -0.8777 -0.0975 0.4691 +vn -0.0869 -0.9951 0.0464 +vn -0.6088 0.7715 0.1847 +vn -0.8448 -0.4696 0.2563 +vn -0.4528 0.8810 0.1374 +vn -0.9161 -0.2890 0.2779 +vn -0.2790 0.9565 0.0846 +vn -0.9524 -0.0976 0.2889 +vn -0.0942 -0.9951 0.0286 +vn -0.0942 0.9951 0.0286 +vn -0.9524 0.0975 0.2889 +vn -0.2790 -0.9565 0.0846 +vn -0.9161 0.2890 0.2779 +vn -0.4528 -0.8810 0.1374 +vn -0.8448 0.4696 0.2563 +vn -0.6088 -0.7715 0.1847 +vn -0.7412 0.6326 0.2248 +vn -0.7412 -0.6326 0.2248 +vn -0.2902 -0.9565 0.0286 +vn -0.9527 0.2890 0.0938 +vn -0.4709 -0.8810 0.0464 +vn -0.8786 0.4696 0.0865 +vn -0.6332 -0.7715 0.0624 +vn -0.7708 0.6326 0.0759 +vn -0.7708 -0.6326 0.0759 +vn -0.6332 0.7715 0.0624 +vn -0.8786 -0.4696 0.0865 +vn -0.4709 0.8810 0.0464 +vn -0.9527 -0.2890 0.0938 +vn -0.2902 0.9565 0.0286 +vn -0.9904 -0.0976 0.0975 +vn -0.0980 -0.9951 0.0097 +vn -0.0980 0.9951 0.0097 +vn -0.9904 0.0975 0.0975 +vn -0.8786 -0.4696 -0.0865 +vn -0.4709 0.8810 -0.0464 +vn -0.9527 -0.2890 -0.0938 +vn -0.2902 0.9565 -0.0286 +vn -0.9904 -0.0975 -0.0975 +vn -0.0980 -0.9951 -0.0097 +vn -0.0980 0.9951 -0.0096 +vn -0.9904 0.0975 -0.0976 +vn -0.2902 -0.9565 -0.0286 +vn -0.9527 0.2890 -0.0938 +vn -0.4709 -0.8810 -0.0464 +vn -0.8786 0.4696 -0.0865 +vn -0.6332 -0.7715 -0.0624 +vn -0.7708 0.6326 -0.0759 +vn -0.7708 -0.6326 -0.0759 +vn -0.6332 0.7715 -0.0624 +vn -0.9161 0.2890 -0.2779 +vn -0.4528 -0.8810 -0.1374 +vn -0.8448 0.4696 -0.2563 +vn -0.6088 -0.7715 -0.1847 +vn -0.7412 0.6326 -0.2248 +vn -0.7412 -0.6326 -0.2248 +vn -0.6088 0.7715 -0.1847 +vn -0.8448 -0.4696 -0.2563 +vn -0.4528 0.8810 -0.1373 +vn -0.9161 -0.2890 -0.2779 +vn -0.2790 0.9566 -0.0846 +vn -0.9524 -0.0975 -0.2889 +vn -0.0942 -0.9951 -0.0286 +vn -0.0942 0.9951 -0.0286 +vn -0.9524 0.0975 -0.2889 +vn -0.2790 -0.9565 -0.0846 +vn -0.4173 0.8810 -0.2231 +vn -0.8443 -0.2890 -0.4513 +vn -0.2571 0.9565 -0.1374 +vn -0.8777 -0.0975 -0.4691 +vn -0.0869 -0.9951 -0.0464 +vn -0.0869 0.9951 -0.0464 +vn -0.8777 0.0975 -0.4691 +vn -0.2571 -0.9565 -0.1374 +vn -0.8443 0.2890 -0.4513 +vn -0.4173 -0.8810 -0.2231 +vn -0.7786 0.4696 -0.4162 +vn -0.5611 -0.7715 -0.2999 +vn -0.6831 0.6326 -0.3651 +vn -0.6831 -0.6326 -0.3651 +vn -0.5611 0.7715 -0.2999 +vn -0.7786 -0.4696 -0.4162 +vn -0.3658 -0.8810 -0.3002 +vn -0.6825 0.4696 -0.5601 +vn -0.4918 -0.7715 -0.4036 +vn -0.5987 0.6326 -0.4913 +vn -0.5987 -0.6326 -0.4913 +vn -0.4918 0.7715 -0.4036 +vn -0.6825 -0.4696 -0.5601 +vn -0.3658 0.8810 -0.3002 +vn -0.7400 -0.2890 -0.6073 +vn -0.2254 0.9566 -0.1850 +vn -0.7693 -0.0975 -0.6314 +vn -0.0761 -0.9951 -0.0625 +vn -0.0761 0.9951 -0.0625 +vn -0.7693 0.0975 -0.6314 +vn -0.2254 -0.9565 -0.1850 +vn -0.7400 0.2890 -0.6073 +vn -0.6073 -0.2890 -0.7400 +vn -0.1850 0.9566 -0.2254 +vn -0.6314 -0.0975 -0.7693 +vn -0.0625 -0.9951 -0.0761 +vn -0.0625 0.9951 -0.0761 +vn -0.6314 0.0975 -0.7693 +vn -0.1850 -0.9565 -0.2254 +vn -0.6073 0.2890 -0.7400 +vn -0.3002 -0.8810 -0.3658 +vn -0.5601 0.4696 -0.6825 +vn -0.4036 -0.7715 -0.4918 +vn -0.4913 0.6326 -0.5987 +vn -0.4913 -0.6326 -0.5987 +vn -0.4036 0.7715 -0.4918 +vn -0.5601 -0.4696 -0.6825 +vn -0.3002 0.8810 -0.3658 +vn -0.4162 0.4696 -0.7786 +vn -0.2999 -0.7715 -0.5611 +vn -0.3651 0.6326 -0.6831 +vn -0.3651 -0.6326 -0.6831 +vn -0.2999 0.7715 -0.5611 +vn -0.4162 -0.4696 -0.7786 +vn -0.2231 0.8810 -0.4173 +vn -0.4513 -0.2890 -0.8443 +vn -0.1374 0.9566 -0.2571 +vn -0.4691 -0.0975 -0.8777 +vn -0.0464 -0.9951 -0.0869 +vn -0.0464 0.9951 -0.0869 +vn -0.4691 0.0975 -0.8777 +vn -0.1374 -0.9565 -0.2571 +vn -0.4513 0.2890 -0.8443 +vn -0.2230 -0.8810 -0.4173 +vn -0.0846 0.9565 -0.2790 +vn -0.2889 -0.0975 -0.9524 +vn -0.0286 -0.9951 -0.0942 +vn -0.0286 0.9951 -0.0942 +vn -0.2889 0.0975 -0.9524 +vn -0.0846 -0.9565 -0.2790 +vn -0.2779 0.2890 -0.9161 +vn -0.1374 -0.8810 -0.4528 +vn -0.2563 0.4696 -0.8448 +vn -0.1847 -0.7715 -0.6088 +vn -0.2248 0.6326 -0.7412 +vn -0.2248 -0.6326 -0.7412 +vn -0.1847 0.7715 -0.6088 +vn -0.2563 -0.4696 -0.8448 +vn -0.1374 0.8810 -0.4528 +vn -0.2779 -0.2890 -0.9161 +vn -0.0759 0.6326 -0.7708 +vn -0.0759 -0.6326 -0.7708 +vn -0.0624 0.7715 -0.6332 +vn -0.0865 -0.4696 -0.8786 +vn -0.0464 0.8810 -0.4709 +vn -0.0938 -0.2890 -0.9527 +vn -0.0286 0.9565 -0.2902 +vn -0.0975 -0.0975 -0.9904 +vn -0.0097 -0.9951 -0.0980 +vn -0.0097 0.9951 -0.0980 +vn -0.0976 0.0975 -0.9904 +vn -0.0286 -0.9565 -0.2902 +vn -0.0938 0.2890 -0.9527 +vn -0.0464 -0.8810 -0.4709 +vn -0.0865 0.4696 -0.8786 +vn -0.0624 -0.7715 -0.6332 +vn 0.0097 -0.9951 -0.0980 +vn 0.0097 0.9951 -0.0980 +vn 0.0975 0.0975 -0.9904 +vn 0.0286 -0.9565 -0.2902 +vn 0.0938 0.2890 -0.9527 +vn 0.0464 -0.8810 -0.4709 +vn 0.0865 0.4696 -0.8786 +vn 0.0624 -0.7715 -0.6332 +vn 0.0759 0.6326 -0.7708 +vn 0.0759 -0.6326 -0.7708 +vn 0.0624 0.7715 -0.6332 +vn 0.0865 -0.4696 -0.8786 +vn 0.0464 0.8810 -0.4709 +vn 0.0938 -0.2890 -0.9527 +vn 0.0286 0.9565 -0.2902 +vn 0.0976 -0.0975 -0.9904 +vn 0.2248 -0.6326 -0.7412 +vn 0.1847 0.7715 -0.6088 +vn 0.2563 -0.4696 -0.8448 +vn 0.1374 0.8810 -0.4528 +vn 0.2779 -0.2890 -0.9161 +vn 0.0846 0.9565 -0.2790 +vn 0.2889 -0.0975 -0.9524 +vn 0.0286 -0.9951 -0.0942 +vn 0.0286 0.9951 -0.0942 +vn 0.2889 0.0975 -0.9524 +vn 0.0846 -0.9565 -0.2790 +vn 0.2779 0.2890 -0.9161 +vn 0.1374 -0.8810 -0.4528 +vn 0.2563 0.4696 -0.8448 +vn 0.1847 -0.7715 -0.6088 +vn 0.2248 0.6326 -0.7412 +vn 0.4691 0.0975 -0.8777 +vn 0.1374 -0.9565 -0.2571 +vn 0.4513 0.2890 -0.8443 +vn 0.2231 -0.8810 -0.4173 +vn 0.4162 0.4696 -0.7786 +vn 0.2999 -0.7715 -0.5611 +vn 0.3651 0.6326 -0.6831 +vn 0.3651 -0.6326 -0.6831 +vn 0.2999 0.7715 -0.5611 +vn 0.4162 -0.4696 -0.7786 +vn 0.2230 0.8810 -0.4173 +vn 0.4513 -0.2890 -0.8443 +vn 0.1374 0.9565 -0.2571 +vn 0.4691 -0.0975 -0.8777 +vn 0.0464 -0.9951 -0.0869 +vn 0.0464 0.9951 -0.0869 +vn 0.4036 0.7715 -0.4918 +vn 0.5601 -0.4696 -0.6825 +vn 0.3002 0.8810 -0.3658 +vn 0.6073 -0.2890 -0.7400 +vn 0.1850 0.9565 -0.2254 +vn 0.6314 -0.0975 -0.7693 +vn 0.0625 -0.9951 -0.0761 +vn 0.0625 0.9951 -0.0761 +vn 0.6314 0.0975 -0.7693 +vn 0.1850 -0.9565 -0.2254 +vn 0.6073 0.2890 -0.7400 +vn 0.3002 -0.8810 -0.3658 +vn 0.5601 0.4696 -0.6825 +vn 0.4036 -0.7715 -0.4918 +vn 0.4913 0.6326 -0.5987 +vn 0.4913 -0.6326 -0.5987 +vn 0.2254 -0.9565 -0.1850 +vn 0.7400 0.2890 -0.6073 +vn 0.3658 -0.8810 -0.3002 +vn 0.6825 0.4696 -0.5601 +vn 0.4918 -0.7715 -0.4036 +vn 0.5987 0.6326 -0.4913 +vn 0.5987 -0.6326 -0.4913 +vn 0.4918 0.7715 -0.4036 +vn 0.6825 -0.4696 -0.5601 +vn 0.3658 0.8810 -0.3002 +vn 0.7400 -0.2890 -0.6073 +vn 0.2254 0.9565 -0.1850 +vn 0.7693 -0.0975 -0.6314 +vn 0.0761 -0.9951 -0.0625 +vn 0.0761 0.9951 -0.0625 +vn 0.7693 0.0975 -0.6314 +vn 0.7786 -0.4696 -0.4162 +vn 0.4173 0.8810 -0.2230 +vn 0.8443 -0.2890 -0.4513 +vn 0.2571 0.9565 -0.1374 +vn 0.8777 -0.0975 -0.4691 +vn 0.0869 -0.9951 -0.0464 +vn 0.0869 0.9951 -0.0464 +vn 0.8777 0.0975 -0.4691 +vn 0.2571 -0.9565 -0.1374 +vn 0.8443 0.2890 -0.4513 +vn 0.4173 -0.8810 -0.2231 +vn 0.7786 0.4696 -0.4162 +vn 0.5611 -0.7715 -0.2999 +vn 0.6831 0.6326 -0.3651 +vn 0.6831 -0.6326 -0.3651 +vn 0.5611 0.7715 -0.2999 +vn 0.9161 0.2890 -0.2779 +vn 0.4528 -0.8810 -0.1374 +vn 0.8448 0.4696 -0.2563 +vn 0.6088 -0.7715 -0.1847 +vn 0.7412 0.6326 -0.2248 +vn 0.7412 -0.6326 -0.2248 +vn 0.6088 0.7715 -0.1847 +vn 0.8448 -0.4696 -0.2563 +vn 0.4528 0.8810 -0.1374 +vn 0.9161 -0.2890 -0.2779 +vn 0.2790 0.9565 -0.0846 +vn 0.9524 -0.0975 -0.2889 +vn 0.0942 -0.9951 -0.0286 +vn 0.0942 0.9951 -0.0286 +vn 0.9524 0.0975 -0.2889 +vn 0.2790 -0.9565 -0.0846 +vn 0.4709 0.8810 -0.0464 +vn 0.9527 -0.2890 -0.0938 +vn 0.2902 0.9565 -0.0286 +vn 0.9904 -0.0975 -0.0975 +vn 0.0980 -0.9951 -0.0096 +vn 0.0980 0.9951 -0.0096 +vn 0.9904 0.0975 -0.0975 +vn 0.2902 -0.9565 -0.0286 +vn 0.9527 0.2890 -0.0938 +vn 0.4709 -0.8810 -0.0464 +vn 0.8786 0.4696 -0.0865 +vn 0.6332 -0.7715 -0.0624 +vn 0.7708 0.6326 -0.0759 +vn 0.7708 -0.6326 -0.0759 +vn 0.6332 0.7715 -0.0624 +vn 0.8786 -0.4696 -0.0865 +vn 0.8786 0.4696 0.0865 +vn 0.6332 -0.7715 0.0624 +vn 0.7708 0.6326 0.0759 +vn 0.7708 -0.6326 0.0759 +vn 0.6332 0.7715 0.0624 +vn 0.8786 -0.4696 0.0865 +vn 0.4709 0.8810 0.0464 +vn 0.9527 -0.2890 0.0938 +vn 0.2902 0.9565 0.0286 +vn 0.9904 -0.0975 0.0975 +vn 0.0980 -0.9951 0.0097 +vn 0.0980 0.9951 0.0096 +vn 0.9904 0.0975 0.0975 +vn 0.2902 -0.9565 0.0286 +vn 0.9527 0.2890 0.0938 +vn 0.4709 -0.8810 0.0464 +vn 0.2790 0.9565 0.0846 +vn 0.9524 -0.0975 0.2889 +vn 0.0942 -0.9951 0.0286 +vn 0.0942 0.9951 0.0286 +vn 0.9524 0.0975 0.2889 +vn 0.2790 -0.9565 0.0846 +vn 0.9161 0.2890 0.2779 +vn 0.4528 -0.8810 0.1374 +vn 0.8448 0.4696 0.2563 +vn 0.6088 -0.7715 0.1847 +vn 0.7412 0.6326 0.2248 +vn 0.7412 -0.6326 0.2248 +vn 0.6088 0.7715 0.1847 +vn 0.8448 -0.4696 0.2563 +vn 0.4528 0.8810 0.1374 +vn 0.9161 -0.2890 0.2779 +vn 0.5611 -0.7715 0.2999 +vn 0.6831 0.6326 0.3651 +vn 0.6831 -0.6326 0.3651 +vn 0.5611 0.7715 0.2999 +vn 0.7786 -0.4696 0.4162 +vn 0.4173 0.8810 0.2230 +vn 0.8443 -0.2890 0.4513 +vn 0.2571 0.9565 0.1374 +vn 0.8777 -0.0975 0.4691 +vn 0.0869 -0.9951 0.0464 +vn 0.0869 0.9951 0.0464 +vn 0.8777 0.0975 0.4691 +vn 0.2571 -0.9565 0.1374 +vn 0.8443 0.2890 0.4513 +vn 0.4173 -0.8810 0.2231 +vn 0.7786 0.4696 0.4162 +vn 0.7693 -0.0975 0.6314 +vn 0.0761 -0.9951 0.0625 +vn 0.0761 0.9951 0.0625 +vn 0.7693 0.0975 0.6314 +vn 0.2254 -0.9565 0.1850 +vn 0.7400 0.2890 0.6073 +vn 0.3658 -0.8810 0.3002 +vn 0.6825 0.4696 0.5601 +vn 0.4918 -0.7715 0.4036 +vn 0.5987 0.6326 0.4913 +vn 0.5987 -0.6326 0.4913 +vn 0.4918 0.7715 0.4036 +vn 0.6825 -0.4696 0.5601 +vn 0.3658 0.8810 0.3002 +vn 0.7400 -0.2890 0.6073 +vn 0.2254 0.9565 0.1850 +vn 0.4913 0.6326 0.5987 +vn 0.4913 -0.6326 0.5987 +vn 0.4036 0.7715 0.4918 +vn 0.5601 -0.4696 0.6825 +vn 0.3002 0.8810 0.3658 +vn 0.6073 -0.2890 0.7400 +vn 0.1850 0.9565 0.2254 +vn 0.6314 -0.0975 0.7693 +vn 0.0625 -0.9951 0.0761 +vn 0.0625 0.9951 0.0761 +vn 0.6314 0.0975 0.7693 +vn 0.1850 -0.9565 0.2254 +vn 0.6073 0.2890 0.7400 +vn 0.3002 -0.8810 0.3658 +vn 0.5601 0.4696 0.6825 +vn 0.4036 -0.7715 0.4918 +vn 0.0464 -0.9951 0.0869 +vn 0.0464 0.9951 0.0869 +vn 0.4691 0.0975 0.8777 +vn 0.1374 -0.9565 0.2571 +vn 0.4513 0.2890 0.8443 +vn 0.2231 -0.8810 0.4173 +vn 0.4162 0.4696 0.7786 +vn 0.2999 -0.7715 0.5611 +vn 0.3651 0.6326 0.6831 +vn 0.3651 -0.6326 0.6831 +vn 0.2999 0.7715 0.5611 +vn 0.4162 -0.4696 0.7786 +vn 0.2231 0.8810 0.4173 +vn 0.4513 -0.2890 0.8443 +vn 0.1374 0.9566 0.2571 +vn 0.4691 -0.0975 0.8777 +vn 0.2248 -0.6326 0.7412 +vn 0.1847 0.7715 0.6088 +vn 0.2563 -0.4696 0.8448 +vn 0.1374 0.8810 0.4528 +vn 0.2779 -0.2890 0.9161 +vn 0.0846 0.9565 0.2790 +vn 0.2889 -0.0975 0.9524 +vn 0.0286 -0.9951 0.0942 +vn 0.0286 0.9951 0.0942 +vn 0.2889 0.0975 0.9524 +vn 0.0846 -0.9565 0.2790 +vn 0.2779 0.2890 0.9161 +vn 0.1374 -0.8810 0.4528 +vn 0.2563 0.4696 0.8448 +vn 0.1847 -0.7715 0.6088 +vn 0.2248 0.6326 0.7412 +vn 0.0976 0.0975 0.9904 +vn 0.0286 -0.9565 0.2902 +vn 0.0938 0.2890 0.9527 +vn 0.0464 -0.8810 0.4709 +vn 0.0865 0.4696 0.8786 +vn 0.0624 -0.7715 0.6332 +vn 0.0759 0.6326 0.7708 +vn 0.0759 -0.6326 0.7708 +vn 0.0624 0.7715 0.6332 +vn 0.0865 -0.4696 0.8786 +vn 0.0464 0.8810 0.4709 +vn 0.0938 -0.2890 0.9527 +vn 0.0286 0.9565 0.2902 +vn 0.0976 -0.0976 0.9904 +vn 0.0097 -0.9951 0.0980 +vn 0.0097 0.9951 0.0980 +vn -0.0975 0.0976 0.9904 +vn -0.0846 -0.9566 0.2790 +vn -0.2231 0.8810 0.4173 +vn -0.1374 -0.9566 0.2571 +vn -0.1850 0.9566 0.2254 +vn -0.2254 -0.9566 0.1850 +vn -0.2571 -0.9566 0.1374 +vn -0.4173 -0.8810 0.2230 +vn -0.4173 0.8810 0.2230 +vn -0.9524 -0.0975 0.2889 +vn -0.9524 0.0976 0.2889 +vn -0.9904 -0.0975 0.0975 +vn -0.9904 0.0976 0.0975 +vn -0.9904 -0.0975 -0.0976 +vn -0.9904 0.0975 -0.0975 +vn -0.4528 -0.8810 -0.1373 +vn -0.4528 0.8810 -0.1374 +vn -0.2790 0.9565 -0.0846 +vn -0.2254 0.9565 -0.1850 +vn -0.1850 0.9565 -0.2254 +vn -0.1850 -0.9566 -0.2254 +vn -0.2230 0.8810 -0.4173 +vn -0.1374 0.9565 -0.2571 +vn -0.0976 -0.0975 -0.9904 +vn -0.0975 0.0975 -0.9904 +vn 0.0976 0.0975 -0.9904 +vn 0.0975 -0.0975 -0.9904 +vn 0.2230 -0.8810 -0.4173 +vn 0.2231 0.8810 -0.4173 +vn 0.4173 -0.8810 -0.2230 +vn 0.4173 0.8810 0.2231 +vn 0.4173 -0.8810 0.2230 +vn 0.1374 -0.9566 0.2571 +vn 0.2230 0.8810 0.4173 +vn 0.1374 0.9565 0.2571 +vn 0.0976 0.0976 0.9904 +vn 0.0976 -0.0975 0.9904 +vn 0.2254 -0.9566 0.1850 +vn 0.9904 0.0975 0.0976 +vn 0.9904 -0.0975 0.0976 +vn 0.9524 -0.0976 -0.2889 +vn 0.2571 -0.9565 -0.1375 +vn 0.2571 -0.9566 -0.1374 +vn 0.4692 0.0975 -0.8777 +vn -0.1374 -0.9566 -0.2571 +vn -0.2254 -0.9566 -0.1850 +vn -0.4173 -0.8810 -0.2230 +vn -0.2571 -0.9566 -0.1374 +vn -0.8777 -0.0976 -0.4691 +vn -0.4173 0.8810 -0.2230 +vn -0.9524 -0.0976 -0.2889 +vn -0.9904 -0.0975 0.0976 +vn -0.8777 -0.0976 0.4691 +vn -0.2571 -0.9565 0.1375 +vn -0.7693 -0.0976 0.6314 +vn -0.1850 -0.9566 0.2254 +vn -0.2231 -0.8810 0.4173 +vn -0.2889 -0.0975 0.9524 +vn -0.0976 -0.0976 0.9904 +vn -0.0975 0.0975 0.9904 +vn 0.2230 -0.8810 0.4173 +vn 0.1850 0.9566 0.2254 +vn 0.0980 0.9951 0.0097 +vn 0.0980 -0.9951 0.0096 +vn 0.0980 0.9951 -0.0097 +vn 0.0980 -0.9951 -0.0097 +vn 0.9524 0.0976 -0.2889 +vn 0.4173 0.8810 -0.2231 +vn 0.2254 -0.9566 -0.1850 +vn 0.4692 -0.0975 -0.8777 +vn 0.1374 0.9566 -0.2571 +vn -0.0846 0.9566 -0.2790 +vn -0.8777 0.0976 -0.4691 +vn -0.2571 0.9566 -0.1374 +vn -0.9524 0.0976 -0.2889 +vn -0.0980 0.9951 -0.0097 +vn -0.0980 -0.9951 -0.0096 +vn -0.9904 0.0975 0.0976 +vn -0.0980 0.9951 0.0096 +vn -0.0980 -0.9951 0.0096 +vn -0.2571 0.9566 0.1374 +vn -0.8777 0.0976 0.4691 +vn -0.7693 0.0976 0.6314 +vn -0.6314 -0.0976 0.7693 +vn -0.2889 0.0976 0.9524 +vn -0.0976 -0.0975 0.9904 +vt 0.750000 0.812500 +vt 0.750000 0.687500 +vt 0.750000 0.562500 +vt 0.750000 0.500000 +vt 0.750000 0.437500 +vt 0.750000 0.312500 +vt 0.718750 0.937500 +vt 0.718750 0.875000 +vt 0.718750 0.812500 +vt 0.718750 0.750000 +vt 0.718750 0.687500 +vt 0.718750 0.625000 +vt 0.718750 0.562500 +vt 0.718750 0.500000 +vt 0.718750 0.437500 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.718750 0.250000 +vt 0.718750 0.187500 +vt 0.718750 0.125000 +vt 0.718750 0.062500 +vt 0.687500 0.937500 +vt 0.687500 0.875000 +vt 0.687500 0.812500 +vt 0.687500 0.750000 +vt 0.687500 0.687500 +vt 0.687500 0.625000 +vt 0.687500 0.562500 +vt 0.687500 0.500000 +vt 0.687500 0.437500 +vt 0.687500 0.375000 +vt 0.687500 0.312500 +vt 0.687500 0.250000 +vt 0.687500 0.187500 +vt 0.687500 0.125000 +vt 0.687500 0.062500 +vt 0.656250 0.937500 +vt 0.656250 0.875000 +vt 0.656250 0.812500 +vt 0.656250 0.750000 +vt 0.656250 0.687500 +vt 0.656250 0.625000 +vt 0.656250 0.562500 +vt 0.656250 0.500000 +vt 0.656250 0.437500 +vt 0.656250 0.375000 +vt 0.656250 0.312500 +vt 0.656250 0.250000 +vt 0.656250 0.187500 +vt 0.656250 0.125000 +vt 0.656250 0.062500 +vt 0.625000 0.937500 +vt 0.625000 0.875000 +vt 0.625000 0.812500 +vt 0.625000 0.750000 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.625000 0.562500 +vt 0.625000 0.500000 +vt 0.625000 0.437500 +vt 0.625000 0.375000 +vt 0.625000 0.312500 +vt 0.625000 0.250000 +vt 0.625000 0.187500 +vt 0.625000 0.125000 +vt 0.625000 0.062500 +vt 0.593750 0.937500 +vt 0.593750 0.875000 +vt 0.593750 0.812500 +vt 0.593750 0.750000 +vt 0.593750 0.687500 +vt 0.593750 0.625000 +vt 0.593750 0.562500 +vt 0.593750 0.500000 +vt 0.593750 0.437500 +vt 0.593750 0.375000 +vt 0.593750 0.312500 +vt 0.593750 0.250000 +vt 0.593750 0.187500 +vt 0.593750 0.125000 +vt 0.593750 0.062500 +vt 0.765625 1.000000 +vt 0.796875 1.000000 +vt 0.828125 1.000000 +vt 0.859375 1.000000 +vt 0.890625 1.000000 +vt 0.921875 1.000000 +vt 0.953125 1.000000 +vt 0.984375 1.000000 +vt 0.015625 1.000000 +vt 0.046875 1.000000 +vt 0.078125 1.000000 +vt 0.109375 1.000000 +vt 0.140625 1.000000 +vt 0.171875 1.000000 +vt 0.203125 1.000000 +vt 0.234375 1.000000 +vt 0.265625 1.000000 +vt 0.296875 1.000000 +vt 0.328125 1.000000 +vt 0.359375 1.000000 +vt 0.390625 1.000000 +vt 0.421875 1.000000 +vt 0.453125 1.000000 +vt 0.484375 1.000000 +vt 0.515625 1.000000 +vt 0.546875 1.000000 +vt 0.578125 1.000000 +vt 0.609375 1.000000 +vt 0.640625 1.000000 +vt 0.671875 1.000000 +vt 0.703125 1.000000 +vt 0.734375 1.000000 +vt 0.562500 0.937500 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.562500 0.750000 +vt 0.562500 0.687500 +vt 0.562500 0.625000 +vt 0.562500 0.562500 +vt 0.562500 0.500000 +vt 0.562500 0.437500 +vt 0.562500 0.375000 +vt 0.562500 0.312500 +vt 0.562500 0.250000 +vt 0.562500 0.187500 +vt 0.562500 0.125000 +vt 0.562500 0.062500 +vt 0.531250 0.937500 +vt 0.531250 0.875000 +vt 0.531250 0.812500 +vt 0.531250 0.750000 +vt 0.531250 0.687500 +vt 0.531250 0.625000 +vt 0.531250 0.562500 +vt 0.531250 0.500000 +vt 0.531250 0.437500 +vt 0.531250 0.375000 +vt 0.531250 0.312500 +vt 0.531250 0.250000 +vt 0.531250 0.187500 +vt 0.531250 0.125000 +vt 0.531250 0.062500 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.500000 0.812500 +vt 0.500000 0.750000 +vt 0.500000 0.687500 +vt 0.500000 0.625000 +vt 0.500000 0.562500 +vt 0.500000 0.500000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.500000 0.312500 +vt 0.500000 0.250000 +vt 0.500000 0.187500 +vt 0.500000 0.125000 +vt 0.500000 0.062500 +vt 0.468750 0.937500 +vt 0.468750 0.875000 +vt 0.468750 0.812500 +vt 0.468750 0.750000 +vt 0.468750 0.687500 +vt 0.468750 0.625000 +vt 0.468750 0.562500 +vt 0.468750 0.500000 +vt 0.468750 0.437500 +vt 0.468750 0.375000 +vt 0.468750 0.312500 +vt 0.468750 0.250000 +vt 0.468750 0.187500 +vt 0.468750 0.125000 +vt 0.468750 0.062500 +vt 0.437500 0.937500 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.750000 +vt 0.437500 0.687500 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.437500 0.500000 +vt 0.437500 0.437500 +vt 0.437500 0.375000 +vt 0.437500 0.312500 +vt 0.437500 0.250000 +vt 0.437500 0.187500 +vt 0.437500 0.125000 +vt 0.437500 0.062500 +vt 0.406250 0.937500 +vt 0.406250 0.875000 +vt 0.406250 0.812500 +vt 0.406250 0.750000 +vt 0.406250 0.687500 +vt 0.406250 0.625000 +vt 0.406250 0.562500 +vt 0.406250 0.500000 +vt 0.406250 0.437500 +vt 0.406250 0.375000 +vt 0.406250 0.312500 +vt 0.406250 0.250000 +vt 0.406250 0.187500 +vt 0.406250 0.125000 +vt 0.406250 0.062500 +vt 0.375000 0.937500 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.375000 0.750000 +vt 0.375000 0.687500 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.375000 0.375000 +vt 0.375000 0.312500 +vt 0.375000 0.250000 +vt 0.375000 0.187500 +vt 0.375000 0.125000 +vt 0.375000 0.062500 +vt 0.343750 0.937500 +vt 0.343750 0.875000 +vt 0.343750 0.812500 +vt 0.343750 0.750000 +vt 0.343750 0.687500 +vt 0.343750 0.625000 +vt 0.343750 0.562500 +vt 0.343750 0.500000 +vt 0.343750 0.437500 +vt 0.343750 0.375000 +vt 0.343750 0.312500 +vt 0.343750 0.250000 +vt 0.343750 0.187500 +vt 0.343750 0.125000 +vt 0.343750 0.062500 +vt 0.312500 0.937500 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.312500 0.750000 +vt 0.312500 0.687500 +vt 0.312500 0.625000 +vt 0.312500 0.562500 +vt 0.312500 0.500000 +vt 0.312500 0.437500 +vt 0.312500 0.375000 +vt 0.312500 0.312500 +vt 0.312500 0.250000 +vt 0.312500 0.187500 +vt 0.312500 0.125000 +vt 0.312500 0.062500 +vt 0.281250 0.937500 +vt 0.281250 0.875000 +vt 0.281250 0.812500 +vt 0.281250 0.750000 +vt 0.281250 0.687500 +vt 0.281250 0.625000 +vt 0.281250 0.562500 +vt 0.281250 0.500000 +vt 0.281250 0.437500 +vt 0.281250 0.375000 +vt 0.281250 0.312500 +vt 0.281250 0.250000 +vt 0.281250 0.187500 +vt 0.281250 0.125000 +vt 0.281250 0.062500 +vt 0.250000 0.937500 +vt 0.250000 0.875000 +vt 0.250000 0.812500 +vt 0.250000 0.750000 +vt 0.250000 0.687500 +vt 0.250000 0.625000 +vt 0.250000 0.562500 +vt 0.250000 0.500000 +vt 0.250000 0.437500 +vt 0.250000 0.375000 +vt 0.250000 0.312500 +vt 0.250000 0.250000 +vt 0.250000 0.187500 +vt 0.250000 0.125000 +vt 0.250000 0.062500 +vt 0.218750 0.937500 +vt 0.218750 0.875000 +vt 0.218750 0.812500 +vt 0.218750 0.750000 +vt 0.218750 0.687500 +vt 0.218750 0.625000 +vt 0.218750 0.562500 +vt 0.218750 0.500000 +vt 0.218750 0.437500 +vt 0.218750 0.375000 +vt 0.218750 0.312500 +vt 0.218750 0.250000 +vt 0.218750 0.187500 +vt 0.218750 0.125000 +vt 0.218750 0.062500 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.187500 0.750000 +vt 0.187500 0.687500 +vt 0.187500 0.625000 +vt 0.187500 0.562500 +vt 0.187500 0.500000 +vt 0.187500 0.437500 +vt 0.187500 0.375000 +vt 0.187500 0.312500 +vt 0.187500 0.250000 +vt 0.187500 0.187500 +vt 0.187500 0.125000 +vt 0.187500 0.062500 +vt 0.156250 0.937500 +vt 0.156250 0.875000 +vt 0.156250 0.812500 +vt 0.156250 0.750000 +vt 0.156250 0.687500 +vt 0.156250 0.625000 +vt 0.156250 0.562500 +vt 0.156250 0.500000 +vt 0.156250 0.437500 +vt 0.156250 0.375000 +vt 0.156250 0.312500 +vt 0.156250 0.250000 +vt 0.156250 0.187500 +vt 0.156250 0.125000 +vt 0.156250 0.062500 +vt 0.125000 0.937500 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.125000 0.687500 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.125000 0.500000 +vt 0.125000 0.437500 +vt 0.125000 0.375000 +vt 0.125000 0.312500 +vt 0.125000 0.250000 +vt 0.125000 0.187500 +vt 0.125000 0.125000 +vt 0.125000 0.062500 +vt 0.734375 0.000000 +vt 0.703125 0.000000 +vt 0.671875 0.000000 +vt 0.640625 0.000000 +vt 0.609375 0.000000 +vt 0.578125 0.000000 +vt 0.546875 0.000000 +vt 0.515625 0.000000 +vt 0.484375 0.000000 +vt 0.453125 0.000000 +vt 0.421875 0.000000 +vt 0.390625 0.000000 +vt 0.359375 0.000000 +vt 0.328125 0.000000 +vt 0.296875 0.000000 +vt 0.265625 0.000000 +vt 0.234375 0.000000 +vt 0.203125 0.000000 +vt 0.171875 0.000000 +vt 0.140625 0.000000 +vt 0.109375 0.000000 +vt 0.078125 0.000000 +vt 0.046875 0.000000 +vt 0.015625 0.000000 +vt 0.984375 0.000000 +vt 0.953125 0.000000 +vt 0.921875 0.000000 +vt 0.890625 0.000000 +vt 0.859375 0.000000 +vt 0.828125 0.000000 +vt 0.796875 0.000000 +vt 0.765625 0.000000 +vt 0.093750 0.937500 +vt 0.093750 0.875000 +vt 0.093750 0.812500 +vt 0.093750 0.750000 +vt 0.093750 0.687500 +vt 0.093750 0.625000 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.093750 0.437500 +vt 0.093750 0.375000 +vt 0.093750 0.312500 +vt 0.093750 0.250000 +vt 0.093750 0.187500 +vt 0.093750 0.125000 +vt 0.093750 0.062500 +vt 0.062500 0.937500 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.062500 0.687500 +vt 0.062500 0.625000 +vt 0.062500 0.562500 +vt 0.062500 0.500000 +vt 0.062500 0.437500 +vt 0.062500 0.375000 +vt 0.062500 0.312500 +vt 0.062500 0.250000 +vt 0.062500 0.187500 +vt 0.062500 0.125000 +vt 0.062500 0.062500 +vt 0.031250 0.937500 +vt 0.031250 0.875000 +vt 0.031250 0.812500 +vt 0.031250 0.750000 +vt 0.031250 0.687500 +vt 0.031250 0.625000 +vt 0.031250 0.562500 +vt 0.031250 0.500000 +vt 0.031250 0.437500 +vt 0.031250 0.375000 +vt 0.031250 0.312500 +vt 0.031250 0.250000 +vt 0.031250 0.187500 +vt 0.031250 0.125000 +vt 0.031250 0.062500 +vt 1.000000 0.937500 +vt 0.000000 0.937500 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt 1.000000 0.812500 +vt 0.000000 0.812500 +vt 1.000000 0.750000 +vt 0.000000 0.750000 +vt 1.000000 0.687500 +vt 0.000000 0.687500 +vt 1.000000 0.625000 +vt 0.000000 0.625000 +vt 1.000000 0.562500 +vt 0.000000 0.562500 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 1.000000 0.437500 +vt 0.000000 0.437500 +vt 1.000000 0.375000 +vt 0.000000 0.375000 +vt 1.000000 0.312500 +vt 0.000000 0.312500 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt 1.000000 0.187500 +vt 0.000000 0.187500 +vt 1.000000 0.125000 +vt 0.000000 0.125000 +vt 1.000000 0.062500 +vt 0.000000 0.062500 +vt 0.968750 0.937500 +vt 0.968750 0.875000 +vt 0.968750 0.812500 +vt 0.968750 0.750000 +vt 0.968750 0.687500 +vt 0.968750 0.625000 +vt 0.968750 0.562500 +vt 0.968750 0.500000 +vt 0.968750 0.437500 +vt 0.968750 0.375000 +vt 0.968750 0.312500 +vt 0.968750 0.250000 +vt 0.968750 0.187500 +vt 0.968750 0.125000 +vt 0.968750 0.062500 +vt 0.937500 0.937500 +vt 0.937500 0.875000 +vt 0.937500 0.812500 +vt 0.937500 0.750000 +vt 0.937500 0.687500 +vt 0.937500 0.625000 +vt 0.937500 0.562500 +vt 0.937500 0.500000 +vt 0.937500 0.437500 +vt 0.937500 0.375000 +vt 0.937500 0.312500 +vt 0.937500 0.250000 +vt 0.937500 0.187500 +vt 0.937500 0.125000 +vt 0.937500 0.062500 +vt 0.906250 0.937500 +vt 0.906250 0.875000 +vt 0.906250 0.812500 +vt 0.906250 0.750000 +vt 0.906250 0.687500 +vt 0.906250 0.625000 +vt 0.906250 0.562500 +vt 0.906250 0.500000 +vt 0.906250 0.437500 +vt 0.906250 0.375000 +vt 0.906250 0.312500 +vt 0.906250 0.250000 +vt 0.906250 0.187500 +vt 0.906250 0.125000 +vt 0.906250 0.062500 +vt 0.875000 0.937500 +vt 0.875000 0.875000 +vt 0.875000 0.812500 +vt 0.875000 0.750000 +vt 0.875000 0.687500 +vt 0.875000 0.625000 +vt 0.875000 0.562500 +vt 0.875000 0.500000 +vt 0.875000 0.437500 +vt 0.875000 0.375000 +vt 0.875000 0.312500 +vt 0.875000 0.250000 +vt 0.875000 0.187500 +vt 0.875000 0.125000 +vt 0.875000 0.062500 +vt 0.843750 0.937500 +vt 0.843750 0.875000 +vt 0.843750 0.812500 +vt 0.843750 0.750000 +vt 0.843750 0.687500 +vt 0.843750 0.625000 +vt 0.843750 0.562500 +vt 0.843750 0.500000 +vt 0.843750 0.437500 +vt 0.843750 0.375000 +vt 0.843750 0.312500 +vt 0.843750 0.250000 +vt 0.843750 0.187500 +vt 0.843750 0.125000 +vt 0.843750 0.062500 +vt 0.812500 0.937500 +vt 0.812500 0.875000 +vt 0.812500 0.812500 +vt 0.812500 0.750000 +vt 0.812500 0.687500 +vt 0.812500 0.625000 +vt 0.812500 0.562500 +vt 0.812500 0.500000 +vt 0.812500 0.437500 +vt 0.812500 0.375000 +vt 0.812500 0.312500 +vt 0.812500 0.250000 +vt 0.812500 0.187500 +vt 0.812500 0.125000 +vt 0.812500 0.062500 +vt 0.781250 0.937500 +vt 0.781250 0.875000 +vt 0.781250 0.812500 +vt 0.781250 0.750000 +vt 0.781250 0.687500 +vt 0.781250 0.625000 +vt 0.781250 0.562500 +vt 0.781250 0.500000 +vt 0.781250 0.437500 +vt 0.781250 0.375000 +vt 0.781250 0.312500 +vt 0.781250 0.250000 +vt 0.781250 0.187500 +vt 0.781250 0.125000 +vt 0.781250 0.062500 +vt 0.750000 0.937500 +vt 0.750000 0.875000 +vt 0.750000 0.750000 +vt 0.750000 0.625000 +vt 0.750000 0.375000 +vt 0.750000 0.250000 +vt 0.750000 0.187500 +vt 0.750000 0.125000 +vt 0.750000 0.062500 +vt 0.234375 0.375000 +vt 0.218750 0.281250 +vt 0.765625 0.531250 +vt 0.179688 0.968750 +vt 0.195312 0.968750 +vt 0.734375 0.843750 +vt 0.734375 0.812500 +vt 0.203125 0.343750 +vt 0.203125 0.312500 +vt 0.718750 0.281250 +vt 0.187500 0.218750 +vt 0.148438 0.968750 +vt 0.164062 0.968750 +vt 0.859375 0.843750 +vt 0.843750 0.531250 +vt 0.703125 0.312500 +vt 0.703125 0.281250 +vt 0.687500 0.218750 +vt 0.156250 0.156250 +vt 0.117188 0.968750 +vt 0.132812 0.968750 +vt 0.671875 0.281250 +vt 0.671875 0.250000 +vt 0.140625 0.187500 +vt 0.656250 0.156250 +vt 0.125000 0.093750 +vt 0.617188 0.031250 +vt 0.632812 0.031250 +vt 0.085938 0.968750 +vt 0.101562 0.968750 +vt 0.765625 0.062500 +vt 0.640625 0.187500 +vt 0.640625 0.156250 +vt 0.625000 0.093750 +vt 0.109375 0.093750 +vt 0.054688 0.968750 +vt 0.070312 0.968750 +vt 0.109375 0.906250 +vt 0.117188 0.031250 +vt 0.132812 0.031250 +vt 0.609375 0.156250 +vt 0.609375 0.125000 +vt 0.609375 0.093750 +vt 0.078125 0.093750 +vt 0.023438 0.968750 +vt 0.039062 0.968750 +vt 0.578125 0.093750 +vt 0.578125 0.062500 +vt 0.992188 0.968750 +vt 0.007812 0.968750 +vt 0.000000 0.906250 +vt 1.000000 0.906250 +vt 0.828125 0.562500 +vt 0.796875 0.156250 +vt 0.546875 0.062500 +vt 0.984375 0.937500 +vt 0.500000 0.906250 +vt 0.968750 0.843750 +vt 0.921875 0.125000 +vt 0.921875 0.093750 +vt 0.859375 0.656250 +vt 0.484375 0.937500 +vt 0.484375 0.906250 +vt 0.468750 0.843750 +vt 0.937500 0.781250 +vt 0.984375 0.625000 +vt 0.953125 0.250000 +vt 0.898438 0.968750 +vt 0.914062 0.968750 +vt 0.453125 0.875000 +vt 0.921875 0.812500 +vt 0.437500 0.781250 +vt 0.906250 0.718750 +vt 0.015625 0.750000 +vt 0.078125 0.156250 +vt 0.867188 0.968750 +vt 0.882812 0.968750 +vt 0.421875 0.843750 +vt 0.421875 0.812500 +vt 0.421875 0.781250 +vt 0.406250 0.718750 +vt 0.875000 0.656250 +vt 0.968750 0.781250 +vt 0.835938 0.968750 +vt 0.851562 0.968750 +vt 0.109375 0.250000 +vt 0.390625 0.750000 +vt 0.859375 0.687500 +vt 0.375000 0.656250 +vt 0.843750 0.593750 +vt 0.562500 0.281250 +vt 0.171875 0.750000 +vt 0.804688 0.968750 +vt 0.820312 0.968750 +vt 0.359375 0.718750 +vt 0.359375 0.687500 +vt 0.359375 0.656250 +vt 0.343750 0.593750 +vt 0.812500 0.531250 +vt 0.625000 0.718750 +vt 0.296875 0.687500 +vt 0.773438 0.968750 +vt 0.789062 0.968750 +vt 0.765625 0.687500 +vt 0.328125 0.625000 +vt 0.796875 0.562500 +vt 0.312500 0.531250 +vt 0.781250 0.468750 +vt 0.757812 0.968750 +vt 0.742188 0.968750 +vt 0.750000 0.718750 +vt 0.750000 0.656250 +vt 0.734375 0.250000 +vt 0.296875 0.562500 +vt 0.281250 0.468750 +vt 0.265625 0.531250 +vt 0.265625 0.500000 +vt 0.265625 0.468750 +vt 0.250000 0.406250 +vt 0.234375 0.437500 +vt 0.234375 0.406250 +vt 0.218750 0.343750 +vt 0.734375 0.718750 +vt 0.734375 0.687500 +vt 0.203125 0.375000 +vt 0.187500 0.281250 +vt 0.718750 0.218750 +vt 0.171875 0.343750 +vt 0.171875 0.312500 +vt 0.703125 0.250000 +vt 0.156250 0.218750 +vt 0.687500 0.156250 +vt 0.671875 0.218750 +vt 0.671875 0.187500 +vt 0.671875 0.156250 +vt 0.656250 0.093750 +vt 0.585938 0.031250 +vt 0.601562 0.031250 +vt 0.796875 0.468750 +vt 0.125000 0.781250 +vt 0.109375 0.218750 +vt 0.640625 0.125000 +vt 0.640625 0.093750 +vt 0.171875 0.906250 +vt 0.765625 0.750000 +vt 0.828125 0.625000 +vt 0.937500 0.093750 +vt 0.078125 0.218750 +vt 0.078125 0.187500 +vt 0.609375 0.062500 +vt 0.062500 0.093750 +vt 0.554688 0.968750 +vt 0.570312 0.968750 +vt 0.953125 0.562500 +vt 0.046875 0.125000 +vt 0.046875 0.093750 +vt 0.523438 0.968750 +vt 0.539062 0.968750 +vt 0.531250 0.906250 +vt 0.984375 0.718750 +vt 0.984375 0.656250 +vt 0.015625 0.062500 +vt 0.515625 0.937500 +vt 0.968750 0.906250 +vt 0.500000 0.843750 +vt 0.109375 0.593750 +vt 0.078125 0.250000 +vt 0.109375 0.562500 +vt 0.460938 0.968750 +vt 0.476562 0.968750 +vt 0.484375 0.875000 +vt 0.484375 0.843750 +vt 0.468750 0.781250 +vt 0.921875 0.906250 +vt 0.140625 0.718750 +vt 0.140625 0.687500 +vt 0.562500 0.468750 +vt 0.429688 0.968750 +vt 0.445312 0.968750 +vt 0.453125 0.843750 +vt 0.453125 0.812500 +vt 0.453125 0.781250 +vt 0.437500 0.718750 +vt 0.562500 0.218750 +vt 0.398438 0.968750 +vt 0.414062 0.968750 +vt 0.890625 0.843750 +vt 0.890625 0.812500 +vt 0.421875 0.750000 +vt 0.875000 0.718750 +vt 0.406250 0.656250 +vt 0.367188 0.968750 +vt 0.382812 0.968750 +vt 0.828125 0.906250 +vt 0.390625 0.718750 +vt 0.390625 0.687500 +vt 0.390625 0.656250 +vt 0.375000 0.593750 +vt 0.335938 0.968750 +vt 0.351562 0.968750 +vt 0.828125 0.718750 +vt 0.828125 0.687500 +vt 0.359375 0.625000 +vt 0.812500 0.593750 +vt 0.343750 0.531250 +vt 0.304688 0.968750 +vt 0.320312 0.968750 +vt 0.765625 0.812500 +vt 0.765625 0.781250 +vt 0.328125 0.593750 +vt 0.328125 0.562500 +vt 0.781250 0.531250 +vt 0.312500 0.468750 +vt 0.273438 0.968750 +vt 0.289062 0.968750 +vt 0.750000 0.843750 +vt 0.750000 0.781250 +vt 0.765625 0.593750 +vt 0.734375 0.343750 +vt 0.296875 0.531250 +vt 0.296875 0.500000 +vt 0.750000 0.093750 +vt 0.281250 0.406250 +vt 0.242188 0.968750 +vt 0.257812 0.968750 +vt 0.265625 0.437500 +vt 0.265625 0.406250 +vt 0.250000 0.343750 +vt 0.210938 0.968750 +vt 0.226562 0.968750 +vt 0.093750 0.531250 +vt 0.234375 0.250000 +vt 0.750000 0.531250 +vt 0.218750 0.156250 +vt 0.734375 0.593750 +vt 0.734375 0.562500 +vt 0.734375 0.531250 +vt 0.203125 0.218750 +vt 0.203125 0.187500 +vt 0.203125 0.156250 +vt 0.187500 0.093750 +vt 0.828125 0.937500 +vt 0.703125 0.218750 +vt 0.703125 0.187500 +vt 0.171875 0.125000 +vt 0.687500 0.093750 +vt 0.890625 0.125000 +vt 0.281250 0.781250 +vt 0.671875 0.125000 +vt 0.671875 0.093750 +vt 0.679688 0.031250 +vt 0.695312 0.031250 +vt 0.953125 0.625000 +vt 0.937500 0.843750 +vt 0.640625 0.062500 +vt 0.085938 0.031250 +vt 0.101562 0.031250 +vt 0.593750 0.906250 +vt 0.062500 0.906250 +vt 0.046875 0.187500 +vt 0.046875 0.156250 +vt 0.585938 0.968750 +vt 0.601562 0.968750 +vt 0.578125 0.937500 +vt 0.578125 0.906250 +vt 0.031250 0.843750 +vt 0.109375 0.625000 +vt 0.023438 0.031250 +vt 0.039062 0.031250 +vt 0.546875 0.937500 +vt 0.015625 0.875000 +vt 0.531250 0.843750 +vt 0.000000 0.781250 +vt 1.000000 0.781250 +vt 0.562500 0.656250 +vt 0.992188 0.031250 +vt 0.007812 0.031250 +vt 0.515625 0.906250 +vt 0.515625 0.875000 +vt 0.515625 0.843750 +vt 0.500000 0.781250 +vt 0.968750 0.718750 +vt 0.031250 0.781250 +vt 0.960938 0.031250 +vt 0.976562 0.031250 +vt 0.484375 0.812500 +vt 0.484375 0.781250 +vt 0.468750 0.718750 +vt 0.937500 0.656250 +vt 0.929688 0.031250 +vt 0.945312 0.031250 +vt 0.453125 0.750000 +vt 0.921875 0.687500 +vt 0.437500 0.656250 +vt 0.906250 0.593750 +vt 0.898438 0.031250 +vt 0.914062 0.031250 +vt 0.859375 0.718750 +vt 0.421875 0.718750 +vt 0.421875 0.687500 +vt 0.421875 0.656250 +vt 0.406250 0.593750 +vt 0.875000 0.531250 +vt 0.179688 0.031250 +vt 0.195312 0.031250 +vt 0.867188 0.031250 +vt 0.882812 0.031250 +vt 0.906250 0.406250 +vt 0.390625 0.625000 +vt 0.859375 0.562500 +vt 0.375000 0.531250 +vt 0.843750 0.468750 +vt 0.835938 0.031250 +vt 0.851562 0.031250 +vt 0.765625 0.406250 +vt 0.359375 0.593750 +vt 0.359375 0.562500 +vt 0.828125 0.500000 +vt 0.343750 0.468750 +vt 0.812500 0.406250 +vt 0.890625 0.468750 +vt 0.109375 0.781250 +vt 0.328125 0.531250 +vt 0.328125 0.500000 +vt 0.328125 0.468750 +vt 0.312500 0.406250 +vt 0.781250 0.343750 +vt 0.773438 0.031250 +vt 0.789062 0.031250 +vt 0.906250 0.156250 +vt 0.765625 0.375000 +vt 0.734375 0.156250 +vt 0.734375 0.125000 +vt 0.757812 0.031250 +vt 0.742188 0.031250 +vt 0.296875 0.406250 +vt 0.281250 0.343750 +vt 0.843750 0.718750 +vt 0.265625 0.375000 +vt 0.250000 0.281250 +vt 0.890625 0.406250 +vt 0.234375 0.343750 +vt 0.234375 0.312500 +vt 0.234375 0.281250 +vt 0.218750 0.218750 +vt 0.750000 0.468750 +vt 0.953125 0.937500 +vt 0.921875 0.562500 +vt 0.734375 0.500000 +vt 0.734375 0.468750 +vt 0.203125 0.250000 +vt 0.187500 0.156250 +vt 0.718750 0.093750 +vt 0.015625 0.093750 +vt 0.171875 0.218750 +vt 0.703125 0.156250 +vt 0.703125 0.125000 +vt 0.703125 0.093750 +vt 0.468750 0.093750 +vt 0.968750 0.656250 +vt 0.109375 0.937500 +vt 0.765625 0.562500 +vt 0.140625 0.125000 +vt 0.671875 0.062500 +vt 0.648438 0.031250 +vt 0.664062 0.031250 +vt 0.625000 0.906250 +vt 0.562500 0.843750 +vt 0.609375 0.937500 +vt 0.609375 0.906250 +vt 0.593750 0.843750 +vt 0.617188 0.968750 +vt 0.632812 0.968750 +vt 0.578125 0.875000 +vt 0.578125 0.843750 +vt 0.546875 0.906250 +vt 0.546875 0.875000 +vt 0.546875 0.843750 +vt 0.531250 0.781250 +vt 0.765625 0.250000 +vt 0.031250 0.656250 +vt 0.781250 0.781250 +vt 0.984375 0.875000 +vt 0.515625 0.812500 +vt 0.515625 0.781250 +vt 0.500000 0.718750 +vt 0.859375 0.531250 +vt 0.953125 0.843750 +vt 0.953125 0.812500 +vt 0.484375 0.750000 +vt 0.937500 0.718750 +vt 0.468750 0.656250 +vt 0.453125 0.718750 +vt 0.453125 0.687500 +vt 0.453125 0.656250 +vt 0.437500 0.593750 +vt 0.890625 0.718750 +vt 0.890625 0.687500 +vt 0.421875 0.625000 +vt 0.875000 0.593750 +vt 0.406250 0.531250 +vt 0.390625 0.593750 +vt 0.390625 0.562500 +vt 0.093750 0.906250 +vt 0.375000 0.468750 +vt 0.125000 0.656250 +vt 0.828125 0.593750 +vt 0.359375 0.531250 +vt 0.359375 0.500000 +vt 0.359375 0.468750 +vt 0.343750 0.406250 +vt 0.859375 0.375000 +vt 0.906250 0.906250 +vt 0.796875 0.906250 +vt 0.796875 0.531250 +vt 0.796875 0.500000 +vt 0.328125 0.437500 +vt 0.328125 0.406250 +vt 0.312500 0.343750 +vt 0.890625 0.531250 +vt 0.921875 0.875000 +vt 0.750000 0.593750 +vt 0.921875 0.843750 +vt 0.734375 0.218750 +vt 0.734375 0.187500 +vt 0.296875 0.375000 +vt 0.281250 0.281250 +vt 0.984375 0.062500 +vt 0.015625 0.406250 +vt 0.265625 0.343750 +vt 0.265625 0.312500 +vt 0.265625 0.281250 +vt 0.250000 0.218750 +vt 0.046875 0.593750 +vt 0.046875 0.562500 +vt 0.078125 0.906250 +vt 0.234375 0.125000 +vt 0.234375 0.093750 +vt 0.140625 0.093750 +vt 0.140625 0.062500 +vt 0.734375 0.437500 +vt 0.734375 0.406250 +vt 0.148438 0.031250 +vt 0.164062 0.031250 +vt 0.765625 0.656250 +vt 0.203125 0.062500 +vt 0.156250 0.906250 +vt 0.703125 0.062500 +vt 0.140625 0.937500 +vt 0.656250 0.906250 +vt 0.125000 0.843750 +vt 0.640625 0.937500 +vt 0.640625 0.906250 +vt 0.625000 0.843750 +vt 0.109375 0.843750 +vt 0.609375 0.875000 +vt 0.609375 0.843750 +vt 0.593750 0.781250 +vt 0.062500 0.781250 +vt 0.648438 0.968750 +vt 0.664062 0.968750 +vt 0.578125 0.812500 +vt 0.578125 0.781250 +vt 0.031250 0.718750 +vt 0.906250 0.781250 +vt 0.546875 0.812500 +vt 0.546875 0.781250 +vt 0.531250 0.718750 +vt 0.000000 0.656250 +vt 1.000000 0.656250 +vt 0.515625 0.750000 +vt 0.984375 0.687500 +vt 0.500000 0.656250 +vt 0.968750 0.593750 +vt 0.921875 0.343750 +vt 0.484375 0.718750 +vt 0.484375 0.687500 +vt 0.484375 0.656250 +vt 0.468750 0.593750 +vt 0.937500 0.531250 +vt 0.171875 0.406250 +vt 0.453125 0.625000 +vt 0.156250 0.343750 +vt 0.437500 0.531250 +vt 0.906250 0.468750 +vt 0.765625 0.875000 +vt 0.828125 0.281250 +vt 0.421875 0.593750 +vt 0.421875 0.562500 +vt 0.890625 0.500000 +vt 0.406250 0.468750 +vt 0.875000 0.406250 +vt 0.859375 0.437500 +vt 0.890625 0.781250 +vt 0.859375 0.406250 +vt 0.390625 0.531250 +vt 0.390625 0.500000 +vt 0.390625 0.468750 +vt 0.375000 0.406250 +vt 0.843750 0.343750 +vt 0.765625 0.906250 +vt 0.984375 0.375000 +vt 0.781250 0.656250 +vt 0.359375 0.437500 +vt 0.359375 0.406250 +vt 0.343750 0.343750 +vt 0.812500 0.281250 +vt 0.015625 0.531250 +vt 0.015625 0.468750 +vt 0.328125 0.375000 +vt 0.796875 0.312500 +vt 0.312500 0.281250 +vt 0.781250 0.218750 +vt 0.140625 0.375000 +vt 0.750000 0.343750 +vt 0.750000 0.281250 +vt 0.296875 0.343750 +vt 0.296875 0.312500 +vt 0.296875 0.281250 +vt 0.281250 0.218750 +vt 0.171875 0.531250 +vt 0.171875 0.500000 +vt 0.265625 0.250000 +vt 0.250000 0.156250 +vt 0.296875 0.437500 +vt 0.929688 0.968750 +vt 0.945312 0.968750 +vt 0.234375 0.218750 +vt 0.234375 0.187500 +vt 0.234375 0.156250 +vt 0.218750 0.093750 +vt 0.734375 0.312500 +vt 0.734375 0.281250 +vt 0.203125 0.125000 +vt 0.203125 0.093750 +vt 0.687500 0.906250 +vt 0.812500 0.468750 +vt 0.859375 0.593750 +vt 0.171875 0.093750 +vt 0.171875 0.062500 +vt 0.671875 0.937500 +vt 0.671875 0.906250 +vt 0.656250 0.843750 +vt 0.054688 0.031250 +vt 0.070312 0.031250 +vt 0.710938 0.031250 +vt 0.726562 0.031250 +vt 0.640625 0.875000 +vt 0.640625 0.843750 +vt 0.625000 0.781250 +vt 0.078125 0.937500 +vt 0.609375 0.812500 +vt 0.609375 0.781250 +vt 0.593750 0.718750 +vt 0.093750 0.781250 +vt 0.679688 0.968750 +vt 0.695312 0.968750 +vt 0.046875 0.875000 +vt 0.046875 0.843750 +vt 0.578125 0.750000 +vt 0.562500 0.718750 +vt 0.015625 0.843750 +vt 0.015625 0.812500 +vt 0.546875 0.750000 +vt 1.000000 0.718750 +vt 0.000000 0.718750 +vt 0.531250 0.656250 +vt 0.796875 0.250000 +vt 0.515625 0.718750 +vt 0.515625 0.687500 +vt 0.515625 0.656250 +vt 0.500000 0.593750 +vt 0.859375 0.750000 +vt 0.828125 0.375000 +vt 0.953125 0.718750 +vt 0.953125 0.687500 +vt 0.484375 0.625000 +vt 0.937500 0.593750 +vt 0.468750 0.531250 +vt 0.890625 0.875000 +vt 0.140625 0.781250 +vt 0.453125 0.593750 +vt 0.453125 0.562500 +vt 0.906250 0.531250 +vt 0.437500 0.468750 +vt 0.984375 0.437500 +vt 0.015625 0.781250 +vt 0.031250 0.156250 +vt 0.890625 0.593750 +vt 0.421875 0.531250 +vt 0.421875 0.500000 +vt 0.421875 0.468750 +vt 0.406250 0.406250 +vt 0.046875 0.937500 +vt 0.109375 0.312500 +vt 0.046875 0.906250 +vt 0.859375 0.500000 +vt 0.390625 0.437500 +vt 0.390625 0.406250 +vt 0.375000 0.343750 +vt 0.171875 0.781250 +vt 0.140625 0.406250 +vt 0.359375 0.375000 +vt 0.812500 0.343750 +vt 0.343750 0.281250 +vt 0.765625 0.468750 +vt 0.765625 0.437500 +vt 0.328125 0.343750 +vt 0.328125 0.312500 +vt 0.328125 0.281250 +vt 0.312500 0.218750 +vt 0.750000 0.406250 +vt 0.765625 0.281250 +vt 0.734375 0.093750 +vt 0.734375 0.062500 +vt 0.296875 0.250000 +vt 0.281250 0.156250 +vt 0.781250 0.156250 +vt 0.265625 0.218750 +vt 0.265625 0.187500 +vt 0.265625 0.156250 +vt 0.250000 0.093750 +vt 0.796875 0.593750 +vt 0.843750 0.281250 +vt 0.203125 0.937500 +vt 0.718750 0.906250 +vt 0.187500 0.843750 +vt 0.703125 0.937500 +vt 0.703125 0.906250 +vt 0.687500 0.843750 +vt 0.156250 0.781250 +vt 0.671875 0.875000 +vt 0.671875 0.843750 +vt 0.656250 0.781250 +vt 0.125000 0.718750 +vt 0.273438 0.031250 +vt 0.289062 0.031250 +vt 0.640625 0.812500 +vt 0.640625 0.781250 +vt 0.109375 0.750000 +vt 0.093750 0.718750 +vt 0.125000 0.531250 +vt 0.609375 0.750000 +vt 0.156250 0.718750 +vt 0.593750 0.656250 +vt 0.062500 0.656250 +vt 0.828125 0.656250 +vt 0.796875 0.281250 +vt 0.710938 0.968750 +vt 0.726562 0.968750 +vt 0.578125 0.718750 +vt 0.578125 0.687500 +vt 0.578125 0.656250 +vt 0.031250 0.593750 +vt 0.921875 0.250000 +vt 0.859375 0.812500 +vt 0.859375 0.781250 +vt 0.546875 0.718750 +vt 0.546875 0.687500 +vt 0.546875 0.656250 +vt 0.531250 0.593750 +vt 1.000000 0.531250 +vt 0.000000 0.531250 +vt 0.984375 0.750000 +vt 0.953125 0.375000 +vt 0.515625 0.625000 +vt 0.984375 0.562500 +vt 0.500000 0.531250 +vt 0.968750 0.468750 +vt 0.953125 0.906250 +vt 0.078125 0.281250 +vt 0.484375 0.593750 +vt 0.484375 0.562500 +vt 0.953125 0.500000 +vt 0.468750 0.468750 +vt 0.937500 0.406250 +vt 0.109375 0.375000 +vt 0.453125 0.531250 +vt 0.453125 0.500000 +vt 0.453125 0.468750 +vt 0.437500 0.406250 +vt 0.906250 0.343750 +vt 0.562500 0.406250 +vt 0.171875 0.875000 +vt 0.171875 0.843750 +vt 0.421875 0.437500 +vt 0.421875 0.406250 +vt 0.406250 0.343750 +vt 0.875000 0.281250 +vt 0.390625 0.375000 +vt 0.859375 0.312500 +vt 0.375000 0.281250 +vt 0.843750 0.218750 +vt 0.359375 0.343750 +vt 0.359375 0.312500 +vt 0.359375 0.281250 +vt 0.343750 0.218750 +vt 0.812500 0.156250 +vt 0.328125 0.250000 +vt 0.796875 0.187500 +vt 0.312500 0.156250 +vt 0.781250 0.093750 +vt 0.734375 0.875000 +vt 0.765625 0.125000 +vt 0.765625 0.093750 +vt 0.296875 0.218750 +vt 0.296875 0.187500 +vt 0.296875 0.156250 +vt 0.281250 0.093750 +vt 0.875000 0.093750 +vt 0.265625 0.125000 +vt 0.921875 0.218750 +vt 0.234375 0.062500 +vt 0.187500 0.906250 +vt 0.718750 0.843750 +vt 0.171875 0.937500 +vt 0.703125 0.875000 +vt 0.703125 0.843750 +vt 0.687500 0.781250 +vt 0.796875 0.625000 +vt 0.140625 0.875000 +vt 0.671875 0.812500 +vt 0.671875 0.781250 +vt 0.656250 0.718750 +vt 0.828125 0.750000 +vt 0.890625 0.156250 +vt 0.242188 0.031250 +vt 0.257812 0.031250 +vt 0.640625 0.750000 +vt 0.640625 0.718750 +vt 0.625000 0.656250 +vt 0.953125 0.656250 +vt 0.921875 0.281250 +vt 0.609375 0.718750 +vt 0.609375 0.687500 +vt 0.609375 0.656250 +vt 0.593750 0.593750 +vt 0.984375 0.843750 +vt 0.046875 0.250000 +vt 0.984375 0.812500 +vt 0.984375 0.781250 +vt 0.046875 0.750000 +vt 0.578125 0.625000 +vt 0.562500 0.593750 +vt 0.109375 0.687500 +vt 0.015625 0.718750 +vt 0.015625 0.687500 +vt 0.546875 0.625000 +vt 1.000000 0.593750 +vt 0.000000 0.593750 +vt 0.531250 0.531250 +vt 0.203125 0.406250 +vt 0.140625 0.812500 +vt 0.515625 0.593750 +vt 0.515625 0.562500 +vt 0.968750 0.531250 +vt 0.500000 0.468750 +vt 0.953125 0.593750 +vt 0.484375 0.531250 +vt 0.484375 0.500000 +vt 0.484375 0.468750 +vt 0.468750 0.406250 +vt 0.921875 0.531250 +vt 0.921875 0.500000 +vt 0.453125 0.437500 +vt 0.453125 0.406250 +vt 0.437500 0.343750 +vt 0.960938 0.968750 +vt 0.976562 0.968750 +vt 0.890625 0.437500 +vt 0.421875 0.375000 +vt 0.875000 0.343750 +vt 0.406250 0.281250 +vt 0.390625 0.343750 +vt 0.390625 0.312500 +vt 0.390625 0.281250 +vt 0.375000 0.218750 +vt 0.828125 0.343750 +vt 0.828125 0.312500 +vt 0.359375 0.250000 +vt 0.812500 0.218750 +vt 0.343750 0.156250 +vt 0.093750 0.656250 +vt 0.328125 0.218750 +vt 0.328125 0.187500 +vt 0.328125 0.156250 +vt 0.312500 0.093750 +vt 0.734375 0.937500 +vt 0.734375 0.906250 +vt 0.765625 0.218750 +vt 0.765625 0.187500 +vt 0.765625 0.156250 +vt 0.296875 0.125000 +vt 0.296875 0.093750 +vt 0.265625 0.093750 +vt 0.265625 0.062500 +vt 0.796875 0.718750 +vt 0.859375 0.125000 +vt 0.859375 0.093750 +vt 0.796875 0.656250 +vt 0.203125 0.812500 +vt 0.718750 0.781250 +vt 0.187500 0.718750 +vt 0.921875 0.625000 +vt 0.890625 0.250000 +vt 0.375000 0.906250 +vt 0.140625 0.656250 +vt 0.703125 0.812500 +vt 0.703125 0.781250 +vt 0.687500 0.718750 +vt 0.156250 0.656250 +vt 0.015625 0.187500 +vt 0.953125 0.750000 +vt 0.921875 0.468750 +vt 0.015625 0.156250 +vt 0.062500 0.468750 +vt 0.078125 0.843750 +vt 0.671875 0.750000 +vt 0.671875 0.718750 +vt 0.656250 0.656250 +vt 0.125000 0.593750 +vt 0.968750 0.406250 +vt 0.796875 0.093750 +vt 0.078125 0.687500 +vt 0.046875 0.312500 +vt 0.335938 0.031250 +vt 0.351562 0.031250 +vt 0.046875 0.281250 +vt 0.640625 0.687500 +vt 0.640625 0.656250 +vt 0.625000 0.593750 +vt 0.093750 0.593750 +vt 0.171875 0.187500 +vt 0.171875 0.156250 +vt 0.765625 0.343750 +vt 0.609375 0.625000 +vt 0.078125 0.625000 +vt 0.593750 0.531250 +vt 0.062500 0.531250 +vt 0.765625 0.312500 +vt 0.562500 0.781250 +vt 0.203125 0.281250 +vt 0.578125 0.593750 +vt 0.578125 0.562500 +vt 0.562500 0.531250 +vt 0.031250 0.468750 +vt 0.546875 0.593750 +vt 0.546875 0.562500 +vt 0.015625 0.500000 +vt 0.531250 0.468750 +vt 0.000000 0.406250 +vt 1.000000 0.406250 +vt 0.843750 0.656250 +vt 0.515625 0.531250 +vt 0.515625 0.500000 +vt 0.515625 0.468750 +vt 0.500000 0.406250 +vt 0.968750 0.343750 +vt 0.484375 0.437500 +vt 0.484375 0.406250 +vt 0.468750 0.343750 +vt 0.937500 0.281250 +vt 0.453125 0.375000 +vt 0.921875 0.312500 +vt 0.437500 0.281250 +vt 0.906250 0.218750 +vt 0.421875 0.343750 +vt 0.421875 0.312500 +vt 0.421875 0.281250 +vt 0.406250 0.218750 +vt 0.875000 0.156250 +vt 0.390625 0.250000 +vt 0.390625 0.218750 +vt 0.375000 0.156250 +vt 0.843750 0.093750 +vt 0.125000 0.406250 +vt 0.359375 0.218750 +vt 0.359375 0.187500 +vt 0.359375 0.156250 +vt 0.343750 0.093750 +vt 0.328125 0.125000 +vt 0.328125 0.093750 +vt 0.859375 0.218750 +vt 0.750000 0.906250 +vt 0.734375 0.750000 +vt 0.890625 0.562500 +vt 0.859375 0.187500 +vt 0.859375 0.156250 +vt 0.296875 0.062500 +vt 0.250000 0.906250 +vt 0.921875 0.718750 +vt 0.984375 0.093750 +vt 0.921875 0.656250 +vt 0.234375 0.937500 +vt 0.234375 0.906250 +vt 0.218750 0.843750 +vt 0.015625 0.250000 +vt 0.203125 0.906250 +vt 0.203125 0.875000 +vt 0.203125 0.843750 +vt 0.554688 0.031250 +vt 0.570312 0.031250 +vt 0.718750 0.718750 +vt 0.078125 0.750000 +vt 0.078125 0.718750 +vt 0.171875 0.812500 +vt 0.703125 0.750000 +vt 0.703125 0.718750 +vt 0.687500 0.656250 +vt 0.171875 0.250000 +vt 0.046875 0.343750 +vt 0.140625 0.750000 +vt 0.671875 0.687500 +vt 0.671875 0.656250 +vt 0.656250 0.593750 +vt 0.781250 0.406250 +vt 0.304688 0.031250 +vt 0.320312 0.031250 +vt 0.109375 0.718750 +vt 0.640625 0.625000 +vt 0.109375 0.656250 +vt 0.625000 0.531250 +vt 0.609375 0.593750 +vt 0.609375 0.562500 +vt 0.062500 0.593750 +vt 0.593750 0.468750 +vt 0.078125 0.656250 +vt 0.781250 0.906250 +vt 0.046875 0.625000 +vt 0.578125 0.531250 +vt 0.578125 0.500000 +vt 0.578125 0.468750 +vt 0.015625 0.593750 +vt 0.546875 0.531250 +vt 0.546875 0.500000 +vt 0.546875 0.468750 +vt 0.531250 0.406250 +vt 0.984375 0.531250 +vt 0.984375 0.500000 +vt 0.515625 0.437500 +vt 0.515625 0.406250 +vt 0.500000 0.343750 +vt 0.953125 0.437500 +vt 0.484375 0.375000 +vt 0.937500 0.343750 +vt 0.468750 0.281250 +vt 0.453125 0.343750 +vt 0.453125 0.312500 +vt 0.453125 0.281250 +vt 0.437500 0.218750 +vt 0.890625 0.343750 +vt 0.890625 0.312500 +vt 0.421875 0.250000 +vt 0.875000 0.218750 +vt 0.406250 0.156250 +vt 0.828125 0.125000 +vt 0.859375 0.468750 +vt 0.828125 0.093750 +vt 0.859375 0.250000 +vt 0.390625 0.187500 +vt 0.843750 0.156250 +vt 0.375000 0.093750 +vt 0.492188 0.968750 +vt 0.507812 0.968750 +vt 0.890625 0.625000 +vt 0.937500 0.468750 +vt 0.828125 0.218750 +vt 0.828125 0.187500 +vt 0.359375 0.125000 +vt 0.359375 0.093750 +vt 0.984375 0.218750 +vt 0.015625 0.562500 +vt 0.984375 0.156250 +vt 0.796875 0.125000 +vt 0.328125 0.062500 +vt 0.281250 0.906250 +vt 0.734375 0.781250 +vt 0.046875 0.718750 +vt 0.046875 0.687500 +vt 0.109375 0.062500 +vt 0.046875 0.656250 +vt 0.265625 0.937500 +vt 0.265625 0.906250 +vt 0.250000 0.843750 +vt 0.140625 0.218750 +vt 0.140625 0.156250 +vt 0.234375 0.875000 +vt 0.234375 0.843750 +vt 0.218750 0.781250 +vt 0.203125 0.656250 +vt 0.203125 0.718750 +vt 0.203125 0.687500 +vt 0.718750 0.656250 +vt 0.187500 0.593750 +vt 0.703125 0.687500 +vt 0.703125 0.656250 +vt 0.687500 0.593750 +vt 0.156250 0.531250 +vt 0.000000 0.093750 +vt 1.000000 0.093750 +vt 0.859375 0.343750 +vt 0.671875 0.625000 +vt 0.671875 0.593750 +vt 0.656250 0.531250 +vt 0.125000 0.468750 +vt 0.398438 0.031250 +vt 0.414062 0.031250 +vt 0.843750 0.406250 +vt 0.640625 0.593750 +vt 0.640625 0.562500 +vt 0.109375 0.531250 +vt 0.625000 0.468750 +vt 0.109375 0.468750 +vt 0.609375 0.531250 +vt 0.609375 0.500000 +vt 0.609375 0.468750 +vt 0.593750 0.406250 +vt 0.062500 0.406250 +vt 0.031250 0.906250 +vt 0.000000 0.468750 +vt 1.000000 0.468750 +vt 0.578125 0.437500 +vt 0.578125 0.406250 +vt 0.031250 0.343750 +vt 0.546875 0.437500 +vt 0.546875 0.406250 +vt 0.531250 0.343750 +vt 0.000000 0.281250 +vt 1.000000 0.281250 +vt 0.515625 0.375000 +vt 0.156250 0.468750 +vt 0.500000 0.281250 +vt 0.968750 0.218750 +vt 0.828125 0.437500 +vt 0.796875 0.062500 +vt 0.828125 0.406250 +vt 0.484375 0.343750 +vt 0.484375 0.312500 +vt 0.484375 0.281250 +vt 0.468750 0.218750 +vt 0.937500 0.156250 +vt 0.890625 0.906250 +vt 0.453125 0.250000 +vt 0.921875 0.187500 +vt 0.437500 0.156250 +vt 0.906250 0.093750 +vt 0.953125 0.125000 +vt 0.984375 0.468750 +vt 0.421875 0.218750 +vt 0.421875 0.187500 +vt 0.421875 0.156250 +vt 0.890625 0.093750 +vt 0.406250 0.093750 +vt 0.968750 0.281250 +vt 0.078125 0.062500 +vt 0.015625 0.625000 +vt 0.390625 0.156250 +vt 0.390625 0.125000 +vt 0.859375 0.062500 +vt 0.812500 0.906250 +vt 0.140625 0.500000 +vt 0.140625 0.468750 +vt 0.109375 0.125000 +vt 0.359375 0.062500 +vt 0.796875 0.937500 +vt 0.312500 0.906250 +vt 0.781250 0.843750 +vt 0.562500 0.156250 +vt 0.171875 0.625000 +vt 0.296875 0.937500 +vt 0.296875 0.906250 +vt 0.281250 0.843750 +vt 0.734375 0.625000 +vt 0.296875 0.593750 +vt 0.265625 0.875000 +vt 0.250000 0.781250 +vt 0.718750 0.156250 +vt 0.234375 0.812500 +vt 0.234375 0.781250 +vt 0.218750 0.718750 +vt 0.203125 0.750000 +vt 0.187500 0.656250 +vt 0.718750 0.593750 +vt 0.171875 0.718750 +vt 0.171875 0.687500 +vt 0.703125 0.625000 +vt 0.156250 0.593750 +vt 0.687500 0.531250 +vt 0.140625 0.625000 +vt 0.671875 0.562500 +vt 0.671875 0.531250 +vt 0.656250 0.468750 +vt 0.367188 0.031250 +vt 0.382812 0.031250 +vt 0.640625 0.531250 +vt 0.640625 0.500000 +vt 0.640625 0.468750 +vt 0.625000 0.406250 +vt 0.078125 0.593750 +vt 0.078125 0.562500 +vt 0.609375 0.437500 +vt 0.609375 0.406250 +vt 0.593750 0.343750 +vt 0.093750 0.093750 +vt 0.796875 0.375000 +vt 0.046875 0.531250 +vt 0.046875 0.500000 +vt 0.046875 0.468750 +vt 0.578125 0.375000 +vt 0.562500 0.343750 +vt 0.828125 0.468750 +vt 0.015625 0.437500 +vt 0.546875 0.375000 +vt 1.000000 0.343750 +vt 0.000000 0.343750 +vt 0.531250 0.281250 +vt 0.953125 0.406250 +vt 0.515625 0.343750 +vt 0.515625 0.312500 +vt 0.515625 0.281250 +vt 0.500000 0.218750 +vt 0.984375 0.593750 +vt 0.015625 0.937500 +vt 0.015625 0.906250 +vt 0.953125 0.343750 +vt 0.953125 0.312500 +vt 0.484375 0.250000 +vt 0.937500 0.218750 +vt 0.468750 0.156250 +vt 0.187500 0.781250 +vt 0.078125 0.125000 +vt 0.109375 0.437500 +vt 0.453125 0.218750 +vt 0.453125 0.187500 +vt 0.453125 0.156250 +vt 0.437500 0.093750 +vt 0.796875 0.218750 +vt 0.140625 0.593750 +vt 0.140625 0.562500 +vt 0.890625 0.218750 +vt 0.890625 0.187500 +vt 0.421875 0.125000 +vt 0.421875 0.093750 +vt 0.390625 0.093750 +vt 0.390625 0.062500 +vt 0.343750 0.906250 +vt 0.828125 0.062500 +vt 0.328125 0.937500 +vt 0.328125 0.906250 +vt 0.312500 0.843750 +vt 0.781250 0.281250 +vt 0.765625 0.937500 +vt 0.296875 0.875000 +vt 0.296875 0.843750 +vt 0.734375 0.656250 +vt 0.265625 0.843750 +vt 0.265625 0.812500 +vt 0.265625 0.781250 +vt 0.250000 0.718750 +vt 0.843750 0.781250 +vt 0.234375 0.750000 +vt 0.218750 0.656250 +vt 0.203125 0.593750 +vt 0.203125 0.562500 +vt 0.718750 0.531250 +vt 0.187500 0.468750 +vt 0.703125 0.593750 +vt 0.703125 0.562500 +vt 0.703125 0.531250 +vt 0.171875 0.468750 +vt 0.156250 0.406250 +vt 0.953125 0.281250 +vt 0.671875 0.500000 +vt 0.140625 0.437500 +vt 0.656250 0.406250 +vt 0.125000 0.343750 +vt 0.796875 0.437500 +vt 0.460938 0.031250 +vt 0.476562 0.031250 +vt 0.828125 0.781250 +vt 0.156250 0.093750 +vt 0.640625 0.437500 +vt 0.640625 0.406250 +vt 0.625000 0.343750 +vt 0.093750 0.343750 +vt 0.921875 0.375000 +vt 0.765625 0.625000 +vt 0.609375 0.375000 +vt 0.078125 0.375000 +vt 0.593750 0.281250 +vt 0.062500 0.281250 +vt 0.953125 0.468750 +vt 0.578125 0.343750 +vt 0.578125 0.312500 +vt 0.578125 0.281250 +vt 0.031250 0.218750 +vt 0.078125 0.437500 +vt 0.046875 0.062500 +vt 0.078125 0.406250 +vt 0.546875 0.343750 +vt 0.546875 0.312500 +vt 0.546875 0.281250 +vt 0.531250 0.218750 +vt 0.000000 0.156250 +vt 1.000000 0.156250 +vt 0.140625 0.843750 +vt 0.109375 0.500000 +vt 0.515625 0.250000 +vt 0.984375 0.187500 +vt 0.500000 0.156250 +vt 0.968750 0.093750 +vt 0.984375 0.406250 +vt 0.062500 0.843750 +vt 0.031250 0.406250 +vt 0.484375 0.218750 +vt 0.484375 0.187500 +vt 0.484375 0.156250 +vt 0.953125 0.093750 +vt 1.000000 0.843750 +vt 0.000000 0.843750 +vt 0.453125 0.125000 +vt 0.921875 0.062500 +vt 0.875000 0.906250 +vt 0.421875 0.062500 +vt 0.859375 0.937500 +vt 0.859375 0.906250 +vt 0.843750 0.843750 +vt 0.359375 0.937500 +vt 0.828125 0.875000 +vt 0.343750 0.843750 +vt 0.812500 0.781250 +vt 0.906250 0.281250 +vt 0.328125 0.875000 +vt 0.328125 0.843750 +vt 0.312500 0.781250 +vt 0.781250 0.718750 +vt 0.109375 0.281250 +vt 0.093750 0.406250 +vt 0.296875 0.812500 +vt 0.296875 0.781250 +vt 0.281250 0.718750 +vt 0.796875 0.843750 +vt 0.265625 0.750000 +vt 0.062500 0.343750 +vt 0.250000 0.656250 +vt 0.234375 0.718750 +vt 0.234375 0.687500 +vt 0.234375 0.656250 +vt 0.218750 0.593750 +vt 0.093750 0.468750 +vt 0.796875 0.750000 +vt 0.203125 0.625000 +vt 0.187500 0.531250 +vt 0.718750 0.468750 +vt 0.890625 0.281250 +vt 0.828125 0.843750 +vt 0.171875 0.593750 +vt 0.171875 0.562500 +vt 0.703125 0.500000 +vt 0.703125 0.468750 +vt 0.687500 0.406250 +vt 0.210938 0.031250 +vt 0.226562 0.031250 +vt 0.156250 0.843750 +vt 0.921875 0.437500 +vt 0.875000 0.468750 +vt 0.953125 0.781250 +vt 0.921875 0.406250 +vt 0.140625 0.531250 +vt 0.671875 0.468750 +vt 0.671875 0.437500 +vt 0.671875 0.406250 +vt 0.656250 0.343750 +vt 0.968750 0.156250 +vt 0.046875 0.375000 +vt 0.429688 0.031250 +vt 0.445312 0.031250 +vt 0.984375 0.906250 +vt 0.640625 0.375000 +vt 0.109375 0.406250 +vt 0.625000 0.281250 +vt 0.078125 0.531250 +vt 0.078125 0.500000 +vt 0.109375 0.812500 +vt 0.078125 0.468750 +vt 0.609375 0.343750 +vt 0.609375 0.312500 +vt 0.609375 0.281250 +vt 0.593750 0.218750 +vt 0.140625 0.906250 +vt 0.578125 0.250000 +vt 0.578125 0.218750 +vt 0.804688 0.031250 +vt 0.820312 0.031250 +vt 0.015625 0.343750 +vt 0.015625 0.312500 +vt 0.546875 0.250000 +vt 1.000000 0.218750 +vt 0.000000 0.218750 +vt 0.531250 0.156250 +vt 0.687500 0.468750 +vt 0.031250 0.281250 +vt 0.515625 0.218750 +vt 0.515625 0.187500 +vt 0.515625 0.156250 +vt 0.500000 0.093750 +vt 0.796875 0.406250 +vt 0.953125 0.218750 +vt 0.953125 0.187500 +vt 0.484375 0.125000 +vt 0.484375 0.093750 +vt 0.921875 0.156250 +vt 0.453125 0.093750 +vt 0.453125 0.062500 +vt 0.406250 0.906250 +vt 0.890625 0.062500 +vt 0.390625 0.937500 +vt 0.390625 0.906250 +vt 0.375000 0.843750 +vt 0.359375 0.906250 +vt 0.359375 0.875000 +vt 0.812500 0.843750 +vt 0.343750 0.781250 +vt 0.765625 0.718750 +vt 0.796875 0.875000 +vt 0.328125 0.812500 +vt 0.328125 0.781250 +vt 0.312500 0.718750 +vt 0.765625 0.843750 +vt 0.296875 0.750000 +vt 0.281250 0.656250 +vt 0.796875 0.812500 +vt 0.953125 0.531250 +vt 0.796875 0.781250 +vt 0.265625 0.718750 +vt 0.265625 0.687500 +vt 0.265625 0.656250 +vt 0.250000 0.593750 +vt 0.921875 0.750000 +vt 0.890625 0.375000 +vt 0.234375 0.625000 +vt 0.218750 0.531250 +vt 0.218750 0.406250 +vt 0.953125 0.875000 +vt 0.015625 0.281250 +vt 0.203125 0.437500 +vt 0.718750 0.406250 +vt 0.187500 0.343750 +vt 0.078125 0.812500 +vt 0.046875 0.437500 +vt 0.078125 0.781250 +vt 0.046875 0.406250 +vt 0.703125 0.437500 +vt 0.703125 0.406250 +vt 0.687500 0.343750 +vt 0.156250 0.281250 +vt 0.828125 0.531250 +vt 0.171875 0.281250 +vt 0.109375 0.875000 +vt 0.765625 0.500000 +vt 0.671875 0.375000 +vt 0.140625 0.312500 +vt 0.656250 0.281250 +vt 0.125000 0.218750 +vt 0.562500 0.906250 +vt 0.523438 0.031250 +vt 0.539062 0.031250 +vt 0.640625 0.343750 +vt 0.640625 0.312500 +vt 0.640625 0.281250 +vt 0.625000 0.218750 +vt 0.093750 0.218750 +vt 0.609375 0.250000 +vt 0.609375 0.218750 +vt 0.593750 0.156250 +vt 0.062500 0.156250 +vt 0.046875 0.218750 +vt 0.578125 0.187500 +vt 0.578125 0.156250 +vt 0.031250 0.093750 +vt 0.546875 0.218750 +vt 0.546875 0.187500 +vt 0.015625 0.125000 +vt 0.531250 0.093750 +vt 0.906250 0.656250 +vt 0.515625 0.125000 +vt 0.515625 0.093750 +vt 0.937500 0.906250 +vt 0.484375 0.062500 +vt 0.921875 0.937500 +vt 0.437500 0.906250 +vt 0.906250 0.843750 +vt 0.421875 0.937500 +vt 0.421875 0.906250 +vt 0.406250 0.843750 +vt 0.875000 0.781250 +vt 0.390625 0.875000 +vt 0.390625 0.843750 +vt 0.375000 0.781250 +vt 0.093750 0.843750 +vt 0.828125 0.156250 +vt 0.125000 0.906250 +vt 0.359375 0.843750 +vt 0.359375 0.812500 +vt 0.359375 0.781250 +vt 0.343750 0.718750 +vt 0.812500 0.656250 +vt 0.890625 0.656250 +vt 0.859375 0.281250 +vt 0.328125 0.750000 +vt 0.796875 0.687500 +vt 0.312500 0.656250 +vt 0.781250 0.593750 +vt 0.984375 0.250000 +vt 0.921875 0.781250 +vt 0.296875 0.718750 +vt 0.734375 0.375000 +vt 0.296875 0.656250 +vt 0.281250 0.593750 +vt 0.750000 0.156250 +vt 0.015625 0.375000 +vt 0.265625 0.625000 +vt 0.250000 0.531250 +vt 0.140625 0.250000 +vt 0.078125 0.875000 +vt 0.234375 0.593750 +vt 0.234375 0.562500 +vt 0.218750 0.468750 +vt 0.171875 0.375000 +vt 0.093750 0.156250 +vt 0.062500 0.718750 +vt 0.203125 0.531250 +vt 0.203125 0.500000 +vt 0.203125 0.468750 +vt 0.187500 0.406250 +vt 0.718750 0.343750 +vt 0.796875 0.343750 +vt 0.171875 0.437500 +vt 0.703125 0.375000 +vt 0.703125 0.343750 +vt 0.687500 0.281250 +vt 0.671875 0.343750 +vt 0.671875 0.312500 +vt 0.125000 0.281250 +vt 0.656250 0.218750 +vt 0.492188 0.031250 +vt 0.507812 0.031250 +vt 0.812500 0.093750 +vt 0.109375 0.343750 +vt 0.640625 0.250000 +vt 0.640625 0.218750 +vt 0.625000 0.156250 +vt 0.078125 0.343750 +vt 0.078125 0.312500 +vt 0.609375 0.187500 +vt 0.062500 0.218750 +vt 0.593750 0.093750 +vt 0.843750 0.906250 +vt 0.093750 0.281250 +vt 0.109375 0.156250 +vt 0.578125 0.125000 +vt 0.562500 0.093750 +vt 0.015625 0.218750 +vt 0.546875 0.156250 +vt 0.546875 0.125000 +vt 0.546875 0.093750 +vt 0.921875 0.593750 +vt 0.984375 0.125000 +vt 0.515625 0.062500 +vt 0.125000 0.156250 +vt 0.468750 0.906250 +vt 0.953125 0.062500 +vt 0.453125 0.937500 +vt 0.453125 0.906250 +vt 0.437500 0.843750 +vt 0.859375 0.625000 +vt 0.828125 0.250000 +vt 0.218750 0.906250 +vt 0.890625 0.937500 +vt 0.421875 0.875000 +vt 0.875000 0.843750 +vt 0.406250 0.781250 +vt 0.890625 0.750000 +vt 0.953125 0.156250 +vt 0.859375 0.875000 +vt 0.390625 0.812500 +vt 0.390625 0.781250 +vt 0.375000 0.718750 +vt 0.984375 0.343750 +vt 0.984375 0.312500 +vt 0.015625 0.656250 +vt 0.984375 0.281250 +vt 0.828125 0.812500 +vt 0.359375 0.750000 +vt 0.812500 0.718750 +vt 0.343750 0.656250 +vt 0.046875 0.812500 +vt 0.109375 0.187500 +vt 0.046875 0.781250 +vt 0.328125 0.718750 +vt 0.328125 0.687500 +vt 0.328125 0.656250 +vt 0.312500 0.593750 +vt 0.140625 0.343750 +vt 0.171875 0.656250 +vt 0.140625 0.281250 +vt 0.296875 0.625000 +vt 0.750000 0.218750 +vt 0.281250 0.531250 +vt 0.203125 0.781250 +vt 0.265625 0.593750 +vt 0.265625 0.562500 +vt 0.250000 0.468750 +vt 0.296875 0.468750 +vt 0.031250 0.531250 +vt 0.234375 0.531250 +vt 0.234375 0.500000 +vt 0.234375 0.468750 +s 0 +f 308/339/1 979/1106/1 775/894/1 +f 4/4/2 786/905/2 790/909/2 +f 475/552/3 1130/1262/3 1213/1348/3 +f 5/5/4 1042/1171/4 880/1001/4 +f 1/1/5 488/566/5 487/565/5 +f 478/555/6 950/1074/6 675/778/6 +f 476/553/7 1307/1444/7 1396/1536/7 +f 6/6/8 951/1075/8 967/1092/8 +f 2/2/9 590/683/9 589/682/9 +f 479/556/10 1912/2067/10 862/983/10 +f 477/554/11 1488/1632/11 1568/1714/11 +f 480/557/12 1825/1979/12 773/891/12 +f 3/3/13 690/795/13 689/794/13 +f 481/558/14 678/781/14 1044/1173/14 +f 3/3/15 687/792/15 691/796/15 +f 474/551/16 1212/1347/16 576/669/16 +f 20/20/17 793/912/17 798/917/17 +f 13/13/18 1578/1724/18 1582/1728/18 +f 7/7/19 1058/1187/19 1078/1208/19 +f 308/340/20 705/811/20 979/1105/20 +f 14/14/21 1664/1813/21 1670/1819/21 +f 7/7/22 1056/1185/22 1059/1188/22 +f 15/15/23 1753/1906/23 1760/1913/23 +f 8/8/24 1142/1274/24 1145/1277/24 +f 16/16/25 1841/1995/25 1845/1999/25 +f 9/9/26 1226/1361/26 1233/1368/26 +f 17/17/27 491/569/27 497/576/27 +f 10/10/28 1324/1462/28 1329/1467/28 +f 19/19/29 698/803/29 697/802/29 +f 11/11/30 1412/1552/30 1415/1555/30 +f 20/20/31 797/916/31 796/915/31 +f 13/13/32 1581/1727/32 1580/1726/32 +f 24/24/33 1146/1278/33 1150/1282/33 +f 33/33/34 502/582/34 501/581/34 +f 25/25/35 1234/1369/35 1243/1378/35 +f 34/34/36 600/693/36 599/692/36 +f 26/26/37 1330/1468/37 1335/1473/37 +f 34/34/38 598/691/38 601/694/38 +f 27/27/39 1416/1556/39 1421/1562/39 +f 35/35/40 700/805/40 704/809/40 +f 28/28/41 1503/1647/41 1506/1650/41 +f 22/22/42 975/1100/42 988/1115/42 +f 308/341/43 805/925/43 705/810/43 +f 30/30/44 1680/1830/44 1679/1829/44 +f 22/22/45 970/1095/45 976/1101/45 +f 30/30/46 1671/1820/46 1681/1831/46 +f 23/23/47 1060/1189/47 1063/1192/47 +f 32/32/48 1848/2002/48 1847/2001/48 +f 44/44/49 1510/1655/49 1509/1654/49 +f 37/37/50 889/1011/50 897/1019/50 +f 308/342/51 506/587/51 805/924/51 +f 44/44/52 1507/1651/52 1511/1656/52 +f 37/37/53 887/1009/53 890/1012/53 +f 45/45/54 1588/1734/54 1595/1742/54 +f 38/38/55 977/1102/55 981/1108/55 +f 47/47/56 1774/1928/56 1773/1927/56 +f 39/39/57 1064/1193/57 1068/1198/57 +f 47/47/58 1769/1922/58 1775/1929/58 +f 40/40/59 1151/1283/59 1156/1289/59 +f 48/48/60 1850/2004/60 1855/2010/60 +f 41/41/61 1244/1379/61 1253/1389/61 +f 49/49/62 504/584/62 510/592/62 +f 43/43/63 1427/1569/63 1426/1568/63 +f 50/50/64 602/695/64 608/702/64 +f 62/62/65 1689/1840/65 1696/1847/65 +f 56/56/66 1161/1294/66 1160/1293/66 +f 63/63/67 1776/1930/67 1779/1933/67 +f 56/56/68 1157/1290/68 1162/1295/68 +f 65/65/69 517/601/69 516/600/69 +f 58/58/70 1344/1483/70 1343/1482/70 +f 65/65/71 511/593/71 518/602/71 +f 59/59/72 1432/1574/72 1431/1573/72 +f 52/52/73 808/928/73 811/931/73 +f 308/343/74 603/697/74 506/586/74 +f 59/59/75 1429/1571/75 1433/1575/75 +f 52/52/76 806/926/76 809/929/76 +f 60/60/77 1512/1657/77 1516/1661/77 +f 53/53/78 891/1013/78 894/1016/78 +f 62/62/79 1695/1846/79 1694/1845/79 +f 54/54/80 982/1109/80 985/1112/80 +f 308/344/81 1323/1461/81 603/696/81 +f 74/74/82 1346/1485/82 1352/1491/82 +f 67/67/83 710/817/83 716/824/83 +f 75/75/84 1434/1576/84 1439/1582/84 +f 68/68/85 810/930/85 813/934/85 +f 77/77/86 1606/1753/86 1605/1752/86 +f 69/69/87 895/1017/87 899/1022/87 +f 77/77/88 1602/1749/88 1607/1754/88 +f 71/71/89 1080/1211/89 1079/1210/89 +f 78/78/90 1697/1848/90 1700/1851/90 +f 71/71/91 1074/1204/91 1081/1212/91 +f 79/79/92 1780/1934/92 1784/1938/92 +f 73/73/93 1267/1403/93 1266/1402/93 +f 81/81/94 522/607/94 521/606/94 +f 74/74/95 1351/1490/95 1350/1489/95 +f 67/67/96 715/823/96 714/821/96 +f 95/126/97 1787/1941/97 1786/1940/97 +f 87/118/98 724/834/98 1088/1219/98 +f 96/127/99 1869/2024/99 1868/2023/99 +f 89/120/100 1271/1407/100 1270/1406/100 +f 96/127/101 1866/2021/101 1870/2025/101 +f 90/121/102 1355/1494/102 1354/1493/102 +f 83/114/103 720/829/103 617/711/103 +f 308/345/104 1772/1926/104 1323/1460/104 +f 90/121/105 639/736/105 1356/1495/105 +f 84/115/106 815/936/106 814/935/106 +f 91/122/107 1110/1242/107 1442/1585/107 +f 84/115/108 807/927/108 816/937/108 +f 93/124/109 1613/1760/109 1612/1759/109 +f 85/116/110 1264/1400/110 903/1026/110 +f 93/124/111 560/650/111 1614/1761/111 +f 87/118/112 1087/1218/112 1086/1217/112 +f 99/130/113 727/838/113 726/837/113 +f 106/137/114 1357/1496/114 1361/1500/114 +f 99/130/115 722/831/115 728/839/115 +f 108/139/116 1532/1678/116 1531/1677/116 +f 100/131/117 817/938/117 823/944/117 +f 108/139/118 1529/1675/118 1533/1679/118 +f 102/133/119 1000/1129/119 999/1128/119 +f 110/141/120 1710/1863/120 1709/1862/120 +f 102/133/121 997/1126/121 1001/1130/121 +f 110/141/122 1706/1859/122 1711/1864/122 +f 104/135/123 1180/1314/123 1179/1313/123 +f 111/142/124 1789/1943/124 1792/1946/124 +f 105/136/125 1277/1414/125 1276/1413/125 +f 98/129/126 626/722/126 621/716/126 +f 308/346/127 1851/2006/127 1772/1925/127 +f 105/136/128 1273/1409/128 1278/1415/128 +f 117/148/129 908/1032/129 913/1037/129 +f 125/156/130 1621/1769/130 1628/1776/130 +f 119/150/131 1100/1232/131 1099/1231/131 +f 126/157/132 1712/1865/132 1717/1870/132 +f 120/151/133 1185/1319/133 1184/1318/133 +f 113/144/134 534/621/134 1383/1522/134 +f 308/347/135 1591/1738/135 1851/2005/135 +f 120/151/136 1182/1316/136 1186/1320/136 +f 113/144/137 529/616/137 535/622/137 +f 121/152/138 1279/1416/138 1282/1419/138 +f 114/145/139 628/724/139 634/731/139 +f 123/154/140 1453/1597/140 1452/1596/140 +f 115/146/141 729/840/141 734/846/141 +f 123/154/142 1447/1591/142 1454/1598/142 +f 117/148/143 912/1036/143 911/1035/143 +f 125/156/144 1627/1775/144 1626/1774/144 +f 136/167/145 1187/1321/145 1191/1325/145 +f 130/161/146 642/740/146 641/739/146 +f 138/169/147 1368/1507/147 1367/1506/147 +f 130/161/148 635/732/148 643/741/148 +f 138/169/149 1366/1505/149 1369/1508/149 +f 132/163/150 832/953/150 831/952/150 +f 140/171/151 1547/1693/151 1546/1692/151 +f 132/163/152 830/951/152 833/954/152 +f 140/171/153 1542/1688/153 1548/1694/153 +f 134/165/154 1013/1142/154 1012/1141/154 +f 142/173/155 1720/1873/155 1719/1872/155 +f 135/166/156 1106/1238/156 1105/1237/156 +f 128/159/157 1877/2032/157 632/728/157 +f 308/348/158 1685/1836/158 1591/1737/158 +f 135/166/159 1102/1234/159 1107/1239/159 +f 128/159/160 1875/2030/160 1878/2033/160 +f 155/186/161 1460/1604/161 1466/1610/161 +f 149/180/162 924/1048/162 923/1047/162 +f 156/187/163 1549/1695/163 1556/1702/163 +f 150/181/164 1021/1150/164 1020/1149/164 +f 143/174/165 1798/1952/165 640/737/165 +f 308/349/166 1424/1566/166 1685/1835/166 +f 150/181/167 1015/1144/167 1022/1151/167 +f 143/174/168 1796/1950/168 1799/1953/168 +f 151/182/169 1108/1240/169 1114/1246/169 +f 145/176/170 549/638/170 548/637/170 +f 153/184/171 1290/1427/171 1289/1426/171 +f 145/176/172 543/631/172 550/639/172 +f 153/184/173 1287/1424/173 1291/1428/173 +f 147/178/174 745/859/174 744/858/174 +f 155/186/175 1465/1609/175 1464/1608/175 +f 147/178/176 740/853/176 746/860/176 +f 159/190/177 1800/1954/177 1803/1957/177 +f 168/199/178 1199/1334/178 1198/1333/178 +f 160/191/179 1886/2041/179 1891/2046/179 +f 168/199/180 1197/1332/180 1200/1335/180 +f 162/193/181 655/755/181 654/754/181 +f 169/200/182 1292/1429/182 1295/1432/182 +f 162/193/183 651/750/183 656/756/183 +f 171/202/184 1473/1617/184 1472/1616/184 +f 164/195/185 841/962/185 840/961/185 +f 172/203/186 1558/1704/186 1557/1703/186 +f 165/196/187 932/1056/187 931/1055/187 +f 158/189/188 1723/1876/188 646/744/188 +f 308/350/189 1508/1653/189 1424/1565/189 +f 165/196/190 926/1050/190 933/1057/190 +f 158/189/191 1721/1874/191 1724/1877/191 +f 166/197/192 1023/1152/192 1029/1158/192 +f 179/210/193 759/876/193 758/875/193 +f 186/217/194 1382/1521/194 1389/1529/194 +f 180/211/195 847/968/195 846/967/195 +f 173/204/196 1638/1787/196 652/751/196 +f 308/351/197 1250/1386/197 1508/1652/197 +f 180/211/198 843/964/198 848/969/198 +f 174/205/199 1727/1880/199 1726/1879/199 +f 181/212/200 934/1058/200 940/1064/200 +f 175/206/201 1809/1963/201 1808/1962/201 +f 183/214/202 1122/1254/202 1121/1253/202 +f 175/206/203 1804/1958/203 1810/1964/203 +f 183/214/204 1119/1251/204 1123/1255/204 +f 177/208/205 564/655/205 563/654/205 +f 185/216/206 1300/1437/206 1299/1436/206 +f 177/208/207 558/648/207 565/656/207 +f 185/216/208 1296/1433/208 1301/1438/208 +f 198/229/209 1039/1168/209 1038/1167/209 +f 190/221/210 1729/1882/210 1733/1886/210 +f 198/229/211 1035/1164/211 1040/1169/211 +f 192/223/212 1905/2060/212 1904/2059/212 +f 200/231/213 1209/1344/213 1208/1343/213 +f 192/223/214 1900/2055/214 1906/2061/214 +f 200/231/215 1206/1341/215 1210/1345/215 +f 194/225/216 668/770/216 667/769/216 +f 201/232/217 1302/1439/217 1304/1441/217 +f 195/226/218 766/883/218 765/882/218 +f 188/219/219 1561/1707/219 658/758/219 +f 308/352/220 1338/1477/220 1250/1385/220 +f 195/226/221 761/878/221 767/884/221 +f 188/219/222 1559/1705/222 1562/1708/222 +f 196/227/223 849/970/223 856/977/223 +f 189/220/224 1640/1789/224 1644/1793/224 +f 216/247/225 1211/1346/225 1218/1353/225 +f 210/241/226 677/780/226 676/779/226 +f 203/234/227 1485/1629/227 664/765/227 +f 308/353/228 1066/1196/228 1338/1476/228 +f 210/241/229 670/772/229 1918/2073/229 +f 203/234/230 1481/1625/230 1486/1630/230 +f 211/242/231 768/885/231 776/895/231 +f 204/235/232 1563/1709/232 1567/1713/232 +f 213/244/233 953/1077/233 952/1076/233 +f 205/236/234 1645/1794/234 1650/1799/234 +f 213/244/235 947/1071/235 954/1078/235 +f 207/238/236 569/660/236 1821/1975/236 +f 215/246/237 1134/1266/237 1133/1265/237 +f 207/238/238 1817/1971/238 1823/1977/238 +f 215/246/239 1128/1260/239 1135/1267/239 +f 209/240/240 580/673/240 1489/1633/240 +f 228/259/241 865/986/241 870/991/241 +f 222/253/242 1742/1895/242 1741/1894/242 +f 230/261/243 1050/1179/243 1049/1178/243 +f 222/253/244 1737/1890/244 1743/1896/244 +f 230/261/245 1047/1176/245 1051/1180/245 +f 224/255/246 1916/2071/246 1915/2070/246 +f 232/263/247 1220/1355/247 1219/1354/247 +f 225/256/248 583/676/248 582/675/248 +f 218/249/249 1401/1541/249 671/773/249 +f 308/354/250 1154/1287/250 1066/1195/250 +f 225/256/251 581/674/251 584/677/251 +f 218/249/252 1395/1535/252 1402/1542/252 +f 226/257/253 679/782/253 682/786/253 +f 220/251/254 1570/1716/254 1569/1715/254 +f 228/259/255 869/990/255 868/989/255 +f 220/251/256 702/807/256 1571/1717/256 +f 233/264/257 1316/1453/257 680/783/257 +f 308/355/258 1672/1822/258 1154/1286/258 +f 240/271/259 1917/2072/259 1922/2077/259 +f 233/264/260 1312/1449/260 1317/1454/260 +f 241/272/261 585/678/261 587/680/261 +f 234/265/262 1403/1543/262 1407/1547/262 +f 243/274/263 783/902/263 782/901/263 +f 235/266/264 1491/1635/264 1494/1638/264 +f 243/274/265 780/899/265 784/903/265 +f 237/268/266 1657/1806/266 1656/1805/266 +f 245/276/267 963/1088/267 962/1087/267 +f 237/268/268 1655/1804/268 1658/1807/268 +f 245/276/269 959/1083/269 964/1089/269 +f 239/270/270 1832/1986/270 1831/1985/270 +f 246/277/271 1052/1181/271 876/997/271 +f 240/271/272 1921/2076/272 1920/2075/272 +f 252/283/273 1411/1551/273 1410/1550/273 +f 260/291/274 693/798/274 692/797/274 +f 252/283/275 1575/1721/275 1409/1549/275 +f 260/291/276 688/793/276 694/799/276 +f 254/285/277 1577/1723/277 1576/1722/277 +f 261/292/278 965/1090/278 969/1094/278 +f 255/286/279 1838/1992/279 1837/1991/279 +f 248/279/280 1055/1184/280 684/788/280 +f 308/356/281 749/864/281 1672/1821/281 +f 255/286/282 1833/1987/282 1839/1993/282 +f 249/280/283 1321/1458/283 1320/1457/283 +f 256/287/284 1749/1902/284 1177/1311/284 +f 249/280/285 1318/1455/285 1322/1459/285 +f 258/289/286 490/568/286 489/567/286 +f 250/281/287 1408/1548/287 1914/2069/287 +f 258/289/288 484/561/288 1265/1401/288 +f 270/301/289 1579/1725/289 1583/1729/289 +f 264/295/290 1111/1243/290 609/703/290 +f 271/302/291 1840/1994/291 916/1040/291 +f 264/295/292 1057/1186/292 1112/1244/292 +f 273/304/293 595/688/293 594/687/293 +f 265/296/294 1543/1689/294 1031/1160/294 +f 273/304/295 592/685/295 1764/1917/295 +f 267/298/296 1500/1644/296 1499/1643/296 +f 275/306/297 1256/1392/297 795/914/297 +f 267/298/298 1497/1641/298 1909/2064/298 +f 275/306/299 792/911/299 1257/1393/299 +f 269/300/300 1668/1817/300 1667/1816/300 +f 277/308/301 974/1099/301 973/1098/301 +f 270/301/302 957/1081/302 956/1080/302 +f 263/294/303 1143/1275/303 486/563/303 +f 308/357/304 881/1003/304 749/863/304 +f 290/321/305 503/583/305 1404/1544/305 +f 282/313/306 1235/1370/306 1231/1366/306 +f 290/321/307 499/578/307 1405/1545/307 +f 284/315/308 1552/1698/308 1551/1697/308 +f 292/323/309 878/999/309 877/998/309 +f 285/316/310 1476/1620/310 1678/1828/310 +f 278/309/311 886/1008/311 493/571/311 +f 308/358/312 515/599/312 881/1002/312 +f 285/316/313 1446/1590/313 1477/1621/313 +f 278/309/314 884/1006/314 1698/1849/314 +f 286/317/315 1584/1730/315 1032/1161/315 +f 279/310/316 1673/1823/316 1617/1765/316 +f 288/319/317 1768/1921/317 1908/2063/317 +f 280/311/318 1061/1190/318 1011/1140/318 +f 288/319/319 1762/1915/319 1910/2065/319 +f 282/313/320 638/735/320 637/734/320 +f 293/324/321 1807/1961/321 514/597/321 +f 301/332/322 1298/1435/322 1688/1839/322 +f 294/325/323 888/1010/323 892/1014/323 +f 303/334/324 1025/1154/324 1853/2008/324 +f 295/326/325 605/699/325 764/881/325 +f 303/334/326 1849/2003/326 1647/1796/326 +f 297/328/327 1171/1304/327 1339/1478/327 +f 305/336/328 1902/2057/328 606/700/328 +f 297/328/329 844/965/329 1341/1480/329 +f 305/336/330 1874/2029/330 1864/2019/330 +f 299/330/331 631/727/331 629/725/331 +f 306/337/332 505/585/332 512/594/332 +f 300/331/333 1618/1766/333 1428/1570/333 +f 293/324/334 801/920/334 500/579/334 +f 308/359/335 709/816/335 515/598/335 +f 300/331/336 1423/1564/336 1430/1572/336 +f 313/375/337 1207/1342/337 1347/1486/337 +f 321/383/338 1835/1989/338 546/634/338 +f 315/377/339 1514/1659/339 1513/1658/339 +f 322/384/340 1518/1663/340 519/603/340 +f 316/378/341 1691/1842/341 1690/1841/341 +f 309/371/342 983/1110/342 507/588/342 +f 308/360/343 978/1104/343 709/815/343 +f 316/378/344 1660/1809/344 1693/1844/344 +f 309/371/345 842/963/345 874/995/345 +f 317/379/346 1648/1797/346 1611/1758/346 +f 310/372/347 1805/1959/347 1241/1376/347 +f 319/381/348 1858/2013/348 1857/2012/348 +f 311/373/349 987/1114/349 1757/1910/349 +f 319/381/350 1863/2018/350 1098/1230/350 +f 312/374/351 1070/1200/351 1326/1464/351 +f 321/383/352 614/708/352 613/707/352 +f 332/394/353 1435/1577/353 1758/1911/353 +f 325/387/354 1624/1772/354 990/1118/354 +f 334/396/355 1249/1384/355 1332/1470/355 +f 326/388/356 896/1018/356 1903/2058/356 +f 334/396/357 1603/1750/357 1251/1387/357 +f 328/390/358 1398/1538/358 1397/1537/358 +f 336/398/359 712/819/359 1782/1936/359 +f 328/390/360 1075/1205/360 1400/1540/360 +f 336/398/361 1781/1935/361 713/820/361 +f 330/392/362 873/994/362 872/993/362 +f 337/399/363 616/710/363 620/715/363 +f 331/393/364 1521/1666/364 1520/1665/364 +f 324/386/365 1024/1153/365 513/595/365 +f 308/361/366 719/828/366 978/1103/366 +f 331/393/367 1240/1375/367 1522/1667/367 +f 324/386/368 711/818/368 1026/1155/368 +f 351/413/369 1018/1147/369 1239/1374/369 +f 345/407/370 1391/1531/370 1353/1492/370 +f 352/414/371 1785/1939/371 794/913/371 +f 346/408/372 1272/1408/372 943/1067/372 +f 339/401/373 1536/1682/373 520/604/373 +f 308/362/374 725/836/374 719/827/374 +f 346/408/375 1269/1405/375 944/1068/375 +f 339/401/376 1436/1578/376 1537/1683/376 +f 347/409/377 1625/1773/377 867/988/377 +f 341/403/378 994/1122/378 993/1121/378 +f 349/411/379 1703/1855/379 1702/1854/379 +f 341/403/380 731/842/380 1017/1146/380 +f 349/411/381 1708/1861/381 1751/1904/381 +f 343/405/382 1173/1306/382 1172/1305/382 +f 351/413/383 1236/1371/383 1867/2022/383 +f 343/405/384 819/940/384 1895/2050/384 +f 364/436/385 1894/2049/385 1893/2048/385 +f 356/420/386 723/833/386 1167/1300/386 +f 364/436/387 1444/1588/387 1896/2051/387 +f 358/424/388 907/1031/388 623/719/388 +f 366/440/389 1620/1768/389 1390/1530/389 +f 358/424/390 905/1029/390 624/720/390 +f 366/440/391 1616/1764/391 1392/1532/391 +f 360/428/392 1094/1226/392 1535/1681/392 +f 367/442/393 1418/1559/393 1314/1451/393 +f 361/430/394 1359/1498/394 1358/1497/394 +f 354/416/395 528/615/395 523/608/395 +f 308/363/396 732/844/396 725/835/396 +f 361/430/397 1437/1580/397 1463/1607/397 +f 354/416/398 524/611/398 1686/1837/398 +f 362/432/399 1274/1411/399 1623/1771/399 +f 356/420/400 1166/1299/400 1164/1297/400 +f 382/459/401 1622/1770/401 1629/1777/401 +f 376/453/402 1101/1233/402 1739/1892/402 +f 369/446/403 787/906/403 1193/1327/403 +f 308/364/404 737/850/404 732/843/404 +f 376/453/405 1096/1228/405 1604/1751/405 +f 369/446/406 627/723/406 1097/1229/406 +f 377/454/407 1246/1381/407 1530/1676/407 +f 371/448/408 827/948/408 826/947/408 +f 379/456/409 1539/1685/409 1538/1684/409 +f 371/448/410 553/642/410 1676/1826/410 +f 379/456/411 1469/1613/411 1585/1731/411 +f 373/450/412 1006/1135/412 1005/1134/412 +f 381/458/413 1715/1868/413 1714/1867/413 +f 373/450/414 800/919/414 1158/1291/414 +f 381/458/415 1683/1833/415 1888/2043/415 +f 375/452/416 618/713/416 1183/1317/416 +f 386/463/417 537/624/417 1820/1974/417 +f 394/471/418 1284/1421/418 1159/1292/418 +f 388/465/419 739/852/419 1313/1450/419 +f 396/473/420 1459/1603/420 1139/1271/420 +f 388/465/421 736/848/421 1315/1452/421 +f 397/474/422 531/618/422 1718/1871/422 +f 390/467/423 788/907/423 1871/2026/423 +f 397/474/424 612/706/424 532/619/424 +f 391/468/425 1189/1323/425 1188/1322/425 +f 384/461/426 1795/1949/426 961/1085/426 +f 308/365/427 742/856/427 737/849/427 +f 391/468/428 1385/1525/428 1238/1373/428 +f 385/462/429 859/980/429 636/733/429 +f 392/469/430 1103/1235/430 1677/1827/430 +f 385/462/431 707/813/431 861/982/431 +f 394/471/432 1286/1423/432 910/1034/432 +f 406/483/433 925/1049/433 858/979/433 +f 399/476/434 1883/2038/434 540/627/434 +f 308/366/435 750/866/435 742/855/435 +f 406/483/436 920/1044/436 763/880/436 +f 399/476/437 851/972/437 1457/1601/437 +f 407/484/438 751/867/438 781/900/438 +f 401/478/439 648/747/439 647/746/439 +f 409/486/440 1372/1511/440 1371/1510/440 +f 401/478/441 901/1024/441 929/1053/441 +f 409/486/442 1642/1791/442 1665/1814/442 +f 403/480/443 836/957/443 835/956/443 +f 411/488/444 1554/1700/444 1553/1699/444 +f 403/480/445 1790/1944/445 1813/1967/445 +f 411/488/446 771/889/446 1153/1285/446 +f 405/482/447 1308/1445/447 1019/1148/447 +f 412/489/448 1461/1605/448 1467/1611/448 +f 424/501/449 1116/1248/449 1814/1968/449 +f 418/495/450 557/647/450 743/857/450 +f 426/503/451 1309/1446/451 1305/1442/451 +f 418/495/452 552/641/452 533/620/452 +f 426/503/453 1293/1430/453 1310/1447/453 +f 420/497/454 753/869/454 972/1097/454 +f 427/504/455 1137/1269/455 1223/1358/455 +f 421/498/456 1027/1156/456 825/946/456 +f 414/491/457 1635/1784/457 547/635/457 +f 308/367/458 756/873/458 750/865/458 +f 421/498/459 1675/1825/459 1377/1516/459 +f 414/491/460 1633/1782/460 1636/1785/460 +f 422/499/461 927/1051/461 930/1054/461 +f 416/493/462 1084/1215/462 494/573/462 +f 424/501/463 1118/1250/463 1419/1560/463 +f 416/493/464 1801/1955/464 1085/1216/464 +f 429/506/465 696/801/465 554/643/465 +f 308/368/466 1701/1853/466 756/872/466 +f 436/513/467 755/871/467 1525/1670/467 +f 430/507/468 1639/1788/468 653/753/468 +f 437/514/469 1425/1567/469 1451/1595/469 +f 430/507/470 1637/1786/470 1666/1815/470 +f 439/516/471 1203/1338/471 1202/1337/471 +f 431/508/472 1573/1719/472 1592/1739/472 +f 439/516/473 1054/1183/473 922/1046/473 +f 433/510/474 660/761/474 659/760/474 +f 441/518/475 1387/1527/475 1386/1526/475 +f 433/510/476 1275/1412/476 1076/1206/476 +f 441/518/477 1381/1520/477 1806/1960/477 +f 435/512/478 525/612/478 845/966/478 +f 442/519/479 1297/1434/479 1378/1517/479 +f 436/513/480 760/877/480 1763/1916/480 +f 448/525/481 1816/1970/481 1221/1356/481 +f 456/533/482 1127/1259/482 1550/1696/482 +f 448/525/483 1812/1966/483 1224/1359/483 +f 456/533/484 1125/1257/484 526/613/484 +f 450/527/485 573/665/485 1053/1182/485 +f 458/535/486 1450/1594/486 1247/1382/486 +f 451/528/487 854/975/487 853/974/487 +f 444/521/488 1480/1624/488 562/652/488 +f 308/369/489 770/888/489 1701/1852/489 +f 451/528/490 971/1096/490 604/698/490 +f 444/521/491 1475/1619/491 852/973/491 +f 452/529/492 762/879/492 1713/1866/492 +f 446/523/493 1738/1891/493 1652/1801/493 +f 454/531/494 946/1070/494 1842/1996/494 +f 446/523/495 1641/1790/495 1740/1893/495 +f 454/531/496 942/1066/496 1077/1207/496 +f 466/543/497 575/667/497 1036/1165/497 +f 460/537/498 921/1045/498 936/1060/498 +f 467/544/499 1337/1475/499 757/874/499 +f 461/538/500 665/767/500 1735/1888/500 +f 468/545/501 769/886/501 1258/1394/501 +f 462/539/502 610/704/502 666/768/502 +f 469/546/503 1564/1710/503 1043/1172/503 +f 463/540/504 571/663/504 1730/1883/504 +f 471/548/505 1215/1350/505 1214/1349/505 +f 464/541/506 1599/1746/506 882/1004/506 +f 471/548/507 1048/1177/507 1216/1351/507 +f 465/542/508 802/921/508 674/777/508 +f 472/549/509 1129/1261/509 1132/1264/509 +f 466/543/510 1766/1919/510 485/562/510 +f 459/536/511 1565/1711/511 570/661/511 +f 308/370/512 775/893/512 770/887/512 +f 4/4/513 790/909/513 789/908/513 +f 475/552/3 1213/1348/3 1306/1443/3 +f 5/5/4 880/1001/4 879/1000/4 +f 1/1/5 487/565/5 672/775/5 +f 478/555/6 675/778/6 1822/1976/6 +f 476/553/7 1396/1536/7 673/776/7 +f 6/6/8 967/1092/8 966/1091/8 +f 2/2/9 589/682/9 577/670/9 +f 479/556/10 862/983/10 579/672/10 +f 477/554/11 1568/1714/11 578/671/11 +f 480/557/12 773/891/12 863/984/12 +f 3/3/13 689/794/13 860/981/13 +f 481/558/14 1044/1173/14 774/892/14 +f 3/3/15 691/796/15 690/795/15 +f 20/20/17 798/917/17 797/916/17 +f 13/13/18 1582/1728/18 1581/1727/18 +f 14/14/21 1670/1819/21 1669/1818/21 +f 7/7/514 1059/1188/514 1058/1187/514 +f 15/15/23 1760/1913/23 1759/1912/23 +f 8/8/24 1145/1277/24 1144/1276/24 +f 16/16/25 1845/1999/25 1844/1998/25 +f 9/9/26 1233/1368/26 1232/1367/26 +f 17/17/27 497/576/27 496/575/27 +f 10/10/28 1329/1467/28 1328/1466/28 +f 19/19/29 697/802/29 593/686/29 +f 11/11/30 1415/1555/30 1414/1554/30 +f 20/20/31 796/915/31 1492/1636/31 +f 13/13/32 1580/1726/32 1498/1642/32 +f 24/24/33 1150/1282/33 1149/1281/33 +f 33/33/34 501/581/34 1846/2000/34 +f 25/25/35 1243/1378/35 1242/1377/35 +f 34/34/36 599/692/36 498/577/36 +f 26/26/37 1335/1473/37 1334/1472/37 +f 34/34/515 601/694/515 600/693/515 +f 27/27/39 1421/1562/39 1420/1561/39 +f 35/35/40 704/809/40 703/808/40 +f 28/28/41 1506/1650/41 1505/1649/41 +f 30/30/44 1679/1829/44 1707/1860/44 +f 22/22/516 976/1101/516 975/1100/516 +f 30/30/46 1681/1831/46 1680/1830/46 +f 23/23/47 1063/1192/47 1062/1191/47 +f 32/32/48 1847/2001/48 1761/1914/48 +f 44/44/49 1509/1654/49 1422/1563/49 +f 44/44/52 1511/1656/52 1510/1655/52 +f 37/37/53 890/1012/53 889/1011/53 +f 45/45/54 1595/1742/54 1594/1741/54 +f 38/38/55 981/1108/55 980/1107/55 +f 47/47/56 1773/1927/56 1682/1832/56 +f 39/39/57 1068/1198/57 1067/1197/57 +f 47/47/58 1775/1929/58 1774/1928/58 +f 40/40/59 1156/1289/59 1155/1288/59 +f 48/48/60 1855/2010/60 1854/2009/60 +f 41/41/61 1253/1389/61 1252/1388/61 +f 49/49/62 510/592/62 509/591/62 +f 43/43/63 1426/1568/63 1336/1474/63 +f 50/50/517 608/702/517 607/701/517 +f 62/62/65 1696/1847/65 1695/1846/65 +f 56/56/66 1160/1293/66 568/659/66 +f 63/63/67 1779/1933/67 1778/1932/67 +f 56/56/68 1162/1295/68 1161/1294/68 +f 65/65/69 516/600/69 1856/2011/69 +f 58/58/70 1343/1482/70 1254/1390/70 +f 65/65/71 518/602/71 517/601/71 +f 59/59/72 1431/1573/72 1342/1481/72 +f 59/59/75 1433/1575/75 1432/1574/75 +f 52/52/518 809/929/518 808/928/518 +f 60/60/77 1516/1661/77 1515/1660/77 +f 53/53/78 894/1016/78 893/1015/78 +f 62/62/79 1694/1845/79 1596/1743/79 +f 54/54/80 985/1112/80 984/1111/80 +f 74/74/82 1352/1491/82 1351/1490/82 +f 67/67/519 716/824/519 715/823/519 +f 75/75/84 1439/1582/84 1438/1581/84 +f 68/68/520 813/934/520 812/933/520 +f 77/77/86 1605/1752/86 1517/1662/86 +f 69/69/87 899/1022/87 898/1021/87 +f 77/77/88 1607/1754/88 1606/1753/88 +f 71/71/89 1079/1210/89 986/1113/89 +f 78/78/90 1700/1851/90 1699/1850/90 +f 71/71/91 1081/1212/91 1080/1211/91 +f 79/79/521 1784/1938/521 1783/1937/521 +f 73/73/93 1266/1402/93 1163/1296/93 +f 81/81/94 521/606/94 1861/2016/94 +f 74/74/95 1350/1489/95 1261/1397/95 +f 95/126/97 1786/1940/97 645/743/97 +f 87/118/98 1088/1219/98 1087/1218/98 +f 96/127/99 1868/2023/99 1483/1627/99 +f 89/120/100 1270/1406/100 1170/1303/100 +f 96/127/101 1870/2025/101 1869/2024/101 +f 90/121/522 1354/1493/522 1268/1404/522 +f 90/121/523 1356/1495/523 1355/1494/523 +f 84/115/106 814/935/106 1771/1924/106 +f 91/122/107 1442/1585/107 1441/1584/107 +f 84/115/108 816/937/108 815/936/108 +f 93/124/109 1612/1759/109 1524/1669/109 +f 85/116/110 903/1026/110 902/1025/110 +f 93/124/111 1614/1761/111 1613/1760/111 +f 87/118/112 1086/1217/112 992/1120/112 +f 99/130/113 726/837/113 622/718/113 +f 106/137/114 1361/1500/114 1360/1499/114 +f 99/130/115 728/839/115 727/838/115 +f 108/139/116 1531/1677/116 1443/1586/116 +f 100/131/117 823/944/117 822/943/117 +f 108/139/118 1533/1679/118 1532/1678/118 +f 102/133/119 999/1128/119 904/1027/119 +f 110/141/120 1709/1862/120 1615/1762/120 +f 102/133/121 1001/1130/121 1000/1129/121 +f 110/141/122 1711/1864/122 1710/1863/122 +f 104/135/123 1179/1313/123 1089/1220/123 +f 111/142/124 1792/1946/124 1791/1945/124 +f 105/136/524 1276/1413/524 1176/1310/524 +f 105/136/525 1278/1415/525 1277/1414/525 +f 117/148/129 913/1037/129 912/1036/129 +f 125/156/130 1628/1776/130 1627/1775/130 +f 119/150/131 1099/1231/131 1002/1131/131 +f 126/157/132 1717/1870/132 1716/1869/132 +f 120/151/526 1184/1318/526 1095/1227/526 +f 120/151/527 1186/1320/527 1185/1319/527 +f 113/144/137 535/622/137 534/621/137 +f 121/152/138 1282/1419/138 1281/1418/138 +f 114/145/139 634/731/139 633/730/139 +f 123/154/140 1452/1596/140 1362/1501/140 +f 115/146/141 734/846/141 733/845/141 +f 123/154/142 1454/1598/142 1453/1597/142 +f 117/148/143 911/1035/143 824/945/143 +f 125/156/144 1626/1774/144 1534/1680/144 +f 136/167/145 1191/1325/145 1190/1324/145 +f 130/161/528 641/739/528 536/623/528 +f 138/169/147 1367/1506/147 1283/1420/147 +f 130/161/148 643/741/148 642/740/148 +f 138/169/149 1369/1508/149 1368/1507/149 +f 132/163/150 831/952/150 735/847/150 +f 140/171/151 1546/1692/151 1455/1599/151 +f 132/163/152 833/954/152 832/953/152 +f 140/171/529 1548/1694/529 1547/1693/529 +f 134/165/154 1012/1141/154 914/1038/154 +f 142/173/530 1719/1872/530 799/918/530 +f 135/166/156 1105/1237/156 1009/1138/156 +f 135/166/159 1107/1239/159 1106/1238/159 +f 128/159/160 1878/2033/160 1877/2032/160 +f 155/186/161 1466/1610/161 1465/1609/161 +f 149/180/162 923/1047/162 834/955/162 +f 156/187/163 1556/1702/163 1555/1701/163 +f 150/181/164 1020/1149/164 919/1043/164 +f 150/181/167 1022/1151/167 1021/1150/167 +f 143/174/168 1799/1953/168 1798/1952/168 +f 151/182/169 1114/1246/169 1113/1245/169 +f 145/176/170 548/637/170 1879/2034/170 +f 153/184/171 1289/1426/171 1192/1326/171 +f 145/176/172 550/639/172 549/638/172 +f 153/184/173 1291/1428/173 1290/1427/173 +f 147/178/174 744/858/174 644/742/174 +f 155/186/175 1464/1608/175 1370/1509/175 +f 147/178/176 746/860/176 745/859/176 +f 159/190/177 1803/1957/177 1802/1956/177 +f 168/199/178 1198/1333/178 1115/1247/178 +f 160/191/179 1891/2046/179 1890/2045/179 +f 168/199/180 1200/1335/180 1199/1334/180 +f 162/193/181 654/754/181 551/640/181 +f 169/200/182 1295/1432/182 1294/1431/182 +f 162/193/183 656/756/183 655/755/183 +f 171/202/184 1472/1616/184 1375/1514/184 +f 164/195/185 840/961/185 747/861/185 +f 172/203/531 1557/1703/531 1468/1612/531 +f 165/196/187 931/1055/187 839/960/187 +f 165/196/190 933/1057/190 932/1056/190 +f 158/189/191 1724/1877/191 1723/1876/191 +f 166/197/192 1029/1158/192 1028/1157/192 +f 179/210/193 758/875/193 657/757/193 +f 186/217/532 1389/1529/532 1388/1528/532 +f 180/211/195 846/967/195 754/870/195 +f 180/211/198 848/969/198 847/968/198 +f 174/205/533 1726/1879/533 1230/1365/533 +f 181/212/200 940/1064/200 939/1063/200 +f 175/206/201 1808/1962/201 1725/1878/201 +f 183/214/202 1121/1253/202 1030/1159/202 +f 175/206/203 1810/1964/203 1809/1963/203 +f 183/214/204 1123/1255/204 1122/1254/204 +f 177/208/205 563/654/205 1892/2047/205 +f 185/216/206 1299/1436/206 1201/1336/206 +f 177/208/207 565/656/207 564/655/207 +f 185/216/208 1301/1438/208 1300/1437/208 +f 198/229/209 1038/1167/209 941/1065/209 +f 190/221/210 1733/1886/210 1732/1885/210 +f 198/229/211 1040/1169/211 1039/1168/211 +f 192/223/212 1904/2059/212 1811/1965/212 +f 200/231/213 1208/1343/213 1124/1256/213 +f 192/223/214 1906/2061/214 1905/2060/214 +f 200/231/534 1210/1345/534 1209/1344/534 +f 194/225/216 667/769/216 566/657/216 +f 201/232/535 1304/1441/535 1303/1440/535 +f 195/226/218 765/882/218 663/764/218 +f 195/226/221 767/884/221 766/883/221 +f 188/219/222 1562/1708/222 1561/1707/222 +f 196/227/223 856/977/223 855/976/223 +f 189/220/224 1644/1793/224 1643/1792/224 +f 216/247/225 1218/1353/225 1217/1352/225 +f 210/241/226 676/779/226 574/666/226 +f 210/241/229 1918/2073/229 677/780/229 +f 203/234/230 1486/1630/230 1485/1629/230 +f 211/242/231 776/895/231 960/1084/231 +f 204/235/232 1567/1713/232 1566/1712/232 +f 213/244/233 952/1076/233 857/978/233 +f 205/236/234 1650/1799/234 1649/1798/234 +f 213/244/235 954/1078/235 953/1077/235 +f 207/238/236 1821/1975/236 1734/1887/236 +f 215/246/237 1133/1265/237 1041/1170/237 +f 207/238/238 1823/1977/238 569/660/238 +f 215/246/239 1135/1267/239 1134/1266/239 +f 209/240/240 1489/1633/240 1907/2062/240 +f 228/259/241 870/991/241 869/990/241 +f 222/253/242 1741/1894/242 1651/1800/242 +f 230/261/243 1049/1178/243 955/1079/243 +f 222/253/244 1743/1896/244 1742/1895/244 +f 230/261/245 1051/1180/245 1050/1179/245 +f 224/255/246 1915/2070/246 1824/1978/246 +f 232/263/247 1219/1354/247 1136/1268/247 +f 225/256/536 582/675/536 1913/2068/536 +f 225/256/537 584/677/537 583/676/537 +f 218/249/252 1402/1542/252 1401/1541/252 +f 226/257/253 682/786/253 681/785/253 +f 220/251/254 1569/1715/254 1487/1631/254 +f 228/259/255 868/989/255 777/896/255 +f 220/251/256 1571/1717/256 1570/1716/256 +f 240/271/538 1922/2077/538 1921/2076/538 +f 233/264/260 1317/1454/260 1316/1453/260 +f 241/272/261 587/680/261 586/679/261 +f 234/265/262 1407/1547/262 1406/1546/262 +f 243/274/263 782/901/263 683/787/263 +f 235/266/264 1494/1638/264 1493/1637/264 +f 243/274/265 784/903/265 783/902/265 +f 237/268/266 1656/1805/266 1572/1718/266 +f 245/276/267 962/1087/267 871/992/267 +f 237/268/268 1658/1807/268 1657/1806/268 +f 245/276/269 964/1089/269 963/1088/269 +f 239/270/270 1831/1985/270 1744/1897/270 +f 246/277/271 876/997/271 875/996/271 +f 240/271/539 1920/2075/539 1828/1982/539 +f 252/283/273 1410/1550/273 1495/1639/273 +f 260/291/274 692/797/274 785/904/274 +f 252/283/275 1409/1549/275 1411/1551/275 +f 260/291/276 694/799/276 693/798/276 +f 254/285/277 1576/1722/277 1659/1808/277 +f 261/292/278 969/1094/278 968/1093/278 +f 255/286/279 1837/1991/279 1748/1901/279 +f 255/286/282 1839/1993/282 1838/1992/282 +f 249/280/283 1320/1457/283 1882/2037/283 +f 256/287/284 1177/1311/284 1752/1905/284 +f 249/280/285 1322/1459/285 1321/1458/285 +f 258/289/286 489/567/286 588/681/286 +f 250/281/287 1914/2069/287 1225/1360/287 +f 258/289/288 1265/1401/288 490/568/288 +f 270/301/289 1583/1729/289 957/1081/289 +f 264/295/290 609/703/290 1141/1273/290 +f 271/302/291 916/1040/291 1843/1997/291 +f 264/295/540 1112/1244/540 1111/1243/540 +f 273/304/293 594/687/293 1754/1907/293 +f 265/296/294 1031/1160/294 1327/1465/294 +f 273/304/295 1764/1917/295 595/688/295 +f 267/298/296 1499/1643/296 1227/1362/296 +f 275/306/297 795/914/297 492/570/297 +f 267/298/298 1909/2064/298 1500/1644/298 +f 275/306/541 1257/1393/541 1256/1392/541 +f 269/300/300 1667/1816/300 1413/1553/300 +f 277/308/301 973/1098/301 695/800/301 +f 270/301/302 956/1080/302 1663/1812/302 +f 290/321/305 1404/1544/305 597/690/305 +f 282/313/306 1231/1366/306 638/735/306 +f 290/321/307 1405/1545/307 503/583/307 +f 284/315/308 1551/1697/308 1502/1646/308 +f 292/323/309 877/998/309 1593/1740/309 +f 285/316/310 1678/1828/310 1417/1557/310 +f 285/316/313 1477/1621/313 1476/1620/313 +f 278/309/314 1698/1849/314 886/1008/314 +f 286/317/315 1032/1161/315 1587/1733/315 +f 279/310/316 1617/1765/316 1148/1280/316 +f 288/319/317 1908/2063/317 918/1042/317 +f 280/311/318 1011/1140/318 1178/1312/318 +f 288/319/319 1910/2065/319 1768/1921/319 +f 282/313/320 637/734/320 1073/1203/320 +f 293/324/321 514/597/321 801/920/321 +f 301/332/322 1688/1839/322 1545/1691/322 +f 294/325/323 892/1014/323 1765/1918/323 +f 303/334/324 1853/2008/324 1589/1735/324 +f 295/326/325 764/881/325 1692/1843/325 +f 303/334/326 1647/1796/326 1025/1154/326 +f 297/328/327 1339/1478/327 1065/1194/327 +f 305/336/328 606/700/328 1770/1923/328 +f 297/328/329 1341/1480/329 1171/1304/329 +f 305/336/330 1864/2019/330 1902/2057/330 +f 299/330/331 629/725/331 1245/1380/331 +f 306/337/332 512/594/332 1478/1622/332 +f 300/331/333 1428/1570/333 1071/1201/333 +f 300/331/336 1430/1572/336 1618/1766/336 +f 313/375/337 1347/1486/337 1248/1383/337 +f 321/383/338 546/634/338 614/708/338 +f 315/377/339 1513/1658/339 1255/1391/339 +f 322/384/340 519/603/340 1544/1690/340 +f 316/378/341 1690/1841/341 685/790/341 +f 316/378/344 1693/1844/344 1691/1842/344 +f 309/371/345 874/995/345 983/1110/345 +f 317/379/346 1611/1758/346 1609/1756/346 +f 310/372/542 1241/1376/542 1830/1984/542 +f 319/381/348 1857/2012/348 1597/1744/348 +f 311/373/349 1757/1910/349 1755/1908/349 +f 319/381/350 1098/1230/350 1858/2013/350 +f 312/374/351 1326/1464/351 1325/1463/351 +f 321/383/352 613/707/352 1777/1931/352 +f 332/394/353 1758/1911/353 1756/1909/353 +f 325/387/354 990/1118/354 989/1117/354 +f 334/396/355 1332/1470/355 1654/1803/355 +f 326/388/356 1903/2058/356 1901/2056/356 +f 334/396/357 1251/1387/357 1249/1384/357 +f 328/390/358 1397/1537/358 1836/1990/358 +f 336/398/359 1782/1936/359 1860/2015/359 +f 328/390/360 1400/1540/360 1398/1538/360 +f 336/398/361 713/820/361 712/819/361 +f 330/392/362 872/993/362 1345/1484/362 +f 337/399/363 620/715/363 619/714/363 +f 331/393/364 1520/1665/364 1262/1398/364 +f 331/393/367 1522/1667/367 1521/1666/367 +f 324/386/368 1026/1155/368 1024/1153/368 +f 351/413/369 1239/1374/369 1236/1371/369 +f 345/407/370 1353/1492/370 1082/1213/370 +f 352/414/371 794/913/371 1788/1942/371 +f 346/408/372 943/1067/372 1919/2074/372 +f 346/408/375 944/1068/375 1272/1408/375 +f 339/401/376 1537/1683/376 1536/1682/376 +f 347/409/377 867/988/377 1526/1671/377 +f 341/403/378 993/1121/378 717/825/378 +f 349/411/379 1702/1854/379 1440/1583/379 +f 341/403/380 1017/1146/380 994/1122/380 +f 349/411/381 1751/1904/381 1703/1855/381 +f 343/405/382 1172/1305/382 900/1023/382 +f 351/413/383 1867/2022/383 1608/1755/383 +f 343/405/384 1895/2050/384 1173/1306/384 +f 364/436/385 1893/2048/385 1528/1673/385 +f 356/420/386 1167/1300/386 1166/1299/386 +f 364/436/387 1896/2051/387 1894/2049/387 +f 358/424/388 623/719/388 996/1124/388 +f 366/440/389 1390/1530/389 1705/1857/389 +f 358/424/390 624/720/390 907/1031/390 +f 366/440/391 1392/1532/391 1620/1768/391 +f 360/428/392 1535/1681/392 1175/1308/392 +f 367/442/393 1314/1451/393 1872/2027/393 +f 361/430/394 1358/1497/394 1090/1221/394 +f 361/430/397 1463/1607/397 1359/1498/397 +f 354/416/398 1686/1837/398 528/615/398 +f 362/432/399 1623/1771/399 1016/1145/399 +f 356/420/400 1164/1297/400 1630/1778/400 +f 382/459/401 1629/1777/401 1462/1606/401 +f 376/453/402 1739/1892/402 1181/1315/402 +f 376/453/405 1604/1751/405 1101/1233/405 +f 369/446/406 1097/1229/406 787/906/406 +f 377/454/407 1530/1676/407 1363/1502/407 +f 371/448/408 826/947/408 530/617/408 +f 379/456/409 1538/1684/409 1280/1417/409 +f 371/448/410 1676/1826/410 827/948/410 +f 379/456/411 1585/1731/411 1539/1685/411 +f 373/450/412 1005/1134/412 730/841/412 +f 381/458/413 1714/1867/413 1448/1592/413 +f 373/450/414 1158/1291/414 1006/1135/414 +f 381/458/415 1888/2043/415 1715/1868/415 +f 375/452/416 1183/1317/416 909/1033/416 +f 386/463/417 1820/1974/417 542/630/417 +f 394/471/418 1159/1292/418 1286/1423/418 +f 388/465/419 1313/1450/419 829/950/419 +f 396/473/420 1139/1271/420 1541/1687/420 +f 388/465/421 1315/1452/421 739/852/421 +f 397/474/543 1718/1871/543 1456/1600/543 +f 390/467/423 1871/2026/423 1008/1137/423 +f 397/474/424 532/619/424 531/618/424 +f 391/468/425 1188/1322/425 915/1039/425 +f 391/468/428 1238/1373/428 1189/1323/428 +f 385/462/429 636/733/429 1793/1947/429 +f 392/469/430 1677/1827/430 1674/1824/430 +f 385/462/544 861/982/544 859/980/544 +f 394/471/432 910/1034/432 1365/1504/432 +f 406/483/433 858/979/433 1014/1143/433 +f 406/483/436 763/880/436 925/1049/436 +f 399/476/437 1457/1601/437 1883/2038/437 +f 407/484/438 781/900/438 1194/1329/438 +f 401/478/439 647/746/439 1797/1951/439 +f 409/486/440 1371/1510/440 1109/1241/440 +f 401/478/441 929/1053/441 648/747/441 +f 409/486/442 1665/1814/442 1372/1511/442 +f 403/480/443 835/956/443 544/632/443 +f 411/488/444 1553/1699/444 1288/1425/444 +f 403/480/445 1813/1967/445 836/957/445 +f 411/488/446 1153/1285/446 1554/1700/446 +f 405/482/447 1019/1148/447 741/854/447 +f 412/489/448 1467/1611/448 701/806/448 +f 424/501/449 1814/1968/449 1118/1250/449 +f 418/495/450 743/857/450 650/749/450 +f 426/503/451 1305/1442/451 1374/1513/451 +f 418/495/452 533/620/452 557/647/452 +f 426/503/453 1310/1447/453 1309/1446/453 +f 420/497/454 972/1097/454 838/959/454 +f 427/504/455 1223/1358/455 1222/1357/455 +f 421/498/456 825/946/456 748/862/456 +f 421/498/459 1377/1516/459 1027/1156/459 +f 414/491/460 1636/1785/460 1635/1784/460 +f 422/499/461 930/1054/461 928/1052/461 +f 416/493/462 494/573/462 1885/2040/462 +f 424/501/463 1419/1560/463 1196/1331/463 +f 416/493/464 1085/1216/464 1084/1215/464 +f 436/513/467 1525/1670/467 760/877/467 +f 430/507/545 653/753/545 1862/2017/545 +f 437/514/469 1451/1595/469 1449/1593/469 +f 430/507/470 1666/1815/470 1639/1788/470 +f 439/516/471 1202/1337/471 935/1059/471 +f 431/508/472 1592/1739/472 1897/2052/472 +f 439/516/473 922/1046/473 1203/1338/473 +f 433/510/474 659/760/474 778/897/474 +f 441/518/475 1386/1526/475 1120/1252/475 +f 433/510/476 1076/1206/476 660/761/476 +f 441/518/546 1806/1960/546 1387/1527/546 +f 435/512/478 845/966/478 559/649/478 +f 442/519/547 1378/1517/547 1376/1515/547 +f 436/513/480 1763/1916/480 495/574/480 +f 448/525/481 1221/1356/481 1899/2054/481 +f 456/533/482 1550/1696/482 1205/1340/482 +f 448/525/483 1224/1359/483 1816/1970/483 +f 456/533/484 526/613/484 1127/1259/484 +f 450/527/485 1053/1182/485 662/763/485 +f 458/535/486 1247/1382/486 1852/2007/486 +f 451/528/487 853/974/487 567/658/487 +f 451/528/490 604/698/490 854/975/490 +f 444/521/491 852/973/491 1480/1624/491 +f 452/529/492 1713/1866/492 1590/1736/492 +f 446/523/493 1652/1801/493 1728/1881/493 +f 454/531/494 1842/1996/494 1034/1163/494 +f 446/523/495 1740/1893/495 1738/1891/495 +f 454/531/496 1077/1207/496 946/1070/496 +f 466/543/548 1036/1165/548 1766/1919/548 +f 460/537/498 936/1060/498 1348/1487/498 +f 467/544/499 757/874/499 1037/1166/499 +f 461/538/500 1735/1888/500 1482/1626/500 +f 468/545/501 1258/1394/501 772/890/501 +f 462/539/502 666/768/502 820/941/502 +f 469/546/503 1043/1172/503 1263/1399/503 +f 463/540/504 1730/1883/504 1646/1795/504 +f 471/548/505 1214/1349/505 948/1072/505 +f 464/541/506 882/1004/506 938/1062/506 +f 471/548/507 1216/1351/507 1215/1350/507 +f 465/542/508 674/777/508 1818/1972/508 +f 472/549/509 1132/1264/509 1131/1263/509 +f 466/543/549 485/562/549 669/771/549 +f 485/562/549 3/3/549 802/921/549 +f 485/562/549 802/921/549 669/771/549 +f 669/771/549 802/921/549 465/542/549 +f 1132/1264/509 482/559/509 678/781/509 +f 1132/1264/509 678/781/509 1131/1263/509 +f 1131/1263/509 678/781/509 481/558/509 +f 674/777/508 477/554/508 1599/1746/508 +f 674/777/508 1599/1746/508 1818/1972/508 +f 1818/1972/508 1599/1746/508 464/541/508 +f 1216/1351/507 481/558/507 1825/1979/507 +f 1216/1351/507 1825/1979/507 1215/1350/507 +f 1215/1350/507 1825/1979/507 480/557/507 +f 882/1004/506 2/2/506 571/663/506 +f 882/1004/506 571/663/506 938/1062/506 +f 938/1062/506 571/663/506 463/540/506 +f 1214/1349/505 479/556/505 818/939/505 +f 1214/1349/505 818/939/505 948/1072/505 +f 948/1072/505 818/939/505 470/547/505 +f 1730/1883/504 476/553/504 610/704/504 +f 1730/1883/504 610/704/504 1646/1795/504 +f 1646/1795/504 610/704/504 462/539/504 +f 1043/1172/503 479/556/503 951/1075/503 +f 1043/1172/503 951/1075/503 1263/1399/503 +f 1263/1399/503 951/1075/503 6/6/503 +f 666/768/502 1/1/502 665/767/502 +f 666/768/502 665/767/502 820/941/502 +f 820/941/502 665/767/502 461/538/502 +f 1258/1394/501 6/6/501 950/1074/501 +f 1258/1394/501 950/1074/501 772/890/501 +f 772/890/501 950/1074/501 478/555/501 +f 1735/1888/500 475/552/500 921/1045/500 +f 1735/1888/500 921/1045/500 1482/1626/500 +f 1482/1626/500 921/1045/500 460/537/500 +f 757/874/499 478/555/499 1042/1171/499 +f 757/874/499 1042/1171/499 1037/1166/499 +f 1037/1166/499 1042/1171/499 5/5/499 +f 936/1060/498 474/551/498 1565/1711/498 +f 936/1060/498 1565/1711/498 1348/1487/498 +f 1348/1487/498 1565/1711/498 459/536/498 +f 1036/1165/497 5/5/497 786/905/497 +f 1036/1165/548 786/905/548 1766/1919/548 +f 1766/1919/497 786/905/497 4/4/497 +f 1077/1207/496 470/547/496 1564/1710/496 +f 1077/1207/496 1564/1710/496 946/1070/496 +f 946/1070/496 1564/1710/496 469/546/496 +f 1740/1893/495 462/539/495 820/941/495 +f 1740/1893/495 820/941/495 1738/1891/495 +f 1738/1891/495 820/941/495 461/538/495 +f 1842/1996/494 468/545/494 1519/1664/494 +f 1842/1996/494 1519/1664/494 1034/1163/494 +f 1034/1163/494 1519/1664/494 453/530/494 +f 1652/1801/493 460/537/493 1731/1884/493 +f 1652/1801/493 1731/1884/493 1728/1881/493 +f 1728/1881/493 1731/1884/493 445/522/493 +f 1713/1866/492 468/545/492 1337/1475/492 +f 1713/1866/492 1337/1475/492 1590/1736/492 +f 1590/1736/492 1337/1475/492 467/544/492 +f 852/973/491 460/537/491 1348/1487/491 +f 852/973/491 1348/1487/491 1480/1624/491 +f 1480/1624/491 1348/1487/491 459/536/491 +f 604/698/490 467/544/490 575/667/490 +f 604/698/490 575/667/490 854/975/490 +f 854/975/490 575/667/490 466/543/490 +f 853/974/487 465/542/487 573/665/487 +f 853/974/487 573/665/487 567/658/487 +f 567/658/487 573/665/487 450/527/487 +f 1247/1382/486 472/549/486 1393/1533/486 +f 1247/1382/486 1393/1533/486 1852/2007/486 +f 1852/2007/486 1393/1533/486 457/534/486 +f 1053/1182/485 464/541/485 1147/1279/485 +f 1053/1182/485 1147/1279/485 662/763/485 +f 662/763/485 1147/1279/485 449/526/485 +f 526/613/484 472/549/484 1048/1177/484 +f 526/613/484 1048/1177/484 1127/1259/484 +f 1127/1259/484 1048/1177/484 471/548/484 +f 1224/1359/483 464/541/483 938/1062/483 +f 1224/1359/483 938/1062/483 1816/1970/483 +f 1816/1970/483 938/1062/483 463/540/483 +f 1550/1696/482 470/547/482 998/1127/482 +f 1550/1696/482 998/1127/482 1205/1340/482 +f 1205/1340/482 998/1127/482 455/532/482 +f 1221/1356/481 462/539/481 1661/1810/481 +f 1221/1356/481 1661/1810/481 1899/2054/481 +f 1899/2054/481 1661/1810/481 447/524/481 +f 1763/1916/480 450/527/480 525/612/480 +f 1763/1916/480 525/612/480 495/574/480 +f 495/574/480 525/612/480 435/512/480 +f 1378/1517/547 458/535/547 1852/2007/547 +f 1378/1517/547 1852/2007/547 1376/1515/547 +f 1376/1515/547 1852/2007/547 457/534/547 +f 845/966/478 449/526/478 611/705/478 +f 845/966/478 611/705/478 559/649/478 +f 559/649/478 611/705/478 434/511/478 +f 1806/1960/546 457/534/546 1125/1257/546 +f 1806/1960/546 1125/1257/546 1387/1527/546 +f 1387/1527/546 1125/1257/546 456/533/546 +f 1076/1206/476 449/526/476 1812/1966/476 +f 1076/1206/476 1812/1966/476 660/761/476 +f 660/761/476 1812/1966/476 448/525/476 +f 1386/1526/475 455/532/475 1881/2036/475 +f 1386/1526/475 1881/2036/475 1120/1252/475 +f 1120/1252/475 1881/2036/475 440/517/475 +f 659/760/474 447/524/474 1152/1284/474 +f 659/760/474 1152/1284/474 778/897/474 +f 778/897/474 1152/1284/474 432/509/474 +f 922/1046/473 455/532/473 942/1066/473 +f 922/1046/473 942/1066/473 1203/1338/473 +f 1203/1338/473 942/1066/473 454/531/473 +f 1592/1739/472 447/524/472 1641/1790/472 +f 1592/1739/472 1641/1790/472 1897/2052/472 +f 1897/2052/472 1641/1790/472 446/523/472 +f 1202/1337/471 453/530/471 1004/1133/471 +f 1202/1337/471 1004/1133/471 935/1059/471 +f 935/1059/471 1004/1133/471 438/515/471 +f 1666/1815/470 446/523/470 1728/1881/470 +f 1666/1815/470 1728/1881/470 1639/1788/470 +f 1639/1788/470 1728/1881/470 445/522/470 +f 1451/1595/469 453/530/469 762/879/469 +f 1451/1595/469 762/879/469 1449/1593/469 +f 1449/1593/469 762/879/469 452/529/469 +f 653/753/468 444/521/468 696/801/468 +f 653/753/545 696/801/545 1862/2017/545 +f 1862/2017/468 696/801/468 429/506/468 +f 1525/1670/467 452/529/467 971/1096/467 +f 1525/1670/467 971/1096/467 760/877/467 +f 760/877/467 971/1096/467 451/528/467 +f 1085/1216/464 432/509/464 1573/1719/464 +f 1085/1216/464 1573/1719/464 1084/1215/464 +f 1084/1215/464 1573/1719/464 431/508/464 +f 1419/1560/463 438/515/463 850/971/463 +f 1419/1560/463 850/971/463 1196/1331/463 +f 1196/1331/463 850/971/463 423/500/463 +f 494/573/462 430/507/462 1889/2044/462 +f 494/573/462 1889/2044/462 1885/2040/462 +f 1885/2040/462 1889/2044/462 415/492/462 +f 930/1054/461 438/515/461 1425/1567/461 +f 930/1054/461 1425/1567/461 928/1052/461 +f 928/1052/461 1425/1567/461 437/514/461 +f 1636/1785/460 430/507/460 1862/2017/460 +f 1636/1785/460 1862/2017/460 1635/1784/460 +f 1635/1784/460 1862/2017/460 429/506/460 +f 1377/1516/459 437/514/459 755/871/459 +f 1377/1516/459 755/871/459 1027/1156/459 +f 1027/1156/459 755/871/459 436/513/459 +f 825/946/456 435/512/456 753/869/456 +f 825/946/456 753/869/456 748/862/456 +f 748/862/456 753/869/456 420/497/456 +f 1223/1358/455 443/520/455 1297/1434/455 +f 1223/1358/455 1297/1434/455 1222/1357/455 +f 1222/1357/455 1297/1434/455 442/519/455 +f 972/1097/454 434/511/454 1880/2035/454 +f 972/1097/454 1880/2035/454 838/959/454 +f 838/959/454 1880/2035/454 419/496/454 +f 1310/1447/453 442/519/453 1381/1520/453 +f 1310/1447/453 1381/1520/453 1309/1446/453 +f 1309/1446/453 1381/1520/453 441/518/453 +f 533/620/452 434/511/452 1275/1412/452 +f 533/620/452 1275/1412/452 557/647/452 +f 557/647/452 1275/1412/452 433/510/452 +f 1305/1442/451 440/517/451 1379/1518/451 +f 1305/1442/451 1379/1518/451 1374/1513/451 +f 1374/1513/451 1379/1518/451 425/502/451 +f 743/857/450 432/509/450 1003/1132/450 +f 743/857/450 1003/1132/450 650/749/450 +f 650/749/450 1003/1132/450 417/494/450 +f 1814/1968/449 440/517/449 1054/1183/449 +f 1814/1968/449 1054/1183/449 1118/1250/449 +f 1118/1250/449 1054/1183/449 439/516/449 +f 1467/1611/448 428/505/448 1137/1269/448 +f 1467/1611/448 1137/1269/448 701/806/448 +f 701/806/448 1137/1269/448 427/504/448 +f 1019/1148/447 419/496/447 1384/1524/447 +f 1019/1148/447 1384/1524/447 741/854/447 +f 741/854/447 1384/1524/447 404/481/447 +f 1153/1285/446 427/504/446 1293/1430/446 +f 1153/1285/446 1293/1430/446 1554/1700/446 +f 1554/1700/446 1293/1430/446 426/503/446 +f 1813/1967/445 419/496/445 552/641/445 +f 1813/1967/445 552/641/445 836/957/445 +f 836/957/445 552/641/445 418/495/445 +f 1553/1699/444 425/502/444 1229/1364/444 +f 1553/1699/444 1229/1364/444 1288/1425/444 +f 1288/1425/444 1229/1364/444 410/487/444 +f 835/956/443 417/494/443 1887/2042/443 +f 835/956/443 1887/2042/443 544/632/443 +f 544/632/443 1887/2042/443 402/479/443 +f 1665/1814/442 425/502/442 1116/1248/442 +f 1665/1814/442 1116/1248/442 1372/1511/442 +f 1372/1511/442 1116/1248/442 424/501/442 +f 929/1053/441 417/494/441 1801/1955/441 +f 929/1053/441 1801/1955/441 648/747/441 +f 648/747/441 1801/1955/441 416/493/441 +f 1371/1510/440 423/500/440 1746/1899/440 +f 1371/1510/440 1746/1899/440 1109/1241/440 +f 1109/1241/440 1746/1899/440 408/485/440 +f 647/746/439 415/492/439 1010/1139/439 +f 647/746/439 1010/1139/439 1797/1951/439 +f 1797/1951/439 1010/1139/439 400/477/439 +f 781/900/438 423/500/438 927/1051/438 +f 781/900/438 927/1051/438 1194/1329/438 +f 1194/1329/438 927/1051/438 422/499/438 +f 1457/1601/437 415/492/437 1633/1782/437 +f 1457/1601/550 1633/1782/550 1883/2038/550 +f 1883/2038/550 1633/1782/550 414/491/550 +f 763/880/436 422/499/436 1675/1825/436 +f 763/880/436 1675/1825/436 925/1049/436 +f 925/1049/436 1675/1825/436 421/498/436 +f 858/979/433 420/497/433 1308/1445/433 +f 858/979/433 1308/1445/433 1014/1143/433 +f 1014/1143/433 1308/1445/433 405/482/433 +f 910/1034/432 408/485/432 1598/1745/432 +f 910/1034/432 1598/1745/432 1365/1504/432 +f 1365/1504/432 1598/1745/432 393/470/432 +f 861/982/544 401/478/544 1797/1951/544 +f 861/982/544 1797/1951/544 859/980/544 +f 859/980/431 1797/1951/431 400/477/431 +f 1677/1827/430 408/485/430 751/867/430 +f 1677/1827/430 751/867/430 1674/1824/430 +f 1674/1824/430 751/867/430 407/484/430 +f 636/733/429 399/476/429 1795/1949/429 +f 636/733/429 1795/1949/429 1793/1947/429 +f 1793/1947/429 1795/1949/429 384/461/429 +f 1238/1373/428 407/484/428 920/1044/428 +f 1238/1373/428 920/1044/428 1189/1323/428 +f 1189/1323/428 920/1044/428 406/483/428 +f 1188/1322/425 405/482/425 788/907/425 +f 1188/1322/425 788/907/425 915/1039/425 +f 915/1039/425 788/907/425 390/467/425 +f 532/619/424 413/490/424 1461/1605/424 +f 532/619/424 1461/1605/424 531/618/424 +f 531/618/424 1461/1605/424 412/489/424 +f 1871/2026/423 404/481/423 1228/1363/423 +f 1871/2026/423 1228/1363/423 1008/1137/423 +f 1008/1137/423 1228/1363/423 389/466/423 +f 1718/1871/543 411/488/543 1459/1603/543 +f 1718/1871/543 1459/1603/543 1456/1600/543 +f 1456/1600/543 1459/1603/543 396/473/543 +f 1315/1452/421 404/481/421 1790/1944/421 +f 1315/1452/421 1790/1944/421 739/852/421 +f 739/852/421 1790/1944/421 403/480/421 +f 1139/1271/420 410/487/420 1083/1214/420 +f 1139/1271/420 1083/1214/420 1541/1687/420 +f 1541/1687/420 1083/1214/420 395/472/420 +f 1313/1450/419 402/479/419 1745/1898/419 +f 1313/1450/419 1745/1898/419 829/950/419 +f 829/950/419 1745/1898/419 387/464/419 +f 1159/1292/418 410/487/418 1642/1791/418 +f 1159/1292/418 1642/1791/418 1286/1423/418 +f 1286/1423/418 1642/1791/418 409/486/418 +f 1820/1974/417 402/479/417 901/1024/417 +f 1820/1974/417 901/1024/417 542/630/417 +f 542/630/417 901/1024/417 401/478/417 +f 1183/1317/416 389/466/416 706/812/416 +f 1183/1317/416 706/812/416 909/1033/416 +f 909/1033/416 706/812/416 374/451/416 +f 1888/2043/415 397/474/415 1456/1600/415 +f 1888/2043/415 1456/1600/415 1715/1868/415 +f 1715/1868/415 1456/1600/415 396/473/415 +f 1158/1291/414 389/466/414 736/848/414 +f 1158/1291/414 736/848/414 1006/1135/414 +f 1006/1135/414 736/848/414 388/465/414 +f 1714/1867/413 395/472/413 539/626/413 +f 1714/1867/413 539/626/413 1448/1592/413 +f 1448/1592/413 539/626/413 380/457/413 +f 1005/1134/412 387/464/412 1237/1372/412 +f 1005/1134/412 1237/1372/412 730/841/412 +f 730/841/412 1237/1372/412 372/449/412 +f 1585/1731/411 395/472/411 1284/1421/411 +f 1585/1731/411 1284/1421/411 1539/1685/411 +f 1539/1685/411 1284/1421/411 394/471/411 +f 1676/1826/410 387/464/410 537/624/410 +f 1676/1826/410 537/624/410 827/948/410 +f 827/948/410 537/624/410 386/463/410 +f 1538/1684/409 393/470/409 1092/1224/409 +f 1538/1684/409 1092/1224/409 1280/1417/409 +f 1280/1417/409 1092/1224/409 378/455/409 +f 826/947/408 385/462/408 1750/1903/408 +f 826/947/408 1750/1903/408 530/617/408 +f 530/617/408 1750/1903/408 370/447/408 +f 1530/1676/407 393/470/407 1103/1235/407 +f 1530/1676/407 1103/1235/407 1363/1502/407 +f 1363/1502/407 1103/1235/407 392/469/407 +f 1097/1229/406 385/462/406 1793/1947/406 +f 1097/1229/406 1793/1947/406 787/906/406 +f 787/906/406 1793/1947/406 384/461/406 +f 1604/1751/405 392/469/405 1385/1525/405 +f 1604/1751/405 1385/1525/405 1101/1233/405 +f 1101/1233/405 1385/1525/405 391/468/405 +f 1739/1892/402 390/467/402 618/713/402 +f 1739/1892/402 618/713/402 1181/1315/402 +f 1181/1315/402 618/713/402 375/452/402 +f 1629/1777/401 398/475/401 612/706/401 +f 1629/1777/401 612/706/401 1462/1606/401 +f 1462/1606/401 612/706/401 397/474/401 +f 1164/1297/400 370/447/400 821/942/400 +f 1164/1297/400 821/942/400 1630/1778/400 +f 1630/1778/400 821/942/400 355/418/400 +f 1623/1771/399 378/455/399 1246/1381/399 +f 1623/1771/399 1246/1381/399 1016/1145/399 +f 1016/1145/399 1246/1381/399 377/454/399 +f 1686/1837/398 370/447/398 627/723/398 +f 1686/1837/398 627/723/398 528/615/398 +f 528/615/398 627/723/398 369/446/398 +f 1463/1607/551 377/454/551 1096/1228/551 +f 1463/1607/551 1096/1228/551 1359/1498/551 +f 1359/1498/551 1096/1228/551 376/453/551 +f 1358/1497/552 375/452/552 1094/1226/552 +f 1358/1497/394 1094/1226/394 1090/1221/394 +f 1090/1221/552 1094/1226/552 360/428/552 +f 1314/1451/393 383/460/393 1622/1770/393 +f 1314/1451/393 1622/1770/393 1872/2027/393 +f 1872/2027/393 1622/1770/393 382/459/393 +f 1535/1681/392 374/451/392 538/625/392 +f 1535/1681/392 538/625/392 1175/1308/392 +f 1175/1308/392 538/625/392 359/426/392 +f 1392/1532/391 382/459/391 1683/1833/391 +f 1392/1532/391 1683/1833/391 1620/1768/391 +f 1620/1768/391 1683/1833/391 381/458/391 +f 624/720/390 374/451/390 800/919/390 +f 624/720/390 800/919/390 907/1031/390 +f 907/1031/390 800/919/390 373/450/390 +f 1390/1530/389 380/457/389 1819/1973/389 +f 1390/1530/389 1819/1973/389 1705/1857/389 +f 1705/1857/389 1819/1973/389 365/438/389 +f 623/719/388 372/449/388 1091/1223/388 +f 623/719/388 1091/1223/388 996/1124/388 +f 996/1124/388 1091/1223/388 357/422/388 +f 1896/2051/387 380/457/387 1469/1613/387 +f 1896/2051/387 1469/1613/387 1894/2049/387 +f 1894/2049/387 1469/1613/387 379/456/387 +f 1167/1300/386 372/449/386 553/642/386 +f 1167/1300/386 553/642/386 1166/1299/386 +f 1166/1299/386 553/642/386 371/448/386 +f 1893/2048/385 378/455/385 937/1061/385 +f 1893/2048/385 937/1061/385 1528/1673/385 +f 1528/1673/385 937/1061/385 363/434/385 +f 1895/2050/384 359/427/384 905/1028/384 +f 1895/2050/384 905/1028/384 1173/1306/384 +f 1173/1306/384 905/1028/384 358/425/384 +f 1867/2022/383 365/439/383 1319/1456/383 +f 1867/2022/383 1319/1456/383 1608/1755/383 +f 1608/1755/383 1319/1456/383 350/412/383 +f 1172/1305/382 357/423/382 545/633/382 +f 1172/1305/382 545/633/382 900/1023/382 +f 900/1023/382 545/633/382 342/404/382 +f 1751/1904/381 365/439/381 1444/1587/381 +f 1751/1904/381 1444/1587/381 1703/1855/381 +f 1703/1855/381 1444/1587/381 364/437/381 +f 1017/1146/380 357/423/380 723/832/380 +f 1017/1146/380 723/832/380 994/1122/380 +f 994/1122/380 723/832/380 356/421/380 +f 1702/1854/379 363/435/379 1826/1980/379 +f 1702/1854/379 1826/1980/379 1440/1583/379 +f 1440/1583/379 1826/1980/379 348/410/379 +f 993/1121/378 355/419/378 721/830/378 +f 993/1121/378 721/830/378 717/825/378 +f 717/825/378 721/830/378 340/402/378 +f 867/988/377 363/435/377 1274/1410/377 +f 867/988/377 1274/1410/377 1526/1671/377 +f 1526/1671/377 1274/1410/377 362/433/377 +f 1537/1683/376 355/419/376 524/610/376 +f 1537/1683/376 524/610/376 1536/1682/376 +f 1536/1682/376 524/610/376 354/417/376 +f 944/1068/375 362/433/375 1437/1579/375 +f 944/1068/375 1437/1579/375 1272/1408/375 +f 1272/1408/375 1437/1579/375 361/431/375 +f 943/1067/372 360/429/372 1391/1531/372 +f 943/1067/372 1391/1531/372 1919/2074/372 +f 1919/2074/372 1391/1531/372 345/407/372 +f 794/913/371 368/445/371 1418/1558/371 +f 794/913/371 1418/1558/371 1788/1942/371 +f 1788/1942/371 1418/1558/371 367/443/371 +f 1353/1492/370 359/427/370 1471/1615/370 +f 1353/1492/370 1471/1615/370 1082/1213/370 +f 1082/1213/370 1471/1615/370 344/406/370 +f 1239/1374/369 367/443/369 1616/1763/369 +f 1239/1374/369 1616/1763/369 1236/1371/369 +f 1236/1371/369 1616/1763/369 366/441/369 +f 1026/1155/368 340/402/368 1436/1578/368 +f 1026/1155/368 1436/1578/368 1024/1153/368 +f 1024/1153/368 1436/1578/368 339/401/368 +f 1522/1667/367 347/409/367 1269/1405/367 +f 1522/1667/367 1269/1405/367 1521/1666/367 +f 1521/1666/367 1269/1405/367 346/408/367 +f 1520/1665/364 345/407/364 873/994/364 +f 1520/1665/553 873/994/553 1262/1398/553 +f 1262/1398/364 873/994/364 330/392/364 +f 620/715/363 353/415/363 1785/1939/363 +f 620/715/363 1785/1939/363 619/714/363 +f 619/714/363 1785/1939/363 352/414/363 +f 872/993/362 344/406/362 1349/1488/362 +f 872/993/362 1349/1488/362 1345/1484/362 +f 1345/1484/362 1349/1488/362 329/391/362 +f 713/820/361 352/414/361 1018/1147/361 +f 713/820/361 1018/1147/361 712/819/361 +f 712/819/361 1018/1147/361 351/413/361 +f 1400/1540/360 344/406/360 819/940/360 +f 1400/1540/360 819/940/360 1398/1538/360 +f 1398/1538/360 819/940/360 343/405/360 +f 1782/1936/359 350/412/359 1165/1298/359 +f 1782/1936/359 1165/1298/359 1860/2015/359 +f 1860/2015/359 1165/1298/359 335/397/359 +f 1397/1537/358 342/404/358 1168/1301/358 +f 1397/1537/358 1168/1301/358 1836/1990/358 +f 1836/1990/358 1168/1301/358 327/389/358 +f 1251/1387/357 350/412/357 1708/1861/357 +f 1251/1387/357 1708/1861/357 1249/1384/357 +f 1249/1384/357 1708/1861/357 349/411/357 +f 1903/2058/356 342/404/356 731/842/356 +f 1903/2058/356 731/842/356 1901/2056/356 +f 1901/2056/356 731/842/356 341/403/356 +f 1332/1470/355 348/410/355 1684/1834/355 +f 1332/1470/355 1684/1834/355 1654/1803/355 +f 1654/1803/355 1684/1834/355 333/395/355 +f 990/1118/354 341/403/354 717/825/354 +f 990/1118/354 717/825/354 989/1117/354 +f 989/1117/354 717/825/354 340/402/354 +f 1758/1911/353 348/410/353 1625/1773/353 +f 1758/1911/353 1625/1773/353 1756/1909/353 +f 1756/1909/353 1625/1773/353 347/409/353 +f 613/707/352 335/397/352 630/726/352 +f 613/707/352 630/726/352 1777/1931/352 +f 1777/1931/352 630/726/352 320/382/352 +f 1326/1464/351 328/390/351 1836/1990/351 +f 1326/1464/351 1836/1990/351 1325/1463/351 +f 1325/1463/351 1836/1990/351 327/389/351 +f 1098/1230/350 335/397/350 1603/1750/350 +f 1098/1230/350 1603/1750/350 1858/2013/350 +f 1858/2013/350 1603/1750/350 334/396/350 +f 1757/1910/349 327/389/349 896/1018/349 +f 1757/1910/349 896/1018/349 1755/1908/349 +f 1755/1908/349 896/1018/349 326/388/349 +f 1857/2012/348 333/395/348 1601/1748/348 +f 1857/2012/348 1601/1748/348 1597/1744/348 +f 1597/1744/348 1601/1748/348 318/380/348 +f 1241/1376/542 326/388/542 1624/1772/542 +f 1241/1376/542 1624/1772/542 1830/1984/542 +f 1830/1984/347 1624/1772/347 325/387/347 +f 1611/1758/346 333/395/346 1435/1577/346 +f 1611/1758/346 1435/1577/346 1609/1756/346 +f 1609/1756/346 1435/1577/346 332/394/346 +f 874/995/345 325/387/345 711/818/345 +f 874/995/554 711/818/554 983/1110/554 +f 983/1110/555 711/818/555 324/386/555 +f 1693/1844/344 332/394/344 1240/1375/344 +f 1693/1844/344 1240/1375/344 1691/1842/344 +f 1691/1842/344 1240/1375/344 331/393/344 +f 1690/1841/341 330/392/341 1514/1659/341 +f 1690/1841/341 1514/1659/341 685/790/341 +f 685/790/341 1514/1659/341 315/377/341 +f 519/603/340 338/400/340 616/710/340 +f 519/603/340 616/710/340 1544/1690/340 +f 1544/1690/340 616/710/340 337/399/340 +f 1513/1658/339 329/391/339 1260/1396/339 +f 1513/1658/339 1260/1396/339 1255/1391/339 +f 1255/1391/339 1260/1396/339 314/376/339 +f 546/634/338 337/399/338 1781/1935/338 +f 546/634/338 1781/1935/338 614/708/338 +f 614/708/338 1781/1935/338 336/398/338 +f 1347/1486/337 329/391/337 1075/1205/337 +f 1347/1486/337 1075/1205/337 1248/1383/337 +f 1248/1383/337 1075/1205/337 328/390/337 +f 1430/1572/336 317/379/336 1660/1809/336 +f 1430/1572/336 1660/1809/336 1618/1766/336 +f 1618/1766/336 1660/1809/336 316/378/336 +f 1428/1570/333 315/377/333 631/727/333 +f 1428/1570/333 631/727/333 1071/1201/333 +f 1071/1201/333 631/727/333 299/330/333 +f 512/594/332 323/385/332 1518/1663/332 +f 512/594/332 1518/1663/332 1478/1622/332 +f 1478/1622/332 1518/1663/332 322/384/332 +f 629/725/331 314/376/331 718/826/331 +f 629/725/331 718/826/331 1245/1380/331 +f 1245/1380/331 718/826/331 298/329/331 +f 1864/2019/330 322/384/330 1835/1989/330 +f 1864/2019/330 1835/1989/330 1902/2057/330 +f 1902/2057/330 1835/1989/330 321/383/330 +f 1341/1480/329 314/376/329 1207/1342/329 +f 1341/1480/329 1207/1342/329 1171/1304/329 +f 1171/1304/329 1207/1342/329 313/375/329 +f 606/700/328 320/382/328 555/645/328 +f 606/700/328 555/645/328 1770/1923/328 +f 1770/1923/328 555/645/328 304/335/328 +f 1339/1478/327 312/374/327 1069/1199/327 +f 1339/1478/327 1069/1199/327 1065/1194/327 +f 1065/1194/327 1069/1199/327 296/327/327 +f 1647/1796/326 320/382/326 1863/2018/326 +f 1647/1796/326 1863/2018/326 1025/1154/326 +f 1025/1154/326 1863/2018/326 319/381/326 +f 764/881/325 312/374/325 987/1114/325 +f 764/881/325 987/1114/325 1692/1843/325 +f 1692/1843/325 987/1114/325 311/373/325 +f 1853/2008/324 318/380/324 1104/1236/324 +f 1853/2008/324 1104/1236/324 1589/1735/324 +f 1589/1735/324 1104/1236/324 302/333/324 +f 892/1014/323 311/373/323 1805/1959/323 +f 892/1014/323 1805/1959/323 1765/1918/323 +f 1765/1918/323 1805/1959/323 310/372/323 +f 1688/1839/322 318/380/322 1648/1797/322 +f 1688/1839/322 1648/1797/322 1545/1691/322 +f 1545/1691/322 1648/1797/322 317/379/322 +f 514/597/321 310/372/321 842/963/321 +f 514/597/321 842/963/321 801/920/321 +f 801/920/321 842/963/321 309/371/321 +f 637/734/320 296/327/320 1333/1471/320 +f 637/734/320 1333/1471/320 1073/1203/320 +f 1073/1203/320 1333/1471/320 281/312/320 +f 1910/2065/319 304/335/319 1849/2003/319 +f 1910/2065/319 1849/2003/319 1768/1921/319 +f 1768/1921/319 1849/2003/319 303/334/319 +f 1011/1140/318 296/327/318 605/699/318 +f 1011/1140/318 605/699/318 1178/1312/318 +f 1178/1312/318 605/699/318 295/326/318 +f 1908/2063/317 302/333/317 949/1073/317 +f 1908/2063/317 949/1073/317 918/1042/317 +f 918/1042/317 949/1073/317 287/318/317 +f 1617/1765/316 295/326/316 888/1010/316 +f 1617/1765/316 888/1010/316 1148/1280/316 +f 1148/1280/316 888/1010/316 294/325/316 +f 1032/1161/315 302/333/315 1298/1435/315 +f 1032/1161/315 1298/1435/315 1587/1733/315 +f 1587/1733/315 1298/1435/315 301/332/315 +f 1698/1849/314 294/325/314 1807/1961/314 +f 1698/1849/314 1807/1961/314 886/1008/314 +f 886/1008/314 1807/1961/314 293/324/314 +f 1477/1621/313 301/332/313 1423/1564/313 +f 1477/1621/313 1423/1564/313 1476/1620/313 +f 1476/1620/313 1423/1564/313 300/331/313 +f 1678/1828/310 299/330/310 1552/1698/310 +f 1678/1828/310 1552/1698/310 1417/1557/310 +f 1417/1557/310 1552/1698/310 284/315/310 +f 877/998/309 306/337/309 803/922/309 +f 877/998/309 803/922/309 1593/1740/309 +f 1593/1740/309 803/922/309 291/322/309 +f 1551/1697/308 298/329/308 1504/1648/308 +f 1551/1697/308 1504/1648/308 1502/1646/308 +f 1502/1646/308 1504/1648/308 283/314/308 +f 1405/1545/307 306/337/307 1874/2029/307 +f 1405/1545/307 1874/2029/307 503/583/307 +f 503/583/307 1874/2029/307 305/336/307 +f 1231/1366/306 298/329/306 844/965/306 +f 1231/1366/306 844/965/306 638/735/306 +f 638/735/306 844/965/306 297/328/306 +f 1404/1544/305 304/335/305 1829/1983/305 +f 1404/1544/305 1829/1983/305 597/690/305 +f 597/690/305 1829/1983/305 289/320/305 +f 956/1080/302 284/315/302 1668/1817/302 +f 956/1080/302 1668/1817/302 1663/1812/302 +f 1663/1812/302 1668/1817/302 269/300/302 +f 973/1098/301 291/322/301 699/804/301 +f 973/1098/301 699/804/301 695/800/301 +f 695/800/301 699/804/301 276/307/301 +f 1667/1816/300 283/314/300 1484/1628/300 +f 1667/1816/300 1484/1628/300 1413/1553/300 +f 1413/1553/300 1484/1628/300 268/299/300 +f 1257/1393/541 291/322/541 499/578/541 +f 1257/1393/299 499/578/299 1256/1392/299 +f 1256/1392/541 499/578/541 290/321/541 +f 1909/2064/298 283/314/298 1235/1370/298 +f 1909/2064/298 1235/1370/298 1500/1644/298 +f 1500/1644/298 1235/1370/298 282/313/298 +f 795/914/297 289/320/297 1331/1469/297 +f 795/914/297 1331/1469/297 492/570/297 +f 492/570/297 1331/1469/297 274/305/297 +f 1499/1643/296 281/312/296 561/651/296 +f 1499/1643/296 561/651/296 1227/1362/296 +f 1227/1362/296 561/651/296 266/297/296 +f 1764/1917/295 289/320/295 1762/1915/295 +f 1764/1917/295 1762/1915/295 595/688/295 +f 595/688/295 1762/1915/295 288/319/295 +f 1031/1160/294 281/312/294 1061/1190/294 +f 1031/1160/294 1061/1190/294 1327/1465/294 +f 1327/1465/294 1061/1190/294 280/311/294 +f 594/687/293 287/318/293 1834/1988/293 +f 594/687/293 1834/1988/293 1754/1907/293 +f 1754/1907/293 1834/1988/293 272/303/293 +f 1112/1244/540 280/311/540 1673/1823/540 +f 1112/1244/292 1673/1823/292 1111/1243/292 +f 1111/1243/540 1673/1823/540 279/310/540 +f 916/1040/291 287/318/291 1584/1730/291 +f 916/1040/291 1584/1730/291 1843/1997/291 +f 1843/1997/291 1584/1730/291 286/317/291 +f 609/703/290 278/309/290 1143/1275/290 +f 609/703/290 1143/1275/290 1141/1273/290 +f 1141/1273/290 1143/1275/290 263/294/290 +f 1583/1729/289 286/317/289 1446/1590/289 +f 1583/1729/289 1446/1590/289 957/1081/289 +f 957/1081/556 1446/1590/556 285/316/556 +f 1265/1401/288 274/305/288 592/685/288 +f 1265/1401/288 592/685/288 490/568/288 +f 490/568/288 592/685/288 273/304/288 +f 1914/2069/287 266/297/287 1543/1689/287 +f 1914/2069/287 1543/1689/287 1225/1360/287 +f 1225/1360/287 1543/1689/287 265/296/287 +f 489/567/286 272/303/286 591/684/286 +f 489/567/286 591/684/286 588/681/286 +f 588/681/286 591/684/286 257/288/286 +f 1322/1459/285 265/296/285 1057/1186/285 +f 1322/1459/285 1057/1186/285 1321/1458/285 +f 1321/1458/285 1057/1186/285 264/295/285 +f 1177/1311/284 272/303/284 1840/1994/284 +f 1177/1311/284 1840/1994/284 1752/1905/284 +f 1752/1905/284 1840/1994/284 271/302/284 +f 1320/1457/283 263/294/283 1055/1184/283 +f 1320/1457/283 1055/1184/283 1882/2037/283 +f 1882/2037/283 1055/1184/283 248/279/283 +f 1839/1993/282 271/302/282 1579/1725/282 +f 1839/1993/282 1579/1725/282 1838/1992/282 +f 1838/1992/282 1579/1725/282 270/301/282 +f 1837/1991/279 269/300/279 1577/1723/279 +f 1837/1991/279 1577/1723/279 1748/1901/279 +f 1748/1901/279 1577/1723/279 254/285/279 +f 969/1094/278 277/308/278 695/800/278 +f 969/1094/278 695/800/278 968/1093/278 +f 968/1093/278 695/800/278 276/307/278 +f 1576/1722/277 268/299/277 1662/1811/277 +f 1576/1722/277 1662/1811/277 1659/1808/277 +f 1659/1808/277 1662/1811/277 253/284/277 +f 694/799/276 276/307/276 792/911/276 +f 694/799/276 792/911/276 693/798/276 +f 693/798/276 792/911/276 275/306/276 +f 1409/1549/275 268/299/275 1497/1641/275 +f 1409/1549/275 1497/1641/275 1411/1551/275 +f 1411/1551/275 1497/1641/275 267/298/275 +f 692/797/274 274/305/274 791/910/274 +f 692/797/274 791/910/274 785/904/274 +f 785/904/274 791/910/274 259/290/274 +f 1410/1550/273 266/297/273 1496/1640/273 +f 1410/1550/273 1496/1640/273 1495/1639/273 +f 1495/1639/273 1496/1640/273 251/282/273 +f 1920/2075/539 254/285/539 1832/1986/539 +f 1920/2075/539 1832/1986/539 1828/1982/539 +f 1828/1982/539 1832/1986/539 239/270/539 +f 876/997/271 262/293/271 965/1090/271 +f 876/997/271 965/1090/271 875/996/271 +f 875/996/271 965/1090/271 261/292/271 +f 1831/1985/270 253/284/270 1747/1900/270 +f 1831/1985/270 1747/1900/270 1744/1897/270 +f 1744/1897/270 1747/1900/270 238/269/270 +f 964/1089/269 261/292/269 688/793/269 +f 964/1089/269 688/793/269 963/1088/269 +f 963/1088/269 688/793/269 260/291/269 +f 1658/1807/268 253/284/268 1575/1721/268 +f 1658/1807/268 1575/1721/268 1657/1806/268 +f 1657/1806/268 1575/1721/268 252/283/268 +f 962/1087/267 259/290/267 686/791/267 +f 962/1087/267 686/791/267 871/992/267 +f 871/992/267 686/791/267 244/275/267 +f 1656/1805/266 251/282/266 1574/1720/266 +f 1656/1805/266 1574/1720/266 1572/1718/266 +f 1572/1718/266 1574/1720/266 236/267/266 +f 784/903/265 259/290/265 484/561/265 +f 784/903/265 484/561/265 783/902/265 +f 783/902/265 484/561/265 258/289/265 +f 1494/1638/264 251/282/264 1408/1548/264 +f 1494/1638/264 1408/1548/264 1493/1637/264 +f 1493/1637/264 1408/1548/264 250/281/264 +f 782/901/263 257/288/263 483/560/263 +f 782/901/263 483/560/263 683/787/263 +f 683/787/263 483/560/263 242/273/263 +f 1407/1547/262 250/281/262 1318/1455/262 +f 1407/1547/262 1318/1455/262 1406/1546/262 +f 1406/1546/262 1318/1455/262 249/280/262 +f 587/680/261 257/288/261 1749/1902/261 +f 587/680/261 1749/1902/261 586/679/261 +f 586/679/261 1749/1902/261 256/287/261 +f 1317/1454/260 249/280/260 1882/2037/260 +f 1317/1454/260 1882/2037/260 1316/1453/260 +f 1316/1453/260 1882/2037/260 248/279/260 +f 1922/2077/538 256/287/538 1833/1987/538 +f 1922/2077/259 1833/1987/259 1921/2076/259 +f 1921/2076/538 1833/1987/538 255/286/538 +f 1571/1717/256 236/267/256 1491/1635/256 +f 1571/1717/256 1491/1635/256 1570/1716/256 +f 1570/1716/256 1491/1635/256 235/266/256 +f 868/989/255 242/273/255 779/898/255 +f 868/989/255 779/898/255 777/896/255 +f 777/896/255 779/898/255 227/258/255 +f 1569/1715/254 234/265/254 1490/1634/254 +f 1569/1715/254 1490/1634/254 1487/1631/254 +f 1487/1631/254 1490/1634/254 219/250/254 +f 682/786/253 242/273/253 585/678/253 +f 682/786/253 585/678/253 681/785/253 +f 681/785/253 585/678/253 241/272/253 +f 1402/1542/252 234/265/252 1312/1449/252 +f 1402/1542/252 1312/1449/252 1401/1541/252 +f 1401/1541/252 1312/1449/252 233/264/252 +f 584/677/537 241/272/537 1917/2072/537 +f 584/677/537 1917/2072/537 583/676/537 +f 583/676/537 1917/2072/537 240/271/537 +f 582/675/248 239/270/248 1916/2071/248 +f 582/675/248 1916/2071/248 1913/2068/248 +f 1913/2068/248 1916/2071/248 224/255/248 +f 1219/1354/247 246/277/247 1138/1270/247 +f 1219/1354/247 1138/1270/247 1136/1268/247 +f 1136/1268/247 1138/1270/247 231/262/247 +f 1915/2070/246 238/269/246 1827/1981/246 +f 1915/2070/246 1827/1981/246 1824/1978/246 +f 1824/1978/246 1827/1981/246 223/254/246 +f 1051/1180/245 246/277/245 959/1083/245 +f 1051/1180/245 959/1083/245 1050/1179/245 +f 1050/1179/245 959/1083/245 245/276/245 +f 1743/1896/244 238/269/244 1655/1804/244 +f 1743/1896/244 1655/1804/244 1742/1895/244 +f 1742/1895/244 1655/1804/244 237/268/244 +f 1049/1178/243 244/275/243 958/1082/243 +f 1049/1178/243 958/1082/243 955/1079/243 +f 955/1079/243 958/1082/243 229/260/243 +f 1741/1894/242 236/267/242 1653/1802/242 +f 1741/1894/242 1653/1802/242 1651/1800/242 +f 1651/1800/242 1653/1802/242 221/252/242 +f 870/991/241 244/275/241 780/899/241 +f 870/991/241 780/899/241 869/990/241 +f 869/990/241 780/899/241 243/274/241 +f 1489/1633/240 223/254/240 1911/2066/240 +f 1489/1633/240 1911/2066/240 1907/2062/240 +f 1907/2062/240 1911/2066/240 208/239/240 +f 1135/1267/239 231/262/239 1047/1176/239 +f 1135/1267/239 1047/1176/239 1134/1266/239 +f 1134/1266/239 1047/1176/239 230/261/239 +f 1823/1977/238 223/254/238 1737/1890/238 +f 1823/1977/238 1737/1890/238 569/660/238 +f 569/660/238 1737/1890/238 222/253/238 +f 1133/1265/237 229/260/237 1046/1175/237 +f 1133/1265/237 1046/1175/237 1041/1170/237 +f 1041/1170/237 1046/1175/237 214/245/237 +f 1821/1975/236 221/252/236 1736/1889/236 +f 1821/1975/236 1736/1889/236 1734/1887/236 +f 1734/1887/236 1736/1889/236 206/237/236 +f 954/1078/235 229/260/235 865/986/235 +f 954/1078/235 865/986/235 953/1077/235 +f 953/1077/235 865/986/235 228/259/235 +f 1650/1799/234 221/252/234 702/807/234 +f 1650/1799/234 702/807/234 1649/1798/234 +f 1649/1798/234 702/807/234 220/251/234 +f 952/1076/233 227/258/233 864/985/233 +f 952/1076/233 864/985/233 857/978/233 +f 857/978/233 864/985/233 212/243/233 +f 1567/1713/232 220/251/232 1487/1631/232 +f 1567/1713/232 1487/1631/232 1566/1712/232 +f 1566/1712/232 1487/1631/232 219/250/232 +f 776/895/231 227/258/231 679/782/231 +f 776/895/231 679/782/231 960/1084/231 +f 960/1084/231 679/782/231 226/257/231 +f 1486/1630/230 219/250/230 1395/1535/230 +f 1486/1630/230 1395/1535/230 1485/1629/230 +f 1485/1629/230 1395/1535/230 218/249/230 +f 1918/2073/229 226/257/229 581/674/229 +f 1918/2073/229 581/674/229 677/780/229 +f 677/780/229 581/674/229 225/256/229 +f 676/779/226 224/255/226 580/673/226 +f 676/779/226 580/673/226 574/666/226 +f 574/666/226 580/673/226 209/240/226 +f 1218/1353/225 232/263/225 1136/1268/225 +f 1218/1353/225 1136/1268/225 1217/1352/225 +f 1217/1352/225 1136/1268/225 231/262/225 +f 1644/1793/224 205/236/224 1563/1709/224 +f 1644/1793/224 1563/1709/224 1643/1792/224 +f 1643/1792/224 1563/1709/224 204/235/224 +f 856/977/223 212/243/223 768/885/223 +f 856/977/223 768/885/223 855/976/223 +f 855/976/223 768/885/223 211/242/223 +f 1562/1708/557 204/235/557 1481/1625/557 +f 1562/1708/222 1481/1625/222 1561/1707/222 +f 1561/1707/222 1481/1625/222 203/234/222 +f 767/884/221 211/242/221 670/772/221 +f 767/884/221 670/772/221 766/883/221 +f 766/883/221 670/772/221 210/241/221 +f 765/882/218 209/240/218 668/770/218 +f 765/882/218 668/770/218 663/764/218 +f 663/764/218 668/770/218 194/225/218 +f 1304/1441/535 217/248/535 1211/1346/535 +f 1304/1441/535 1211/1346/535 1303/1440/535 +f 1303/1440/535 1211/1346/535 216/247/535 +f 667/769/216 208/239/216 572/664/216 +f 667/769/216 572/664/216 566/657/216 +f 566/657/216 572/664/216 193/224/216 +f 1210/1345/534 216/247/534 1128/1260/534 +f 1210/1345/534 1128/1260/534 1209/1344/534 +f 1209/1344/534 1128/1260/534 215/246/534 +f 1906/2061/214 208/239/214 1817/1971/214 +f 1906/2061/214 1817/1971/214 1905/2060/214 +f 1905/2060/214 1817/1971/214 207/238/214 +f 1208/1343/213 214/245/213 1126/1258/213 +f 1208/1343/213 1126/1258/213 1124/1256/213 +f 1124/1256/213 1126/1258/213 199/230/213 +f 1904/2059/212 206/237/212 1815/1969/212 +f 1904/2059/212 1815/1969/212 1811/1965/212 +f 1811/1965/212 1815/1969/212 191/222/212 +f 1040/1169/211 214/245/211 947/1071/211 +f 1040/1169/211 947/1071/211 1039/1168/211 +f 1039/1168/211 947/1071/211 213/244/211 +f 1733/1886/210 206/237/210 1645/1794/210 +f 1733/1886/210 1645/1794/210 1732/1885/210 +f 1732/1885/210 1645/1794/210 205/236/210 +f 1038/1167/209 212/243/209 945/1069/209 +f 1038/1167/209 945/1069/209 941/1065/209 +f 941/1065/209 945/1069/209 197/228/209 +f 1301/1438/208 201/232/208 1206/1341/208 +f 1301/1438/208 1206/1341/208 1300/1437/208 +f 1300/1437/208 1206/1341/208 200/231/208 +f 565/656/207 193/224/207 1900/2055/207 +f 565/656/207 1900/2055/207 564/655/207 +f 564/655/207 1900/2055/207 192/223/207 +f 1299/1436/206 199/230/206 1204/1339/206 +f 1299/1436/206 1204/1339/206 1201/1336/206 +f 1201/1336/206 1204/1339/206 184/215/206 +f 563/654/205 191/222/205 1898/2053/205 +f 563/654/205 1898/2053/205 1892/2047/205 +f 1892/2047/205 1898/2053/205 176/207/205 +f 1123/1255/204 199/230/204 1035/1164/204 +f 1123/1255/204 1035/1164/204 1122/1254/204 +f 1122/1254/204 1035/1164/204 198/229/204 +f 1810/1964/203 191/222/203 1729/1882/203 +f 1810/1964/203 1729/1882/203 1809/1963/203 +f 1809/1963/203 1729/1882/203 190/221/203 +f 1121/1253/202 197/228/202 1033/1162/202 +f 1121/1253/202 1033/1162/202 1030/1159/202 +f 1030/1159/202 1033/1162/202 182/213/202 +f 1808/1962/201 189/220/201 1727/1880/201 +f 1808/1962/201 1727/1880/201 1725/1878/201 +f 1725/1878/201 1727/1880/201 174/205/201 +f 940/1064/200 197/228/200 849/970/200 +f 940/1064/200 849/970/200 939/1063/200 +f 939/1063/200 849/970/200 196/227/200 +f 1726/1879/199 188/219/199 1638/1787/199 +f 1726/1879/199 1638/1787/199 1230/1365/199 +f 1230/1365/199 1638/1787/199 173/204/199 +f 848/969/198 196/227/198 761/878/198 +f 848/969/198 761/878/198 847/968/198 +f 847/968/198 761/878/198 195/226/198 +f 846/967/195 194/225/195 759/876/195 +f 846/967/195 759/876/195 754/870/195 +f 754/870/195 759/876/195 179/210/195 +f 1389/1529/194 202/233/194 1302/1439/194 +f 1389/1529/194 1302/1439/194 1388/1528/194 +f 1388/1528/532 1302/1439/532 201/232/532 +f 758/875/193 193/224/193 661/762/193 +f 758/875/193 661/762/193 657/757/193 +f 657/757/193 661/762/193 178/209/193 +f 1029/1158/192 182/213/192 934/1058/192 +f 1029/1158/192 934/1058/192 1028/1157/192 +f 1028/1157/192 934/1058/192 181/212/192 +f 1724/1877/191 174/205/191 1230/1365/191 +f 1724/1877/191 1230/1365/191 1723/1876/191 +f 1723/1876/558 1230/1365/558 173/204/558 +f 933/1057/190 181/212/190 843/964/190 +f 933/1057/190 843/964/190 932/1056/190 +f 932/1056/190 843/964/190 180/211/190 +f 931/1055/187 179/210/187 841/962/187 +f 931/1055/187 841/962/187 839/960/187 +f 839/960/187 841/962/187 164/195/187 +f 1557/1703/531 186/217/531 1473/1617/531 +f 1557/1703/531 1473/1617/531 1468/1612/531 +f 1468/1612/531 1473/1617/531 171/202/531 +f 840/961/185 178/209/185 752/868/185 +f 840/961/185 752/868/185 747/861/185 +f 747/861/185 752/868/185 163/194/185 +f 1472/1616/184 185/216/184 1380/1519/184 +f 1472/1616/184 1380/1519/184 1375/1514/184 +f 1375/1514/184 1380/1519/184 170/201/184 +f 656/756/183 178/209/183 558/648/183 +f 656/756/183 558/648/183 655/755/183 +f 655/755/183 558/648/183 177/208/183 +f 1295/1432/182 185/216/182 1201/1336/182 +f 1295/1432/182 1201/1336/182 1294/1431/182 +f 1294/1431/182 1201/1336/182 184/215/182 +f 654/754/181 176/207/181 556/646/181 +f 654/754/181 556/646/181 551/640/181 +f 551/640/181 556/646/181 161/192/181 +f 1200/1335/180 184/215/180 1119/1251/180 +f 1200/1335/180 1119/1251/180 1199/1334/180 +f 1199/1334/180 1119/1251/180 183/214/180 +f 1891/2046/179 176/207/179 1804/1958/179 +f 1891/2046/179 1804/1958/179 1890/2045/179 +f 1890/2045/179 1804/1958/179 175/206/179 +f 1198/1333/178 182/213/178 1117/1249/178 +f 1198/1333/178 1117/1249/178 1115/1247/178 +f 1115/1247/178 1117/1249/178 167/198/178 +f 1803/1957/177 175/206/177 1725/1878/177 +f 1803/1957/177 1725/1878/177 1802/1956/177 +f 1802/1956/177 1725/1878/177 174/205/177 +f 746/860/176 163/194/176 651/750/176 +f 746/860/176 651/750/176 745/859/176 +f 745/859/176 651/750/176 162/193/176 +f 1464/1608/175 169/200/175 1373/1512/175 +f 1464/1608/175 1373/1512/175 1370/1509/175 +f 1370/1509/175 1373/1512/175 154/185/175 +f 744/858/174 161/192/174 649/748/174 +f 744/858/174 649/748/174 644/742/174 +f 644/742/174 649/748/174 146/177/174 +f 1291/1428/173 169/200/173 1197/1332/173 +f 1291/1428/173 1197/1332/173 1290/1427/173 +f 1290/1427/173 1197/1332/173 168/199/173 +f 550/639/172 161/192/172 1886/2041/172 +f 550/639/172 1886/2041/172 549/638/172 +f 549/638/172 1886/2041/172 160/191/172 +f 1289/1426/171 167/198/171 1195/1330/171 +f 1289/1426/171 1195/1330/171 1192/1326/171 +f 1192/1326/171 1195/1330/171 152/183/171 +f 548/637/559 159/190/559 1884/2039/559 +f 548/637/170 1884/2039/170 1879/2034/170 +f 1879/2034/559 1884/2039/559 144/175/559 +f 1114/1246/169 167/198/169 1023/1152/169 +f 1114/1246/169 1023/1152/169 1113/1245/169 +f 1113/1245/169 1023/1152/169 166/197/169 +f 1799/1953/560 159/190/560 1721/1874/560 +f 1799/1953/168 1721/1874/168 1798/1952/168 +f 1798/1952/168 1721/1874/168 158/189/168 +f 1022/1151/167 166/197/167 926/1050/167 +f 1022/1151/167 926/1050/167 1021/1150/167 +f 1021/1150/167 926/1050/167 165/196/167 +f 1020/1149/561 164/195/561 924/1048/561 +f 1020/1149/164 924/1048/164 919/1043/164 +f 919/1043/164 924/1048/164 149/180/164 +f 1556/1702/163 172/203/163 1468/1612/163 +f 1556/1702/163 1468/1612/163 1555/1701/163 +f 1555/1701/163 1468/1612/163 171/202/163 +f 923/1047/162 163/194/162 837/958/162 +f 923/1047/162 837/958/162 834/955/162 +f 834/955/162 837/958/162 148/179/162 +f 1466/1610/562 171/202/562 1375/1514/562 +f 1466/1610/562 1375/1514/562 1465/1609/562 +f 1465/1609/161 1375/1514/161 170/201/161 +f 1878/2033/160 144/175/160 1796/1950/160 +f 1878/2033/160 1796/1950/160 1877/2032/160 +f 1877/2032/160 1796/1950/160 143/174/160 +f 1107/1239/159 151/182/159 1015/1144/159 +f 1107/1239/159 1015/1144/159 1106/1238/159 +f 1106/1238/159 1015/1144/159 150/181/159 +f 1105/1237/563 149/180/563 1013/1142/563 +f 1105/1237/156 1013/1142/156 1009/1138/156 +f 1009/1138/156 1013/1142/156 134/165/156 +f 1719/1872/530 156/187/530 1631/1780/530 +f 1719/1872/530 1631/1780/530 799/918/530 +f 799/918/530 1631/1780/530 141/172/530 +f 1012/1141/154 148/179/154 917/1041/154 +f 1012/1141/154 917/1041/154 914/1038/154 +f 914/1038/154 917/1041/154 133/164/154 +f 1548/1694/529 156/187/529 1460/1604/529 +f 1548/1694/529 1460/1604/529 1547/1693/529 +f 1547/1693/529 1460/1604/529 155/186/529 +f 833/954/152 148/179/152 740/853/152 +f 833/954/152 740/853/152 832/953/152 +f 832/953/152 740/853/152 147/178/152 +f 1546/1692/151 154/185/151 1458/1602/151 +f 1546/1692/151 1458/1602/151 1455/1599/151 +f 1455/1599/151 1458/1602/151 139/170/151 +f 831/952/150 146/177/150 738/851/150 +f 831/952/150 738/851/150 735/847/150 +f 735/847/150 738/851/150 131/162/150 +f 1369/1508/149 154/185/149 1287/1424/149 +f 1369/1508/149 1287/1424/149 1368/1507/149 +f 1368/1507/149 1287/1424/149 153/184/149 +f 643/741/148 146/177/148 543/631/148 +f 643/741/148 543/631/148 642/740/148 +f 642/740/148 543/631/148 145/176/148 +f 1367/1506/147 152/183/147 1285/1422/147 +f 1367/1506/147 1285/1422/147 1283/1420/147 +f 1283/1420/147 1285/1422/147 137/168/147 +f 641/739/146 144/175/146 541/629/146 +f 641/739/146 541/629/146 536/623/146 +f 536/623/146 541/629/146 129/160/146 +f 1191/1325/145 152/183/145 1108/1240/145 +f 1191/1325/145 1108/1240/145 1190/1324/145 +f 1190/1324/145 1108/1240/145 151/182/145 +f 1626/1774/144 139/170/144 1540/1686/144 +f 1626/1774/144 1540/1686/144 1534/1680/144 +f 1534/1680/144 1540/1686/144 124/155/144 +f 911/1035/143 131/162/143 828/949/143 +f 911/1035/143 828/949/143 824/945/143 +f 824/945/143 828/949/143 116/147/143 +f 1454/1598/142 139/170/142 1366/1505/142 +f 1454/1598/142 1366/1505/142 1453/1597/142 +f 1453/1597/142 1366/1505/142 138/169/142 +f 734/846/141 131/162/141 635/732/141 +f 734/846/141 635/732/141 733/845/141 +f 733/845/141 635/732/141 130/161/141 +f 1452/1596/140 137/168/140 1364/1503/140 +f 1452/1596/140 1364/1503/140 1362/1501/140 +f 1362/1501/140 1364/1503/140 122/153/140 +f 634/731/139 130/161/139 536/623/139 +f 634/731/139 536/623/139 633/730/139 +f 633/730/139 536/623/139 129/160/139 +f 1282/1419/138 137/168/138 1187/1321/138 +f 1282/1419/138 1187/1321/138 1281/1418/138 +f 1281/1418/138 1187/1321/138 136/167/138 +f 535/622/137 129/160/137 1875/2030/137 +f 535/622/137 1875/2030/137 534/621/137 +f 534/621/137 1875/2030/137 128/159/137 +f 1186/1320/136 136/167/136 1102/1234/136 +f 1186/1320/136 1102/1234/136 1185/1319/136 +f 1185/1319/136 1102/1234/136 135/166/136 +f 1184/1318/526 134/165/526 1100/1232/526 +f 1184/1318/526 1100/1232/526 1095/1227/526 +f 1095/1227/526 1100/1232/526 119/150/526 +f 1717/1870/132 142/173/132 799/918/132 +f 1717/1870/132 799/918/132 1716/1869/132 +f 1716/1869/132 799/918/132 141/172/132 +f 1099/1231/131 133/164/131 1007/1136/131 +f 1099/1231/131 1007/1136/131 1002/1131/131 +f 1002/1131/131 1007/1136/131 118/149/131 +f 1628/1776/130 141/172/130 1542/1688/130 +f 1628/1776/130 1542/1688/130 1627/1775/130 +f 1627/1775/130 1542/1688/130 140/171/130 +f 913/1037/129 133/164/129 830/951/129 +f 913/1037/129 830/951/129 912/1036/129 +f 912/1036/129 830/951/129 132/163/129 +f 1278/1415/128 121/152/128 1182/1316/128 +f 1278/1415/128 1182/1316/128 1277/1414/128 +f 1277/1414/128 1182/1316/128 120/151/128 +f 1276/1413/564 119/150/564 1180/1314/564 +f 1276/1413/524 1180/1314/524 1176/1310/524 +f 1176/1310/524 1180/1314/524 104/135/524 +f 1792/1946/124 127/158/124 1712/1865/124 +f 1792/1946/124 1712/1865/124 1791/1945/124 +f 1791/1945/124 1712/1865/124 126/157/124 +f 1179/1313/123 118/149/123 1093/1225/123 +f 1179/1313/123 1093/1225/123 1089/1220/123 +f 1089/1220/123 1093/1225/123 103/134/123 +f 1711/1864/122 126/157/122 1621/1769/122 +f 1711/1864/122 1621/1769/122 1710/1863/122 +f 1710/1863/122 1621/1769/122 125/156/122 +f 1001/1130/121 118/149/121 908/1032/121 +f 1001/1130/121 908/1032/121 1000/1129/121 +f 1000/1129/121 908/1032/121 117/148/121 +f 1709/1862/120 124/155/120 1619/1767/120 +f 1709/1862/120 1619/1767/120 1615/1762/120 +f 1615/1762/120 1619/1767/120 109/140/120 +f 999/1128/119 116/147/119 906/1030/119 +f 999/1128/119 906/1030/119 904/1027/119 +f 904/1027/119 906/1030/119 101/132/119 +f 1533/1679/118 124/155/118 1447/1591/118 +f 1533/1679/118 1447/1591/118 1532/1678/118 +f 1532/1678/118 1447/1591/118 123/154/118 +f 823/944/117 116/147/117 729/840/117 +f 823/944/117 729/840/117 822/943/117 +f 822/943/117 729/840/117 115/146/117 +f 1531/1677/116 122/153/116 1445/1589/116 +f 1531/1677/116 1445/1589/116 1443/1586/116 +f 1443/1586/116 1445/1589/116 107/138/116 +f 728/839/115 115/146/115 628/724/115 +f 728/839/115 628/724/115 727/838/115 +f 727/838/115 628/724/115 114/145/115 +f 1361/1500/114 122/153/114 1279/1416/114 +f 1361/1500/114 1279/1416/114 1360/1499/114 +f 1360/1499/114 1279/1416/114 121/152/114 +f 726/837/113 113/144/113 626/722/113 +f 726/837/113 626/722/113 622/718/113 +f 622/718/113 626/722/113 98/129/113 +f 1086/1217/112 101/132/112 995/1123/112 +f 1086/1217/112 995/1123/112 992/1120/112 +f 992/1120/112 995/1123/112 86/117/112 +f 1614/1761/111 109/140/111 1529/1675/111 +f 1614/1761/111 1529/1675/111 1613/1760/111 +f 1613/1760/111 1529/1675/111 108/139/111 +f 903/1026/110 101/132/110 817/938/110 +f 903/1026/110 817/938/110 902/1025/110 +f 902/1025/110 817/938/110 100/131/110 +f 1612/1759/109 107/138/109 1527/1672/109 +f 1612/1759/109 1527/1672/109 1524/1669/109 +f 1524/1669/109 1527/1672/109 92/123/109 +f 816/937/108 100/131/108 722/831/108 +f 816/937/108 722/831/108 815/936/108 +f 815/936/108 722/831/108 99/130/108 +f 1442/1585/107 107/138/107 1357/1496/107 +f 1442/1585/107 1357/1496/107 1441/1584/107 +f 1441/1584/107 1357/1496/107 106/137/107 +f 814/935/106 98/129/106 720/829/106 +f 814/935/106 720/829/106 1771/1924/106 +f 1771/1924/106 720/829/106 83/114/106 +f 1356/1495/105 106/137/105 1273/1409/105 +f 1356/1495/105 1273/1409/105 1355/1494/105 +f 1355/1494/105 1273/1409/105 105/136/105 +f 1354/1493/522 104/135/522 1271/1407/522 +f 1354/1493/522 1271/1407/522 1268/1404/522 +f 1268/1404/102 1271/1407/102 89/120/102 +f 1870/2025/101 112/143/101 1789/1943/101 +f 1870/2025/101 1789/1943/101 1869/2024/101 +f 1869/2024/101 1789/1943/101 111/142/101 +f 1270/1406/100 103/134/100 1174/1307/100 +f 1270/1406/100 1174/1307/100 1170/1303/100 +f 1170/1303/100 1174/1307/100 88/119/100 +f 1868/2023/99 110/141/99 1787/1941/99 +f 1868/2023/99 1787/1941/99 1483/1627/99 +f 1483/1627/99 1787/1941/99 95/126/99 +f 1088/1219/98 103/134/98 997/1126/98 +f 1088/1219/98 997/1126/98 1087/1218/98 +f 1087/1218/98 997/1126/98 102/133/98 +f 1786/1940/97 109/140/97 1704/1856/97 +f 1786/1940/97 1704/1856/97 645/743/97 +f 645/743/97 1704/1856/97 94/125/97 +f 1350/1489/565 89/120/565 1267/1403/565 +f 1350/1489/95 1267/1403/95 1261/1397/95 +f 1261/1397/95 1267/1403/95 73/73/95 +f 521/606/94 96/127/94 1865/2020/94 +f 521/606/94 1865/2020/94 1861/2016/94 +f 1861/2016/94 1865/2020/94 80/80/94 +f 1266/1402/93 88/119/93 1169/1302/93 +f 1266/1402/93 1169/1302/93 1163/1296/93 +f 1163/1296/93 1169/1302/93 72/72/93 +f 1784/1938/521 96/127/521 1483/1627/521 +f 1784/1938/521 1483/1627/521 1783/1937/521 +f 1783/1937/521 1483/1627/521 95/126/521 +f 1081/1212/91 88/119/91 724/834/91 +f 1081/1212/91 724/834/91 1080/1211/91 +f 1080/1211/91 724/834/91 87/118/91 +f 1700/1851/90 95/126/90 645/743/90 +f 1700/1851/90 645/743/90 1699/1850/90 +f 1699/1850/90 645/743/90 94/125/90 +f 1079/1210/89 86/117/89 991/1119/89 +f 1079/1210/89 991/1119/89 986/1113/89 +f 986/1113/89 991/1119/89 70/70/89 +f 1607/1754/88 94/125/88 560/650/88 +f 1607/1754/88 560/650/88 1606/1753/88 +f 1606/1753/88 560/650/88 93/124/88 +f 899/1022/87 86/117/87 1264/1400/87 +f 899/1022/87 1264/1400/87 898/1021/87 +f 898/1021/87 1264/1400/87 85/116/87 +f 1605/1752/86 92/123/86 1523/1668/86 +f 1605/1752/86 1523/1668/86 1517/1662/86 +f 1517/1662/86 1523/1668/86 76/76/86 +f 813/934/520 85/116/520 807/927/520 +f 813/934/85 807/927/85 812/933/85 +f 812/933/520 807/927/520 84/115/520 +f 1439/1582/84 92/123/84 1110/1242/84 +f 1439/1582/84 1110/1242/84 1438/1581/84 +f 1438/1581/84 1110/1242/84 91/122/84 +f 716/824/83 84/115/83 1771/1924/83 +f 716/824/566 1771/1924/566 715/823/566 +f 715/823/519 1771/1924/519 83/114/519 +f 1352/1491/82 91/122/82 639/736/82 +f 1352/1491/82 639/736/82 1351/1490/82 +f 1351/1490/82 639/736/82 90/121/82 +f 985/1112/80 70/70/80 895/1017/80 +f 985/1112/80 895/1017/80 984/1111/80 +f 984/1111/80 895/1017/80 69/69/80 +f 1694/1845/79 76/76/79 1600/1747/79 +f 1694/1845/79 1600/1747/79 1596/1743/79 +f 1596/1743/79 1600/1747/79 61/61/79 +f 894/1016/78 69/69/78 810/930/78 +f 894/1016/78 810/930/78 893/1015/78 +f 893/1015/78 810/930/78 68/68/78 +f 1516/1661/77 76/76/77 1434/1576/77 +f 1516/1661/77 1434/1576/77 1515/1660/77 +f 1515/1660/77 1434/1576/77 75/75/77 +f 809/929/76 68/68/76 710/817/76 +f 809/929/76 710/817/76 808/928/76 +f 808/928/518 710/817/518 67/67/518 +f 1433/1575/75 75/75/75 1346/1485/75 +f 1433/1575/75 1346/1485/75 1432/1574/75 +f 1432/1574/75 1346/1485/75 74/74/75 +f 1431/1573/72 73/73/72 1344/1483/72 +f 1431/1573/567 1344/1483/567 1342/1481/567 +f 1342/1481/567 1344/1483/567 58/58/567 +f 518/602/71 81/81/71 1861/2016/71 +f 518/602/71 1861/2016/71 517/601/71 +f 517/601/71 1861/2016/71 80/80/71 +f 1343/1482/70 72/72/70 1259/1395/70 +f 1343/1482/70 1259/1395/70 1254/1390/70 +f 1254/1390/70 1259/1395/70 57/57/70 +f 516/600/69 79/79/69 1859/2014/69 +f 516/600/69 1859/2014/69 1856/2011/69 +f 1856/2011/69 1859/2014/69 64/64/69 +f 1162/1295/68 72/72/68 1074/1204/68 +f 1162/1295/68 1074/1204/68 1161/1294/68 +f 1161/1294/68 1074/1204/68 71/71/68 +f 1779/1933/67 79/79/67 1697/1848/67 +f 1779/1933/67 1697/1848/67 1778/1932/67 +f 1778/1932/67 1697/1848/67 78/78/67 +f 1160/1293/66 70/70/66 1072/1202/66 +f 1160/1293/66 1072/1202/66 568/659/66 +f 568/659/66 1072/1202/66 55/55/66 +f 1696/1847/65 78/78/65 1602/1749/65 +f 1696/1847/65 1602/1749/65 1695/1846/65 +f 1695/1846/65 1602/1749/65 77/77/65 +f 608/702/64 66/66/64 511/593/64 +f 608/702/64 511/593/64 607/701/64 +f 607/701/64 511/593/64 65/65/64 +f 1426/1568/63 57/57/63 1340/1479/63 +f 1426/1568/63 1340/1479/63 1336/1474/63 +f 1336/1474/63 1340/1479/63 42/42/63 +f 510/592/62 65/65/62 1856/2011/62 +f 510/592/62 1856/2011/62 509/591/62 +f 509/591/62 1856/2011/62 64/64/62 +f 1253/1389/61 57/57/61 1157/1290/61 +f 1253/1389/61 1157/1290/61 1252/1388/61 +f 1252/1388/61 1157/1290/61 56/56/61 +f 1855/2010/60 64/64/60 1776/1930/60 +f 1855/2010/60 1776/1930/60 1854/2009/60 +f 1854/2009/60 1776/1930/60 63/63/60 +f 1156/1289/59 56/56/59 568/659/59 +f 1156/1289/59 568/659/59 1155/1288/59 +f 1155/1288/59 568/659/59 55/55/59 +f 1775/1929/58 63/63/58 1689/1840/58 +f 1775/1929/58 1689/1840/58 1774/1928/58 +f 1774/1928/58 1689/1840/58 62/62/58 +f 1068/1198/57 55/55/57 982/1109/57 +f 1068/1198/57 982/1109/57 1067/1197/57 +f 1067/1197/57 982/1109/57 54/54/57 +f 1773/1927/56 61/61/56 1687/1838/56 +f 1773/1927/56 1687/1838/56 1682/1832/56 +f 1682/1832/56 1687/1838/56 46/46/56 +f 981/1108/55 54/54/55 891/1013/55 +f 981/1108/55 891/1013/55 980/1107/55 +f 980/1107/55 891/1013/55 53/53/55 +f 1595/1742/54 61/61/54 1512/1657/54 +f 1595/1742/54 1512/1657/54 1594/1741/54 +f 1594/1741/54 1512/1657/54 60/60/54 +f 890/1012/53 53/53/53 806/926/53 +f 890/1012/568 806/926/568 889/1011/568 +f 889/1011/53 806/926/53 52/52/53 +f 1511/1656/52 60/60/52 1429/1571/52 +f 1511/1656/52 1429/1571/52 1510/1655/52 +f 1510/1655/52 1429/1571/52 59/59/52 +f 1509/1654/49 58/58/49 1427/1569/49 +f 1509/1654/49 1427/1569/49 1422/1563/49 +f 1422/1563/49 1427/1569/49 43/43/49 +f 1847/2001/48 46/46/48 1767/1920/48 +f 1847/2001/48 1767/1920/48 1761/1914/48 +f 1761/1914/48 1767/1920/48 31/31/48 +f 1063/1192/569 39/39/569 977/1102/569 +f 1063/1192/569 977/1102/569 1062/1191/569 +f 1062/1191/47 977/1102/47 38/38/47 +f 1681/1831/46 46/46/46 1588/1734/46 +f 1681/1831/46 1588/1734/46 1680/1830/46 +f 1680/1830/46 1588/1734/46 45/45/46 +f 976/1101/45 38/38/45 887/1009/45 +f 976/1101/516 887/1009/516 975/1100/516 +f 975/1100/45 887/1009/45 37/37/45 +f 1679/1829/44 44/44/44 1586/1732/44 +f 1679/1829/44 1586/1732/44 1707/1860/44 +f 1707/1860/44 1586/1732/44 29/29/44 +f 1506/1650/41 44/44/41 1422/1563/41 +f 1506/1650/41 1422/1563/41 1505/1649/41 +f 1505/1649/41 1422/1563/41 43/43/41 +f 704/809/40 51/51/40 602/695/40 +f 704/809/40 602/695/40 703/808/40 +f 703/808/40 602/695/40 50/50/40 +f 1421/1562/39 43/43/39 1336/1474/39 +f 1421/1562/39 1336/1474/39 1420/1561/39 +f 1420/1561/39 1336/1474/39 42/42/39 +f 601/694/515 50/50/515 504/584/515 +f 601/694/515 504/584/515 600/693/515 +f 600/693/38 504/584/38 49/49/38 +f 1335/1473/37 42/42/37 1244/1379/37 +f 1335/1473/37 1244/1379/37 1334/1472/37 +f 1334/1472/37 1244/1379/37 41/41/37 +f 599/692/36 48/48/36 502/582/36 +f 599/692/36 502/582/36 498/577/36 +f 498/577/36 502/582/36 33/33/36 +f 1243/1378/35 41/41/35 1151/1283/35 +f 1243/1378/35 1151/1283/35 1242/1377/35 +f 1242/1377/35 1151/1283/35 40/40/35 +f 501/581/34 47/47/34 1848/2002/34 +f 501/581/34 1848/2002/34 1846/2000/34 +f 1846/2000/34 1848/2002/34 32/32/34 +f 1150/1282/33 40/40/33 1064/1193/33 +f 1150/1282/33 1064/1193/33 1149/1281/33 +f 1149/1281/33 1064/1193/33 39/39/33 +f 1580/1726/32 27/27/32 1501/1645/32 +f 1580/1726/32 1501/1645/32 1498/1642/32 +f 1498/1642/32 1501/1645/32 12/12/32 +f 796/915/31 34/34/31 698/803/31 +f 796/915/31 698/803/31 1492/1636/31 +f 1492/1636/31 698/803/31 19/19/31 +f 1415/1555/30 27/27/30 1330/1468/30 +f 1415/1555/30 1330/1468/30 1414/1554/30 +f 1414/1554/30 1330/1468/30 26/26/30 +f 697/802/29 33/33/29 596/689/29 +f 697/802/29 596/689/29 593/686/29 +f 593/686/29 596/689/29 18/18/29 +f 1329/1467/28 26/26/28 1234/1369/28 +f 1329/1467/28 1234/1369/28 1328/1466/28 +f 1328/1466/28 1234/1369/28 25/25/28 +f 497/576/27 33/33/27 1846/2000/27 +f 497/576/27 1846/2000/27 496/575/27 +f 496/575/27 1846/2000/27 32/32/27 +f 1233/1368/26 25/25/26 1146/1278/26 +f 1233/1368/26 1146/1278/26 1232/1367/26 +f 1232/1367/26 1146/1278/26 24/24/26 +f 1845/1999/25 32/32/25 1761/1914/25 +f 1845/1999/25 1761/1914/25 1844/1998/25 +f 1844/1998/25 1761/1914/25 31/31/25 +f 1145/1277/24 24/24/24 1060/1189/24 +f 1145/1277/24 1060/1189/24 1144/1276/24 +f 1144/1276/24 1060/1189/24 23/23/24 +f 1760/1913/23 31/31/23 1671/1820/23 +f 1760/1913/23 1671/1820/23 1759/1912/23 +f 1759/1912/23 1671/1820/23 30/30/23 +f 1059/1188/514 23/23/514 970/1095/514 +f 1059/1188/22 970/1095/22 1058/1187/22 +f 1058/1187/22 970/1095/22 22/22/22 +f 1670/1819/21 30/30/21 1707/1860/21 +f 1670/1819/21 1707/1860/21 1669/1818/21 +f 1669/1818/21 1707/1860/21 29/29/21 +f 1582/1728/18 29/29/18 1503/1647/18 +f 1582/1728/18 1503/1647/18 1581/1727/18 +f 1581/1727/570 1503/1647/570 28/28/570 +f 798/917/17 36/36/17 700/805/17 +f 798/917/17 700/805/17 797/916/17 +f 797/916/17 700/805/17 35/35/17 +f 691/796/15 14/14/15 1578/1724/15 +f 691/796/15 1578/1724/15 690/795/15 +f 690/795/571 1578/1724/571 13/13/571 +f 1044/1173/14 21/21/14 793/912/14 +f 1044/1173/14 793/912/14 774/892/14 +f 774/892/14 793/912/14 20/20/14 +f 689/794/13 12/12/13 1488/1632/13 +f 689/794/13 1488/1632/13 860/981/13 +f 860/981/13 1488/1632/13 477/554/13 +f 773/891/12 20/20/12 1492/1636/12 +f 773/891/12 1492/1636/12 863/984/12 +f 863/984/12 1492/1636/12 19/19/12 +f 1568/1714/11 11/11/11 590/683/11 +f 1568/1714/11 590/683/11 578/671/11 +f 578/671/11 590/683/11 2/2/11 +f 862/983/10 19/19/10 593/686/10 +f 862/983/10 593/686/10 579/672/10 +f 579/672/10 593/686/10 18/18/10 +f 589/682/9 10/10/9 1307/1444/9 +f 589/682/9 1307/1444/9 577/670/9 +f 577/670/9 1307/1444/9 476/553/9 +f 967/1092/8 18/18/8 491/569/8 +f 967/1092/8 491/569/8 966/1091/8 +f 966/1091/8 491/569/8 17/17/8 +f 1396/1536/7 9/9/7 488/566/7 +f 1396/1536/7 488/566/7 673/776/7 +f 673/776/7 488/566/7 1/1/7 +f 675/778/6 17/17/6 1841/1995/6 +f 675/778/6 1841/1995/6 1822/1976/6 +f 1822/1976/6 1841/1995/6 16/16/6 +f 487/565/5 8/8/5 1130/1262/5 +f 487/565/5 1130/1262/5 672/775/5 +f 672/775/5 1130/1262/5 475/552/5 +f 880/1001/4 16/16/4 1753/1906/4 +f 880/1001/4 1753/1906/4 879/1000/4 +f 879/1000/4 1753/1906/4 15/15/4 +f 1213/1348/3 7/7/3 1212/1347/3 +f 1213/1348/3 1212/1347/3 1306/1443/3 +f 1306/1443/3 1212/1347/3 474/551/3 +f 790/909/513 15/15/513 1664/1813/513 +f 790/909/513 1664/1813/513 789/908/513 +f 789/908/572 1664/1813/572 14/14/572 +f 775/893/512 482/559/512 508/590/512 +f 775/893/512 508/590/512 770/887/512 +f 770/887/512 508/590/512 473/550/512 +f 1565/1711/511 474/551/511 576/668/511 +f 1565/1711/511 576/668/511 570/661/511 +f 570/661/511 576/668/511 82/82/511 +f 1766/1919/549 4/4/549 687/792/549 +f 1766/1919/510 687/792/510 485/562/510 +f 485/562/549 687/792/549 3/3/549 +f 1129/1261/509 473/550/509 508/590/509 +f 1129/1261/509 508/590/509 1132/1264/509 +f 1132/1264/509 508/590/509 482/559/509 +f 802/921/508 3/3/508 860/981/508 +f 802/921/508 860/981/508 674/777/508 +f 674/777/508 860/981/508 477/554/508 +f 1048/1177/507 472/549/507 1131/1263/507 +f 1048/1177/507 1131/1263/507 1216/1351/507 +f 1216/1351/507 1131/1263/507 481/558/507 +f 1599/1746/506 477/554/506 578/671/506 +f 1599/1746/506 578/671/506 882/1004/506 +f 882/1004/506 578/671/506 2/2/506 +f 1215/1350/505 480/557/505 1912/2067/505 +f 1215/1350/505 1912/2067/505 1214/1349/505 +f 1214/1349/505 1912/2067/505 479/556/505 +f 571/663/504 2/2/504 577/670/504 +f 571/663/504 577/670/504 1730/1883/504 +f 1730/1883/504 577/670/504 476/553/504 +f 1564/1710/503 470/547/503 818/939/503 +f 1564/1710/503 818/939/503 1043/1172/503 +f 1043/1172/503 818/939/503 479/556/503 +f 610/704/502 476/553/502 673/776/502 +f 610/704/502 673/776/502 666/768/502 +f 666/768/502 673/776/502 1/1/502 +f 769/886/501 469/546/501 1263/1399/501 +f 769/886/501 1263/1399/501 1258/1394/501 +f 1258/1394/501 1263/1399/501 6/6/501 +f 665/767/500 1/1/500 672/775/500 +f 665/767/500 672/775/500 1735/1888/500 +f 1735/1888/500 672/775/500 475/552/500 +f 1337/1475/499 468/545/499 772/890/499 +f 1337/1475/499 772/890/499 757/874/499 +f 757/874/499 772/890/499 478/555/499 +f 921/1045/498 475/552/498 1306/1443/498 +f 921/1045/498 1306/1443/498 936/1060/498 +f 936/1060/498 1306/1443/498 474/551/498 +f 575/667/497 467/544/497 1037/1166/497 +f 575/667/497 1037/1166/497 1036/1165/497 +f 1036/1165/497 1037/1166/497 5/5/497 +f 942/1066/496 455/532/496 998/1127/496 +f 942/1066/496 998/1127/496 1077/1207/496 +f 1077/1207/496 998/1127/496 470/547/496 +f 1641/1790/495 447/524/495 1661/1810/495 +f 1641/1790/495 1661/1810/495 1740/1893/495 +f 1740/1893/495 1661/1810/495 462/539/495 +f 946/1070/494 469/546/494 769/886/494 +f 946/1070/494 769/886/494 1842/1996/494 +f 1842/1996/494 769/886/494 468/545/494 +f 1738/1891/493 461/538/493 1482/1626/493 +f 1738/1891/493 1482/1626/493 1652/1801/493 +f 1652/1801/493 1482/1626/493 460/537/493 +f 762/879/492 453/530/492 1519/1664/492 +f 762/879/492 1519/1664/492 1713/1866/492 +f 1713/1866/492 1519/1664/492 468/545/492 +f 1475/1619/491 445/522/491 1731/1884/491 +f 1475/1619/491 1731/1884/491 852/973/491 +f 852/973/491 1731/1884/491 460/537/491 +f 971/1096/490 452/529/490 1590/1736/490 +f 971/1096/490 1590/1736/490 604/698/490 +f 604/698/490 1590/1736/490 467/544/490 +f 770/888/489 473/550/489 1450/1594/489 +f 770/888/489 1450/1594/489 1701/1852/489 +f 1701/1852/489 1450/1594/489 458/535/489 +f 1480/1624/488 459/536/488 570/662/488 +f 1480/1624/488 570/662/488 562/652/488 +f 562/652/488 570/662/488 82/83/488 +f 854/975/487 466/543/487 669/771/487 +f 854/975/487 669/771/487 853/974/487 +f 853/974/487 669/771/487 465/542/487 +f 1450/1594/486 473/550/486 1129/1261/486 +f 1450/1594/486 1129/1261/486 1247/1382/486 +f 1247/1382/486 1129/1261/486 472/549/486 +f 573/665/485 465/542/485 1818/1972/485 +f 573/665/485 1818/1972/485 1053/1182/485 +f 1053/1182/485 1818/1972/485 464/541/485 +f 1125/1257/484 457/534/484 1393/1533/484 +f 1125/1257/484 1393/1533/484 526/613/484 +f 526/613/484 1393/1533/484 472/549/484 +f 1812/1966/483 449/526/483 1147/1279/483 +f 1812/1966/483 1147/1279/483 1224/1359/483 +f 1224/1359/483 1147/1279/483 464/541/483 +f 1127/1259/482 471/548/482 948/1072/482 +f 1127/1259/482 948/1072/482 1550/1696/482 +f 1550/1696/482 948/1072/482 470/547/482 +f 1816/1970/481 463/540/481 1646/1795/481 +f 1816/1970/481 1646/1795/481 1221/1356/481 +f 1221/1356/481 1646/1795/481 462/539/481 +f 760/877/480 451/528/480 567/658/480 +f 760/877/480 567/658/480 1763/1916/480 +f 1763/1916/480 567/658/480 450/527/480 +f 1297/1434/547 443/520/547 1560/1706/547 +f 1297/1434/547 1560/1706/547 1378/1517/547 +f 1378/1517/547 1560/1706/547 458/535/547 +f 525/612/478 450/527/478 662/763/478 +f 525/612/478 662/763/478 845/966/478 +f 845/966/478 662/763/478 449/526/478 +f 1381/1520/477 442/519/477 1376/1515/477 +f 1381/1520/477 1376/1515/477 1806/1960/477 +f 1806/1960/546 1376/1515/546 457/534/546 +f 1275/1412/476 434/511/476 611/705/476 +f 1275/1412/476 611/705/476 1076/1206/476 +f 1076/1206/476 611/705/476 449/526/476 +f 1387/1527/475 456/533/475 1205/1340/475 +f 1387/1527/475 1205/1340/475 1386/1526/475 +f 1386/1526/475 1205/1340/475 455/532/475 +f 660/761/474 448/525/474 1899/2054/474 +f 660/761/474 1899/2054/474 659/760/474 +f 659/760/474 1899/2054/474 447/524/474 +f 1054/1183/473 440/517/473 1881/2036/473 +f 1054/1183/473 1881/2036/473 922/1046/473 +f 922/1046/473 1881/2036/473 455/532/473 +f 1573/1719/472 432/509/472 1152/1284/472 +f 1573/1719/472 1152/1284/472 1592/1739/472 +f 1592/1739/472 1152/1284/472 447/524/472 +f 1203/1338/471 454/531/471 1034/1163/471 +f 1203/1338/471 1034/1163/471 1202/1337/471 +f 1202/1337/471 1034/1163/471 453/530/471 +f 1637/1786/573 431/508/573 1897/2052/573 +f 1637/1786/573 1897/2052/573 1666/1815/573 +f 1666/1815/573 1897/2052/573 446/523/573 +f 1425/1567/469 438/515/469 1004/1133/469 +f 1425/1567/469 1004/1133/469 1451/1595/469 +f 1451/1595/469 1004/1133/469 453/530/469 +f 1639/1788/468 445/522/468 1475/1619/468 +f 1639/1788/468 1475/1619/468 653/753/468 +f 653/753/468 1475/1619/468 444/521/468 +f 755/871/467 437/514/467 1449/1593/467 +f 755/871/467 1449/1593/467 1525/1670/467 +f 1525/1670/467 1449/1593/467 452/529/467 +f 1701/1853/466 458/535/466 1560/1706/466 +f 1701/1853/466 1560/1706/466 756/872/466 +f 756/872/466 1560/1706/466 443/520/466 +f 696/801/465 444/521/465 562/653/465 +f 696/801/465 562/653/465 554/643/465 +f 554/643/465 562/653/465 82/84/465 +f 1801/1955/464 417/494/464 1003/1132/464 +f 1801/1955/464 1003/1132/464 1085/1216/464 +f 1085/1216/464 1003/1132/464 432/509/464 +f 1118/1250/463 439/516/463 935/1059/463 +f 1118/1250/463 935/1059/463 1419/1560/463 +f 1419/1560/463 935/1059/463 438/515/463 +f 1084/1215/462 431/508/462 1637/1786/462 +f 1084/1215/462 1637/1786/462 494/573/462 +f 494/573/462 1637/1786/462 430/507/462 +f 927/1051/461 423/500/461 850/971/461 +f 927/1051/461 850/971/461 930/1054/461 +f 930/1054/461 850/971/461 438/515/461 +f 1633/1782/460 415/492/460 1889/2044/460 +f 1633/1782/460 1889/2044/460 1636/1785/460 +f 1636/1785/460 1889/2044/460 430/507/460 +f 1675/1825/459 422/499/459 928/1052/459 +f 1675/1825/459 928/1052/459 1377/1516/459 +f 1377/1516/459 928/1052/459 437/514/459 +f 756/873/458 443/520/458 1474/1618/458 +f 756/873/458 1474/1618/458 750/865/458 +f 750/865/458 1474/1618/458 428/505/458 +f 1635/1784/457 429/506/457 554/644/457 +f 1635/1784/457 554/644/457 547/635/457 +f 547/635/457 554/644/457 82/85/457 +f 1027/1156/456 436/513/456 495/574/456 +f 1027/1156/456 495/574/456 825/946/456 +f 825/946/456 495/574/456 435/512/456 +f 1137/1269/455 428/505/455 1474/1618/455 +f 1137/1269/574 1474/1618/574 1223/1358/574 +f 1223/1358/455 1474/1618/455 443/520/455 +f 753/869/454 435/512/454 559/649/454 +f 753/869/454 559/649/454 972/1097/454 +f 972/1097/454 559/649/454 434/511/454 +f 1293/1430/453 427/504/453 1222/1357/453 +f 1293/1430/453 1222/1357/453 1310/1447/453 +f 1310/1447/453 1222/1357/453 442/519/453 +f 552/641/452 419/496/452 1880/2035/452 +f 552/641/452 1880/2035/452 533/620/452 +f 533/620/452 1880/2035/452 434/511/452 +f 1309/1446/451 441/518/451 1120/1252/451 +f 1309/1446/451 1120/1252/451 1305/1442/451 +f 1305/1442/451 1120/1252/451 440/517/451 +f 557/647/450 433/510/450 778/897/450 +f 557/647/450 778/897/450 743/857/450 +f 743/857/450 778/897/450 432/509/450 +f 1116/1248/449 425/502/449 1379/1518/449 +f 1116/1248/449 1379/1518/449 1814/1968/449 +f 1814/1968/449 1379/1518/449 440/517/449 +f 1461/1605/448 413/490/448 1722/1875/448 +f 1461/1605/448 1722/1875/448 1467/1611/448 +f 1467/1611/448 1722/1875/448 428/505/448 +f 1308/1445/447 420/497/447 838/959/447 +f 1308/1445/447 838/959/447 1019/1148/447 +f 1019/1148/447 838/959/447 419/496/447 +f 771/889/446 412/489/446 701/806/446 +f 771/889/446 701/806/446 1153/1285/446 +f 1153/1285/446 701/806/446 427/504/446 +f 1790/1944/445 404/481/445 1384/1524/445 +f 1790/1944/445 1384/1524/445 1813/1967/445 +f 1813/1967/445 1384/1524/445 419/496/445 +f 1554/1700/444 426/503/444 1374/1513/444 +f 1554/1700/444 1374/1513/444 1553/1699/444 +f 1553/1699/444 1374/1513/444 425/502/444 +f 836/957/443 418/495/443 650/749/443 +f 836/957/443 650/749/443 835/956/443 +f 835/956/443 650/749/443 417/494/443 +f 1642/1791/442 410/487/442 1229/1364/442 +f 1642/1791/442 1229/1364/442 1665/1814/442 +f 1665/1814/442 1229/1364/442 425/502/442 +f 901/1024/441 402/479/441 1887/2042/441 +f 901/1024/441 1887/2042/441 929/1053/441 +f 929/1053/441 1887/2042/441 417/494/441 +f 1372/1511/440 424/501/440 1196/1331/440 +f 1372/1511/440 1196/1331/440 1371/1510/440 +f 1371/1510/440 1196/1331/440 423/500/440 +f 648/747/439 416/493/439 1885/2040/439 +f 648/747/439 1885/2040/439 647/746/439 +f 647/746/439 1885/2040/439 415/492/439 +f 751/867/438 408/485/438 1746/1899/438 +f 751/867/438 1746/1899/438 781/900/438 +f 781/900/438 1746/1899/438 423/500/438 +f 851/972/437 400/477/437 1010/1139/437 +f 851/972/437 1010/1139/437 1457/1601/437 +f 1457/1601/437 1010/1139/437 415/492/437 +f 920/1044/436 407/484/436 1194/1329/436 +f 920/1044/436 1194/1329/436 763/880/436 +f 763/880/436 1194/1329/436 422/499/436 +f 750/866/435 428/505/435 1722/1875/435 +f 750/866/435 1722/1875/435 742/855/435 +f 742/855/435 1722/1875/435 413/490/435 +f 1883/2038/434 414/491/434 547/636/434 +f 1883/2038/434 547/636/434 540/627/434 +f 540/627/434 547/636/434 82/86/434 +f 925/1049/433 421/498/433 748/862/433 +f 925/1049/433 748/862/433 858/979/433 +f 858/979/433 748/862/433 420/497/433 +f 1286/1423/432 409/486/432 1109/1241/432 +f 1286/1423/432 1109/1241/432 910/1034/432 +f 910/1034/432 1109/1241/432 408/485/432 +f 707/813/431 386/463/431 542/630/431 +f 707/813/544 542/630/544 861/982/544 +f 861/982/431 542/630/431 401/478/431 +f 1103/1235/430 393/470/430 1598/1745/430 +f 1103/1235/430 1598/1745/430 1677/1827/430 +f 1677/1827/430 1598/1745/430 408/485/430 +f 859/980/429 400/477/429 851/972/429 +f 859/980/429 851/972/429 636/733/429 +f 636/733/429 851/972/429 399/476/429 +f 1385/1525/428 392/469/428 1674/1824/428 +f 1385/1525/428 1674/1824/428 1238/1373/428 +f 1238/1373/428 1674/1824/428 407/484/428 +f 742/856/427 413/490/427 1632/1781/427 +f 742/856/427 1632/1781/427 737/849/427 +f 737/849/427 1632/1781/427 398/475/427 +f 1795/1949/426 399/476/426 540/628/426 +f 1795/1949/426 540/628/426 961/1085/426 +f 961/1085/426 540/628/426 82/87/426 +f 1189/1323/425 406/483/425 1014/1143/425 +f 1189/1323/425 1014/1143/425 1188/1322/425 +f 1188/1322/425 1014/1143/425 405/482/425 +f 612/706/424 398/475/424 1632/1781/424 +f 612/706/424 1632/1781/424 532/619/424 +f 532/619/424 1632/1781/424 413/490/424 +f 788/907/423 405/482/423 741/854/423 +f 788/907/423 741/854/423 1871/2026/423 +f 1871/2026/423 741/854/423 404/481/423 +f 531/618/543 412/489/543 771/889/543 +f 531/618/422 771/889/422 1718/1871/422 +f 1718/1871/422 771/889/422 411/488/422 +f 736/848/421 389/466/421 1228/1363/421 +f 736/848/421 1228/1363/421 1315/1452/421 +f 1315/1452/421 1228/1363/421 404/481/421 +f 1459/1603/420 411/488/420 1288/1425/420 +f 1459/1603/420 1288/1425/420 1139/1271/420 +f 1139/1271/420 1288/1425/420 410/487/420 +f 739/852/419 403/480/419 544/632/419 +f 739/852/419 544/632/419 1313/1450/419 +f 1313/1450/419 544/632/419 402/479/419 +f 1284/1421/418 395/472/418 1083/1214/418 +f 1284/1421/418 1083/1214/418 1159/1292/418 +f 1159/1292/418 1083/1214/418 410/487/418 +f 537/624/417 387/464/417 1745/1898/417 +f 537/624/417 1745/1898/417 1820/1974/417 +f 1820/1974/417 1745/1898/417 402/479/417 +f 618/713/416 390/467/416 1008/1137/416 +f 618/713/416 1008/1137/416 1183/1317/416 +f 1183/1317/416 1008/1137/416 389/466/416 +f 1683/1833/415 382/459/415 1462/1606/415 +f 1683/1833/415 1462/1606/415 1888/2043/415 +f 1888/2043/415 1462/1606/415 397/474/415 +f 800/919/414 374/451/414 706/812/414 +f 800/919/414 706/812/414 1158/1291/414 +f 1158/1291/414 706/812/414 389/466/414 +f 1715/1868/413 396/473/413 1541/1687/413 +f 1715/1868/413 1541/1687/413 1714/1867/413 +f 1714/1867/413 1541/1687/413 395/472/413 +f 1006/1135/412 388/465/412 829/950/412 +f 1006/1135/412 829/950/412 1005/1134/412 +f 1005/1134/412 829/950/412 387/464/412 +f 1469/1613/411 380/457/411 539/626/411 +f 1469/1613/411 539/626/411 1585/1731/411 +f 1585/1731/411 539/626/411 395/472/411 +f 553/642/410 372/449/410 1237/1372/410 +f 553/642/410 1237/1372/410 1676/1826/410 +f 1676/1826/410 1237/1372/410 387/464/410 +f 1539/1685/409 394/471/409 1365/1504/409 +f 1539/1685/409 1365/1504/409 1538/1684/409 +f 1538/1684/409 1365/1504/409 393/470/409 +f 827/948/408 386/463/408 707/813/408 +f 827/948/408 707/813/408 826/947/408 +f 826/947/408 707/813/408 385/462/408 +f 1246/1381/407 378/455/407 1092/1224/407 +f 1246/1381/407 1092/1224/407 1530/1676/407 +f 1530/1676/407 1092/1224/407 393/470/407 +f 627/723/406 370/447/406 1750/1903/406 +f 627/723/406 1750/1903/406 1097/1229/406 +f 1097/1229/406 1750/1903/406 385/462/406 +f 1096/1228/405 377/454/405 1363/1502/405 +f 1096/1228/405 1363/1502/405 1604/1751/405 +f 1604/1751/405 1363/1502/405 392/469/405 +f 737/850/404 398/475/404 1876/2031/404 +f 737/850/404 1876/2031/404 732/843/404 +f 732/843/404 1876/2031/404 383/460/404 +f 787/906/403 384/461/403 961/1086/403 +f 787/906/403 961/1086/403 1193/1327/403 +f 1193/1327/403 961/1086/403 82/88/403 +f 1101/1233/402 391/468/402 915/1039/402 +f 1101/1233/402 915/1039/402 1739/1892/402 +f 1739/1892/402 915/1039/402 390/467/402 +f 1622/1770/401 383/460/401 1876/2031/401 +f 1622/1770/401 1876/2031/401 1629/1777/401 +f 1629/1777/401 1876/2031/401 398/475/401 +f 1166/1299/400 371/448/400 530/617/400 +f 1166/1299/400 530/617/400 1164/1297/400 +f 1164/1297/400 530/617/400 370/447/400 +f 1274/1411/399 363/434/399 937/1061/399 +f 1274/1411/399 937/1061/399 1623/1771/399 +f 1623/1771/399 937/1061/399 378/455/399 +f 524/611/398 355/418/398 821/942/398 +f 524/611/398 821/942/398 1686/1837/398 +f 1686/1837/398 821/942/398 370/447/398 +f 1437/1580/551 362/432/551 1016/1145/551 +f 1437/1580/397 1016/1145/397 1463/1607/397 +f 1463/1607/551 1016/1145/551 377/454/551 +f 732/844/575 383/460/575 866/987/575 +f 732/844/575 866/987/575 725/835/575 +f 725/835/575 866/987/575 368/444/575 +f 528/615/395 369/446/395 1193/1328/395 +f 528/615/395 1193/1328/395 523/608/395 +f 523/608/576 1193/1328/576 82/89/576 +f 1359/1498/552 376/453/552 1181/1315/552 +f 1359/1498/552 1181/1315/552 1358/1497/552 +f 1358/1497/552 1181/1315/552 375/452/552 +f 1418/1559/393 368/444/393 866/987/393 +f 1418/1559/393 866/987/393 1314/1451/393 +f 1314/1451/393 866/987/393 383/460/393 +f 1094/1226/392 375/452/392 909/1033/392 +f 1094/1226/392 909/1033/392 1535/1681/392 +f 1535/1681/392 909/1033/392 374/451/392 +f 1616/1764/391 367/442/391 1872/2027/391 +f 1616/1764/391 1872/2027/391 1392/1532/391 +f 1392/1532/391 1872/2027/391 382/459/391 +f 905/1029/390 359/426/390 538/625/390 +f 905/1029/390 538/625/390 624/720/390 +f 624/720/390 538/625/390 374/451/390 +f 1620/1768/389 381/458/389 1448/1592/389 +f 1620/1768/389 1448/1592/389 1390/1530/389 +f 1390/1530/389 1448/1592/389 380/457/389 +f 907/1031/388 373/450/388 730/841/388 +f 907/1031/388 730/841/388 623/719/388 +f 623/719/388 730/841/388 372/449/388 +f 1444/1588/387 365/438/387 1819/1973/387 +f 1444/1588/387 1819/1973/387 1896/2051/387 +f 1896/2051/387 1819/1973/387 380/457/387 +f 723/833/386 357/422/386 1091/1223/386 +f 723/833/386 1091/1223/386 1167/1300/386 +f 1167/1300/386 1091/1223/386 372/449/386 +f 1894/2049/385 379/456/385 1280/1417/385 +f 1894/2049/385 1280/1417/385 1893/2048/385 +f 1893/2048/385 1280/1417/385 378/455/385 +f 819/940/384 344/406/384 1471/1615/384 +f 819/940/384 1471/1615/384 1895/2050/384 +f 1895/2050/384 1471/1615/384 359/427/384 +f 1236/1371/383 366/441/383 1705/1858/383 +f 1236/1371/383 1705/1858/383 1867/2022/383 +f 1867/2022/383 1705/1858/383 365/439/383 +f 1173/1306/382 358/425/382 996/1125/382 +f 1173/1306/382 996/1125/382 1172/1305/382 +f 1172/1305/382 996/1125/382 357/423/382 +f 1708/1861/381 350/412/381 1319/1456/381 +f 1708/1861/381 1319/1456/381 1751/1904/381 +f 1751/1904/381 1319/1456/381 365/439/381 +f 731/842/380 342/404/380 545/633/380 +f 731/842/380 545/633/380 1017/1146/380 +f 1017/1146/380 545/633/380 357/423/380 +f 1703/1855/379 364/437/379 1528/1674/379 +f 1703/1855/379 1528/1674/379 1702/1854/379 +f 1702/1854/379 1528/1674/379 363/435/379 +f 994/1122/378 356/421/378 1630/1779/378 +f 994/1122/378 1630/1779/378 993/1121/378 +f 993/1121/378 1630/1779/378 355/419/378 +f 1625/1773/377 348/410/377 1826/1980/377 +f 1625/1773/377 1826/1980/377 867/988/377 +f 867/988/377 1826/1980/377 363/435/377 +f 1436/1578/376 340/402/376 721/830/376 +f 1436/1578/376 721/830/376 1537/1683/376 +f 1537/1683/376 721/830/376 355/419/376 +f 1269/1405/375 347/409/375 1526/1671/375 +f 1269/1405/375 1526/1671/375 944/1068/375 +f 944/1068/375 1526/1671/375 362/433/375 +f 725/836/374 368/445/374 625/721/374 +f 725/836/577 625/721/577 719/827/577 +f 719/827/374 625/721/374 353/415/374 +f 1536/1682/373 354/417/373 523/609/373 +f 1536/1682/578 523/609/578 520/604/578 +f 520/604/373 523/609/373 82/90/373 +f 1272/1408/372 361/431/372 1090/1222/372 +f 1272/1408/372 1090/1222/372 943/1067/372 +f 943/1067/372 1090/1222/372 360/429/372 +f 1785/1939/371 353/415/371 625/721/371 +f 1785/1939/371 625/721/371 794/913/371 +f 794/913/371 625/721/371 368/445/371 +f 1391/1531/370 360/429/370 1175/1309/370 +f 1391/1531/370 1175/1309/370 1353/1492/370 +f 1353/1492/370 1175/1309/370 359/427/370 +f 1018/1147/369 352/414/369 1788/1942/369 +f 1018/1147/369 1788/1942/369 1239/1374/369 +f 1239/1374/369 1788/1942/369 367/443/369 +f 711/818/368 325/387/368 989/1117/368 +f 711/818/368 989/1117/368 1026/1155/368 +f 1026/1155/368 989/1117/368 340/402/368 +f 1240/1375/367 332/394/367 1756/1909/367 +f 1240/1375/579 1756/1909/579 1522/1667/579 +f 1522/1667/367 1756/1909/367 347/409/367 +f 719/828/366 353/415/366 1610/1757/366 +f 719/828/366 1610/1757/366 978/1103/366 +f 978/1103/366 1610/1757/366 338/400/366 +f 1024/1153/365 339/401/365 520/605/365 +f 1024/1153/365 520/605/365 513/595/365 +f 513/595/365 520/605/365 82/91/365 +f 1521/1666/364 346/408/364 1919/2074/364 +f 1521/1666/364 1919/2074/364 1520/1665/364 +f 1520/1665/364 1919/2074/364 345/407/364 +f 616/710/363 338/400/363 1610/1757/363 +f 616/710/363 1610/1757/363 620/715/363 +f 620/715/363 1610/1757/363 353/415/363 +f 873/994/362 345/407/362 1082/1213/362 +f 873/994/362 1082/1213/362 872/993/362 +f 872/993/362 1082/1213/362 344/406/362 +f 1781/1935/361 337/399/361 619/714/361 +f 1781/1935/361 619/714/361 713/820/361 +f 713/820/361 619/714/361 352/414/361 +f 1075/1205/360 329/391/360 1349/1488/360 +f 1075/1205/360 1349/1488/360 1400/1540/360 +f 1400/1540/360 1349/1488/360 344/406/360 +f 712/819/359 351/413/359 1608/1755/359 +f 712/819/359 1608/1755/359 1782/1936/359 +f 1782/1936/359 1608/1755/359 350/412/359 +f 1398/1538/358 343/405/358 900/1023/358 +f 1398/1538/358 900/1023/358 1397/1537/358 +f 1397/1537/358 900/1023/358 342/404/358 +f 1603/1750/357 335/397/357 1165/1298/357 +f 1603/1750/357 1165/1298/357 1251/1387/357 +f 1251/1387/357 1165/1298/357 350/412/357 +f 896/1018/356 327/389/356 1168/1301/356 +f 896/1018/356 1168/1301/356 1903/2058/356 +f 1903/2058/356 1168/1301/356 342/404/356 +f 1249/1384/355 349/411/355 1440/1583/355 +f 1249/1384/355 1440/1583/355 1332/1470/355 +f 1332/1470/355 1440/1583/355 348/410/355 +f 1624/1772/354 326/388/354 1901/2056/354 +f 1624/1772/354 1901/2056/354 990/1118/354 +f 990/1118/354 1901/2056/354 341/403/354 +f 1435/1577/353 333/395/353 1684/1834/353 +f 1435/1577/353 1684/1834/353 1758/1911/353 +f 1758/1911/353 1684/1834/353 348/410/353 +f 614/708/352 336/398/352 1860/2015/352 +f 614/708/352 1860/2015/352 613/707/352 +f 613/707/352 1860/2015/352 335/397/352 +f 1070/1200/351 313/375/351 1248/1383/351 +f 1070/1200/351 1248/1383/351 1326/1464/351 +f 1326/1464/351 1248/1383/351 328/390/351 +f 1863/2018/350 320/382/350 630/726/350 +f 1863/2018/350 630/726/350 1098/1230/350 +f 1098/1230/350 630/726/350 335/397/350 +f 987/1114/349 312/374/349 1325/1463/349 +f 987/1114/349 1325/1463/349 1757/1910/349 +f 1757/1910/349 1325/1463/349 327/389/349 +f 1858/2013/348 334/396/348 1654/1803/348 +f 1858/2013/348 1654/1803/348 1857/2012/348 +f 1857/2012/348 1654/1803/348 333/395/348 +f 1805/1959/542 311/373/542 1755/1908/542 +f 1805/1959/542 1755/1908/542 1241/1376/542 +f 1241/1376/347 1755/1908/347 326/388/347 +f 1648/1797/346 318/380/346 1601/1748/346 +f 1648/1797/346 1601/1748/346 1611/1758/346 +f 1611/1758/346 1601/1748/346 333/395/346 +f 842/963/345 310/372/345 1830/1984/345 +f 842/963/345 1830/1984/345 874/995/345 +f 874/995/345 1830/1984/345 325/387/345 +f 1660/1809/344 317/379/344 1609/1756/344 +f 1660/1809/344 1609/1756/344 1693/1844/344 +f 1693/1844/344 1609/1756/344 332/394/344 +f 978/1104/343 338/400/343 1470/1614/343 +f 978/1104/343 1470/1614/343 709/815/343 +f 709/815/343 1470/1614/343 323/385/343 +f 983/1110/342 324/386/342 513/596/342 +f 983/1110/342 513/596/342 507/588/342 +f 507/588/342 513/596/342 82/92/342 +f 1691/1842/341 331/393/341 1262/1398/341 +f 1691/1842/341 1262/1398/341 1690/1841/341 +f 1690/1841/341 1262/1398/341 330/392/341 +f 1518/1663/340 323/385/340 1470/1614/340 +f 1518/1663/340 1470/1614/340 519/603/340 +f 519/603/340 1470/1614/340 338/400/340 +f 1514/1659/339 330/392/339 1345/1484/339 +f 1514/1659/339 1345/1484/339 1513/1658/339 +f 1513/1658/339 1345/1484/339 329/391/339 +f 1835/1989/338 322/384/338 1544/1690/338 +f 1835/1989/580 1544/1690/580 546/634/580 +f 546/634/338 1544/1690/338 337/399/338 +f 1207/1342/337 314/376/337 1260/1396/337 +f 1207/1342/337 1260/1396/337 1347/1486/337 +f 1347/1486/337 1260/1396/337 329/391/337 +f 1423/1564/336 301/332/336 1545/1691/336 +f 1423/1564/336 1545/1691/336 1430/1572/336 +f 1430/1572/336 1545/1691/336 317/379/336 +f 709/816/335 323/385/335 1399/1539/335 +f 709/816/335 1399/1539/335 515/598/335 +f 515/598/335 1399/1539/335 307/338/335 +f 801/920/334 309/371/334 507/589/334 +f 801/920/334 507/589/334 500/579/334 +f 500/579/334 507/589/334 82/93/334 +f 1618/1766/333 316/378/333 685/790/333 +f 1618/1766/333 685/790/333 1428/1570/333 +f 1428/1570/333 685/790/333 315/377/333 +f 505/585/332 307/338/332 1399/1539/332 +f 505/585/332 1399/1539/332 512/594/332 +f 512/594/332 1399/1539/332 323/385/332 +f 631/727/331 315/377/331 1255/1391/331 +f 631/727/331 1255/1391/331 629/725/331 +f 629/725/331 1255/1391/331 314/376/331 +f 1874/2029/330 306/337/330 1478/1622/330 +f 1874/2029/330 1478/1622/330 1864/2019/330 +f 1864/2019/330 1478/1622/330 322/384/330 +f 844/965/329 298/329/329 718/826/329 +f 844/965/329 718/826/329 1341/1480/329 +f 1341/1480/329 718/826/329 314/376/329 +f 1902/2057/328 321/383/328 1777/1931/328 +f 1902/2057/328 1777/1931/328 606/700/328 +f 606/700/328 1777/1931/328 320/382/328 +f 1171/1304/327 313/375/327 1070/1200/327 +f 1171/1304/327 1070/1200/327 1339/1478/327 +f 1339/1478/327 1070/1200/327 312/374/327 +f 1849/2003/326 304/335/326 555/645/326 +f 1849/2003/326 555/645/326 1647/1796/326 +f 1647/1796/326 555/645/326 320/382/326 +f 605/699/325 296/327/325 1069/1199/325 +f 605/699/325 1069/1199/325 764/881/325 +f 764/881/325 1069/1199/325 312/374/325 +f 1025/1154/324 319/381/324 1597/1744/324 +f 1025/1154/324 1597/1744/324 1853/2008/324 +f 1853/2008/324 1597/1744/324 318/380/324 +f 888/1010/323 295/326/323 1692/1843/323 +f 888/1010/323 1692/1843/323 892/1014/323 +f 892/1014/323 1692/1843/323 311/373/323 +f 1298/1435/322 302/333/322 1104/1236/322 +f 1298/1435/322 1104/1236/322 1688/1839/322 +f 1688/1839/322 1104/1236/322 318/380/322 +f 1807/1961/321 294/325/321 1765/1918/321 +f 1807/1961/581 1765/1918/581 514/597/581 +f 514/597/321 1765/1918/321 310/372/321 +f 638/735/320 297/328/320 1065/1194/320 +f 638/735/320 1065/1194/320 637/734/320 +f 637/734/320 1065/1194/320 296/327/320 +f 1762/1915/319 289/320/319 1829/1983/319 +f 1762/1915/319 1829/1983/319 1910/2065/319 +f 1910/2065/319 1829/1983/319 304/335/319 +f 1061/1190/318 281/312/318 1333/1471/318 +f 1061/1190/318 1333/1471/318 1011/1140/318 +f 1011/1140/318 1333/1471/318 296/327/318 +f 1768/1921/317 303/334/317 1589/1735/317 +f 1768/1921/317 1589/1735/317 1908/2063/317 +f 1908/2063/317 1589/1735/317 302/333/317 +f 1673/1823/316 280/311/316 1178/1312/316 +f 1673/1823/316 1178/1312/316 1617/1765/316 +f 1617/1765/316 1178/1312/316 295/326/316 +f 1584/1730/315 287/318/315 949/1073/315 +f 1584/1730/315 949/1073/315 1032/1161/315 +f 1032/1161/315 949/1073/315 302/333/315 +f 884/1006/314 279/310/314 1148/1280/314 +f 884/1006/314 1148/1280/314 1698/1849/314 +f 1698/1849/314 1148/1280/314 294/325/314 +f 1446/1590/313 286/317/313 1587/1733/313 +f 1446/1590/313 1587/1733/313 1477/1621/313 +f 1477/1621/313 1587/1733/313 301/332/313 +f 515/599/312 307/338/312 878/999/312 +f 515/599/312 878/999/312 881/1002/312 +f 881/1002/312 878/999/312 292/323/312 +f 886/1008/311 293/324/311 500/580/311 +f 886/1008/311 500/580/311 493/571/311 +f 493/571/311 500/580/311 82/94/311 +f 1476/1620/310 300/331/310 1071/1201/310 +f 1476/1620/310 1071/1201/310 1678/1828/310 +f 1678/1828/310 1071/1201/310 299/330/310 +f 878/999/309 307/338/309 505/585/309 +f 878/999/309 505/585/309 877/998/309 +f 877/998/309 505/585/309 306/337/309 +f 1552/1698/308 299/330/308 1245/1380/308 +f 1552/1698/308 1245/1380/308 1551/1697/308 +f 1551/1697/308 1245/1380/308 298/329/308 +f 499/578/307 291/322/307 803/922/307 +f 499/578/307 803/922/307 1405/1545/307 +f 1405/1545/307 803/922/307 306/337/307 +f 1235/1370/306 283/314/306 1504/1648/306 +f 1235/1370/306 1504/1648/306 1231/1366/306 +f 1231/1366/306 1504/1648/306 298/329/306 +f 503/583/305 305/336/305 1770/1923/305 +f 503/583/305 1770/1923/305 1404/1544/305 +f 1404/1544/305 1770/1923/305 304/335/305 +f 881/1003/304 292/323/304 974/1099/304 +f 881/1003/304 974/1099/304 749/863/304 +f 749/863/304 974/1099/304 277/308/304 +f 1143/1275/303 278/309/303 493/572/303 +f 1143/1275/303 493/572/303 486/563/303 +f 486/563/303 493/572/303 82/95/303 +f 957/1081/582 285/316/582 1417/1557/582 +f 957/1081/302 1417/1557/302 956/1080/302 +f 956/1080/302 1417/1557/302 284/315/302 +f 974/1099/583 292/323/583 1593/1740/583 +f 974/1099/301 1593/1740/301 973/1098/301 +f 973/1098/301 1593/1740/301 291/322/301 +f 1668/1817/300 284/315/300 1502/1646/300 +f 1668/1817/300 1502/1646/300 1667/1816/300 +f 1667/1816/300 1502/1646/300 283/314/300 +f 792/911/541 276/307/541 699/804/541 +f 792/911/541 699/804/541 1257/1393/541 +f 1257/1393/299 699/804/299 291/322/299 +f 1497/1641/298 268/299/298 1484/1628/298 +f 1497/1641/298 1484/1628/298 1909/2064/298 +f 1909/2064/298 1484/1628/298 283/314/298 +f 1256/1392/297 290/321/297 597/690/297 +f 1256/1392/297 597/690/297 795/914/297 +f 795/914/297 597/690/297 289/320/297 +f 1500/1644/296 282/313/296 1073/1203/296 +f 1500/1644/296 1073/1203/296 1499/1643/296 +f 1499/1643/296 1073/1203/296 281/312/296 +f 592/685/295 274/305/295 1331/1469/295 +f 592/685/295 1331/1469/295 1764/1917/295 +f 1764/1917/295 1331/1469/295 289/320/295 +f 1543/1689/294 266/297/294 561/651/294 +f 1543/1689/294 561/651/294 1031/1160/294 +f 1031/1160/294 561/651/294 281/312/294 +f 595/688/293 288/319/293 918/1042/293 +f 595/688/293 918/1042/293 594/687/293 +f 594/687/293 918/1042/293 287/318/293 +f 1057/1186/540 265/296/540 1327/1465/540 +f 1057/1186/292 1327/1465/292 1112/1244/292 +f 1112/1244/292 1327/1465/292 280/311/292 +f 1840/1994/291 272/303/291 1834/1988/291 +f 1840/1994/291 1834/1988/291 916/1040/291 +f 916/1040/291 1834/1988/291 287/318/291 +f 1111/1243/290 279/310/290 884/1006/290 +f 1111/1243/290 884/1006/290 609/703/290 +f 609/703/290 884/1006/290 278/309/290 +f 1579/1725/289 271/302/289 1843/1997/289 +f 1579/1725/289 1843/1997/289 1583/1729/289 +f 1583/1729/289 1843/1997/289 286/317/289 +f 484/561/288 259/290/288 791/910/288 +f 484/561/288 791/910/288 1265/1401/288 +f 1265/1401/288 791/910/288 274/305/288 +f 1408/1548/287 251/282/287 1496/1640/287 +f 1408/1548/287 1496/1640/287 1914/2069/287 +f 1914/2069/287 1496/1640/287 266/297/287 +f 490/568/286 273/304/286 1754/1907/286 +f 490/568/286 1754/1907/286 489/567/286 +f 489/567/286 1754/1907/286 272/303/286 +f 1318/1455/285 250/281/285 1225/1360/285 +f 1318/1455/285 1225/1360/285 1322/1459/285 +f 1322/1459/285 1225/1360/285 265/296/285 +f 1749/1902/284 257/288/284 591/684/284 +f 1749/1902/284 591/684/284 1177/1311/284 +f 1177/1311/284 591/684/284 272/303/284 +f 1321/1458/283 264/295/283 1141/1273/283 +f 1321/1458/283 1141/1273/283 1320/1457/283 +f 1320/1457/283 1141/1273/283 263/294/283 +f 1833/1987/282 256/287/282 1752/1905/282 +f 1833/1987/282 1752/1905/282 1839/1993/282 +f 1839/1993/282 1752/1905/282 271/302/282 +f 749/864/281 277/308/281 883/1005/281 +f 749/864/281 883/1005/281 1672/1821/281 +f 1672/1821/281 883/1005/281 262/293/281 +f 1055/1184/280 263/294/280 486/564/280 +f 1055/1184/280 486/564/280 684/788/280 +f 684/788/280 486/564/280 82/96/280 +f 1838/1992/279 270/301/279 1663/1812/279 +f 1838/1992/279 1663/1812/279 1837/1991/279 +f 1837/1991/279 1663/1812/279 269/300/279 +f 965/1090/278 262/293/278 883/1005/278 +f 965/1090/278 883/1005/278 969/1094/278 +f 969/1094/278 883/1005/278 277/308/278 +f 1577/1723/277 269/300/277 1413/1553/277 +f 1577/1723/277 1413/1553/277 1576/1722/277 +f 1576/1722/277 1413/1553/277 268/299/277 +f 688/793/276 261/292/276 968/1093/276 +f 688/793/276 968/1093/276 694/799/276 +f 694/799/276 968/1093/276 276/307/276 +f 1575/1721/275 253/284/275 1662/1811/275 +f 1575/1721/275 1662/1811/275 1409/1549/275 +f 1409/1549/275 1662/1811/275 268/299/275 +f 693/798/274 275/306/274 492/570/274 +f 693/798/274 492/570/274 692/797/274 +f 692/797/274 492/570/274 274/305/274 +f 1411/1551/273 267/298/273 1227/1362/273 +f 1411/1551/273 1227/1362/273 1410/1550/273 +f 1410/1550/273 1227/1362/273 266/297/273 +f 1921/2076/272 255/286/272 1748/1901/272 +f 1921/2076/539 1748/1901/539 1920/2075/539 +f 1920/2075/272 1748/1901/272 254/285/272 +f 1052/1181/271 247/278/271 1140/1272/271 +f 1052/1181/271 1140/1272/271 876/997/271 +f 876/997/271 1140/1272/271 262/293/271 +f 1832/1986/270 254/285/270 1659/1808/270 +f 1832/1986/270 1659/1808/270 1831/1985/270 +f 1831/1985/270 1659/1808/270 253/284/270 +f 959/1083/269 246/277/269 875/996/269 +f 959/1083/269 875/996/269 964/1089/269 +f 964/1089/269 875/996/269 261/292/269 +f 1655/1804/268 238/269/268 1747/1900/268 +f 1655/1804/268 1747/1900/268 1658/1807/268 +f 1658/1807/268 1747/1900/268 253/284/268 +f 963/1088/267 260/291/267 785/904/267 +f 963/1088/267 785/904/267 962/1087/267 +f 962/1087/267 785/904/267 259/290/267 +f 1657/1806/266 252/283/266 1495/1639/266 +f 1657/1806/266 1495/1639/266 1656/1805/266 +f 1656/1805/266 1495/1639/266 251/282/266 +f 780/899/265 244/275/265 686/791/265 +f 780/899/265 686/791/265 784/903/265 +f 784/903/265 686/791/265 259/290/265 +f 1491/1635/264 236/267/264 1574/1720/264 +f 1491/1635/264 1574/1720/264 1494/1638/264 +f 1494/1638/264 1574/1720/264 251/282/264 +f 783/902/263 258/289/263 588/681/263 +f 783/902/263 588/681/263 782/901/263 +f 782/901/263 588/681/263 257/288/263 +f 1403/1543/262 235/266/262 1493/1637/262 +f 1403/1543/262 1493/1637/262 1407/1547/262 +f 1407/1547/262 1493/1637/262 250/281/262 +f 585/678/261 242/273/261 483/560/261 +f 585/678/261 483/560/261 587/680/261 +f 587/680/261 483/560/261 257/288/261 +f 1312/1449/260 234/265/260 1406/1546/260 +f 1312/1449/260 1406/1546/260 1317/1454/260 +f 1317/1454/260 1406/1546/260 249/280/260 +f 1917/2072/259 241/272/259 586/679/259 +f 1917/2072/259 586/679/259 1922/2077/259 +f 1922/2077/259 586/679/259 256/287/259 +f 1672/1822/258 262/293/258 1140/1272/258 +f 1672/1822/258 1140/1272/258 1154/1286/258 +f 1154/1286/258 1140/1272/258 247/278/258 +f 1316/1453/257 248/279/257 684/789/257 +f 1316/1453/257 684/789/257 680/783/257 +f 680/783/257 684/789/257 82/97/257 +f 702/807/256 221/252/256 1653/1802/256 +f 702/807/256 1653/1802/256 1571/1717/256 +f 1571/1717/256 1653/1802/256 236/267/256 +f 869/990/255 243/274/255 683/787/255 +f 869/990/255 683/787/255 868/989/255 +f 868/989/255 683/787/255 242/273/255 +f 1570/1716/254 235/266/254 1403/1543/254 +f 1570/1716/254 1403/1543/254 1569/1715/254 +f 1569/1715/254 1403/1543/254 234/265/254 +f 679/782/253 227/258/253 779/898/253 +f 679/782/253 779/898/253 682/786/253 +f 682/786/253 779/898/253 242/273/253 +f 1395/1535/252 219/250/252 1490/1634/252 +f 1395/1535/252 1490/1634/252 1402/1542/252 +f 1402/1542/252 1490/1634/252 234/265/252 +f 581/674/537 226/257/537 681/785/537 +f 581/674/537 681/785/537 584/677/537 +f 584/677/537 681/785/537 241/272/537 +f 1154/1287/250 247/278/250 1220/1355/250 +f 1154/1287/250 1220/1355/250 1066/1195/250 +f 1066/1195/250 1220/1355/250 232/263/250 +f 1401/1541/249 233/264/249 680/784/249 +f 1401/1541/249 680/784/249 671/773/249 +f 671/773/249 680/784/249 82/98/249 +f 583/676/248 240/271/248 1828/1982/248 +f 583/676/248 1828/1982/248 582/675/248 +f 582/675/248 1828/1982/248 239/270/248 +f 1220/1355/247 247/278/247 1052/1181/247 +f 1220/1355/247 1052/1181/247 1219/1354/247 +f 1219/1354/247 1052/1181/247 246/277/247 +f 1916/2071/246 239/270/246 1744/1897/246 +f 1916/2071/246 1744/1897/246 1915/2070/246 +f 1915/2070/246 1744/1897/246 238/269/246 +f 1047/1176/245 231/262/245 1138/1270/245 +f 1047/1176/245 1138/1270/245 1051/1180/245 +f 1051/1180/245 1138/1270/245 246/277/245 +f 1737/1890/244 223/254/244 1827/1981/244 +f 1737/1890/244 1827/1981/244 1743/1896/244 +f 1743/1896/244 1827/1981/244 238/269/244 +f 1050/1179/243 245/276/243 871/992/243 +f 1050/1179/243 871/992/243 1049/1178/243 +f 1049/1178/243 871/992/243 244/275/243 +f 1742/1895/242 237/268/242 1572/1718/242 +f 1742/1895/242 1572/1718/242 1741/1894/242 +f 1741/1894/242 1572/1718/242 236/267/242 +f 865/986/241 229/260/241 958/1082/241 +f 865/986/241 958/1082/241 870/991/241 +f 870/991/241 958/1082/241 244/275/241 +f 580/673/240 224/255/240 1824/1978/240 +f 580/673/240 1824/1978/240 1489/1633/240 +f 1489/1633/240 1824/1978/240 223/254/240 +f 1128/1260/239 216/247/239 1217/1352/239 +f 1128/1260/239 1217/1352/239 1135/1267/239 +f 1135/1267/239 1217/1352/239 231/262/239 +f 1817/1971/238 208/239/238 1911/2066/238 +f 1817/1971/238 1911/2066/238 1823/1977/238 +f 1823/1977/238 1911/2066/238 223/254/238 +f 1134/1266/237 230/261/237 955/1079/237 +f 1134/1266/237 955/1079/237 1133/1265/237 +f 1133/1265/237 955/1079/237 229/260/237 +f 569/660/236 222/253/236 1651/1800/236 +f 569/660/236 1651/1800/236 1821/1975/236 +f 1821/1975/236 1651/1800/236 221/252/236 +f 947/1071/235 214/245/235 1046/1175/235 +f 947/1071/235 1046/1175/235 954/1078/235 +f 954/1078/235 1046/1175/235 229/260/235 +f 1645/1794/234 206/237/234 1736/1889/234 +f 1645/1794/234 1736/1889/234 1650/1799/234 +f 1650/1799/234 1736/1889/234 221/252/234 +f 953/1077/233 228/259/233 777/896/233 +f 953/1077/233 777/896/233 952/1076/233 +f 952/1076/233 777/896/233 227/258/233 +f 1563/1709/232 205/236/232 1649/1798/232 +f 1563/1709/232 1649/1798/232 1567/1713/232 +f 1567/1713/232 1649/1798/232 220/251/232 +f 768/885/231 212/243/231 864/985/231 +f 768/885/231 864/985/231 776/895/231 +f 776/895/231 864/985/231 227/258/231 +f 1481/1625/230 204/235/230 1566/1712/230 +f 1481/1625/230 1566/1712/230 1486/1630/230 +f 1486/1630/230 1566/1712/230 219/250/230 +f 670/772/229 211/242/229 960/1084/229 +f 670/772/229 960/1084/229 1918/2073/229 +f 1918/2073/229 960/1084/229 226/257/229 +f 1066/1196/228 232/263/228 1311/1448/228 +f 1066/1196/228 1311/1448/228 1338/1476/228 +f 1338/1476/228 1311/1448/228 217/248/228 +f 1485/1629/227 218/249/227 671/774/227 +f 1485/1629/227 671/774/227 664/765/227 +f 664/765/227 671/774/227 82/99/227 +f 677/780/226 225/256/226 1913/2068/226 +f 677/780/226 1913/2068/226 676/779/226 +f 676/779/226 1913/2068/226 224/255/226 +f 1211/1346/225 217/248/225 1311/1448/225 +f 1211/1346/584 1311/1448/584 1218/1353/584 +f 1218/1353/225 1311/1448/225 232/263/225 +f 1640/1789/224 190/221/224 1732/1885/224 +f 1640/1789/224 1732/1885/224 1644/1793/224 +f 1644/1793/224 1732/1885/224 205/236/224 +f 849/970/223 197/228/223 945/1069/223 +f 849/970/223 945/1069/223 856/977/223 +f 856/977/223 945/1069/223 212/243/223 +f 1559/1705/222 189/220/222 1643/1792/222 +f 1559/1705/222 1643/1792/222 1562/1708/222 +f 1562/1708/222 1643/1792/222 204/235/222 +f 761/878/221 196/227/221 855/976/221 +f 761/878/221 855/976/221 767/884/221 +f 767/884/221 855/976/221 211/242/221 +f 1338/1477/220 217/248/220 1394/1534/220 +f 1338/1477/220 1394/1534/220 1250/1385/220 +f 1250/1385/220 1394/1534/220 202/233/220 +f 1561/1707/219 203/234/219 664/766/219 +f 1561/1707/219 664/766/219 658/758/219 +f 658/758/219 664/766/219 82/100/219 +f 766/883/218 210/241/218 574/666/218 +f 766/883/218 574/666/218 765/882/218 +f 765/882/218 574/666/218 209/240/218 +f 1302/1439/535 202/233/535 1394/1534/535 +f 1302/1439/217 1394/1534/217 1304/1441/217 +f 1304/1441/535 1394/1534/535 217/248/535 +f 668/770/216 209/240/216 1907/2062/216 +f 668/770/216 1907/2062/216 667/769/216 +f 667/769/216 1907/2062/216 208/239/216 +f 1206/1341/534 201/232/534 1303/1440/534 +f 1206/1341/534 1303/1440/534 1210/1345/534 +f 1210/1345/215 1303/1440/215 216/247/215 +f 1900/2055/214 193/224/214 572/664/214 +f 1900/2055/214 572/664/214 1906/2061/214 +f 1906/2061/214 572/664/214 208/239/214 +f 1209/1344/213 215/246/213 1041/1170/213 +f 1209/1344/213 1041/1170/213 1208/1343/213 +f 1208/1343/213 1041/1170/213 214/245/213 +f 1905/2060/212 207/238/212 1734/1887/212 +f 1905/2060/212 1734/1887/212 1904/2059/212 +f 1904/2059/212 1734/1887/212 206/237/212 +f 1035/1164/211 199/230/211 1126/1258/211 +f 1035/1164/211 1126/1258/211 1040/1169/211 +f 1040/1169/211 1126/1258/211 214/245/211 +f 1729/1882/210 191/222/210 1815/1969/210 +f 1729/1882/210 1815/1969/210 1733/1886/210 +f 1733/1886/210 1815/1969/210 206/237/210 +f 1039/1168/209 213/244/209 857/978/209 +f 1039/1168/209 857/978/209 1038/1167/209 +f 1038/1167/209 857/978/209 212/243/209 +f 1296/1433/208 186/217/208 1388/1528/208 +f 1296/1433/208 1388/1528/208 1301/1438/208 +f 1301/1438/208 1388/1528/208 201/232/208 +f 558/648/207 178/209/207 661/762/207 +f 558/648/207 661/762/207 565/656/207 +f 565/656/207 661/762/207 193/224/207 +f 1300/1437/206 200/231/206 1124/1256/206 +f 1300/1437/206 1124/1256/206 1299/1436/206 +f 1299/1436/206 1124/1256/206 199/230/206 +f 564/655/205 192/223/205 1811/1965/205 +f 564/655/205 1811/1965/205 563/654/205 +f 563/654/205 1811/1965/205 191/222/205 +f 1119/1251/204 184/215/204 1204/1339/204 +f 1119/1251/204 1204/1339/204 1123/1255/204 +f 1123/1255/204 1204/1339/204 199/230/204 +f 1804/1958/203 176/207/203 1898/2053/203 +f 1804/1958/203 1898/2053/203 1810/1964/203 +f 1810/1964/203 1898/2053/203 191/222/203 +f 1122/1254/202 198/229/202 941/1065/202 +f 1122/1254/202 941/1065/202 1121/1253/202 +f 1121/1253/202 941/1065/202 197/228/202 +f 1809/1963/201 190/221/201 1640/1789/201 +f 1809/1963/201 1640/1789/201 1808/1962/201 +f 1808/1962/201 1640/1789/201 189/220/201 +f 934/1058/200 182/213/200 1033/1162/200 +f 934/1058/200 1033/1162/200 940/1064/200 +f 940/1064/200 1033/1162/200 197/228/200 +f 1727/1880/199 189/220/199 1559/1705/199 +f 1727/1880/199 1559/1705/199 1726/1879/199 +f 1726/1879/533 1559/1705/533 188/219/533 +f 843/964/198 181/212/198 939/1063/198 +f 843/964/198 939/1063/198 848/969/198 +f 848/969/198 939/1063/198 196/227/198 +f 1250/1386/197 202/233/197 1479/1623/197 +f 1250/1386/197 1479/1623/197 1508/1652/197 +f 1508/1652/197 1479/1623/197 187/218/197 +f 1638/1787/196 188/219/196 658/759/196 +f 1638/1787/196 658/759/196 652/751/196 +f 652/751/196 658/759/196 82/101/196 +f 847/968/195 195/226/195 663/764/195 +f 847/968/195 663/764/195 846/967/195 +f 846/967/195 663/764/195 194/225/195 +f 1382/1521/532 187/218/532 1479/1623/532 +f 1382/1521/532 1479/1623/532 1389/1529/532 +f 1389/1529/532 1479/1623/532 202/233/532 +f 759/876/193 194/225/193 566/657/193 +f 759/876/193 566/657/193 758/875/193 +f 758/875/193 566/657/193 193/224/193 +f 1023/1152/192 167/198/192 1117/1249/192 +f 1023/1152/192 1117/1249/192 1029/1158/192 +f 1029/1158/192 1117/1249/192 182/213/192 +f 1721/1874/191 159/190/191 1802/1956/191 +f 1721/1874/191 1802/1956/191 1724/1877/191 +f 1724/1877/191 1802/1956/191 174/205/191 +f 926/1050/190 166/197/190 1028/1157/190 +f 926/1050/190 1028/1157/190 933/1057/190 +f 933/1057/190 1028/1157/190 181/212/190 +f 1508/1653/189 187/218/189 1558/1704/189 +f 1508/1653/189 1558/1704/189 1424/1565/189 +f 1424/1565/189 1558/1704/189 172/203/189 +f 1723/1876/188 173/204/188 652/752/188 +f 1723/1876/188 652/752/188 646/744/188 +f 646/744/188 652/752/188 82/102/188 +f 932/1056/187 180/211/187 754/870/187 +f 932/1056/187 754/870/187 931/1055/187 +f 931/1055/187 754/870/187 179/210/187 +f 1558/1704/186 187/218/186 1382/1521/186 +f 1558/1704/531 1382/1521/531 1557/1703/531 +f 1557/1703/531 1382/1521/531 186/217/531 +f 841/962/185 179/210/185 657/757/185 +f 841/962/185 657/757/185 840/961/185 +f 840/961/185 657/757/185 178/209/185 +f 1473/1617/184 186/217/184 1296/1433/184 +f 1473/1617/184 1296/1433/184 1472/1616/184 +f 1472/1616/184 1296/1433/184 185/216/184 +f 651/750/183 163/194/183 752/868/183 +f 651/750/183 752/868/183 656/756/183 +f 656/756/183 752/868/183 178/209/183 +f 1292/1429/182 170/201/182 1380/1519/182 +f 1292/1429/182 1380/1519/182 1295/1432/182 +f 1295/1432/182 1380/1519/182 185/216/182 +f 655/755/181 177/208/181 1892/2047/181 +f 655/755/181 1892/2047/181 654/754/181 +f 654/754/181 1892/2047/181 176/207/181 +f 1197/1332/180 169/200/180 1294/1431/180 +f 1197/1332/180 1294/1431/180 1200/1335/180 +f 1200/1335/180 1294/1431/180 184/215/180 +f 1886/2041/179 161/192/179 556/646/179 +f 1886/2041/179 556/646/179 1891/2046/179 +f 1891/2046/179 556/646/179 176/207/179 +f 1199/1334/178 183/214/178 1030/1159/178 +f 1199/1334/178 1030/1159/178 1198/1333/178 +f 1198/1333/178 1030/1159/178 182/213/178 +f 1800/1954/177 160/191/177 1890/2045/177 +f 1800/1954/177 1890/2045/177 1803/1957/177 +f 1803/1957/177 1890/2045/177 175/206/177 +f 740/853/176 148/179/176 837/958/176 +f 740/853/176 837/958/176 746/860/176 +f 746/860/176 837/958/176 163/194/176 +f 1465/1609/175 170/201/175 1292/1429/175 +f 1465/1609/175 1292/1429/175 1464/1608/175 +f 1464/1608/175 1292/1429/175 169/200/175 +f 745/859/174 162/193/174 551/640/174 +f 745/859/174 551/640/174 744/858/174 +f 744/858/174 551/640/174 161/192/174 +f 1287/1424/173 154/185/173 1373/1512/173 +f 1287/1424/173 1373/1512/173 1291/1428/173 +f 1291/1428/173 1373/1512/173 169/200/173 +f 543/631/172 146/177/172 649/748/172 +f 543/631/172 649/748/172 550/639/172 +f 550/639/172 649/748/172 161/192/172 +f 1290/1427/171 168/199/171 1115/1247/171 +f 1290/1427/171 1115/1247/171 1289/1426/171 +f 1289/1426/171 1115/1247/171 167/198/171 +f 549/638/170 160/191/170 1800/1954/170 +f 549/638/559 1800/1954/559 548/637/559 +f 548/637/170 1800/1954/170 159/190/170 +f 1108/1240/169 152/183/169 1195/1330/169 +f 1108/1240/169 1195/1330/169 1114/1246/169 +f 1114/1246/169 1195/1330/169 167/198/169 +f 1796/1950/168 144/175/168 1884/2039/168 +f 1796/1950/168 1884/2039/168 1799/1953/168 +f 1799/1953/168 1884/2039/168 159/190/168 +f 1015/1144/167 151/182/167 1113/1245/167 +f 1015/1144/167 1113/1245/167 1022/1151/167 +f 1022/1151/585 1113/1245/585 166/197/585 +f 1424/1566/166 172/203/166 1634/1783/166 +f 1424/1566/166 1634/1783/166 1685/1835/166 +f 1685/1835/166 1634/1783/166 157/188/166 +f 1798/1952/165 158/189/165 646/745/165 +f 1798/1952/165 646/745/165 640/737/165 +f 640/737/165 646/745/165 82/103/165 +f 1021/1150/164 165/196/164 839/960/164 +f 1021/1150/164 839/960/164 1020/1149/164 +f 1020/1149/164 839/960/164 164/195/164 +f 1549/1695/163 157/188/163 1634/1783/163 +f 1549/1695/586 1634/1783/586 1556/1702/586 +f 1556/1702/163 1634/1783/163 172/203/163 +f 924/1048/162 164/195/162 747/861/162 +f 924/1048/162 747/861/162 923/1047/162 +f 923/1047/162 747/861/162 163/194/162 +f 1460/1604/562 156/187/562 1555/1701/562 +f 1460/1604/161 1555/1701/161 1466/1610/161 +f 1466/1610/562 1555/1701/562 171/202/562 +f 1875/2030/160 129/160/160 541/629/160 +f 1875/2030/160 541/629/160 1878/2033/160 +f 1878/2033/160 541/629/160 144/175/160 +f 1102/1234/159 136/167/159 1190/1324/159 +f 1102/1234/159 1190/1324/159 1107/1239/159 +f 1107/1239/587 1190/1324/587 151/182/587 +f 1685/1836/158 157/188/158 1720/1873/158 +f 1685/1836/158 1720/1873/158 1591/1737/158 +f 1591/1737/158 1720/1873/158 142/173/158 +f 1877/2032/157 143/174/157 640/738/157 +f 1877/2032/157 640/738/157 632/728/157 +f 632/728/157 640/738/157 82/104/157 +f 1106/1238/156 150/181/156 919/1043/156 +f 1106/1238/156 919/1043/156 1105/1237/156 +f 1105/1237/156 919/1043/156 149/180/156 +f 1720/1873/530 157/188/530 1549/1695/530 +f 1720/1873/530 1549/1695/530 1719/1872/530 +f 1719/1872/530 1549/1695/530 156/187/530 +f 1013/1142/154 149/180/154 834/955/154 +f 1013/1142/154 834/955/154 1012/1141/154 +f 1012/1141/154 834/955/154 148/179/154 +f 1542/1688/529 141/172/529 1631/1780/529 +f 1542/1688/529 1631/1780/529 1548/1694/529 +f 1548/1694/529 1631/1780/529 156/187/529 +f 830/951/152 133/164/152 917/1041/152 +f 830/951/152 917/1041/152 833/954/152 +f 833/954/152 917/1041/152 148/179/152 +f 1547/1693/151 155/186/151 1370/1509/151 +f 1547/1693/151 1370/1509/151 1546/1692/151 +f 1546/1692/151 1370/1509/151 154/185/151 +f 832/953/150 147/178/150 644/742/150 +f 832/953/150 644/742/150 831/952/150 +f 831/952/150 644/742/150 146/177/150 +f 1366/1505/149 139/170/149 1458/1602/149 +f 1366/1505/149 1458/1602/149 1369/1508/149 +f 1369/1508/149 1458/1602/149 154/185/149 +f 635/732/148 131/162/148 738/851/148 +f 635/732/148 738/851/148 643/741/148 +f 643/741/148 738/851/148 146/177/148 +f 1368/1507/147 153/184/147 1192/1326/147 +f 1368/1507/147 1192/1326/147 1367/1506/147 +f 1367/1506/147 1192/1326/147 152/183/147 +f 642/740/146 145/176/146 1879/2034/146 +f 642/740/146 1879/2034/146 641/739/146 +f 641/739/146 1879/2034/146 144/175/146 +f 1187/1321/145 137/168/145 1285/1422/145 +f 1187/1321/145 1285/1422/145 1191/1325/145 +f 1191/1325/145 1285/1422/145 152/183/145 +f 1627/1775/144 140/171/144 1455/1599/144 +f 1627/1775/144 1455/1599/144 1626/1774/144 +f 1626/1774/144 1455/1599/144 139/170/144 +f 912/1036/143 132/163/143 735/847/143 +f 912/1036/143 735/847/143 911/1035/143 +f 911/1035/143 735/847/143 131/162/143 +f 1447/1591/142 124/155/142 1540/1686/142 +f 1447/1591/142 1540/1686/142 1454/1598/142 +f 1454/1598/142 1540/1686/142 139/170/142 +f 729/840/141 116/147/141 828/949/141 +f 729/840/141 828/949/141 734/846/141 +f 734/846/141 828/949/141 131/162/141 +f 1453/1597/140 138/169/140 1283/1420/140 +f 1453/1597/140 1283/1420/140 1452/1596/140 +f 1452/1596/140 1283/1420/140 137/168/140 +f 628/724/139 115/146/139 733/845/139 +f 628/724/139 733/845/139 634/731/139 +f 634/731/139 733/845/139 130/161/139 +f 1279/1416/138 122/153/138 1364/1503/138 +f 1279/1416/138 1364/1503/138 1282/1419/138 +f 1282/1419/138 1364/1503/138 137/168/138 +f 529/616/137 114/145/137 633/730/137 +f 529/616/137 633/730/137 535/622/137 +f 535/622/137 633/730/137 129/160/137 +f 1182/1316/136 121/152/136 1281/1418/136 +f 1182/1316/136 1281/1418/136 1186/1320/136 +f 1186/1320/136 1281/1418/136 136/167/136 +f 1591/1738/588 142/173/588 1794/1948/588 +f 1591/1738/588 1794/1948/588 1851/2005/588 +f 1851/2005/588 1794/1948/588 127/158/588 +f 534/621/134 128/159/134 632/729/134 +f 534/621/134 632/729/134 1383/1522/134 +f 1383/1522/589 632/729/589 82/105/589 +f 1185/1319/526 135/166/526 1009/1138/526 +f 1185/1319/526 1009/1138/526 1184/1318/526 +f 1184/1318/526 1009/1138/526 134/165/526 +f 1712/1865/132 127/158/132 1794/1948/132 +f 1712/1865/132 1794/1948/132 1717/1870/132 +f 1717/1870/132 1794/1948/132 142/173/132 +f 1100/1232/131 134/165/131 914/1038/131 +f 1100/1232/131 914/1038/131 1099/1231/131 +f 1099/1231/131 914/1038/131 133/164/131 +f 1621/1769/130 126/157/130 1716/1869/130 +f 1621/1769/130 1716/1869/130 1628/1776/130 +f 1628/1776/130 1716/1869/130 141/172/130 +f 908/1032/129 118/149/129 1007/1136/129 +f 908/1032/129 1007/1136/129 913/1037/129 +f 913/1037/129 1007/1136/129 133/164/129 +f 1273/1409/128 106/137/128 1360/1499/128 +f 1273/1409/128 1360/1499/128 1278/1415/128 +f 1278/1415/590 1360/1499/590 121/152/590 +f 1851/2006/127 127/158/127 1873/2028/127 +f 1851/2006/591 1873/2028/591 1772/1925/591 +f 1772/1925/127 1873/2028/127 112/143/127 +f 626/722/126 113/144/126 1383/1523/126 +f 626/722/592 1383/1523/592 621/716/592 +f 621/716/126 1383/1523/126 82/106/126 +f 1277/1414/524 120/151/524 1095/1227/524 +f 1277/1414/524 1095/1227/524 1276/1413/524 +f 1276/1413/524 1095/1227/524 119/150/524 +f 1789/1943/124 112/143/124 1873/2028/124 +f 1789/1943/124 1873/2028/124 1792/1946/124 +f 1792/1946/124 1873/2028/124 127/158/124 +f 1180/1314/123 119/150/123 1002/1131/123 +f 1180/1314/123 1002/1131/123 1179/1313/123 +f 1179/1313/123 1002/1131/123 118/149/123 +f 1706/1859/122 111/142/122 1791/1945/122 +f 1706/1859/122 1791/1945/122 1711/1864/122 +f 1711/1864/122 1791/1945/122 126/157/122 +f 997/1126/121 103/134/121 1093/1225/121 +f 997/1126/121 1093/1225/121 1001/1130/121 +f 1001/1130/121 1093/1225/121 118/149/121 +f 1710/1863/120 125/156/120 1534/1680/120 +f 1710/1863/120 1534/1680/120 1709/1862/120 +f 1709/1862/120 1534/1680/120 124/155/120 +f 1000/1129/119 117/148/119 824/945/119 +f 1000/1129/119 824/945/119 999/1128/119 +f 999/1128/119 824/945/119 116/147/119 +f 1529/1675/118 109/140/118 1619/1767/118 +f 1529/1675/118 1619/1767/118 1533/1679/118 +f 1533/1679/118 1619/1767/118 124/155/118 +f 817/938/117 101/132/117 906/1030/117 +f 817/938/117 906/1030/117 823/944/117 +f 823/944/117 906/1030/117 116/147/117 +f 1532/1678/116 123/154/116 1362/1501/116 +f 1532/1678/116 1362/1501/116 1531/1677/116 +f 1531/1677/116 1362/1501/116 122/153/116 +f 722/831/115 100/131/115 822/943/115 +f 722/831/115 822/943/115 728/839/115 +f 728/839/115 822/943/115 115/146/115 +f 1357/1496/114 107/138/114 1445/1589/114 +f 1357/1496/114 1445/1589/114 1361/1500/114 +f 1361/1500/114 1445/1589/114 122/153/114 +f 727/838/113 114/145/113 529/616/113 +f 727/838/113 529/616/113 726/837/113 +f 726/837/113 529/616/113 113/144/113 +f 1087/1218/112 102/133/112 904/1027/112 +f 1087/1218/112 904/1027/112 1086/1217/112 +f 1086/1217/112 904/1027/112 101/132/112 +f 560/650/111 94/125/111 1704/1856/111 +f 560/650/111 1704/1856/111 1614/1761/111 +f 1614/1761/111 1704/1856/111 109/140/111 +f 1264/1400/110 86/117/110 995/1123/110 +f 1264/1400/110 995/1123/110 903/1026/110 +f 903/1026/110 995/1123/110 101/132/110 +f 1613/1760/109 108/139/109 1443/1586/109 +f 1613/1760/109 1443/1586/109 1612/1759/109 +f 1612/1759/109 1443/1586/109 107/138/109 +f 807/927/108 85/116/108 902/1025/108 +f 807/927/108 902/1025/108 816/937/108 +f 816/937/108 902/1025/108 100/131/108 +f 1110/1242/107 92/123/107 1527/1672/107 +f 1110/1242/107 1527/1672/107 1442/1585/107 +f 1442/1585/107 1527/1672/107 107/138/107 +f 815/936/106 99/130/106 622/718/106 +f 815/936/106 622/718/106 814/935/106 +f 814/935/106 622/718/106 98/129/106 +f 639/736/523 91/122/523 1441/1584/523 +f 639/736/105 1441/1584/105 1356/1495/105 +f 1356/1495/105 1441/1584/105 106/137/105 +f 1772/1926/104 112/143/104 527/614/104 +f 1772/1926/104 527/614/104 1323/1460/104 +f 1323/1460/104 527/614/104 97/128/104 +f 720/829/103 98/129/103 621/717/103 +f 720/829/103 621/717/103 617/711/103 +f 617/711/103 621/717/103 82/107/103 +f 1355/1494/522 105/136/522 1176/1310/522 +f 1355/1494/522 1176/1310/522 1354/1493/522 +f 1354/1493/522 1176/1310/522 104/135/522 +f 1866/2021/101 97/128/101 527/614/101 +f 1866/2021/101 527/614/101 1870/2025/101 +f 1870/2025/101 527/614/101 112/143/101 +f 1271/1407/100 104/135/100 1089/1220/100 +f 1271/1407/100 1089/1220/100 1270/1406/100 +f 1270/1406/100 1089/1220/100 103/134/100 +f 1869/2024/99 111/142/99 1706/1859/99 +f 1869/2024/99 1706/1859/99 1868/2023/99 +f 1868/2023/99 1706/1859/99 110/141/99 +f 724/834/98 88/119/98 1174/1307/98 +f 724/834/98 1174/1307/98 1088/1219/98 +f 1088/1219/98 1174/1307/98 103/134/98 +f 1787/1941/97 110/141/97 1615/1762/97 +f 1787/1941/97 1615/1762/97 1786/1940/97 +f 1786/1940/97 1615/1762/97 109/140/97 +f 715/823/96 83/114/96 617/712/96 +f 715/823/96 617/712/96 714/821/96 +f 714/821/96 617/712/96 82/108/96 +f 1351/1490/95 90/121/95 1268/1404/95 +f 1351/1490/95 1268/1404/95 1350/1489/95 +f 1350/1489/95 1268/1404/95 89/120/95 +f 522/607/593 97/128/593 1866/2021/593 +f 522/607/94 1866/2021/94 521/606/94 +f 521/606/94 1866/2021/94 96/127/94 +f 1267/1403/93 89/120/93 1170/1303/93 +f 1267/1403/93 1170/1303/93 1266/1402/93 +f 1266/1402/93 1170/1303/93 88/119/93 +f 1780/1934/92 80/80/92 1865/2020/92 +f 1780/1934/521 1865/2020/521 1784/1938/521 +f 1784/1938/92 1865/2020/92 96/127/92 +f 1074/1204/91 72/72/91 1169/1302/91 +f 1074/1204/91 1169/1302/91 1081/1212/91 +f 1081/1212/91 1169/1302/91 88/119/91 +f 1697/1848/90 79/79/90 1783/1937/90 +f 1697/1848/90 1783/1937/90 1700/1851/90 +f 1700/1851/90 1783/1937/90 95/126/90 +f 1080/1211/89 87/118/89 992/1120/89 +f 1080/1211/89 992/1120/89 1079/1210/89 +f 1079/1210/89 992/1120/89 86/117/89 +f 1602/1749/88 78/78/88 1699/1850/88 +f 1602/1749/88 1699/1850/88 1607/1754/88 +f 1607/1754/88 1699/1850/88 94/125/88 +f 895/1017/87 70/70/87 991/1119/87 +f 895/1017/87 991/1119/87 899/1022/87 +f 899/1022/87 991/1119/87 86/117/87 +f 1606/1753/86 93/124/86 1524/1669/86 +f 1606/1753/86 1524/1669/86 1605/1752/86 +f 1605/1752/86 1524/1669/86 92/123/86 +f 810/930/85 69/69/85 898/1021/85 +f 810/930/520 898/1021/520 813/934/520 +f 813/934/85 898/1021/85 85/116/85 +f 1434/1576/84 76/76/84 1523/1668/84 +f 1434/1576/84 1523/1668/84 1439/1582/84 +f 1439/1582/84 1523/1668/84 92/123/84 +f 710/817/83 68/68/83 812/933/83 +f 710/817/83 812/933/83 716/824/83 +f 716/824/83 812/933/83 84/115/83 +f 1346/1485/82 75/75/82 1438/1581/82 +f 1346/1485/82 1438/1581/82 1352/1491/82 +f 1352/1491/594 1438/1581/594 91/122/594 +f 1323/1461/81 97/128/81 522/607/81 +f 1323/1461/81 522/607/81 603/696/81 +f 603/696/81 522/607/81 81/81/81 +f 982/1109/80 55/55/80 1072/1202/80 +f 982/1109/80 1072/1202/80 985/1112/80 +f 985/1112/80 1072/1202/80 70/70/80 +f 1695/1846/79 77/77/79 1517/1662/79 +f 1695/1846/79 1517/1662/79 1694/1845/79 +f 1694/1845/79 1517/1662/79 76/76/79 +f 891/1013/78 54/54/78 984/1111/78 +f 891/1013/78 984/1111/78 894/1016/78 +f 894/1016/78 984/1111/78 69/69/78 +f 1512/1657/77 61/61/77 1600/1747/77 +f 1512/1657/77 1600/1747/77 1516/1661/77 +f 1516/1661/77 1600/1747/77 76/76/77 +f 806/926/76 53/53/76 893/1015/76 +f 806/926/76 893/1015/76 809/929/76 +f 809/929/76 893/1015/76 68/68/76 +f 1429/1571/595 60/60/595 1515/1660/595 +f 1429/1571/75 1515/1660/75 1433/1575/75 +f 1433/1575/75 1515/1660/75 75/75/75 +f 603/697/74 81/81/74 615/709/74 +f 603/697/74 615/709/74 506/586/74 +f 506/586/74 615/709/74 66/66/74 +f 808/928/73 67/67/73 714/822/73 +f 808/928/73 714/822/73 811/931/73 +f 811/931/73 714/822/73 82/109/73 +f 1432/1574/72 74/74/72 1261/1397/72 +f 1432/1574/72 1261/1397/72 1431/1573/72 +f 1431/1573/72 1261/1397/72 73/73/72 +f 511/593/71 66/66/71 615/709/71 +f 511/593/71 615/709/71 518/602/71 +f 518/602/71 615/709/71 81/81/71 +f 1344/1483/70 73/73/70 1163/1296/70 +f 1344/1483/70 1163/1296/70 1343/1482/70 +f 1343/1482/70 1163/1296/70 72/72/70 +f 517/601/69 80/80/69 1780/1934/69 +f 517/601/69 1780/1934/69 516/600/69 +f 516/600/69 1780/1934/69 79/79/69 +f 1157/1290/68 57/57/68 1259/1395/68 +f 1157/1290/68 1259/1395/68 1162/1295/68 +f 1162/1295/68 1259/1395/68 72/72/68 +f 1776/1930/67 64/64/67 1859/2014/67 +f 1776/1930/67 1859/2014/67 1779/1933/67 +f 1779/1933/67 1859/2014/67 79/79/67 +f 1161/1294/66 71/71/66 986/1113/66 +f 1161/1294/66 986/1113/66 1160/1293/66 +f 1160/1293/66 986/1113/66 70/70/66 +f 1689/1840/65 63/63/65 1778/1932/65 +f 1689/1840/65 1778/1932/65 1696/1847/65 +f 1696/1847/65 1778/1932/65 78/78/65 +f 602/695/64 51/51/64 708/814/64 +f 602/695/64 708/814/64 608/702/64 +f 608/702/64 708/814/64 66/66/64 +f 1427/1569/63 58/58/63 1254/1390/63 +f 1427/1569/63 1254/1390/63 1426/1568/63 +f 1426/1568/63 1254/1390/63 57/57/63 +f 504/584/62 50/50/62 607/701/62 +f 504/584/62 607/701/62 510/592/62 +f 510/592/62 607/701/62 65/65/62 +f 1244/1379/61 42/42/61 1340/1479/61 +f 1244/1379/61 1340/1479/61 1253/1389/61 +f 1253/1389/61 1340/1479/61 57/57/61 +f 1850/2004/60 49/49/60 509/591/60 +f 1850/2004/60 509/591/60 1855/2010/60 +f 1855/2010/60 509/591/60 64/64/60 +f 1151/1283/59 41/41/59 1252/1388/59 +f 1151/1283/59 1252/1388/59 1156/1289/59 +f 1156/1289/59 1252/1388/59 56/56/59 +f 1769/1922/58 48/48/58 1854/2009/58 +f 1769/1922/58 1854/2009/58 1775/1929/58 +f 1775/1929/58 1854/2009/58 63/63/58 +f 1064/1193/57 40/40/57 1155/1288/57 +f 1064/1193/57 1155/1288/57 1068/1198/57 +f 1068/1198/57 1155/1288/57 55/55/57 +f 1774/1928/56 62/62/56 1596/1743/56 +f 1774/1928/56 1596/1743/56 1773/1927/56 +f 1773/1927/56 1596/1743/56 61/61/56 +f 977/1102/55 39/39/55 1067/1197/55 +f 977/1102/55 1067/1197/55 981/1108/55 +f 981/1108/55 1067/1197/55 54/54/55 +f 1588/1734/54 46/46/54 1687/1838/54 +f 1588/1734/54 1687/1838/54 1595/1742/54 +f 1595/1742/54 1687/1838/54 61/61/54 +f 887/1009/53 38/38/53 980/1107/53 +f 887/1009/53 980/1107/53 890/1012/53 +f 890/1012/53 980/1107/53 53/53/53 +f 1507/1651/52 45/45/52 1594/1741/52 +f 1507/1651/52 1594/1741/52 1511/1656/52 +f 1511/1656/52 1594/1741/52 60/60/52 +f 506/587/51 66/66/51 708/814/51 +f 506/587/51 708/814/51 805/924/51 +f 805/924/51 708/814/51 51/51/51 +f 889/1011/50 52/52/50 811/932/50 +f 889/1011/50 811/932/50 897/1019/50 +f 897/1019/50 811/932/50 82/110/50 +f 1510/1655/49 59/59/49 1342/1481/49 +f 1510/1655/49 1342/1481/49 1509/1654/49 +f 1509/1654/596 1342/1481/596 58/58/596 +f 1848/2002/48 47/47/48 1682/1832/48 +f 1848/2002/48 1682/1832/48 1847/2001/48 +f 1847/2001/48 1682/1832/48 46/46/48 +f 1060/1189/47 24/24/47 1149/1281/47 +f 1060/1189/569 1149/1281/569 1063/1192/569 +f 1063/1192/47 1149/1281/47 39/39/47 +f 1671/1820/46 31/31/46 1767/1920/46 +f 1671/1820/46 1767/1920/46 1681/1831/46 +f 1681/1831/46 1767/1920/46 46/46/46 +f 970/1095/45 23/23/45 1062/1191/45 +f 970/1095/45 1062/1191/45 976/1101/45 +f 976/1101/45 1062/1191/45 38/38/45 +f 1680/1830/44 45/45/44 1507/1651/44 +f 1680/1830/44 1507/1651/44 1679/1829/44 +f 1679/1829/44 1507/1651/44 44/44/44 +f 805/925/43 51/51/43 804/923/43 +f 805/925/43 804/923/43 705/810/43 +f 705/810/43 804/923/43 36/36/43 +f 975/1100/42 37/37/42 897/1020/42 +f 975/1100/42 897/1020/42 988/1115/42 +f 988/1115/42 897/1020/42 82/111/42 +f 1503/1647/41 29/29/41 1586/1732/41 +f 1503/1647/41 1586/1732/41 1506/1650/41 +f 1506/1650/41 1586/1732/41 44/44/41 +f 700/805/40 36/36/40 804/923/40 +f 700/805/40 804/923/40 704/809/40 +f 704/809/40 804/923/40 51/51/40 +f 1416/1556/39 28/28/39 1505/1649/39 +f 1416/1556/39 1505/1649/39 1421/1562/39 +f 1421/1562/39 1505/1649/39 43/43/39 +f 598/691/515 35/35/515 703/808/515 +f 598/691/38 703/808/38 601/694/38 +f 601/694/38 703/808/38 50/50/38 +f 1330/1468/37 27/27/37 1420/1561/37 +f 1330/1468/37 1420/1561/37 1335/1473/37 +f 1335/1473/37 1420/1561/37 42/42/37 +f 600/693/36 49/49/36 1850/2004/36 +f 600/693/36 1850/2004/36 599/692/36 +f 599/692/36 1850/2004/36 48/48/36 +f 1234/1369/35 26/26/35 1334/1472/35 +f 1234/1369/35 1334/1472/35 1243/1378/35 +f 1243/1378/35 1334/1472/35 41/41/35 +f 502/582/34 48/48/34 1769/1922/34 +f 502/582/34 1769/1922/34 501/581/34 +f 501/581/34 1769/1922/34 47/47/34 +f 1146/1278/33 25/25/33 1242/1377/33 +f 1146/1278/33 1242/1377/33 1150/1282/33 +f 1150/1282/33 1242/1377/33 40/40/33 +f 1581/1727/32 28/28/32 1416/1556/32 +f 1581/1727/32 1416/1556/32 1580/1726/32 +f 1580/1726/32 1416/1556/32 27/27/32 +f 797/916/31 35/35/31 598/691/31 +f 797/916/31 598/691/31 796/915/31 +f 796/915/31 598/691/31 34/34/31 +f 1412/1552/30 12/12/30 1501/1645/30 +f 1412/1552/30 1501/1645/30 1415/1555/30 +f 1415/1555/30 1501/1645/30 27/27/30 +f 698/803/29 34/34/29 498/577/29 +f 698/803/29 498/577/29 697/802/29 +f 697/802/29 498/577/29 33/33/29 +f 1324/1462/28 11/11/28 1414/1554/28 +f 1324/1462/28 1414/1554/28 1329/1467/28 +f 1329/1467/28 1414/1554/28 26/26/28 +f 491/569/27 18/18/27 596/689/27 +f 491/569/27 596/689/27 497/576/27 +f 497/576/27 596/689/27 33/33/27 +f 1226/1361/26 10/10/26 1328/1466/26 +f 1226/1361/26 1328/1466/26 1233/1368/26 +f 1233/1368/26 1328/1466/26 25/25/26 +f 1841/1995/25 17/17/25 496/575/25 +f 1841/1995/25 496/575/25 1845/1999/25 +f 1845/1999/25 496/575/25 32/32/25 +f 1142/1274/24 9/9/24 1232/1367/24 +f 1142/1274/24 1232/1367/24 1145/1277/24 +f 1145/1277/24 1232/1367/24 24/24/24 +f 1753/1906/23 16/16/23 1844/1998/23 +f 1753/1906/23 1844/1998/23 1760/1913/23 +f 1760/1913/23 1844/1998/23 31/31/23 +f 1056/1185/22 8/8/22 1144/1276/22 +f 1056/1185/514 1144/1276/514 1059/1188/514 +f 1059/1188/22 1144/1276/22 23/23/22 +f 1664/1813/597 15/15/597 1759/1912/597 +f 1664/1813/21 1759/1912/21 1670/1819/21 +f 1670/1819/21 1759/1912/21 30/30/21 +f 705/811/20 36/36/20 885/1007/20 +f 705/811/20 885/1007/20 979/1105/20 +f 979/1105/20 885/1007/20 21/21/20 +f 1058/1187/19 22/22/19 988/1116/19 +f 1058/1187/19 988/1116/19 1078/1208/19 +f 1078/1208/19 988/1116/19 82/112/19 +f 1578/1724/570 14/14/570 1669/1818/570 +f 1578/1724/570 1669/1818/570 1582/1728/570 +f 1582/1728/570 1669/1818/570 29/29/570 +f 793/912/17 21/21/17 885/1007/17 +f 793/912/17 885/1007/17 798/917/17 +f 798/917/17 885/1007/17 36/36/17 +f 1212/1347/16 7/7/16 1078/1209/16 +f 1212/1347/16 1078/1209/16 576/669/16 +f 576/669/16 1078/1209/16 82/113/16 +f 687/792/598 4/4/598 789/908/598 +f 687/792/598 789/908/598 691/796/598 +f 691/796/15 789/908/15 14/14/15 +f 678/781/14 482/559/14 1045/1174/14 +f 678/781/14 1045/1174/14 1044/1173/14 +f 1044/1173/14 1045/1174/14 21/21/14 +f 690/795/13 13/13/13 1498/1642/13 +f 690/795/13 1498/1642/13 689/794/13 +f 689/794/13 1498/1642/13 12/12/13 +f 1825/1979/12 481/558/12 774/892/12 +f 1825/1979/12 774/892/12 773/891/12 +f 773/891/12 774/892/12 20/20/12 +f 1488/1632/11 12/12/11 1412/1552/11 +f 1488/1632/11 1412/1552/11 1568/1714/11 +f 1568/1714/11 1412/1552/11 11/11/11 +f 1912/2067/10 480/557/10 863/984/10 +f 1912/2067/10 863/984/10 862/983/10 +f 862/983/10 863/984/10 19/19/10 +f 590/683/9 11/11/9 1324/1462/9 +f 590/683/9 1324/1462/9 589/682/9 +f 589/682/9 1324/1462/9 10/10/9 +f 951/1075/8 479/556/8 579/672/8 +f 951/1075/8 579/672/8 967/1092/8 +f 967/1092/8 579/672/8 18/18/8 +f 1307/1444/7 10/10/7 1226/1361/7 +f 1307/1444/7 1226/1361/7 1396/1536/7 +f 1396/1536/7 1226/1361/7 9/9/7 +f 950/1074/6 6/6/6 966/1091/6 +f 950/1074/6 966/1091/6 675/778/6 +f 675/778/6 966/1091/6 17/17/6 +f 488/566/5 9/9/5 1142/1274/5 +f 488/566/5 1142/1274/5 487/565/5 +f 487/565/5 1142/1274/5 8/8/5 +f 1042/1171/4 478/555/4 1822/1976/4 +f 1042/1171/4 1822/1976/4 880/1001/4 +f 880/1001/4 1822/1976/4 16/16/4 +f 1130/1262/3 8/8/3 1056/1185/3 +f 1130/1262/3 1056/1185/3 1213/1348/3 +f 1213/1348/3 1056/1185/3 7/7/3 +f 786/905/572 5/5/572 879/1000/572 +f 786/905/2 879/1000/2 790/909/2 +f 790/909/2 879/1000/2 15/15/2 +f 979/1106/1 21/21/1 1045/1174/1 +f 979/1106/1 1045/1174/1 775/894/1 +f 775/894/1 1045/1174/1 482/559/1 diff --git a/tectech/src/main/resources/assets/tectech/models/Star.obj b/tectech/src/main/resources/assets/tectech/models/Star.obj new file mode 100644 index 0000000000..a3469e9f05 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/models/Star.obj @@ -0,0 +1,2537 @@ +# Blender 3.4.1 +# www.blender.org +mtllib untitled.mtl +o Sphere +v 0.000000 61.528751 -41.112198 +v 0.000000 41.112198 -61.528751 +v 0.000000 14.436684 -72.578110 +v 0.000000 0.000000 -74.000000 +v 0.000000 -14.436684 -72.578110 +v 0.000000 -41.112198 -61.528751 +v 2.816457 72.578110 -14.159286 +v 5.524680 68.367081 -27.774443 +v 8.020593 61.528751 -40.322239 +v 10.208277 52.325901 -51.320473 +v 12.003664 41.112198 -60.346489 +v 13.337756 28.318575 -67.053429 +v 14.159286 14.436684 -71.183540 +v 14.436684 0.000000 -72.578110 +v 14.159286 -14.436684 -71.183540 +v 13.337756 -28.318575 -67.053429 +v 12.003664 -41.112198 -60.346489 +v 10.208277 -52.325901 -51.320473 +v 8.020593 -61.528751 -40.322239 +v 5.524680 -68.367081 -27.774443 +v 2.816457 -72.578110 -14.159286 +v 5.524679 72.578110 -13.337756 +v 10.837049 68.367081 -26.162952 +v 15.732958 61.528751 -37.982712 +v 20.024256 52.325901 -48.342827 +v 23.546032 41.112198 -56.845146 +v 26.162949 28.318575 -63.162949 +v 27.774441 14.436684 -67.053429 +v 28.318573 0.000000 -68.367081 +v 27.774441 -14.436684 -67.053429 +v 26.162949 -28.318575 -63.162949 +v 23.546032 -41.112198 -56.845146 +v 20.024256 -52.325901 -48.342827 +v 15.732958 -61.528751 -37.982712 +v 10.837049 -68.367081 -26.162952 +v 5.524679 -72.578110 -13.337756 +v 8.020591 72.578110 -12.003662 +v 15.732958 68.367081 -23.546034 +v 22.840712 61.528751 -34.183537 +v 29.070713 52.325901 -43.507397 +v 34.183537 41.112198 -51.159275 +v 37.982712 28.318575 -56.845150 +v 40.322239 14.436684 -60.346489 +v 41.112198 0.000000 -61.528740 +v 40.322239 -14.436684 -60.346489 +v 37.982712 -28.318575 -56.845150 +v 34.183537 -41.112198 -51.159275 +v 29.070713 -52.325901 -43.507397 +v 22.840712 -61.528751 -34.183537 +v 15.732958 -68.367081 -23.546034 +v 8.020591 -72.578110 -12.003662 +v 10.208276 72.578110 -10.208275 +v 20.024256 68.367081 -20.024254 +v 29.070711 61.528751 -29.070707 +v 37.000000 52.325901 -37.000000 +v 43.507389 41.112198 -43.507385 +v 48.342823 28.318575 -48.342827 +v 51.320473 14.436684 -51.320469 +v 52.325901 0.000000 -52.325890 +v 51.320473 -14.436684 -51.320469 +v 48.342823 -28.318575 -48.342827 +v 43.507389 -41.112198 -43.507385 +v 37.000000 -52.325901 -37.000000 +v 29.070711 -61.528751 -29.070707 +v 20.024256 -68.367081 -20.024254 +v 10.208276 -72.578110 -10.208275 +v 12.003662 72.578110 -8.020590 +v 23.546034 68.367081 -15.732955 +v 34.183540 61.528751 -22.840708 +v 43.507397 52.325901 -29.070713 +v 51.159283 41.112198 -34.183533 +v 56.845146 28.318575 -37.982719 +v 60.346489 14.436684 -40.322231 +v 61.528748 0.000000 -41.112179 +v 60.346489 -14.436684 -40.322231 +v 56.845146 -28.318575 -37.982719 +v 51.159283 -41.112198 -34.183533 +v 43.507397 -52.325901 -29.070713 +v 34.183540 -61.528751 -22.840708 +v 23.546034 -68.367081 -15.732955 +v 12.003662 -72.578110 -8.020590 +v 0.000000 74.000000 0.000000 +v 13.337753 72.578110 -5.524678 +v 26.162949 68.367081 -10.837048 +v 37.982712 61.528751 -15.732952 +v 48.342827 52.325901 -20.024256 +v 56.845146 41.112198 -23.546022 +v 63.162945 28.318575 -26.162952 +v 67.053421 14.436684 -27.774431 +v 68.367073 0.000000 -28.318558 +v 67.053421 -14.436684 -27.774431 +v 63.162945 -28.318575 -26.162952 +v 56.845146 -41.112198 -23.546022 +v 48.342827 -52.325901 -20.024256 +v 37.982712 -61.528751 -15.732952 +v 26.162949 -68.367081 -10.837048 +v 13.337753 -72.578110 -5.524678 +v 14.159284 72.578110 -2.816456 +v 27.774437 68.367081 -5.524678 +v 40.322235 61.528751 -8.020587 +v 51.320473 52.325901 -10.208279 +v 60.346481 41.112198 -12.003656 +v 67.053421 28.318575 -13.337759 +v 71.183533 14.436684 -14.159279 +v 72.578094 0.000000 -14.436669 +v 71.183533 -14.436684 -14.159279 +v 67.053421 -28.318575 -13.337759 +v 60.346481 -41.112198 -12.003656 +v 51.320473 -52.325901 -10.208279 +v 40.322235 -61.528751 -8.020587 +v 27.774437 -68.367081 -5.524678 +v 14.159284 -72.578110 -2.816456 +v 14.436680 72.578110 0.000001 +v 28.318571 68.367081 0.000002 +v 41.112190 61.528751 0.000004 +v 52.325897 52.325901 -0.000001 +v 61.528736 41.112198 0.000007 +v 68.367081 28.318575 -0.000003 +v 72.578102 14.436684 0.000007 +v 73.999977 0.000000 0.000012 +v 72.578102 -14.436684 0.000007 +v 68.367081 -28.318575 -0.000003 +v 61.528736 -41.112198 0.000007 +v 52.325897 -52.325901 -0.000001 +v 41.112190 -61.528751 0.000004 +v 28.318571 -68.367081 0.000002 +v 14.436680 -72.578110 0.000001 +v 14.159283 72.578110 2.816457 +v 27.774437 68.367081 5.524681 +v 40.322231 61.528751 8.020594 +v 51.320469 52.325901 10.208275 +v 60.346478 41.112198 12.003668 +v 67.053421 28.318575 13.337752 +v 71.183525 14.436684 14.159291 +v 72.578079 0.000000 14.436691 +v 71.183525 -14.436684 14.159291 +v 67.053421 -28.318575 13.337752 +v 60.346478 -41.112198 12.003668 +v 51.320469 -52.325901 10.208275 +v 40.322231 -61.528751 8.020594 +v 27.774437 -68.367081 5.524681 +v 14.159283 -72.578110 2.816457 +v 13.337751 72.578110 5.524679 +v 26.162949 68.367081 10.837049 +v 37.982704 61.528751 15.732958 +v 48.342823 52.325901 20.024252 +v 56.845135 41.112198 23.546034 +v 63.162945 28.318575 26.162945 +v 67.053413 14.436684 27.774443 +v 68.367050 0.000000 28.318575 +v 67.053413 -14.436684 27.774443 +v 63.162945 -28.318575 26.162945 +v 56.845135 -41.112198 23.546034 +v 48.342823 -52.325901 20.024252 +v 37.982704 -61.528751 15.732958 +v 26.162949 -68.367081 10.837049 +v 13.337751 -72.578110 5.524679 +v 12.003658 72.578110 8.020589 +v 23.546030 68.367081 15.732956 +v 34.183529 61.528751 22.840710 +v 43.507389 52.325901 29.070709 +v 51.159267 41.112198 34.183537 +v 56.845146 28.318575 37.982708 +v 60.346478 14.436684 40.322235 +v 61.528713 0.000000 41.112194 +v 60.346478 -14.436684 40.322235 +v 56.845146 -28.318575 37.982708 +v 51.159267 -41.112198 34.183537 +v 43.507389 -52.325901 29.070709 +v 34.183529 -61.528751 22.840710 +v 23.546030 -68.367081 15.732956 +v 12.003658 -72.578110 8.020589 +v 10.208272 72.578110 10.208273 +v 20.024250 68.367081 20.024254 +v 29.070698 61.528751 29.070709 +v 36.999996 52.325901 36.999996 +v 43.507378 41.112198 43.507385 +v 48.342823 28.318575 48.342819 +v 51.320457 14.436684 51.320469 +v 52.325863 0.000000 52.325893 +v 51.320457 -14.436684 51.320469 +v 48.342823 -28.318575 48.342819 +v 43.507378 -41.112198 43.507385 +v 36.999996 -52.325901 36.999996 +v 29.070698 -61.528751 29.070709 +v 20.024250 -68.367081 20.024254 +v 10.208272 -72.578110 10.208273 +v 8.020587 72.578110 12.003658 +v 15.732951 68.367081 23.546032 +v 22.840698 61.528751 34.183537 +v 29.070709 52.325901 43.507389 +v 34.183525 41.112198 51.159271 +v 37.982712 28.318575 56.845139 +v 40.322220 14.436684 60.346481 +v 41.112160 0.000000 61.528732 +v 40.322220 -14.436684 60.346481 +v 37.982712 -28.318575 56.845139 +v 34.183525 -41.112198 51.159271 +v 29.070709 -52.325901 43.507389 +v 22.840698 -61.528751 34.183537 +v 15.732951 -68.367081 23.546032 +v 8.020587 -72.578110 12.003658 +v 5.524676 72.578110 13.337749 +v 10.837043 68.367081 26.162947 +v 15.732944 61.528751 37.982704 +v 20.024252 52.325901 48.342823 +v 23.546019 41.112198 56.845135 +v 26.162949 28.318575 63.162933 +v 27.774422 14.436684 67.053413 +v 28.318539 0.000000 68.367058 +v 27.774422 -14.436684 67.053413 +v 26.162949 -28.318575 63.162933 +v 23.546019 -41.112198 56.845135 +v 20.024252 -52.325901 48.342823 +v 15.732944 -61.528751 37.982704 +v 10.837043 -68.367081 26.162947 +v 5.524676 -72.578110 13.337749 +v 2.816455 72.578110 14.159278 +v 5.524674 68.367081 27.774433 +v 8.020581 61.528751 40.322220 +v 10.208275 52.325901 51.320469 +v 12.003653 41.112198 60.346474 +v 13.337756 28.318575 67.053413 +v 14.159272 14.436684 71.183517 +v 14.436653 0.000000 72.578072 +v 14.159272 -14.436684 71.183517 +v 13.337756 -28.318575 67.053413 +v 12.003653 -41.112198 60.346474 +v 10.208275 -52.325901 51.320469 +v 8.020581 -61.528751 40.322220 +v 5.524674 -68.367081 27.774433 +v 2.816455 -72.578110 14.159278 +v -0.000001 72.578110 14.436674 +v -0.000004 68.367081 28.318567 +v -0.000007 61.528751 41.112175 +v -0.000001 52.325901 52.325893 +v -0.000008 41.112198 61.528728 +v 0.000002 28.318575 68.367065 +v -0.000010 14.436684 72.578087 +v -0.000024 0.000000 73.999954 +v -0.000010 -14.436684 72.578087 +v 0.000002 -28.318575 68.367065 +v -0.000008 -41.112198 61.528728 +v -0.000001 -52.325901 52.325893 +v -0.000007 -61.528751 41.112175 +v -0.000004 -68.367081 28.318567 +v -0.000001 -72.578110 14.436674 +v -2.816456 72.578110 14.159277 +v -5.524682 68.367081 27.774433 +v -8.020595 61.528751 40.322216 +v -10.208276 52.325901 51.320461 +v -12.003667 41.112198 60.346466 +v -13.337750 28.318575 67.053406 +v -14.159292 14.436684 71.183517 +v -14.436698 0.000000 72.578056 +v -14.159292 -14.436684 71.183517 +v -13.337750 -28.318575 67.053406 +v -12.003667 -41.112198 60.346466 +v -10.208276 -52.325901 51.320461 +v -8.020595 -61.528751 40.322216 +v -5.524682 -68.367081 27.774433 +v -2.816456 -72.578110 14.159277 +v -5.524676 72.578110 13.337748 +v -10.837049 68.367081 26.162945 +v -15.732955 61.528751 37.982693 +v -20.024252 52.325901 48.342819 +v -23.546032 41.112198 56.845127 +v -26.162939 28.318575 63.162930 +v -27.774441 14.436684 67.053398 +v -28.318579 0.000000 68.367027 +v -27.774441 -14.436684 67.053398 +v -26.162939 -28.318575 63.162930 +v -23.546032 -41.112198 56.845127 +v -20.024252 -52.325901 48.342819 +v -15.732955 -61.528751 37.982693 +v -10.837049 -68.367081 26.162945 +v -5.524676 -72.578110 13.337748 +v -8.020586 72.578110 12.003654 +v -15.732955 68.367081 23.546026 +v -22.840706 61.528751 34.183514 +v -29.070709 52.325901 43.507385 +v -34.183533 41.112198 51.159260 +v -37.982700 28.318575 56.845135 +v -40.322235 14.436684 60.346462 +v -41.112190 0.000000 61.528687 +v -40.322235 -14.436684 60.346462 +v -37.982700 -28.318575 56.845135 +v -34.183533 -41.112198 51.159260 +v -29.070709 -52.325901 43.507385 +v -22.840706 -61.528751 34.183514 +v -15.732955 -68.367081 23.546026 +v -8.020586 -72.578110 12.003654 +v -10.208269 72.578110 10.208268 +v -20.024252 68.367081 20.024246 +v -29.070700 61.528751 29.070686 +v -36.999992 52.325901 36.999992 +v -43.507381 41.112198 43.507370 +v -48.342812 28.318575 48.342815 +v -51.320461 14.436684 51.320446 +v -52.325878 0.000000 52.325840 +v -51.320461 -14.436684 51.320446 +v -48.342812 -28.318575 48.342815 +v -43.507381 -41.112198 43.507370 +v -36.999992 -52.325901 36.999992 +v -29.070700 -61.528751 29.070686 +v -20.024252 -68.367081 20.024246 +v -10.208269 -72.578110 10.208268 +v 0.000000 -74.000000 0.000000 +v -12.003654 72.578110 8.020584 +v -23.546028 68.367081 15.732948 +v -34.183525 61.528751 22.840689 +v -43.507385 52.325901 29.070705 +v -51.159267 41.112198 34.183517 +v -56.845131 28.318575 37.982704 +v -60.346478 14.436684 40.322208 +v -61.528713 0.000000 41.112137 +v -60.346478 -14.436684 40.322208 +v -56.845131 -28.318575 37.982704 +v -51.159267 -41.112198 34.183517 +v -43.507385 -52.325901 29.070705 +v -34.183525 -61.528751 22.840689 +v -23.546028 -68.367081 15.732948 +v -12.003654 -72.578110 8.020584 +v -13.337746 72.578110 5.524674 +v -26.162941 68.367081 10.837042 +v -37.982693 61.528751 15.732935 +v -48.342819 52.325901 20.024250 +v -56.845127 41.112198 23.546009 +v -63.162926 28.318575 26.162941 +v -67.053406 14.436684 27.774412 +v -68.367035 0.000000 28.318518 +v -67.053406 -14.436684 27.774412 +v -63.162926 -28.318575 26.162941 +v -56.845127 -41.112198 23.546009 +v -48.342819 -52.325901 20.024250 +v -37.982693 -61.528751 15.732935 +v -26.162941 -68.367081 10.837042 +v -13.337746 -72.578110 5.524674 +v -14.159275 72.578110 2.816453 +v -27.774429 68.367081 5.524674 +v -40.322208 61.528751 8.020576 +v -51.320461 52.325901 10.208273 +v -60.346462 41.112198 12.003646 +v -67.053406 28.318575 13.337751 +v -71.183517 14.436684 14.159263 +v -72.578049 0.000000 14.436638 +v -71.183517 -14.436684 14.159263 +v -67.053406 -28.318575 13.337751 +v -60.346462 -41.112198 12.003646 +v -51.320461 -52.325901 10.208273 +v -40.322208 -61.528751 8.020576 +v -27.774429 -68.367081 5.524674 +v -14.159275 -72.578110 2.816453 +v -14.436670 72.578110 -0.000001 +v -28.318560 68.367081 -0.000004 +v -41.112164 61.528751 -0.000011 +v -52.325890 52.325901 -0.000002 +v -61.528721 41.112198 -0.000012 +v -68.367058 28.318575 -0.000001 +v -72.578079 14.436684 -0.000020 +v -73.999931 0.000000 -0.000033 +v -72.578079 -14.436684 -0.000020 +v -68.367058 -28.318575 -0.000001 +v -61.528721 -41.112198 -0.000012 +v -52.325890 -52.325901 -0.000002 +v -41.112164 -61.528751 -0.000011 +v -28.318560 -68.367081 -0.000004 +v -14.436670 -72.578110 -0.000001 +v -14.159273 72.578110 -2.816456 +v -27.774427 68.367081 -5.524681 +v -40.322205 61.528751 -8.020597 +v -51.320457 52.325901 -10.208277 +v -60.346455 41.112198 -12.003671 +v -67.053398 28.318575 -13.337752 +v -71.183502 14.436684 -14.159300 +v -72.578033 0.000000 -14.436703 +v -71.183502 -14.436684 -14.159300 +v -67.053398 -28.318575 -13.337752 +v -60.346455 -41.112198 -12.003671 +v -51.320457 -52.325901 -10.208277 +v -40.322205 -61.528751 -8.020597 +v -27.774427 -68.367081 -5.524681 +v -14.159273 -72.578110 -2.816456 +v -13.337744 72.578110 -5.524676 +v -26.162937 68.367081 -10.837048 +v -37.982677 61.528751 -15.732954 +v -48.342815 52.325901 -20.024252 +v -56.845112 41.112198 -23.546032 +v -63.162922 28.318575 -26.162939 +v -67.053391 14.436684 -27.774445 +v -68.367004 0.000000 -28.318579 +v -67.053391 -14.436684 -27.774445 +v -63.162922 -28.318575 -26.162939 +v -56.845112 -41.112198 -23.546032 +v -48.342815 -52.325901 -20.024252 +v -37.982677 -61.528751 -15.732954 +v -26.162937 -68.367081 -10.837048 +v -13.337744 -72.578110 -5.524676 +v -12.003652 72.578110 -8.020586 +v -23.546019 68.367081 -15.732952 +v -34.183502 61.528751 -22.840704 +v -43.507381 52.325901 -29.070707 +v -51.159245 41.112198 -34.183533 +v -56.845127 28.318575 -37.982700 +v -60.346451 14.436684 -40.322235 +v -61.528667 0.000000 -41.112186 +v -60.346451 -14.436684 -40.322235 +v -56.845127 -28.318575 -37.982700 +v -51.159245 -41.112198 -34.183533 +v -43.507381 -52.325901 -29.070707 +v -34.183502 -61.528751 -22.840704 +v -23.546019 -68.367081 -15.732952 +v -12.003652 -72.578110 -8.020586 +v -10.208266 72.578110 -10.208268 +v -20.024242 68.367081 -20.024246 +v -29.070673 61.528751 -29.070696 +v -36.999989 52.325901 -36.999992 +v -43.507355 41.112198 -43.507378 +v -48.342804 28.318575 -48.342804 +v -51.320431 14.436684 -51.320457 +v -52.325821 0.000000 -52.325871 +v -51.320431 -14.436684 -51.320457 +v -48.342804 -28.318575 -48.342804 +v -43.507355 -41.112198 -43.507378 +v -36.999989 -52.325901 -36.999992 +v -29.070673 -61.528751 -29.070696 +v -20.024242 -68.367081 -20.024246 +v -10.208266 -72.578110 -10.208268 +v -8.020582 72.578110 -12.003653 +v -15.732945 68.367081 -23.546022 +v -22.840677 61.528751 -34.183517 +v -29.070700 52.325901 -43.507385 +v -34.183506 41.112198 -51.159260 +v -37.982697 28.318575 -56.845127 +v -40.322197 14.436684 -60.346466 +v -41.112122 0.000000 -61.528702 +v -40.322197 -14.436684 -60.346466 +v -37.982697 -28.318575 -56.845127 +v -34.183506 -41.112198 -51.159260 +v -29.070700 -52.325901 -43.507385 +v -22.840677 -61.528751 -34.183517 +v -15.732945 -68.367081 -23.546022 +v -8.020582 -72.578110 -12.003653 +v -5.524673 72.578110 -13.337743 +v -10.837040 68.367081 -26.162939 +v -15.732925 61.528751 -37.982681 +v -20.024244 52.325901 -48.342819 +v -23.546001 41.112198 -56.845119 +v -26.162935 28.318575 -63.162922 +v -27.774405 14.436684 -67.053398 +v -28.318510 0.000000 -68.367020 +v -27.774405 -14.436684 -67.053398 +v -26.162935 -28.318575 -63.162922 +v -23.546001 -41.112198 -56.845119 +v -20.024244 -52.325901 -48.342819 +v -15.732925 -61.528751 -37.982681 +v -10.837040 -68.367081 -26.162939 +v -5.524673 -72.578110 -13.337743 +v -2.816453 72.578110 -14.159271 +v -5.524672 68.367081 -27.774427 +v -8.020567 61.528751 -40.322193 +v -10.208268 52.325901 -51.320461 +v -12.003638 41.112198 -60.346451 +v -13.337746 28.318575 -67.053398 +v -14.159258 14.436684 -71.183502 +v -14.436632 0.000000 -72.578026 +v -14.159258 -14.436684 -71.183502 +v -13.337746 -28.318575 -67.053398 +v -12.003638 -41.112198 -60.346451 +v -10.208268 -52.325901 -51.320461 +v -8.020567 -61.528751 -40.322193 +v -5.524672 -68.367081 -27.774427 +v -2.816453 -72.578110 -14.159271 +v 0.000001 72.578110 -14.436667 +v 0.000005 68.367081 -28.318558 +v 0.000007 52.325901 -52.325890 +v 0.000004 28.318575 -68.367050 +v 0.000004 -28.318575 -68.367050 +v 0.000007 -52.325901 -52.325890 +v 0.000016 -61.528751 -41.112144 +v 0.000005 -68.367081 -28.318558 +v 0.000001 -72.578110 -14.436667 +vn 0.0097 -0.9951 -0.0980 +vn 0.0975 -0.0976 -0.9904 +vn 0.0286 0.9565 -0.2902 +vn 0.0938 -0.2890 -0.9527 +vn 0.0464 0.8810 -0.4709 +vn 0.0865 -0.4696 -0.8786 +vn 0.0624 0.7715 -0.6332 +vn 0.0759 -0.6326 -0.7708 +vn 0.0759 0.6326 -0.7708 +vn 0.0624 -0.7715 -0.6332 +vn 0.0865 0.4696 -0.8786 +vn 0.0464 -0.8810 -0.4709 +vn 0.0938 0.2890 -0.9527 +vn 0.0286 -0.9565 -0.2902 +vn 0.0975 0.0975 -0.9904 +vn 0.0097 0.9951 -0.0980 +vn 0.0846 -0.9565 -0.2790 +vn 0.2889 0.0976 -0.9524 +vn 0.0286 0.9951 -0.0942 +vn 0.0286 -0.9951 -0.0942 +vn 0.2889 -0.0976 -0.9524 +vn 0.0846 0.9565 -0.2790 +vn 0.2779 -0.2890 -0.9161 +vn 0.1374 0.8810 -0.4528 +vn 0.2563 -0.4696 -0.8448 +vn 0.1847 0.7715 -0.6088 +vn 0.2248 -0.6326 -0.7412 +vn 0.2248 0.6326 -0.7412 +vn 0.1847 -0.7715 -0.6088 +vn 0.2563 0.4696 -0.8448 +vn 0.1374 -0.8810 -0.4528 +vn 0.2779 0.2890 -0.9161 +vn 0.2999 0.7715 -0.5611 +vn 0.3651 -0.6326 -0.6831 +vn 0.3651 0.6326 -0.6831 +vn 0.2999 -0.7715 -0.5611 +vn 0.4162 0.4696 -0.7786 +vn 0.2230 -0.8810 -0.4173 +vn 0.4513 0.2890 -0.8443 +vn 0.1374 -0.9565 -0.2571 +vn 0.4691 0.0975 -0.8777 +vn 0.0464 0.9951 -0.0869 +vn 0.0464 -0.9951 -0.0869 +vn 0.4691 -0.0975 -0.8777 +vn 0.1374 0.9565 -0.2571 +vn 0.4513 -0.2890 -0.8443 +vn 0.2231 0.8810 -0.4173 +vn 0.4162 -0.4696 -0.7786 +vn 0.6314 0.0975 -0.7693 +vn 0.0625 0.9951 -0.0761 +vn 0.0625 -0.9951 -0.0761 +vn 0.6314 -0.0975 -0.7693 +vn 0.1850 0.9565 -0.2254 +vn 0.6073 -0.2890 -0.7400 +vn 0.3002 0.8810 -0.3658 +vn 0.5601 -0.4696 -0.6825 +vn 0.4036 0.7715 -0.4918 +vn 0.4913 -0.6326 -0.5987 +vn 0.4913 0.6326 -0.5987 +vn 0.4036 -0.7715 -0.4918 +vn 0.5601 0.4696 -0.6825 +vn 0.3002 -0.8810 -0.3658 +vn 0.6073 0.2890 -0.7400 +vn 0.1850 -0.9565 -0.2254 +vn 0.5987 -0.6326 -0.4913 +vn 0.5987 0.6326 -0.4913 +vn 0.4918 -0.7715 -0.4036 +vn 0.6825 0.4696 -0.5601 +vn 0.3658 -0.8810 -0.3002 +vn 0.7400 0.2890 -0.6073 +vn 0.2254 -0.9566 -0.1850 +vn 0.7693 0.0975 -0.6314 +vn 0.0761 0.9951 -0.0625 +vn 0.0761 -0.9951 -0.0625 +vn 0.7693 -0.0975 -0.6314 +vn 0.2254 0.9565 -0.1850 +vn 0.7400 -0.2890 -0.6073 +vn 0.3658 0.8810 -0.3002 +vn 0.6825 -0.4696 -0.5601 +vn 0.4918 0.7715 -0.4036 +vn 0.0869 -0.9951 -0.0464 +vn 0.8777 -0.0975 -0.4691 +vn 0.2571 0.9565 -0.1374 +vn 0.8443 -0.2890 -0.4513 +vn 0.4173 0.8810 -0.2230 +vn 0.7786 -0.4696 -0.4162 +vn 0.5611 0.7715 -0.2999 +vn 0.6831 -0.6326 -0.3651 +vn 0.6831 0.6326 -0.3651 +vn 0.5611 -0.7715 -0.2999 +vn 0.7786 0.4696 -0.4162 +vn 0.4173 -0.8810 -0.2230 +vn 0.8443 0.2890 -0.4513 +vn 0.2571 -0.9565 -0.1374 +vn 0.8777 0.0975 -0.4691 +vn 0.0869 0.9951 -0.0464 +vn 0.6088 -0.7715 -0.1847 +vn 0.8448 0.4696 -0.2563 +vn 0.4528 -0.8810 -0.1374 +vn 0.9161 0.2890 -0.2779 +vn 0.2790 -0.9565 -0.0846 +vn 0.9524 0.0975 -0.2889 +vn 0.0942 0.9951 -0.0286 +vn 0.0942 -0.9951 -0.0286 +vn 0.9524 -0.0975 -0.2889 +vn 0.2790 0.9565 -0.0846 +vn 0.9161 -0.2890 -0.2779 +vn 0.4528 0.8810 -0.1374 +vn 0.8448 -0.4696 -0.2563 +vn 0.6088 0.7715 -0.1847 +vn 0.7412 -0.6326 -0.2248 +vn 0.7412 0.6326 -0.2248 +vn 0.2902 0.9565 -0.0286 +vn 0.9527 -0.2890 -0.0938 +vn 0.4709 0.8810 -0.0464 +vn 0.8786 -0.4696 -0.0865 +vn 0.6332 0.7715 -0.0624 +vn 0.7708 -0.6326 -0.0759 +vn 0.7708 0.6326 -0.0759 +vn 0.6332 -0.7715 -0.0624 +vn 0.8786 0.4696 -0.0865 +vn 0.4709 -0.8810 -0.0464 +vn 0.9527 0.2890 -0.0938 +vn 0.2902 -0.9565 -0.0286 +vn 0.9904 0.0975 -0.0975 +vn 0.0980 0.9951 -0.0097 +vn 0.0980 -0.9951 -0.0097 +vn 0.9904 -0.0975 -0.0975 +vn 0.8786 0.4696 0.0865 +vn 0.4709 -0.8810 0.0464 +vn 0.9527 0.2890 0.0938 +vn 0.2902 -0.9565 0.0286 +vn 0.9904 0.0975 0.0976 +vn 0.0980 0.9951 0.0097 +vn 0.0980 -0.9951 0.0097 +vn 0.9904 -0.0975 0.0976 +vn 0.2902 0.9565 0.0286 +vn 0.9527 -0.2890 0.0938 +vn 0.4709 0.8810 0.0464 +vn 0.8786 -0.4696 0.0865 +vn 0.6332 0.7715 0.0624 +vn 0.7708 -0.6326 0.0759 +vn 0.7708 0.6326 0.0759 +vn 0.6332 -0.7715 0.0624 +vn 0.9161 -0.2890 0.2779 +vn 0.4528 0.8810 0.1374 +vn 0.8448 -0.4696 0.2563 +vn 0.6088 0.7715 0.1847 +vn 0.7412 -0.6326 0.2248 +vn 0.7412 0.6326 0.2248 +vn 0.6088 -0.7715 0.1847 +vn 0.8448 0.4696 0.2563 +vn 0.4528 -0.8810 0.1374 +vn 0.9161 0.2890 0.2779 +vn 0.2790 -0.9565 0.0846 +vn 0.9524 0.0975 0.2889 +vn 0.0942 0.9951 0.0286 +vn 0.0942 -0.9951 0.0286 +vn 0.9524 -0.0975 0.2889 +vn 0.2790 0.9565 0.0846 +vn 0.4173 -0.8810 0.2230 +vn 0.8443 0.2890 0.4513 +vn 0.2571 -0.9565 0.1374 +vn 0.8777 0.0975 0.4691 +vn 0.0869 0.9951 0.0464 +vn 0.0869 -0.9951 0.0464 +vn 0.8777 -0.0975 0.4691 +vn 0.2571 0.9565 0.1374 +vn 0.8443 -0.2890 0.4513 +vn 0.4173 0.8810 0.2231 +vn 0.7786 -0.4696 0.4162 +vn 0.5611 0.7715 0.2999 +vn 0.6831 -0.6326 0.3651 +vn 0.6831 0.6326 0.3651 +vn 0.5611 -0.7715 0.2999 +vn 0.7786 0.4696 0.4162 +vn 0.3658 0.8810 0.3002 +vn 0.6825 -0.4696 0.5601 +vn 0.4918 0.7715 0.4036 +vn 0.5987 -0.6326 0.4913 +vn 0.5987 0.6326 0.4913 +vn 0.4918 -0.7715 0.4036 +vn 0.6825 0.4696 0.5601 +vn 0.3658 -0.8810 0.3002 +vn 0.7400 0.2890 0.6073 +vn 0.2254 -0.9565 0.1850 +vn 0.7693 0.0975 0.6314 +vn 0.0761 0.9951 0.0625 +vn 0.0761 -0.9951 0.0625 +vn 0.7693 -0.0975 0.6314 +vn 0.2254 0.9565 0.1850 +vn 0.7400 -0.2890 0.6073 +vn 0.6073 0.2890 0.7400 +vn 0.1850 -0.9565 0.2254 +vn 0.6314 0.0975 0.7693 +vn 0.0625 0.9951 0.0761 +vn 0.0625 -0.9951 0.0761 +vn 0.6314 -0.0975 0.7693 +vn 0.1850 0.9565 0.2254 +vn 0.6073 -0.2890 0.7400 +vn 0.3002 0.8810 0.3658 +vn 0.5601 -0.4696 0.6825 +vn 0.4036 0.7715 0.4918 +vn 0.4913 -0.6326 0.5987 +vn 0.4913 0.6326 0.5987 +vn 0.4036 -0.7715 0.4918 +vn 0.5601 0.4696 0.6825 +vn 0.3002 -0.8810 0.3658 +vn 0.4162 -0.4696 0.7786 +vn 0.2999 0.7715 0.5611 +vn 0.3651 -0.6326 0.6831 +vn 0.3651 0.6326 0.6831 +vn 0.2999 -0.7715 0.5611 +vn 0.4162 0.4696 0.7786 +vn 0.2230 -0.8810 0.4173 +vn 0.4513 0.2890 0.8443 +vn 0.1374 -0.9565 0.2571 +vn 0.4691 0.0975 0.8777 +vn 0.0464 0.9951 0.0869 +vn 0.0464 -0.9951 0.0869 +vn 0.4691 -0.0975 0.8777 +vn 0.1374 0.9565 0.2571 +vn 0.4513 -0.2890 0.8443 +vn 0.2230 0.8810 0.4173 +vn 0.0846 -0.9565 0.2790 +vn 0.2889 0.0975 0.9524 +vn 0.0286 0.9951 0.0942 +vn 0.0286 -0.9951 0.0942 +vn 0.2889 -0.0975 0.9524 +vn 0.0846 0.9565 0.2790 +vn 0.2779 -0.2890 0.9161 +vn 0.1374 0.8810 0.4528 +vn 0.2563 -0.4696 0.8448 +vn 0.1847 0.7715 0.6088 +vn 0.2248 -0.6326 0.7412 +vn 0.2248 0.6326 0.7412 +vn 0.1847 -0.7715 0.6088 +vn 0.2563 0.4696 0.8448 +vn 0.1374 -0.8810 0.4528 +vn 0.2779 0.2890 0.9161 +vn 0.0759 -0.6326 0.7708 +vn 0.0759 0.6326 0.7708 +vn 0.0624 -0.7715 0.6332 +vn 0.0865 0.4696 0.8786 +vn 0.0464 -0.8810 0.4709 +vn 0.0938 0.2890 0.9527 +vn 0.0286 -0.9565 0.2902 +vn 0.0975 0.0975 0.9904 +vn 0.0097 0.9951 0.0980 +vn 0.0097 -0.9951 0.0980 +vn 0.0975 -0.0975 0.9904 +vn 0.0286 0.9565 0.2902 +vn 0.0938 -0.2890 0.9527 +vn 0.0464 0.8810 0.4709 +vn 0.0865 -0.4696 0.8786 +vn 0.0624 0.7715 0.6332 +vn -0.0097 0.9951 0.0980 +vn -0.0097 -0.9951 0.0980 +vn -0.0975 -0.0975 0.9904 +vn -0.0286 0.9565 0.2902 +vn -0.0938 -0.2890 0.9527 +vn -0.0464 0.8810 0.4709 +vn -0.0865 -0.4696 0.8786 +vn -0.0624 0.7715 0.6332 +vn -0.0759 -0.6326 0.7708 +vn -0.0759 0.6326 0.7708 +vn -0.0624 -0.7715 0.6332 +vn -0.0865 0.4696 0.8786 +vn -0.0464 -0.8810 0.4709 +vn -0.0938 0.2890 0.9527 +vn -0.0286 -0.9565 0.2902 +vn -0.0976 0.0975 0.9904 +vn -0.2248 0.6326 0.7412 +vn -0.1847 -0.7715 0.6088 +vn -0.2563 0.4696 0.8448 +vn -0.1374 -0.8810 0.4528 +vn -0.2779 0.2890 0.9161 +vn -0.0846 -0.9565 0.2790 +vn -0.2889 0.0975 0.9524 +vn -0.0286 0.9951 0.0942 +vn -0.0286 -0.9951 0.0942 +vn -0.2889 -0.0975 0.9524 +vn -0.0846 0.9565 0.2790 +vn -0.2779 -0.2890 0.9161 +vn -0.1374 0.8810 0.4528 +vn -0.2563 -0.4696 0.8448 +vn -0.1847 0.7715 0.6088 +vn -0.2248 -0.6326 0.7412 +vn -0.4691 -0.0975 0.8777 +vn -0.1374 0.9565 0.2571 +vn -0.4513 -0.2890 0.8443 +vn -0.2230 0.8810 0.4173 +vn -0.4162 -0.4696 0.7786 +vn -0.2999 0.7715 0.5611 +vn -0.3651 -0.6326 0.6831 +vn -0.3651 0.6326 0.6831 +vn -0.2999 -0.7715 0.5611 +vn -0.4162 0.4696 0.7786 +vn -0.2230 -0.8810 0.4173 +vn -0.4513 0.2890 0.8443 +vn -0.1374 -0.9565 0.2571 +vn -0.4691 0.0975 0.8777 +vn -0.0464 0.9951 0.0869 +vn -0.0464 -0.9951 0.0869 +vn -0.4036 -0.7715 0.4918 +vn -0.5601 0.4696 0.6825 +vn -0.3002 -0.8810 0.3658 +vn -0.6073 0.2890 0.7400 +vn -0.1850 -0.9565 0.2254 +vn -0.6314 0.0975 0.7693 +vn -0.0625 0.9951 0.0761 +vn -0.0625 -0.9951 0.0761 +vn -0.6314 -0.0975 0.7693 +vn -0.1850 0.9565 0.2254 +vn -0.6073 -0.2890 0.7400 +vn -0.3002 0.8810 0.3658 +vn -0.5601 -0.4696 0.6825 +vn -0.4036 0.7715 0.4918 +vn -0.4913 -0.6326 0.5987 +vn -0.4913 0.6326 0.5987 +vn -0.2254 0.9565 0.1850 +vn -0.7400 -0.2890 0.6073 +vn -0.3658 0.8810 0.3002 +vn -0.6825 -0.4696 0.5601 +vn -0.4918 0.7715 0.4036 +vn -0.5987 -0.6326 0.4913 +vn -0.5987 0.6326 0.4913 +vn -0.4918 -0.7715 0.4036 +vn -0.6825 0.4696 0.5601 +vn -0.3658 -0.8810 0.3002 +vn -0.7400 0.2890 0.6073 +vn -0.2254 -0.9566 0.1850 +vn -0.7693 0.0975 0.6314 +vn -0.0761 0.9951 0.0625 +vn -0.0761 -0.9951 0.0625 +vn -0.7693 -0.0975 0.6314 +vn -0.7786 0.4696 0.4162 +vn -0.4173 -0.8810 0.2231 +vn -0.8443 0.2890 0.4513 +vn -0.2571 -0.9565 0.1374 +vn -0.8777 0.0975 0.4691 +vn -0.0869 0.9951 0.0464 +vn -0.0869 -0.9951 0.0464 +vn -0.8777 -0.0975 0.4691 +vn -0.2571 0.9565 0.1374 +vn -0.8443 -0.2890 0.4513 +vn -0.4173 0.8810 0.2230 +vn -0.7786 -0.4696 0.4162 +vn -0.5611 0.7715 0.2999 +vn -0.6831 -0.6326 0.3651 +vn -0.6831 0.6326 0.3651 +vn -0.5611 -0.7715 0.2999 +vn -0.9161 -0.2890 0.2779 +vn -0.4528 0.8810 0.1374 +vn -0.8448 -0.4696 0.2563 +vn -0.6088 0.7715 0.1847 +vn -0.7412 -0.6326 0.2248 +vn -0.7412 0.6326 0.2248 +vn -0.6088 -0.7715 0.1847 +vn -0.8448 0.4696 0.2563 +vn -0.4528 -0.8810 0.1374 +vn -0.9161 0.2890 0.2779 +vn -0.2790 -0.9565 0.0846 +vn -0.9524 0.0975 0.2889 +vn -0.0942 0.9951 0.0286 +vn -0.0942 -0.9951 0.0286 +vn -0.9524 -0.0975 0.2889 +vn -0.2790 0.9565 0.0846 +vn -0.4709 -0.8810 0.0464 +vn -0.9527 0.2890 0.0938 +vn -0.2902 -0.9565 0.0286 +vn -0.9904 0.0975 0.0975 +vn -0.0980 0.9951 0.0097 +vn -0.0980 -0.9951 0.0097 +vn -0.9904 -0.0975 0.0976 +vn -0.2902 0.9565 0.0286 +vn -0.9527 -0.2890 0.0938 +vn -0.4709 0.8810 0.0464 +vn -0.8786 -0.4696 0.0865 +vn -0.6332 0.7715 0.0624 +vn -0.7708 -0.6326 0.0759 +vn -0.7708 0.6326 0.0759 +vn -0.6332 -0.7715 0.0624 +vn -0.8786 0.4696 0.0865 +vn -0.8786 -0.4696 -0.0865 +vn -0.6332 0.7715 -0.0624 +vn -0.7708 -0.6326 -0.0759 +vn -0.7708 0.6326 -0.0759 +vn -0.6332 -0.7715 -0.0624 +vn -0.8786 0.4696 -0.0865 +vn -0.4709 -0.8810 -0.0464 +vn -0.9527 0.2890 -0.0938 +vn -0.2902 -0.9565 -0.0286 +vn -0.9904 0.0975 -0.0975 +vn -0.0980 0.9951 -0.0097 +vn -0.0980 -0.9951 -0.0097 +vn -0.9904 -0.0975 -0.0976 +vn -0.2902 0.9565 -0.0286 +vn -0.9527 -0.2890 -0.0938 +vn -0.4709 0.8810 -0.0464 +vn -0.2790 -0.9565 -0.0846 +vn -0.9524 0.0975 -0.2889 +vn -0.0942 0.9951 -0.0286 +vn -0.0942 -0.9951 -0.0286 +vn -0.9524 -0.0975 -0.2889 +vn -0.2790 0.9565 -0.0846 +vn -0.9161 -0.2890 -0.2779 +vn -0.4528 0.8810 -0.1374 +vn -0.8448 -0.4696 -0.2563 +vn -0.6088 0.7715 -0.1847 +vn -0.7412 -0.6326 -0.2248 +vn -0.7412 0.6326 -0.2248 +vn -0.6088 -0.7715 -0.1847 +vn -0.8448 0.4696 -0.2563 +vn -0.4528 -0.8810 -0.1374 +vn -0.9161 0.2890 -0.2779 +vn -0.5611 0.7715 -0.2999 +vn -0.6831 -0.6326 -0.3651 +vn -0.6831 0.6326 -0.3651 +vn -0.5611 -0.7715 -0.2999 +vn -0.7786 0.4696 -0.4162 +vn -0.4173 -0.8810 -0.2231 +vn -0.8443 0.2890 -0.4513 +vn -0.2571 -0.9565 -0.1374 +vn -0.8777 0.0975 -0.4691 +vn -0.0869 0.9951 -0.0464 +vn -0.0869 -0.9951 -0.0464 +vn -0.8777 -0.0975 -0.4691 +vn -0.2571 0.9565 -0.1374 +vn -0.8443 -0.2890 -0.4513 +vn -0.4173 0.8810 -0.2231 +vn -0.7786 -0.4696 -0.4162 +vn -0.7693 0.0975 -0.6314 +vn -0.0761 0.9951 -0.0625 +vn -0.0761 -0.9951 -0.0625 +vn -0.7693 -0.0975 -0.6314 +vn -0.2254 0.9565 -0.1850 +vn -0.7400 -0.2890 -0.6073 +vn -0.3658 0.8810 -0.3002 +vn -0.6825 -0.4696 -0.5601 +vn -0.4918 0.7715 -0.4036 +vn -0.5987 -0.6326 -0.4913 +vn -0.5987 0.6326 -0.4913 +vn -0.4918 -0.7715 -0.4036 +vn -0.6825 0.4696 -0.5601 +vn -0.3658 -0.8810 -0.3002 +vn -0.7400 0.2890 -0.6073 +vn -0.2254 -0.9565 -0.1850 +vn -0.4913 -0.6326 -0.5987 +vn -0.4913 0.6326 -0.5987 +vn -0.4036 -0.7715 -0.4918 +vn -0.5601 0.4696 -0.6825 +vn -0.3002 -0.8810 -0.3658 +vn -0.6073 0.2890 -0.7400 +vn -0.1850 -0.9565 -0.2254 +vn -0.6314 0.0975 -0.7693 +vn -0.0625 0.9951 -0.0761 +vn -0.0625 -0.9951 -0.0761 +vn -0.6314 -0.0975 -0.7693 +vn -0.1850 0.9565 -0.2254 +vn -0.6073 -0.2890 -0.7400 +vn -0.3002 0.8810 -0.3658 +vn -0.5601 -0.4696 -0.6825 +vn -0.4036 0.7715 -0.4918 +vn -0.0464 0.9951 -0.0869 +vn -0.0464 -0.9951 -0.0869 +vn -0.4691 -0.0975 -0.8777 +vn -0.1374 0.9565 -0.2571 +vn -0.4513 -0.2890 -0.8443 +vn -0.2230 0.8810 -0.4173 +vn -0.4162 -0.4696 -0.7786 +vn -0.2999 0.7715 -0.5611 +vn -0.3651 -0.6326 -0.6831 +vn -0.3651 0.6326 -0.6831 +vn -0.2999 -0.7715 -0.5611 +vn -0.4162 0.4696 -0.7786 +vn -0.2230 -0.8810 -0.4173 +vn -0.4513 0.2890 -0.8443 +vn -0.1374 -0.9565 -0.2571 +vn -0.4691 0.0975 -0.8777 +vn -0.2248 0.6326 -0.7412 +vn -0.1847 -0.7715 -0.6088 +vn -0.2563 0.4696 -0.8448 +vn -0.1374 -0.8810 -0.4528 +vn -0.2779 0.2890 -0.9161 +vn -0.0846 -0.9565 -0.2790 +vn -0.2889 0.0975 -0.9524 +vn -0.0286 0.9951 -0.0942 +vn -0.0286 -0.9951 -0.0942 +vn -0.2889 -0.0975 -0.9524 +vn -0.0846 0.9565 -0.2790 +vn -0.2779 -0.2890 -0.9161 +vn -0.1374 0.8810 -0.4528 +vn -0.2563 -0.4696 -0.8448 +vn -0.1847 0.7715 -0.6088 +vn -0.2248 -0.6326 -0.7412 +vn -0.0976 -0.0975 -0.9904 +vn -0.0286 0.9565 -0.2902 +vn -0.0938 -0.2890 -0.9527 +vn -0.0464 0.8810 -0.4709 +vn -0.0865 -0.4696 -0.8786 +vn -0.0624 0.7715 -0.6332 +vn -0.0759 -0.6326 -0.7708 +vn -0.0759 0.6326 -0.7708 +vn -0.0624 -0.7715 -0.6332 +vn -0.0865 0.4696 -0.8786 +vn -0.0464 -0.8810 -0.4709 +vn -0.0938 0.2890 -0.9527 +vn -0.0286 -0.9565 -0.2902 +vn -0.0976 0.0975 -0.9904 +vn -0.0097 0.9951 -0.0980 +vn -0.0097 -0.9951 -0.0980 +vn 0.0975 -0.0975 -0.9904 +vn 0.0975 0.0976 -0.9904 +vn 0.2231 -0.8810 -0.4173 +vn 0.2230 0.8810 -0.4173 +vn 0.2254 -0.9565 -0.1850 +vn 0.4173 -0.8810 0.2231 +vn 0.2571 0.9566 0.1374 +vn 0.4173 0.8810 0.2230 +vn 0.2231 -0.8810 0.4173 +vn -0.0976 -0.0975 0.9904 +vn -0.0975 0.0975 0.9904 +vn -0.2231 0.8810 0.4173 +vn -0.2231 -0.8810 0.4173 +vn -0.2254 -0.9565 0.1850 +vn -0.4173 -0.8810 0.2230 +vn -0.9904 0.0975 0.0976 +vn -0.9904 -0.0975 0.0975 +vn -0.9904 0.0975 -0.0976 +vn -0.9904 -0.0975 -0.0975 +vt 0.750000 0.812500 +vt 0.750000 0.687500 +vt 0.750000 0.562500 +vt 0.750000 0.500000 +vt 0.750000 0.437500 +vt 0.750000 0.312500 +vt 0.718750 0.937500 +vt 0.718750 0.875000 +vt 0.718750 0.812500 +vt 0.718750 0.750000 +vt 0.718750 0.687500 +vt 0.718750 0.625000 +vt 0.718750 0.562500 +vt 0.718750 0.500000 +vt 0.718750 0.437500 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.718750 0.250000 +vt 0.718750 0.187500 +vt 0.718750 0.125000 +vt 0.718750 0.062500 +vt 0.687500 0.937500 +vt 0.687500 0.875000 +vt 0.687500 0.812500 +vt 0.687500 0.750000 +vt 0.687500 0.687500 +vt 0.687500 0.625000 +vt 0.687500 0.562500 +vt 0.687500 0.500000 +vt 0.687500 0.437500 +vt 0.687500 0.375000 +vt 0.687500 0.312500 +vt 0.687500 0.250000 +vt 0.687500 0.187500 +vt 0.687500 0.125000 +vt 0.687500 0.062500 +vt 0.656250 0.937500 +vt 0.656250 0.875000 +vt 0.656250 0.812500 +vt 0.656250 0.750000 +vt 0.656250 0.687500 +vt 0.656250 0.625000 +vt 0.656250 0.562500 +vt 0.656250 0.500000 +vt 0.656250 0.437500 +vt 0.656250 0.375000 +vt 0.656250 0.312500 +vt 0.656250 0.250000 +vt 0.656250 0.187500 +vt 0.656250 0.125000 +vt 0.656250 0.062500 +vt 0.625000 0.937500 +vt 0.625000 0.875000 +vt 0.625000 0.812500 +vt 0.625000 0.750000 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.625000 0.562500 +vt 0.625000 0.500000 +vt 0.625000 0.437500 +vt 0.625000 0.375000 +vt 0.625000 0.312500 +vt 0.625000 0.250000 +vt 0.625000 0.187500 +vt 0.625000 0.125000 +vt 0.625000 0.062500 +vt 0.593750 0.937500 +vt 0.593750 0.875000 +vt 0.593750 0.812500 +vt 0.593750 0.750000 +vt 0.593750 0.687500 +vt 0.593750 0.625000 +vt 0.593750 0.562500 +vt 0.593750 0.500000 +vt 0.593750 0.437500 +vt 0.593750 0.375000 +vt 0.593750 0.312500 +vt 0.593750 0.250000 +vt 0.593750 0.187500 +vt 0.593750 0.125000 +vt 0.593750 0.062500 +vt 0.734375 1.000000 +vt 0.703125 1.000000 +vt 0.671875 1.000000 +vt 0.640625 1.000000 +vt 0.609375 1.000000 +vt 0.578125 1.000000 +vt 0.546875 1.000000 +vt 0.515625 1.000000 +vt 0.484375 1.000000 +vt 0.453125 1.000000 +vt 0.421875 1.000000 +vt 0.390625 1.000000 +vt 0.359375 1.000000 +vt 0.328125 1.000000 +vt 0.296875 1.000000 +vt 0.265625 1.000000 +vt 0.234375 1.000000 +vt 0.203125 1.000000 +vt 0.171875 1.000000 +vt 0.140625 1.000000 +vt 0.109375 1.000000 +vt 0.078125 1.000000 +vt 0.046875 1.000000 +vt 0.015625 1.000000 +vt 0.984375 1.000000 +vt 0.953125 1.000000 +vt 0.921875 1.000000 +vt 0.890625 1.000000 +vt 0.859375 1.000000 +vt 0.828125 1.000000 +vt 0.796875 1.000000 +vt 0.765625 1.000000 +vt 0.562500 0.937500 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.562500 0.750000 +vt 0.562500 0.687500 +vt 0.562500 0.625000 +vt 0.562500 0.562500 +vt 0.562500 0.500000 +vt 0.562500 0.437500 +vt 0.562500 0.375000 +vt 0.562500 0.312500 +vt 0.562500 0.250000 +vt 0.562500 0.187500 +vt 0.562500 0.125000 +vt 0.562500 0.062500 +vt 0.531250 0.937500 +vt 0.531250 0.875000 +vt 0.531250 0.812500 +vt 0.531250 0.750000 +vt 0.531250 0.687500 +vt 0.531250 0.625000 +vt 0.531250 0.562500 +vt 0.531250 0.500000 +vt 0.531250 0.437500 +vt 0.531250 0.375000 +vt 0.531250 0.312500 +vt 0.531250 0.250000 +vt 0.531250 0.187500 +vt 0.531250 0.125000 +vt 0.531250 0.062500 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.500000 0.812500 +vt 0.500000 0.750000 +vt 0.500000 0.687500 +vt 0.500000 0.625000 +vt 0.500000 0.562500 +vt 0.500000 0.500000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.500000 0.312500 +vt 0.500000 0.250000 +vt 0.500000 0.187500 +vt 0.500000 0.125000 +vt 0.500000 0.062500 +vt 0.468750 0.937500 +vt 0.468750 0.875000 +vt 0.468750 0.812500 +vt 0.468750 0.750000 +vt 0.468750 0.687500 +vt 0.468750 0.625000 +vt 0.468750 0.562500 +vt 0.468750 0.500000 +vt 0.468750 0.437500 +vt 0.468750 0.375000 +vt 0.468750 0.312500 +vt 0.468750 0.250000 +vt 0.468750 0.187500 +vt 0.468750 0.125000 +vt 0.468750 0.062500 +vt 0.437500 0.937500 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.750000 +vt 0.437500 0.687500 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.437500 0.500000 +vt 0.437500 0.437500 +vt 0.437500 0.375000 +vt 0.437500 0.312500 +vt 0.437500 0.250000 +vt 0.437500 0.187500 +vt 0.437500 0.125000 +vt 0.437500 0.062500 +vt 0.406250 0.937500 +vt 0.406250 0.875000 +vt 0.406250 0.812500 +vt 0.406250 0.750000 +vt 0.406250 0.687500 +vt 0.406250 0.625000 +vt 0.406250 0.562500 +vt 0.406250 0.500000 +vt 0.406250 0.437500 +vt 0.406250 0.375000 +vt 0.406250 0.312500 +vt 0.406250 0.250000 +vt 0.406250 0.187500 +vt 0.406250 0.125000 +vt 0.406250 0.062500 +vt 0.375000 0.937500 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.375000 0.750000 +vt 0.375000 0.687500 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.375000 0.375000 +vt 0.375000 0.312500 +vt 0.375000 0.250000 +vt 0.375000 0.187500 +vt 0.375000 0.125000 +vt 0.375000 0.062500 +vt 0.343750 0.937500 +vt 0.343750 0.875000 +vt 0.343750 0.812500 +vt 0.343750 0.750000 +vt 0.343750 0.687500 +vt 0.343750 0.625000 +vt 0.343750 0.562500 +vt 0.343750 0.500000 +vt 0.343750 0.437500 +vt 0.343750 0.375000 +vt 0.343750 0.312500 +vt 0.343750 0.250000 +vt 0.343750 0.187500 +vt 0.343750 0.125000 +vt 0.343750 0.062500 +vt 0.312500 0.937500 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.312500 0.750000 +vt 0.312500 0.687500 +vt 0.312500 0.625000 +vt 0.312500 0.562500 +vt 0.312500 0.500000 +vt 0.312500 0.437500 +vt 0.312500 0.375000 +vt 0.312500 0.312500 +vt 0.312500 0.250000 +vt 0.312500 0.187500 +vt 0.312500 0.125000 +vt 0.312500 0.062500 +vt 0.281250 0.937500 +vt 0.281250 0.875000 +vt 0.281250 0.812500 +vt 0.281250 0.750000 +vt 0.281250 0.687500 +vt 0.281250 0.625000 +vt 0.281250 0.562500 +vt 0.281250 0.500000 +vt 0.281250 0.437500 +vt 0.281250 0.375000 +vt 0.281250 0.312500 +vt 0.281250 0.250000 +vt 0.281250 0.187500 +vt 0.281250 0.125000 +vt 0.281250 0.062500 +vt 0.250000 0.937500 +vt 0.250000 0.875000 +vt 0.250000 0.812500 +vt 0.250000 0.750000 +vt 0.250000 0.687500 +vt 0.250000 0.625000 +vt 0.250000 0.562500 +vt 0.250000 0.500000 +vt 0.250000 0.437500 +vt 0.250000 0.375000 +vt 0.250000 0.312500 +vt 0.250000 0.250000 +vt 0.250000 0.187500 +vt 0.250000 0.125000 +vt 0.250000 0.062500 +vt 0.218750 0.937500 +vt 0.218750 0.875000 +vt 0.218750 0.812500 +vt 0.218750 0.750000 +vt 0.218750 0.687500 +vt 0.218750 0.625000 +vt 0.218750 0.562500 +vt 0.218750 0.500000 +vt 0.218750 0.437500 +vt 0.218750 0.375000 +vt 0.218750 0.312500 +vt 0.218750 0.250000 +vt 0.218750 0.187500 +vt 0.218750 0.125000 +vt 0.218750 0.062500 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.187500 0.750000 +vt 0.187500 0.687500 +vt 0.187500 0.625000 +vt 0.187500 0.562500 +vt 0.187500 0.500000 +vt 0.187500 0.437500 +vt 0.187500 0.375000 +vt 0.187500 0.312500 +vt 0.187500 0.250000 +vt 0.187500 0.187500 +vt 0.187500 0.125000 +vt 0.187500 0.062500 +vt 0.156250 0.937500 +vt 0.156250 0.875000 +vt 0.156250 0.812500 +vt 0.156250 0.750000 +vt 0.156250 0.687500 +vt 0.156250 0.625000 +vt 0.156250 0.562500 +vt 0.156250 0.500000 +vt 0.156250 0.437500 +vt 0.156250 0.375000 +vt 0.156250 0.312500 +vt 0.156250 0.250000 +vt 0.156250 0.187500 +vt 0.156250 0.125000 +vt 0.156250 0.062500 +vt 0.125000 0.937500 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.125000 0.687500 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.125000 0.500000 +vt 0.125000 0.437500 +vt 0.125000 0.375000 +vt 0.125000 0.312500 +vt 0.125000 0.250000 +vt 0.125000 0.187500 +vt 0.125000 0.125000 +vt 0.125000 0.062500 +vt 0.734375 0.000000 +vt 0.703125 0.000000 +vt 0.671875 0.000000 +vt 0.640625 0.000000 +vt 0.609375 0.000000 +vt 0.578125 0.000000 +vt 0.546875 0.000000 +vt 0.515625 0.000000 +vt 0.484375 0.000000 +vt 0.453125 0.000000 +vt 0.421875 0.000000 +vt 0.390625 0.000000 +vt 0.359375 0.000000 +vt 0.328125 0.000000 +vt 0.296875 0.000000 +vt 0.265625 0.000000 +vt 0.234375 0.000000 +vt 0.203125 0.000000 +vt 0.171875 0.000000 +vt 0.140625 0.000000 +vt 0.109375 0.000000 +vt 0.078125 0.000000 +vt 0.046875 0.000000 +vt 0.015625 0.000000 +vt 0.984375 0.000000 +vt 0.953125 0.000000 +vt 0.921875 0.000000 +vt 0.890625 0.000000 +vt 0.859375 0.000000 +vt 0.828125 0.000000 +vt 0.796875 0.000000 +vt 0.765625 0.000000 +vt 0.093750 0.937500 +vt 0.093750 0.875000 +vt 0.093750 0.812500 +vt 0.093750 0.750000 +vt 0.093750 0.687500 +vt 0.093750 0.625000 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.093750 0.437500 +vt 0.093750 0.375000 +vt 0.093750 0.312500 +vt 0.093750 0.250000 +vt 0.093750 0.187500 +vt 0.093750 0.125000 +vt 0.093750 0.062500 +vt 0.062500 0.937500 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.062500 0.687500 +vt 0.062500 0.625000 +vt 0.062500 0.562500 +vt 0.062500 0.500000 +vt 0.062500 0.437500 +vt 0.062500 0.375000 +vt 0.062500 0.312500 +vt 0.062500 0.250000 +vt 0.062500 0.187500 +vt 0.062500 0.125000 +vt 0.062500 0.062500 +vt 0.031250 0.937500 +vt 0.031250 0.875000 +vt 0.031250 0.812500 +vt 0.031250 0.750000 +vt 0.031250 0.687500 +vt 0.031250 0.625000 +vt 0.031250 0.562500 +vt 0.031250 0.500000 +vt 0.031250 0.437500 +vt 0.031250 0.375000 +vt 0.031250 0.312500 +vt 0.031250 0.250000 +vt 0.031250 0.187500 +vt 0.031250 0.125000 +vt 0.031250 0.062500 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt 0.000000 0.875000 +vt 1.000000 0.875000 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 0.000000 0.750000 +vt 1.000000 0.750000 +vt 0.000000 0.687500 +vt 1.000000 0.687500 +vt 0.000000 0.625000 +vt 1.000000 0.625000 +vt 0.000000 0.562500 +vt 1.000000 0.562500 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.437500 +vt 1.000000 0.437500 +vt 0.000000 0.375000 +vt 1.000000 0.375000 +vt 0.000000 0.312500 +vt 1.000000 0.312500 +vt 0.000000 0.250000 +vt 1.000000 0.250000 +vt 0.000000 0.187500 +vt 1.000000 0.187500 +vt 0.000000 0.125000 +vt 1.000000 0.125000 +vt 1.000000 0.062500 +vt 0.000000 0.062500 +vt 0.968750 0.937500 +vt 0.968750 0.875000 +vt 0.968750 0.812500 +vt 0.968750 0.750000 +vt 0.968750 0.687500 +vt 0.968750 0.625000 +vt 0.968750 0.562500 +vt 0.968750 0.500000 +vt 0.968750 0.437500 +vt 0.968750 0.375000 +vt 0.968750 0.312500 +vt 0.968750 0.250000 +vt 0.968750 0.187500 +vt 0.968750 0.125000 +vt 0.968750 0.062500 +vt 0.937500 0.937500 +vt 0.937500 0.875000 +vt 0.937500 0.812500 +vt 0.937500 0.750000 +vt 0.937500 0.687500 +vt 0.937500 0.625000 +vt 0.937500 0.562500 +vt 0.937500 0.500000 +vt 0.937500 0.437500 +vt 0.937500 0.375000 +vt 0.937500 0.312500 +vt 0.937500 0.250000 +vt 0.937500 0.187500 +vt 0.937500 0.125000 +vt 0.937500 0.062500 +vt 0.906250 0.937500 +vt 0.906250 0.875000 +vt 0.906250 0.812500 +vt 0.906250 0.750000 +vt 0.906250 0.687500 +vt 0.906250 0.625000 +vt 0.906250 0.562500 +vt 0.906250 0.500000 +vt 0.906250 0.437500 +vt 0.906250 0.375000 +vt 0.906250 0.312500 +vt 0.906250 0.250000 +vt 0.906250 0.187500 +vt 0.906250 0.125000 +vt 0.906250 0.062500 +vt 0.875000 0.937500 +vt 0.875000 0.875000 +vt 0.875000 0.812500 +vt 0.875000 0.750000 +vt 0.875000 0.687500 +vt 0.875000 0.625000 +vt 0.875000 0.562500 +vt 0.875000 0.500000 +vt 0.875000 0.437500 +vt 0.875000 0.375000 +vt 0.875000 0.312500 +vt 0.875000 0.250000 +vt 0.875000 0.187500 +vt 0.875000 0.125000 +vt 0.875000 0.062500 +vt 0.843750 0.937500 +vt 0.843750 0.875000 +vt 0.843750 0.812500 +vt 0.843750 0.750000 +vt 0.843750 0.687500 +vt 0.843750 0.625000 +vt 0.843750 0.562500 +vt 0.843750 0.500000 +vt 0.843750 0.437500 +vt 0.843750 0.375000 +vt 0.843750 0.312500 +vt 0.843750 0.250000 +vt 0.843750 0.187500 +vt 0.843750 0.125000 +vt 0.843750 0.062500 +vt 0.812500 0.937500 +vt 0.812500 0.875000 +vt 0.812500 0.812500 +vt 0.812500 0.750000 +vt 0.812500 0.687500 +vt 0.812500 0.625000 +vt 0.812500 0.562500 +vt 0.812500 0.500000 +vt 0.812500 0.437500 +vt 0.812500 0.375000 +vt 0.812500 0.312500 +vt 0.812500 0.250000 +vt 0.812500 0.187500 +vt 0.812500 0.125000 +vt 0.812500 0.062500 +vt 0.781250 0.937500 +vt 0.781250 0.875000 +vt 0.781250 0.812500 +vt 0.781250 0.750000 +vt 0.781250 0.687500 +vt 0.781250 0.625000 +vt 0.781250 0.562500 +vt 0.781250 0.500000 +vt 0.781250 0.437500 +vt 0.781250 0.375000 +vt 0.781250 0.312500 +vt 0.781250 0.250000 +vt 0.781250 0.187500 +vt 0.781250 0.125000 +vt 0.781250 0.062500 +vt 0.750000 0.937500 +vt 0.750000 0.875000 +vt 0.750000 0.750000 +vt 0.750000 0.625000 +vt 0.750000 0.375000 +vt 0.750000 0.250000 +vt 0.750000 0.187500 +vt 0.750000 0.125000 +vt 0.750000 0.062500 +s 0 +f 308/339/1 482/559/1 21/21/1 +f 4/4/2 15/15/2 5/5/2 +f 475/552/3 7/7/3 8/8/3 +f 5/5/4 16/16/4 478/555/4 +f 1/1/5 8/8/5 9/9/5 +f 478/555/6 17/17/6 6/6/6 +f 476/553/7 9/9/7 10/10/7 +f 6/6/8 18/18/8 479/556/8 +f 2/2/9 10/10/9 11/11/9 +f 479/556/10 19/19/10 480/557/10 +f 477/554/11 11/11/11 12/12/11 +f 480/557/12 20/20/12 481/558/12 +f 3/3/13 12/12/13 13/13/13 +f 481/558/14 21/21/14 482/559/14 +f 3/3/15 14/14/15 4/4/15 +f 474/551/16 82/82/16 7/7/16 +f 20/20/17 36/36/17 21/21/17 +f 13/13/18 29/29/18 14/14/18 +f 7/7/19 82/83/19 22/22/19 +f 308/340/20 21/21/20 36/36/20 +f 14/14/21 30/30/21 15/15/21 +f 7/7/22 23/23/22 8/8/22 +f 15/15/23 31/31/23 16/16/23 +f 8/8/24 24/24/24 9/9/24 +f 16/16/25 32/32/25 17/17/25 +f 9/9/26 25/25/26 10/10/26 +f 17/17/27 33/33/27 18/18/27 +f 10/10/28 26/26/28 11/11/28 +f 19/19/29 33/33/29 34/34/29 +f 11/11/30 27/27/30 12/12/30 +f 20/20/31 34/34/31 35/35/31 +f 13/13/32 27/27/32 28/28/32 +f 24/24/33 40/40/33 25/25/33 +f 33/33/34 47/47/34 48/48/34 +f 25/25/35 41/41/35 26/26/35 +f 34/34/36 48/48/36 49/49/36 +f 26/26/37 42/42/37 27/27/37 +f 34/34/38 50/50/38 35/35/38 +f 27/27/39 43/43/39 28/28/39 +f 35/35/40 51/51/40 36/36/40 +f 28/28/41 44/44/41 29/29/41 +f 22/22/42 82/84/42 37/37/42 +f 308/341/43 36/36/43 51/51/43 +f 30/30/44 44/44/44 45/45/44 +f 22/22/45 38/38/45 23/23/45 +f 30/30/46 46/46/46 31/31/46 +f 23/23/47 39/39/47 24/24/47 +f 32/32/48 46/46/48 47/47/48 +f 44/44/49 58/58/49 59/59/49 +f 37/37/50 82/85/50 52/52/50 +f 308/342/51 51/51/51 66/66/51 +f 44/44/52 60/60/52 45/45/52 +f 37/37/53 53/53/53 38/38/53 +f 45/45/54 61/61/54 46/46/54 +f 38/38/55 54/54/55 39/39/55 +f 47/47/56 61/61/56 62/62/56 +f 39/39/57 55/55/57 40/40/57 +f 47/47/58 63/63/58 48/48/58 +f 40/40/59 56/56/59 41/41/59 +f 48/48/60 64/64/60 49/49/60 +f 41/41/61 57/57/61 42/42/61 +f 49/49/62 65/65/62 50/50/62 +f 43/43/63 57/57/63 58/58/63 +f 50/50/64 66/66/64 51/51/64 +f 62/62/65 78/78/65 63/63/65 +f 56/56/66 70/70/66 71/71/66 +f 63/63/67 79/79/67 64/64/67 +f 56/56/68 72/72/68 57/57/68 +f 65/65/69 79/79/69 80/80/69 +f 58/58/70 72/72/70 73/73/70 +f 65/65/71 81/81/71 66/66/71 +f 59/59/72 73/73/72 74/74/72 +f 52/52/73 82/86/73 67/67/73 +f 308/343/74 66/66/74 81/81/74 +f 59/59/75 75/75/75 60/60/75 +f 52/52/76 68/68/76 53/53/76 +f 60/60/77 76/76/77 61/61/77 +f 53/53/78 69/69/78 54/54/78 +f 62/62/79 76/76/79 77/77/79 +f 54/54/80 70/70/80 55/55/80 +f 308/344/81 81/81/81 97/128/81 +f 74/74/82 91/122/82 75/75/82 +f 67/67/83 84/115/83 68/68/83 +f 75/75/84 92/123/84 76/76/84 +f 68/68/85 85/116/85 69/69/85 +f 77/77/86 92/123/86 93/124/86 +f 69/69/87 86/117/87 70/70/87 +f 77/77/88 94/125/88 78/78/88 +f 71/71/89 86/117/89 87/118/89 +f 78/78/90 95/126/90 79/79/90 +f 71/71/91 88/119/91 72/72/91 +f 79/79/92 96/127/92 80/80/92 +f 73/73/93 88/119/93 89/120/93 +f 81/81/94 96/127/94 97/128/94 +f 74/74/95 89/120/95 90/121/95 +f 67/67/96 82/87/96 83/114/96 +f 95/126/97 109/140/97 110/141/97 +f 87/118/98 103/134/98 88/119/98 +f 96/127/99 110/141/99 111/142/99 +f 89/120/100 103/134/100 104/135/100 +f 96/127/101 112/143/101 97/128/101 +f 90/121/102 104/135/102 105/136/102 +f 83/114/103 82/88/103 98/129/103 +f 308/345/104 97/128/104 112/143/104 +f 90/121/105 106/137/105 91/122/105 +f 84/115/106 98/129/106 99/130/106 +f 91/122/107 107/138/107 92/123/107 +f 84/115/108 100/131/108 85/116/108 +f 93/124/109 107/138/109 108/139/109 +f 85/116/110 101/132/110 86/117/110 +f 93/124/111 109/140/111 94/125/111 +f 87/118/112 101/132/112 102/133/112 +f 99/130/113 113/144/113 114/145/113 +f 106/137/114 122/153/114 107/138/114 +f 99/130/115 115/146/115 100/131/115 +f 108/139/116 122/153/116 123/154/116 +f 100/131/117 116/147/117 101/132/117 +f 108/139/118 124/155/118 109/140/118 +f 102/133/119 116/147/119 117/148/119 +f 110/141/120 124/155/120 125/156/120 +f 102/133/121 118/149/121 103/134/121 +f 110/141/122 126/157/122 111/142/122 +f 104/135/123 118/149/123 119/150/123 +f 111/142/124 127/158/124 112/143/124 +f 105/136/125 119/150/125 120/151/125 +f 98/129/126 82/89/126 113/144/126 +f 308/346/127 112/143/127 127/158/127 +f 105/136/128 121/152/128 106/137/128 +f 117/148/129 133/164/129 118/149/129 +f 125/156/130 141/172/130 126/157/130 +f 119/150/131 133/164/131 134/165/131 +f 126/157/132 142/173/132 127/158/132 +f 120/151/133 134/165/133 135/166/133 +f 113/144/134 82/90/134 128/159/134 +f 308/347/135 127/158/135 142/173/135 +f 120/151/136 136/167/136 121/152/136 +f 113/144/137 129/160/137 114/145/137 +f 121/152/138 137/168/138 122/153/138 +f 114/145/139 130/161/139 115/146/139 +f 123/154/140 137/168/140 138/169/140 +f 115/146/141 131/162/141 116/147/141 +f 123/154/142 139/170/142 124/155/142 +f 117/148/143 131/162/143 132/163/143 +f 125/156/144 139/170/144 140/171/144 +f 136/167/145 152/183/145 137/168/145 +f 130/161/146 144/175/146 145/176/146 +f 138/169/147 152/183/147 153/184/147 +f 130/161/148 146/177/148 131/162/148 +f 138/169/149 154/185/149 139/170/149 +f 132/163/150 146/177/150 147/178/150 +f 140/171/151 154/185/151 155/186/151 +f 132/163/152 148/179/152 133/164/152 +f 140/171/153 156/187/153 141/172/153 +f 134/165/154 148/179/154 149/180/154 +f 142/173/155 156/187/155 157/188/155 +f 135/166/156 149/180/156 150/181/156 +f 128/159/157 82/91/157 143/174/157 +f 308/348/158 142/173/158 157/188/158 +f 135/166/159 151/182/159 136/167/159 +f 128/159/160 144/175/160 129/160/160 +f 155/186/161 171/202/161 156/187/161 +f 149/180/162 163/194/162 164/195/162 +f 156/187/163 172/203/163 157/188/163 +f 150/181/164 164/195/164 165/196/164 +f 143/174/165 82/92/165 158/189/165 +f 308/349/166 157/188/166 172/203/166 +f 150/181/167 166/197/167 151/182/167 +f 143/174/168 159/190/168 144/175/168 +f 151/182/169 167/198/169 152/183/169 +f 145/176/170 159/190/170 160/191/170 +f 153/184/171 167/198/171 168/199/171 +f 145/176/172 161/192/172 146/177/172 +f 153/184/173 169/200/173 154/185/173 +f 147/178/174 161/192/174 162/193/174 +f 155/186/175 169/200/175 170/201/175 +f 147/178/176 163/194/176 148/179/176 +f 159/190/177 175/206/177 160/191/177 +f 168/199/178 182/213/178 183/214/178 +f 160/191/179 176/207/179 161/192/179 +f 168/199/180 184/215/180 169/200/180 +f 162/193/181 176/207/181 177/208/181 +f 169/200/182 185/216/182 170/201/182 +f 162/193/183 178/209/183 163/194/183 +f 171/202/184 185/216/184 186/217/184 +f 164/195/185 178/209/185 179/210/185 +f 172/203/186 186/217/186 187/218/186 +f 165/196/187 179/210/187 180/211/187 +f 158/189/188 82/93/188 173/204/188 +f 308/350/189 172/203/189 187/218/189 +f 165/196/190 181/212/190 166/197/190 +f 158/189/191 174/205/191 159/190/191 +f 166/197/192 182/213/192 167/198/192 +f 179/210/193 193/224/193 194/225/193 +f 186/217/194 202/233/194 187/218/194 +f 180/211/195 194/225/195 195/226/195 +f 173/204/196 82/94/196 188/219/196 +f 308/351/197 187/218/197 202/233/197 +f 180/211/198 196/227/198 181/212/198 +f 174/205/199 188/219/199 189/220/199 +f 181/212/200 197/228/200 182/213/200 +f 175/206/201 189/220/201 190/221/201 +f 183/214/202 197/228/202 198/229/202 +f 175/206/203 191/222/203 176/207/203 +f 183/214/204 199/230/204 184/215/204 +f 177/208/205 191/222/205 192/223/205 +f 185/216/206 199/230/206 200/231/206 +f 177/208/207 193/224/207 178/209/207 +f 185/216/208 201/232/208 186/217/208 +f 198/229/209 212/243/209 213/244/209 +f 190/221/210 206/237/210 191/222/210 +f 198/229/211 214/245/211 199/230/211 +f 192/223/212 206/237/212 207/238/212 +f 200/231/213 214/245/213 215/246/213 +f 192/223/214 208/239/214 193/224/214 +f 200/231/215 216/247/215 201/232/215 +f 194/225/216 208/239/216 209/240/216 +f 201/232/217 217/248/217 202/233/217 +f 195/226/218 209/240/218 210/241/218 +f 188/219/219 82/95/219 203/234/219 +f 308/352/220 202/233/220 217/248/220 +f 195/226/221 211/242/221 196/227/221 +f 188/219/222 204/235/222 189/220/222 +f 196/227/223 212/243/223 197/228/223 +f 189/220/224 205/236/224 190/221/224 +f 216/247/225 232/263/225 217/248/225 +f 210/241/226 224/255/226 225/256/226 +f 203/234/227 82/96/227 218/249/227 +f 308/353/228 217/248/228 232/263/228 +f 210/241/229 226/257/229 211/242/229 +f 203/234/230 219/250/230 204/235/230 +f 211/242/231 227/258/231 212/243/231 +f 204/235/232 220/251/232 205/236/232 +f 213/244/233 227/258/233 228/259/233 +f 205/236/234 221/252/234 206/237/234 +f 213/244/235 229/260/235 214/245/235 +f 207/238/236 221/252/236 222/253/236 +f 215/246/237 229/260/237 230/261/237 +f 207/238/238 223/254/238 208/239/238 +f 215/246/239 231/262/239 216/247/239 +f 209/240/240 223/254/240 224/255/240 +f 228/259/241 244/275/241 229/260/241 +f 222/253/242 236/267/242 237/268/242 +f 230/261/243 244/275/243 245/276/243 +f 222/253/244 238/269/244 223/254/244 +f 230/261/245 246/277/245 231/262/245 +f 224/255/246 238/269/246 239/270/246 +f 232/263/247 246/277/247 247/278/247 +f 225/256/248 239/270/248 240/271/248 +f 218/249/249 82/97/249 233/264/249 +f 308/354/250 232/263/250 247/278/250 +f 225/256/251 241/272/251 226/257/251 +f 218/249/252 234/265/252 219/250/252 +f 226/257/253 242/273/253 227/258/253 +f 220/251/254 234/265/254 235/266/254 +f 228/259/255 242/273/255 243/274/255 +f 220/251/256 236/267/256 221/252/256 +f 233/264/257 82/98/257 248/279/257 +f 308/355/258 247/278/258 262/293/258 +f 240/271/259 256/287/259 241/272/259 +f 233/264/260 249/280/260 234/265/260 +f 241/272/261 257/288/261 242/273/261 +f 234/265/262 250/281/262 235/266/262 +f 243/274/263 257/288/263 258/289/263 +f 235/266/264 251/282/264 236/267/264 +f 243/274/265 259/290/265 244/275/265 +f 237/268/266 251/282/266 252/283/266 +f 245/276/267 259/290/267 260/291/267 +f 237/268/268 253/284/268 238/269/268 +f 245/276/269 261/292/269 246/277/269 +f 239/270/270 253/284/270 254/285/270 +f 246/277/271 262/293/271 247/278/271 +f 240/271/272 254/285/272 255/286/272 +f 252/283/273 266/297/273 267/298/273 +f 260/291/274 274/305/274 275/306/274 +f 252/283/275 268/299/275 253/284/275 +f 260/291/276 276/307/276 261/292/276 +f 254/285/277 268/299/277 269/300/277 +f 261/292/278 277/308/278 262/293/278 +f 255/286/279 269/300/279 270/301/279 +f 248/279/280 82/99/280 263/294/280 +f 308/356/281 262/293/281 277/308/281 +f 255/286/282 271/302/282 256/287/282 +f 249/280/283 263/294/283 264/295/283 +f 256/287/284 272/303/284 257/288/284 +f 249/280/285 265/296/285 250/281/285 +f 258/289/286 272/303/286 273/304/286 +f 250/281/287 266/297/287 251/282/287 +f 258/289/288 274/305/288 259/290/288 +f 270/301/289 286/317/289 271/302/289 +f 264/295/290 278/309/290 279/310/290 +f 271/302/291 287/318/291 272/303/291 +f 264/295/292 280/311/292 265/296/292 +f 273/304/293 287/318/293 288/319/293 +f 265/296/294 281/312/294 266/297/294 +f 273/304/295 289/320/295 274/305/295 +f 267/298/296 281/312/296 282/313/296 +f 275/306/297 289/320/297 290/321/297 +f 267/298/298 283/314/298 268/299/298 +f 275/306/299 291/322/299 276/307/299 +f 269/300/300 283/314/300 284/315/300 +f 277/308/301 291/322/301 292/323/301 +f 270/301/302 284/315/302 285/316/302 +f 263/294/303 82/100/303 278/309/303 +f 308/357/304 277/308/304 292/323/304 +f 290/321/305 304/335/305 305/336/305 +f 282/313/306 298/329/306 283/314/306 +f 290/321/307 306/337/307 291/322/307 +f 284/315/308 298/329/308 299/330/308 +f 292/323/309 306/337/309 307/338/309 +f 285/316/310 299/330/310 300/331/310 +f 278/309/311 82/101/311 293/324/311 +f 308/358/312 292/323/312 307/338/312 +f 285/316/313 301/332/313 286/317/313 +f 278/309/314 294/325/314 279/310/314 +f 286/317/315 302/333/315 287/318/315 +f 279/310/316 295/326/316 280/311/316 +f 288/319/317 302/333/317 303/334/317 +f 280/311/318 296/327/318 281/312/318 +f 288/319/319 304/335/319 289/320/319 +f 282/313/320 296/327/320 297/328/320 +f 293/324/321 310/372/321 294/325/321 +f 301/332/322 318/380/322 302/333/322 +f 294/325/323 311/373/323 295/326/323 +f 303/334/324 318/380/324 319/381/324 +f 295/326/325 312/374/325 296/327/325 +f 303/334/326 320/382/326 304/335/326 +f 297/328/327 312/374/327 313/375/327 +f 305/336/328 320/382/328 321/383/328 +f 297/328/329 314/376/329 298/329/329 +f 305/336/330 322/384/330 306/337/330 +f 299/330/331 314/376/331 315/377/331 +f 306/337/332 323/385/332 307/338/332 +f 300/331/333 315/377/333 316/378/333 +f 293/324/334 82/102/334 309/371/334 +f 308/359/335 307/338/335 323/385/335 +f 300/331/336 317/379/336 301/332/336 +f 313/375/337 329/391/337 314/376/337 +f 321/383/338 337/399/338 322/384/338 +f 315/377/339 329/391/339 330/392/339 +f 322/384/340 338/400/340 323/385/340 +f 316/378/341 330/392/341 331/393/341 +f 309/371/342 82/103/342 324/386/342 +f 308/360/343 323/385/343 338/400/343 +f 316/378/344 332/394/344 317/379/344 +f 309/371/345 325/387/345 310/372/345 +f 317/379/346 333/395/346 318/380/346 +f 310/372/347 326/388/347 311/373/347 +f 319/381/348 333/395/348 334/396/348 +f 311/373/349 327/389/349 312/374/349 +f 319/381/350 335/397/350 320/382/350 +f 312/374/351 328/390/351 313/375/351 +f 321/383/352 335/397/352 336/398/352 +f 332/394/353 348/410/353 333/395/353 +f 325/387/354 341/403/354 326/388/354 +f 334/396/355 348/410/355 349/411/355 +f 326/388/356 342/404/356 327/389/356 +f 334/396/357 350/412/357 335/397/357 +f 328/390/358 342/404/358 343/405/358 +f 336/398/359 350/412/359 351/413/359 +f 328/390/360 344/406/360 329/391/360 +f 336/398/361 352/414/361 337/399/361 +f 330/392/362 344/406/362 345/407/362 +f 337/399/363 353/415/363 338/400/363 +f 331/393/364 345/407/364 346/408/364 +f 324/386/365 82/104/365 339/401/365 +f 308/361/366 338/400/366 353/415/366 +f 331/393/367 347/409/367 332/394/367 +f 324/386/368 340/402/368 325/387/368 +f 351/413/369 367/442/369 352/414/369 +f 345/407/370 359/426/370 360/428/370 +f 352/414/371 368/445/371 353/415/371 +f 346/408/372 360/428/372 361/430/372 +f 339/401/373 82/105/373 354/416/373 +f 308/362/374 353/415/374 368/445/374 +f 346/408/375 362/432/375 347/409/375 +f 339/401/376 355/418/376 340/402/376 +f 347/409/377 363/434/377 348/410/377 +f 341/403/378 355/418/378 356/420/378 +f 349/411/379 363/434/379 364/436/379 +f 341/403/380 357/422/380 342/404/380 +f 349/411/381 365/438/381 350/412/381 +f 343/405/382 357/422/382 358/424/382 +f 351/413/383 365/438/383 366/440/383 +f 343/405/384 359/426/384 344/406/384 +f 364/437/385 378/455/385 379/456/385 +f 356/421/386 372/449/386 357/423/386 +f 364/437/387 380/457/387 365/439/387 +f 358/425/388 372/449/388 373/450/388 +f 366/441/389 380/457/389 381/458/389 +f 358/425/390 374/451/390 359/427/390 +f 366/441/391 382/459/391 367/443/391 +f 360/429/392 374/451/392 375/452/392 +f 367/443/393 383/460/393 368/444/393 +f 361/431/394 375/452/394 376/453/394 +f 354/417/395 82/106/395 369/446/395 +f 308/363/396 368/444/396 383/460/396 +f 361/431/397 377/454/397 362/433/397 +f 354/417/398 370/447/398 355/419/398 +f 362/433/399 378/455/399 363/435/399 +f 356/421/400 370/447/400 371/448/400 +f 382/459/401 398/475/401 383/460/401 +f 376/453/402 390/467/402 391/468/402 +f 369/446/403 82/107/403 384/461/403 +f 308/364/404 383/460/404 398/475/404 +f 376/453/405 392/469/405 377/454/405 +f 369/446/406 385/462/406 370/447/406 +f 377/454/407 393/470/407 378/455/407 +f 371/448/408 385/462/408 386/463/408 +f 379/456/409 393/470/409 394/471/409 +f 371/448/410 387/464/410 372/449/410 +f 379/456/411 395/472/411 380/457/411 +f 373/450/412 387/464/412 388/465/412 +f 381/458/413 395/472/413 396/473/413 +f 373/450/414 389/466/414 374/451/414 +f 381/458/415 397/474/415 382/459/415 +f 375/452/416 389/466/416 390/467/416 +f 386/463/417 402/479/417 387/464/417 +f 394/471/418 410/487/418 395/472/418 +f 388/465/419 402/479/419 403/480/419 +f 396/473/420 410/487/420 411/488/420 +f 388/465/421 404/481/421 389/466/421 +f 397/474/422 411/488/422 412/489/422 +f 390/467/423 404/481/423 405/482/423 +f 397/474/424 413/490/424 398/475/424 +f 391/468/425 405/482/425 406/483/425 +f 384/461/426 82/108/426 399/476/426 +f 308/365/427 398/475/427 413/490/427 +f 391/468/428 407/484/428 392/469/428 +f 385/462/429 399/476/429 400/477/429 +f 392/469/430 408/485/430 393/470/430 +f 385/462/431 401/478/431 386/463/431 +f 394/471/432 408/485/432 409/486/432 +f 406/483/433 420/497/433 421/498/433 +f 399/476/434 82/109/434 414/491/434 +f 308/366/435 413/490/435 428/505/435 +f 406/483/436 422/499/436 407/484/436 +f 399/476/437 415/492/437 400/477/437 +f 407/484/438 423/500/438 408/485/438 +f 401/478/439 415/492/439 416/493/439 +f 409/486/440 423/500/440 424/501/440 +f 401/478/441 417/494/441 402/479/441 +f 409/486/442 425/502/442 410/487/442 +f 403/480/443 417/494/443 418/495/443 +f 411/488/444 425/502/444 426/503/444 +f 403/480/445 419/496/445 404/481/445 +f 411/488/446 427/504/446 412/489/446 +f 405/482/447 419/496/447 420/497/447 +f 412/489/448 428/505/448 413/490/448 +f 424/501/449 440/517/449 425/502/449 +f 418/495/450 432/509/450 433/510/450 +f 426/503/451 440/517/451 441/518/451 +f 418/495/452 434/511/452 419/496/452 +f 426/503/453 442/519/453 427/504/453 +f 420/497/454 434/511/454 435/512/454 +f 427/504/455 443/520/455 428/505/455 +f 421/498/456 435/512/456 436/513/456 +f 414/491/457 82/110/457 429/506/457 +f 308/367/458 428/505/458 443/520/458 +f 421/498/459 437/514/459 422/499/459 +f 414/491/460 430/507/460 415/492/460 +f 422/499/461 438/515/461 423/500/461 +f 416/493/462 430/507/462 431/508/462 +f 424/501/463 438/515/463 439/516/463 +f 416/493/464 432/509/464 417/494/464 +f 429/506/465 82/111/465 444/521/465 +f 308/368/466 443/520/466 458/535/466 +f 436/513/467 452/529/467 437/514/467 +f 430/507/468 444/521/468 445/522/468 +f 437/514/469 453/530/469 438/515/469 +f 430/507/470 446/523/470 431/508/470 +f 439/516/471 453/530/471 454/531/471 +f 431/508/472 447/524/472 432/509/472 +f 439/516/473 455/532/473 440/517/473 +f 433/510/474 447/524/474 448/525/474 +f 441/518/475 455/532/475 456/533/475 +f 433/510/476 449/526/476 434/511/476 +f 441/518/477 457/534/477 442/519/477 +f 435/512/478 449/526/478 450/527/478 +f 442/519/479 458/535/479 443/520/479 +f 436/513/480 450/527/480 451/528/480 +f 448/525/481 462/539/481 463/540/481 +f 456/533/482 470/547/482 471/548/482 +f 448/525/483 464/541/483 449/526/483 +f 456/533/484 472/549/484 457/534/484 +f 450/527/485 464/541/485 465/542/485 +f 458/535/486 472/549/486 473/550/486 +f 451/528/487 465/542/487 466/543/487 +f 444/521/488 82/112/488 459/536/488 +f 308/369/489 458/535/489 473/550/489 +f 451/528/490 467/544/490 452/529/490 +f 444/521/491 460/537/491 445/522/491 +f 452/529/492 468/545/492 453/530/492 +f 446/523/493 460/537/493 461/538/493 +f 454/531/494 468/545/494 469/546/494 +f 446/523/495 462/539/495 447/524/495 +f 454/531/496 470/547/496 455/532/496 +f 466/543/497 5/5/497 467/544/497 +f 460/537/498 474/551/498 475/552/498 +f 467/544/499 478/555/499 468/545/499 +f 461/538/500 475/552/500 1/1/500 +f 468/545/501 6/6/501 469/546/501 +f 462/539/502 1/1/502 476/553/502 +f 469/546/503 479/556/503 470/547/503 +f 463/540/504 476/553/504 2/2/504 +f 471/548/505 479/556/505 480/557/505 +f 464/541/506 2/2/506 477/554/506 +f 471/548/507 481/558/507 472/549/507 +f 465/542/508 477/554/508 3/3/508 +f 472/549/509 482/559/509 473/550/509 +f 466/543/510 3/3/510 4/4/510 +f 459/536/511 82/113/511 474/551/511 +f 308/370/512 473/550/512 482/559/512 +f 4/4/513 14/14/513 15/15/513 +f 475/552/3 474/551/3 7/7/3 +f 5/5/4 15/15/4 16/16/4 +f 1/1/5 475/552/5 8/8/5 +f 478/555/6 16/16/6 17/17/6 +f 476/553/7 1/1/7 9/9/7 +f 6/6/8 17/17/8 18/18/8 +f 2/2/9 476/553/9 10/10/9 +f 479/556/10 18/18/10 19/19/10 +f 477/554/11 2/2/11 11/11/11 +f 480/557/12 19/19/12 20/20/12 +f 3/3/13 477/554/13 12/12/13 +f 481/558/14 20/20/14 21/21/14 +f 3/3/514 13/13/514 14/14/514 +f 20/20/17 35/35/17 36/36/17 +f 13/13/18 28/28/18 29/29/18 +f 14/14/21 29/29/21 30/30/21 +f 7/7/22 22/22/22 23/23/22 +f 15/15/23 30/30/23 31/31/23 +f 8/8/24 23/23/24 24/24/24 +f 16/16/25 31/31/25 32/32/25 +f 9/9/26 24/24/26 25/25/26 +f 17/17/27 32/32/27 33/33/27 +f 10/10/28 25/25/28 26/26/28 +f 19/19/29 18/18/29 33/33/29 +f 11/11/30 26/26/30 27/27/30 +f 20/20/31 19/19/31 34/34/31 +f 13/13/32 12/12/32 27/27/32 +f 24/24/33 39/39/33 40/40/33 +f 33/33/34 32/32/34 47/47/34 +f 25/25/35 40/40/35 41/41/35 +f 34/34/36 33/33/36 48/48/36 +f 26/26/37 41/41/37 42/42/37 +f 34/34/515 49/49/515 50/50/515 +f 27/27/39 42/42/39 43/43/39 +f 35/35/40 50/50/40 51/51/40 +f 28/28/41 43/43/41 44/44/41 +f 30/30/44 29/29/44 44/44/44 +f 22/22/45 37/37/45 38/38/45 +f 30/30/46 45/45/46 46/46/46 +f 23/23/516 38/38/516 39/39/516 +f 32/32/48 31/31/48 46/46/48 +f 44/44/49 43/43/49 58/58/49 +f 44/44/52 59/59/52 60/60/52 +f 37/37/53 52/52/53 53/53/53 +f 45/45/54 60/60/54 61/61/54 +f 38/38/55 53/53/55 54/54/55 +f 47/47/56 46/46/56 61/61/56 +f 39/39/57 54/54/57 55/55/57 +f 47/47/58 62/62/58 63/63/58 +f 40/40/59 55/55/59 56/56/59 +f 48/48/60 63/63/60 64/64/60 +f 41/41/61 56/56/61 57/57/61 +f 49/49/62 64/64/62 65/65/62 +f 43/43/63 42/42/63 57/57/63 +f 50/50/64 65/65/64 66/66/64 +f 62/62/65 77/77/65 78/78/65 +f 56/56/66 55/55/66 70/70/66 +f 63/63/67 78/78/67 79/79/67 +f 56/56/68 71/71/68 72/72/68 +f 65/65/69 64/64/69 79/79/69 +f 58/58/70 57/57/70 72/72/70 +f 65/65/517 80/80/517 81/81/517 +f 59/59/72 58/58/72 73/73/72 +f 59/59/75 74/74/75 75/75/75 +f 52/52/76 67/67/76 68/68/76 +f 60/60/77 75/75/77 76/76/77 +f 53/53/78 68/68/78 69/69/78 +f 62/62/79 61/61/79 76/76/79 +f 54/54/80 69/69/80 70/70/80 +f 74/74/82 90/121/82 91/122/82 +f 67/67/83 83/114/83 84/115/83 +f 75/75/84 91/122/84 92/123/84 +f 68/68/85 84/115/85 85/116/85 +f 77/77/86 76/76/86 92/123/86 +f 69/69/87 85/116/87 86/117/87 +f 77/77/88 93/124/88 94/125/88 +f 71/71/89 70/70/89 86/117/89 +f 78/78/90 94/125/90 95/126/90 +f 71/71/91 87/118/91 88/119/91 +f 79/79/92 95/126/92 96/127/92 +f 73/73/93 72/72/93 88/119/93 +f 81/81/94 80/80/94 96/127/94 +f 74/74/95 73/73/95 89/120/95 +f 95/126/97 94/125/97 109/140/97 +f 87/118/98 102/133/98 103/134/98 +f 96/127/99 95/126/99 110/141/99 +f 89/120/100 88/119/100 103/134/100 +f 96/127/101 111/142/101 112/143/101 +f 90/121/102 89/120/102 104/135/102 +f 90/121/105 105/136/105 106/137/105 +f 84/115/106 83/114/106 98/129/106 +f 91/122/107 106/137/107 107/138/107 +f 84/115/108 99/130/108 100/131/108 +f 93/124/109 92/123/109 107/138/109 +f 85/116/110 100/131/110 101/132/110 +f 93/124/111 108/139/111 109/140/111 +f 87/118/112 86/117/112 101/132/112 +f 99/130/113 98/129/113 113/144/113 +f 106/137/114 121/152/114 122/153/114 +f 99/130/115 114/145/115 115/146/115 +f 108/139/116 107/138/116 122/153/116 +f 100/131/117 115/146/117 116/147/117 +f 108/139/118 123/154/118 124/155/118 +f 102/133/119 101/132/119 116/147/119 +f 110/141/120 109/140/120 124/155/120 +f 102/133/121 117/148/121 118/149/121 +f 110/141/122 125/156/122 126/157/122 +f 104/135/123 103/134/123 118/149/123 +f 111/142/124 126/157/124 127/158/124 +f 105/136/125 104/135/125 119/150/125 +f 105/136/128 120/151/128 121/152/128 +f 117/148/129 132/163/129 133/164/129 +f 125/156/130 140/171/130 141/172/130 +f 119/150/131 118/149/131 133/164/131 +f 126/157/132 141/172/132 142/173/132 +f 120/151/133 119/150/133 134/165/133 +f 120/151/136 135/166/136 136/167/136 +f 113/144/137 128/159/137 129/160/137 +f 121/152/138 136/167/138 137/168/138 +f 114/145/139 129/160/139 130/161/139 +f 123/154/140 122/153/140 137/168/140 +f 115/146/141 130/161/141 131/162/141 +f 123/154/142 138/169/142 139/170/142 +f 117/148/143 116/147/143 131/162/143 +f 125/156/144 124/155/144 139/170/144 +f 136/167/145 151/182/145 152/183/145 +f 130/161/146 129/160/146 144/175/146 +f 138/169/147 137/168/147 152/183/147 +f 130/161/148 145/176/148 146/177/148 +f 138/169/149 153/184/149 154/185/149 +f 132/163/150 131/162/150 146/177/150 +f 140/171/151 139/170/151 154/185/151 +f 132/163/152 147/178/152 148/179/152 +f 140/171/153 155/186/153 156/187/153 +f 134/165/154 133/164/154 148/179/154 +f 142/173/155 141/172/155 156/187/155 +f 135/166/156 134/165/156 149/180/156 +f 135/166/159 150/181/159 151/182/159 +f 128/159/160 143/174/160 144/175/160 +f 155/186/518 170/201/518 171/202/518 +f 149/180/162 148/179/162 163/194/162 +f 156/187/163 171/202/163 172/203/163 +f 150/181/164 149/180/164 164/195/164 +f 150/181/167 165/196/167 166/197/167 +f 143/174/519 158/189/519 159/190/519 +f 151/182/169 166/197/169 167/198/169 +f 145/176/520 144/175/520 159/190/520 +f 153/184/171 152/183/171 167/198/171 +f 145/176/172 160/191/172 161/192/172 +f 153/184/173 168/199/173 169/200/173 +f 147/178/174 146/177/174 161/192/174 +f 155/186/175 154/185/175 169/200/175 +f 147/178/176 162/193/176 163/194/176 +f 159/190/177 174/205/177 175/206/177 +f 168/199/178 167/198/178 182/213/178 +f 160/191/179 175/206/179 176/207/179 +f 168/199/180 183/214/180 184/215/180 +f 162/193/181 161/192/181 176/207/181 +f 169/200/182 184/215/182 185/216/182 +f 162/193/183 177/208/183 178/209/183 +f 171/202/184 170/201/184 185/216/184 +f 164/195/185 163/194/185 178/209/185 +f 172/203/186 171/202/186 186/217/186 +f 165/196/187 164/195/187 179/210/187 +f 165/196/190 180/211/190 181/212/190 +f 158/189/191 173/204/191 174/205/191 +f 166/197/192 181/212/192 182/213/192 +f 179/210/193 178/209/193 193/224/193 +f 186/217/194 201/232/194 202/233/194 +f 180/211/195 179/210/195 194/225/195 +f 180/211/198 195/226/198 196/227/198 +f 174/205/199 173/204/199 188/219/199 +f 181/212/200 196/227/200 197/228/200 +f 175/206/201 174/205/201 189/220/201 +f 183/214/202 182/213/202 197/228/202 +f 175/206/203 190/221/203 191/222/203 +f 183/214/204 198/229/204 199/230/204 +f 177/208/205 176/207/205 191/222/205 +f 185/216/206 184/215/206 199/230/206 +f 177/208/207 192/223/207 193/224/207 +f 185/216/208 200/231/208 201/232/208 +f 198/229/209 197/228/209 212/243/209 +f 190/221/210 205/236/210 206/237/210 +f 198/229/211 213/244/211 214/245/211 +f 192/223/212 191/222/212 206/237/212 +f 200/231/213 199/230/213 214/245/213 +f 192/223/214 207/238/214 208/239/214 +f 200/231/521 215/246/521 216/247/521 +f 194/225/216 193/224/216 208/239/216 +f 201/232/217 216/247/217 217/248/217 +f 195/226/218 194/225/218 209/240/218 +f 195/226/221 210/241/221 211/242/221 +f 188/219/222 203/234/222 204/235/222 +f 196/227/223 211/242/223 212/243/223 +f 189/220/224 204/235/224 205/236/224 +f 216/247/225 231/262/225 232/263/225 +f 210/241/226 209/240/226 224/255/226 +f 210/241/229 225/256/229 226/257/229 +f 203/234/230 218/249/230 219/250/230 +f 211/242/231 226/257/231 227/258/231 +f 204/235/232 219/250/232 220/251/232 +f 213/244/233 212/243/233 227/258/233 +f 205/236/234 220/251/234 221/252/234 +f 213/244/235 228/259/235 229/260/235 +f 207/238/236 206/237/236 221/252/236 +f 215/246/237 214/245/237 229/260/237 +f 207/238/238 222/253/238 223/254/238 +f 215/246/239 230/261/239 231/262/239 +f 209/240/240 208/239/240 223/254/240 +f 228/259/241 243/274/241 244/275/241 +f 222/253/242 221/252/242 236/267/242 +f 230/261/243 229/260/243 244/275/243 +f 222/253/244 237/268/244 238/269/244 +f 230/261/245 245/276/245 246/277/245 +f 224/255/246 223/254/246 238/269/246 +f 232/263/247 231/262/247 246/277/247 +f 225/256/248 224/255/248 239/270/248 +f 225/256/251 240/271/251 241/272/251 +f 218/249/252 233/264/252 234/265/252 +f 226/257/253 241/272/253 242/273/253 +f 220/251/254 219/250/254 234/265/254 +f 228/259/255 227/258/255 242/273/255 +f 220/251/256 235/266/256 236/267/256 +f 240/271/522 255/286/522 256/287/522 +f 233/264/260 248/279/260 249/280/260 +f 241/272/261 256/287/261 257/288/261 +f 234/265/262 249/280/262 250/281/262 +f 243/274/263 242/273/263 257/288/263 +f 235/266/264 250/281/264 251/282/264 +f 243/274/265 258/289/265 259/290/265 +f 237/268/266 236/267/266 251/282/266 +f 245/276/267 244/275/267 259/290/267 +f 237/268/268 252/283/268 253/284/268 +f 245/276/269 260/291/269 261/292/269 +f 239/270/270 238/269/270 253/284/270 +f 246/277/271 261/292/271 262/293/271 +f 240/271/523 239/270/523 254/285/523 +f 252/283/273 251/282/273 266/297/273 +f 260/291/274 259/290/274 274/305/274 +f 252/283/275 267/298/275 268/299/275 +f 260/291/276 275/306/276 276/307/276 +f 254/285/277 253/284/277 268/299/277 +f 261/292/278 276/307/278 277/308/278 +f 255/286/279 254/285/279 269/300/279 +f 255/286/282 270/301/282 271/302/282 +f 249/280/283 248/279/283 263/294/283 +f 256/287/284 271/302/284 272/303/284 +f 249/280/285 264/295/285 265/296/285 +f 258/289/286 257/288/286 272/303/286 +f 250/281/287 265/296/287 266/297/287 +f 258/289/288 273/304/288 274/305/288 +f 270/301/289 285/316/289 286/317/289 +f 264/295/290 263/294/290 278/309/290 +f 271/302/291 286/317/291 287/318/291 +f 264/295/524 279/310/524 280/311/524 +f 273/304/293 272/303/293 287/318/293 +f 265/296/294 280/311/294 281/312/294 +f 273/304/295 288/319/295 289/320/295 +f 267/298/296 266/297/296 281/312/296 +f 275/306/297 274/305/297 289/320/297 +f 267/298/298 282/313/298 283/314/298 +f 275/306/525 290/321/525 291/322/525 +f 269/300/300 268/299/300 283/314/300 +f 277/308/301 276/307/301 291/322/301 +f 270/301/302 269/300/302 284/315/302 +f 290/321/305 289/320/305 304/335/305 +f 282/313/306 297/328/306 298/329/306 +f 290/321/307 305/336/307 306/337/307 +f 284/315/308 283/314/308 298/329/308 +f 292/323/309 291/322/309 306/337/309 +f 285/316/310 284/315/310 299/330/310 +f 285/316/313 300/331/313 301/332/313 +f 278/309/314 293/324/314 294/325/314 +f 286/317/315 301/332/315 302/333/315 +f 279/310/316 294/325/316 295/326/316 +f 288/319/317 287/318/317 302/333/317 +f 280/311/318 295/326/318 296/327/318 +f 288/319/319 303/334/319 304/335/319 +f 282/313/320 281/312/320 296/327/320 +f 293/324/321 309/371/321 310/372/321 +f 301/332/322 317/379/322 318/380/322 +f 294/325/323 310/372/323 311/373/323 +f 303/334/324 302/333/324 318/380/324 +f 295/326/325 311/373/325 312/374/325 +f 303/334/326 319/381/326 320/382/326 +f 297/328/327 296/327/327 312/374/327 +f 305/336/328 304/335/328 320/382/328 +f 297/328/329 313/375/329 314/376/329 +f 305/336/330 321/383/330 322/384/330 +f 299/330/331 298/329/331 314/376/331 +f 306/337/526 322/384/526 323/385/526 +f 300/331/333 299/330/333 315/377/333 +f 300/331/336 316/378/336 317/379/336 +f 313/375/337 328/390/337 329/391/337 +f 321/383/527 336/398/527 337/399/527 +f 315/377/339 314/376/339 329/391/339 +f 322/384/340 337/399/340 338/400/340 +f 316/378/341 315/377/341 330/392/341 +f 316/378/344 331/393/344 332/394/344 +f 309/371/345 324/386/345 325/387/345 +f 317/379/346 332/394/346 333/395/346 +f 310/372/347 325/387/347 326/388/347 +f 319/381/348 318/380/348 333/395/348 +f 311/373/349 326/388/349 327/389/349 +f 319/381/350 334/396/350 335/397/350 +f 312/374/351 327/389/351 328/390/351 +f 321/383/352 320/382/352 335/397/352 +f 332/394/353 347/409/353 348/410/353 +f 325/387/354 340/402/354 341/403/354 +f 334/396/355 333/395/355 348/410/355 +f 326/388/356 341/403/356 342/404/356 +f 334/396/357 349/411/357 350/412/357 +f 328/390/358 327/389/358 342/404/358 +f 336/398/359 335/397/359 350/412/359 +f 328/390/360 343/405/360 344/406/360 +f 336/398/361 351/413/361 352/414/361 +f 330/392/362 329/391/362 344/406/362 +f 337/399/363 352/414/363 353/415/363 +f 331/393/364 330/392/364 345/407/364 +f 331/393/367 346/408/367 347/409/367 +f 324/386/368 339/401/368 340/402/368 +f 351/413/369 366/440/369 367/442/369 +f 345/407/370 344/406/370 359/426/370 +f 352/414/371 367/442/371 368/445/371 +f 346/408/528 345/407/528 360/428/528 +f 346/408/529 361/430/529 362/432/529 +f 339/401/376 354/416/376 355/418/376 +f 347/409/377 362/432/377 363/434/377 +f 341/403/378 340/402/378 355/418/378 +f 349/411/379 348/410/379 363/434/379 +f 341/403/380 356/420/380 357/422/380 +f 349/411/381 364/436/381 365/438/381 +f 343/405/382 342/404/382 357/422/382 +f 351/413/383 350/412/383 365/438/383 +f 343/405/384 358/424/384 359/426/384 +f 364/437/385 363/435/385 378/455/385 +f 356/421/386 371/448/386 372/449/386 +f 364/437/387 379/456/387 380/457/387 +f 358/425/388 357/423/388 372/449/388 +f 366/441/389 365/439/389 380/457/389 +f 358/425/390 373/450/390 374/451/390 +f 366/441/391 381/458/391 382/459/391 +f 360/429/392 359/427/392 374/451/392 +f 367/443/393 382/459/393 383/460/393 +f 361/431/530 360/429/530 375/452/530 +f 361/431/531 376/453/531 377/454/531 +f 354/417/398 369/446/398 370/447/398 +f 362/433/399 377/454/399 378/455/399 +f 356/421/400 355/419/400 370/447/400 +f 382/459/401 397/474/401 398/475/401 +f 376/453/402 375/452/402 390/467/402 +f 376/453/405 391/468/405 392/469/405 +f 369/446/406 384/461/406 385/462/406 +f 377/454/407 392/469/407 393/470/407 +f 371/448/408 370/447/408 385/462/408 +f 379/456/409 378/455/409 393/470/409 +f 371/448/410 386/463/410 387/464/410 +f 379/456/411 394/471/411 395/472/411 +f 373/450/412 372/449/412 387/464/412 +f 381/458/413 380/457/413 395/472/413 +f 373/450/414 388/465/414 389/466/414 +f 381/458/415 396/473/415 397/474/415 +f 375/452/416 374/451/416 389/466/416 +f 386/463/417 401/478/417 402/479/417 +f 394/471/418 409/486/418 410/487/418 +f 388/465/419 387/464/419 402/479/419 +f 396/473/420 395/472/420 410/487/420 +f 388/465/421 403/480/421 404/481/421 +f 397/474/422 396/473/422 411/488/422 +f 390/467/423 389/466/423 404/481/423 +f 397/474/424 412/489/424 413/490/424 +f 391/468/425 390/467/425 405/482/425 +f 391/468/428 406/483/428 407/484/428 +f 385/462/429 384/461/429 399/476/429 +f 392/469/430 407/484/430 408/485/430 +f 385/462/431 400/477/431 401/478/431 +f 394/471/432 393/470/432 408/485/432 +f 406/483/433 405/482/433 420/497/433 +f 406/483/436 421/498/436 422/499/436 +f 399/476/437 414/491/437 415/492/437 +f 407/484/438 422/499/438 423/500/438 +f 401/478/439 400/477/439 415/492/439 +f 409/486/440 408/485/440 423/500/440 +f 401/478/441 416/493/441 417/494/441 +f 409/486/442 424/501/442 425/502/442 +f 403/480/443 402/479/443 417/494/443 +f 411/488/444 410/487/444 425/502/444 +f 403/480/445 418/495/445 419/496/445 +f 411/488/446 426/503/446 427/504/446 +f 405/482/447 404/481/447 419/496/447 +f 412/489/448 427/504/448 428/505/448 +f 424/501/449 439/516/449 440/517/449 +f 418/495/450 417/494/450 432/509/450 +f 426/503/451 425/502/451 440/517/451 +f 418/495/452 433/510/452 434/511/452 +f 426/503/453 441/518/453 442/519/453 +f 420/497/454 419/496/454 434/511/454 +f 427/504/455 442/519/455 443/520/455 +f 421/498/456 420/497/456 435/512/456 +f 421/498/459 436/513/459 437/514/459 +f 414/491/460 429/506/460 430/507/460 +f 422/499/461 437/514/461 438/515/461 +f 416/493/462 415/492/462 430/507/462 +f 424/501/463 423/500/463 438/515/463 +f 416/493/464 431/508/464 432/509/464 +f 436/513/467 451/528/467 452/529/467 +f 430/507/468 429/506/468 444/521/468 +f 437/514/469 452/529/469 453/530/469 +f 430/507/470 445/522/470 446/523/470 +f 439/516/471 438/515/471 453/530/471 +f 431/508/472 446/523/472 447/524/472 +f 439/516/473 454/531/473 455/532/473 +f 433/510/474 432/509/474 447/524/474 +f 441/518/475 440/517/475 455/532/475 +f 433/510/476 448/525/476 449/526/476 +f 441/518/477 456/533/477 457/534/477 +f 435/512/478 434/511/478 449/526/478 +f 442/519/479 457/534/479 458/535/479 +f 436/513/480 435/512/480 450/527/480 +f 448/525/481 447/524/481 462/539/481 +f 456/533/482 455/532/482 470/547/482 +f 448/525/483 463/540/483 464/541/483 +f 456/533/484 471/548/484 472/549/484 +f 450/527/485 449/526/485 464/541/485 +f 458/535/486 457/534/486 472/549/486 +f 451/528/487 450/527/487 465/542/487 +f 451/528/490 466/543/490 467/544/490 +f 444/521/491 459/536/491 460/537/491 +f 452/529/492 467/544/492 468/545/492 +f 446/523/493 445/522/493 460/537/493 +f 454/531/494 453/530/494 468/545/494 +f 446/523/495 461/538/495 462/539/495 +f 454/531/496 469/546/496 470/547/496 +f 466/543/497 4/4/497 5/5/497 +f 460/537/498 459/536/498 474/551/498 +f 467/544/499 5/5/499 478/555/499 +f 461/538/500 460/537/500 475/552/500 +f 468/545/501 478/555/501 6/6/501 +f 462/539/502 461/538/502 1/1/502 +f 469/546/503 6/6/503 479/556/503 +f 463/540/504 462/539/504 476/553/504 +f 471/548/505 470/547/505 479/556/505 +f 464/541/506 463/540/506 2/2/506 +f 471/548/507 480/557/507 481/558/507 +f 465/542/508 464/541/508 477/554/508 +f 472/549/509 481/558/509 482/559/509 +f 466/543/510 465/542/510 3/3/510 diff --git a/tectech/src/main/resources/assets/tectech/models/StarLayer0.png b/tectech/src/main/resources/assets/tectech/models/StarLayer0.png Binary files differnew file mode 100644 index 0000000000..5b0ac0ac67 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/models/StarLayer0.png diff --git a/tectech/src/main/resources/assets/tectech/models/StarLayer1.png b/tectech/src/main/resources/assets/tectech/models/StarLayer1.png Binary files differnew file mode 100644 index 0000000000..a1b9b25c35 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/models/StarLayer1.png diff --git a/tectech/src/main/resources/assets/tectech/models/StarLayer2.png b/tectech/src/main/resources/assets/tectech/models/StarLayer2.png Binary files differnew file mode 100644 index 0000000000..d23f1c6915 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/models/StarLayer2.png diff --git a/tectech/src/main/resources/assets/tectech/models/spaceLayer.png b/tectech/src/main/resources/assets/tectech/models/spaceLayer.png Binary files differnew file mode 100644 index 0000000000..7a327d9126 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/models/spaceLayer.png diff --git a/tectech/src/main/resources/assets/tectech/sounds.json b/tectech/src/main/resources/assets/tectech/sounds.json new file mode 100644 index 0000000000..e23f1c1196 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds.json @@ -0,0 +1,52 @@ +{ + "microwave_ding": { + "category": "block", + "subtitle": "tectech.subtitle.microwave_ding", + "sounds": [{"name": "microwave_ding","stream": false}] + }, + "fx_scan": { + "category": "block", + "subtitle": "tectech.subtitle.fx_scan", + "sounds": [{"name": "fx_scan","stream": false}] + }, + "fx_alarm": { + "category": "block", + "subtitle": "tectech.subtitle.fx_alarm", + "sounds": [{"name": "fx_alarm","stream": false}] + }, + "fx_click": { + "category": "block", + "subtitle": "tectech.subtitle.fx_click", + "sounds": [{"name": "fx_click","stream": false}] + }, + "fx_lo_freq": { + "category": "block", + "subtitle": "tectech.subtitle.fx_lo_freq", + "sounds": [{"name": "fx_lo_freq","stream": false}] + }, + "fx_mid_freq": { + "category": "block", + "subtitle": "tectech.subtitle.fx_mid_freq", + "sounds": [{"name": "fx_mid_freq","stream": false}] + }, + "fx_hi_freq": { + "category": "block", + "subtitle": "tectech.subtitle.fx_hi_freq", + "sounds": [{"name": "fx_hi_freq","stream": false}] + }, + "fx_noise": { + "category": "block", + "subtitle": "tectech.subtitle.fx_noise", + "sounds": [{"name": "fx_noise","stream": false}] + }, + "fx_woo_uu": { + "category": "block", + "subtitle": "tectech.subtitle.fx_woo_uu", + "sounds": [{"name": "fx_woo_uu","stream": false}] + }, + "fx_whooum": { + "category": "block", + "subtitle": "tectech.subtitle.fx_whooum", + "sounds": [{"name": "fx_whooum","stream": false}] + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_alarm.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_alarm.ogg Binary files differnew file mode 100644 index 0000000000..6156f6b1eb --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_alarm.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_click.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_click.ogg Binary files differnew file mode 100644 index 0000000000..3211d0d12e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_click.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_hi_freq.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_hi_freq.ogg Binary files differnew file mode 100644 index 0000000000..bb21d14ea5 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_hi_freq.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_lo_freq.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_lo_freq.ogg Binary files differnew file mode 100644 index 0000000000..f02581ae56 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_lo_freq.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_mid_freq.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_mid_freq.ogg Binary files differnew file mode 100644 index 0000000000..10ac371e19 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_mid_freq.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_noise.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_noise.ogg Binary files differnew file mode 100644 index 0000000000..0bb3a58dc0 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_noise.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_scan.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_scan.ogg Binary files differnew file mode 100644 index 0000000000..0b50e0ca76 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_scan.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_whooum.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_whooum.ogg Binary files differnew file mode 100644 index 0000000000..4e9331924d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_whooum.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/fx_woo_uu.ogg b/tectech/src/main/resources/assets/tectech/sounds/fx_woo_uu.ogg Binary files differnew file mode 100644 index 0000000000..51a35371a1 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/fx_woo_uu.ogg diff --git a/tectech/src/main/resources/assets/tectech/sounds/microwave_ding.ogg b/tectech/src/main/resources/assets/tectech/sounds/microwave_ding.ogg Binary files differnew file mode 100644 index 0000000000..489c3749d7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/sounds/microwave_ding.ogg diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumGlass.png b/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumGlass.png Binary files differnew file mode 100644 index 0000000000..0176d7f27a --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumGlass.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png b/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png Binary files differnew file mode 100644 index 0000000000..d03659020c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png.mcmeta b/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png.mcmeta new file mode 100644 index 0000000000..60af678259 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/blockQuantumStuff.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/blockReactorSimulator.png b/tectech/src/main/resources/assets/tectech/textures/blocks/blockReactorSimulator.png Binary files differnew file mode 100644 index 0000000000..92c6a3691c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/blockReactorSimulator.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png b/tectech/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png Binary files differnew file mode 100644 index 0000000000..d8b0bed4ae --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_0.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_0.png Binary files differnew file mode 100644 index 0000000000..ad6cc6eaa3 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_0.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_1.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_1.png Binary files differnew file mode 100644 index 0000000000..401b8ba303 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_1.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_10.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_10.png Binary files differnew file mode 100644 index 0000000000..a6d05e419b --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_10.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_11.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_11.png Binary files differnew file mode 100644 index 0000000000..6642e5646c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_11.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_2.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_2.png Binary files differnew file mode 100644 index 0000000000..ba328f6ed6 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_2.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_3.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_3.png Binary files differnew file mode 100644 index 0000000000..a6dc35f9a6 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_3.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_4.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_4.png Binary files differnew file mode 100644 index 0000000000..ba0d727722 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_4.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_5.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_5.png Binary files differnew file mode 100644 index 0000000000..c4f62763f7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_5.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_6.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_6.png Binary files differnew file mode 100644 index 0000000000..cb3aa9325d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_6.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_7.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_7.png Binary files differnew file mode 100644 index 0000000000..9a88af8a0e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_7.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_8.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_8.png Binary files differnew file mode 100644 index 0000000000..03c11338c3 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_8.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_9.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_9.png Binary files differnew file mode 100644 index 0000000000..e9cbd7d06f --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_9.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_AIR.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_AIR.png Binary files differnew file mode 100644 index 0000000000..9d709ad4b9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_AIR.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_DEFAULT.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_DEFAULT.png Binary files differnew file mode 100644 index 0000000000..d8f9721be0 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_DEFAULT.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_ERROR.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_ERROR.png Binary files differnew file mode 100644 index 0000000000..3313d24d7d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_ERROR.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_NOAIR.png b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_NOAIR.png Binary files differnew file mode 100644 index 0000000000..13102c6823 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/iconsets/HINT_NOAIR.png diff --git a/tectech/src/main/resources/assets/tectech/textures/blocks/turretBaseEM.png b/tectech/src/main/resources/assets/tectech/textures/blocks/turretBaseEM.png Binary files differnew file mode 100644 index 0000000000..8c3a027773 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/blocks/turretBaseEM.png diff --git a/tectech/src/main/resources/assets/tectech/textures/entity/projectileEM.png b/tectech/src/main/resources/assets/tectech/textures/entity/projectileEM.png Binary files differnew file mode 100644 index 0000000000..0f2aca19d0 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/entity/projectileEM.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/assLineRender.png b/tectech/src/main/resources/assets/tectech/textures/gui/assLineRender.png Binary files differnew file mode 100644 index 0000000000..cc1cd35a7d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/assLineRender.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png Binary files differnew file mode 100644 index 0000000000..8a4dc47307 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/green_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/green_glow.png Binary files differnew file mode 100644 index 0000000000..ff6c8ac7f5 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/green_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png Binary files differnew file mode 100644 index 0000000000..1e3d22f8c6 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png Binary files differnew file mode 100644 index 0000000000..434e23ad42 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue.png Binary files differnew file mode 100644 index 0000000000..3f70db25e7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue_no_inventory.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue_no_inventory.png Binary files differnew file mode 100644 index 0000000000..f1afff2b70 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue_no_inventory.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue_parametrizer_txt.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue_parametrizer_txt.png Binary files differnew file mode 100644 index 0000000000..d35be3f276 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/screen_blue_parametrizer_txt.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/space.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/space.png Binary files differnew file mode 100644 index 0000000000..4ecf8caa09 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/space.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/star.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/star.png Binary files differnew file mode 100644 index 0000000000..ad21ad0868 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/star.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/background/white_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/background/white_glow.png Binary files differnew file mode 100644 index 0000000000..79df16e73b --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/background/white_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/button/celestial.png b/tectech/src/main/resources/assets/tectech/textures/gui/button/celestial.png Binary files differnew file mode 100644 index 0000000000..5b9bc0688a --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/button/celestial.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/button/standard_16x16.png b/tectech/src/main/resources/assets/tectech/textures/gui/button/standard_16x16.png Binary files differnew file mode 100644 index 0000000000..c2d191d9ce --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/button/standard_16x16.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/button/standard_light_16x16.png b/tectech/src/main/resources/assets/tectech/textures/gui/button/standard_light_16x16.png Binary files differnew file mode 100644 index 0000000000..4071b19033 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/button/standard_light_16x16.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png Binary files differnew file mode 100644 index 0000000000..04d5ab80bd --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png Binary files differnew file mode 100644 index 0000000000..ce3e3ed119 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_off.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png Binary files differnew file mode 100644 index 0000000000..75832441e8 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/battery_on.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png Binary files differnew file mode 100644 index 0000000000..07c606ec11 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/cyclic_blue.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png Binary files differnew file mode 100644 index 0000000000..48bcca969b --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/flag.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_off.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_off.png Binary files differnew file mode 100644 index 0000000000..d4307a802c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_off.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_on.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_on.png Binary files differnew file mode 100644 index 0000000000..45f6bdf8ce --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/heat_on.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_0.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_0.png Binary files differnew file mode 100644 index 0000000000..585859a7b2 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_0.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_1.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_1.png Binary files differnew file mode 100644 index 0000000000..8d55a58ff5 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_1.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_c.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_c.png Binary files differnew file mode 100644 index 0000000000..d57bbee6e6 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_c.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_id.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_id.png Binary files differnew file mode 100644 index 0000000000..a7c940c97b --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_id.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_if.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_if.png Binary files differnew file mode 100644 index 0000000000..442c9161b7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_if.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_s.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_s.png Binary files differnew file mode 100644 index 0000000000..a47abc5829 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_s.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_t.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_t.png Binary files differnew file mode 100644 index 0000000000..300c06cbf5 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_t.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_x.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_x.png Binary files differnew file mode 100644 index 0000000000..ab7dcec9bb --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/parametrizer_x.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_disabled.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_disabled.png Binary files differnew file mode 100644 index 0000000000..8edbc8ae1a --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_disabled.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_off.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_off.png Binary files differnew file mode 100644 index 0000000000..9887dfefd9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_off.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_on.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_on.png Binary files differnew file mode 100644 index 0000000000..6021472296 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_pass_on.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_disabled.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_disabled.png Binary files differnew file mode 100644 index 0000000000..be40408929 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_disabled.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_off.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_off.png Binary files differnew file mode 100644 index 0000000000..366fb5c8d7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_off.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_on.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_on.png Binary files differnew file mode 100644 index 0000000000..1a033c8aec --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/power_switch_on.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_disabled.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_disabled.png Binary files differnew file mode 100644 index 0000000000..bc2b89a234 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_disabled.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_off.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_off.png Binary files differnew file mode 100644 index 0000000000..0d06a43a68 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_off.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_on.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_on.png Binary files differnew file mode 100644 index 0000000000..c5907fa3fd --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/safe_void_on.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/0.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/0.png Binary files differnew file mode 100644 index 0000000000..4beeaf609c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/0.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/1.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/1.png Binary files differnew file mode 100644 index 0000000000..125ff851f0 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/1.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/10.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/10.png Binary files differnew file mode 100644 index 0000000000..6e28c85673 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/10.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/11.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/11.png Binary files differnew file mode 100644 index 0000000000..498246457d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/11.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/12.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/12.png Binary files differnew file mode 100644 index 0000000000..f8c25b8625 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/12.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/13.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/13.png Binary files differnew file mode 100644 index 0000000000..f900fba9a2 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/13.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/14.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/14.png Binary files differnew file mode 100644 index 0000000000..a0ca048fa7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/14.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/15.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/15.png Binary files differnew file mode 100644 index 0000000000..5f88156010 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/15.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/2.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/2.png Binary files differnew file mode 100644 index 0000000000..cfe3bc8922 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/2.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/3.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/3.png Binary files differnew file mode 100644 index 0000000000..cc04de0089 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/3.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/4.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/4.png Binary files differnew file mode 100644 index 0000000000..84d45df4c2 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/4.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/5.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/5.png Binary files differnew file mode 100644 index 0000000000..45f1196611 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/5.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/6.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/6.png Binary files differnew file mode 100644 index 0000000000..685991502e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/6.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/7.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/7.png Binary files differnew file mode 100644 index 0000000000..8e9c590652 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/7.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/8.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/8.png Binary files differnew file mode 100644 index 0000000000..3fae38f805 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/8.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/9.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/9.png Binary files differnew file mode 100644 index 0000000000..477400df07 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_button/uncertainty/9.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_slot/mesh.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_slot/mesh.png Binary files differnew file mode 100644 index 0000000000..a782e3dd7a --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_slot/mesh.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/overlay_slot/rack.png b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_slot/rack.png Binary files differnew file mode 100644 index 0000000000..8abaf83263 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/overlay_slot/rack.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector.png Binary files differnew file mode 100644 index 0000000000..c333d0ded8 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png Binary files differnew file mode 100644 index 0000000000..c043180b5c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png Binary files differnew file mode 100644 index 0000000000..f72c959a52 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png Binary files differnew file mode 100644 index 0000000000..cdc6b609af --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/gorge_logo.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png Binary files differnew file mode 100644 index 0000000000..daa67e29c0 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/heat_sink.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/heat_sink.png Binary files differnew file mode 100644 index 0000000000..238409ace8 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/heat_sink.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/heat_sink_small.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/heat_sink_small.png Binary files differnew file mode 100644 index 0000000000..28ac50bdc0 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/heat_sink_small.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png Binary files differnew file mode 100644 index 0000000000..7085898445 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png Binary files differnew file mode 100644 index 0000000000..6787270397 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_catalyst_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png Binary files differnew file mode 100644 index 0000000000..5fec5cdded --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png Binary files differnew file mode 100644 index 0000000000..148c8c9202 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_charge_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png Binary files differnew file mode 100644 index 0000000000..5a2f011349 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png Binary files differnew file mode 100644 index 0000000000..a37e194cb0 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_composition_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png Binary files differnew file mode 100644 index 0000000000..2ecf6e0617 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png Binary files differnew file mode 100644 index 0000000000..952c00a526 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/milestone_conversion_glow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png Binary files differnew file mode 100644 index 0000000000..8e2bb24af4 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_blue.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png Binary files differnew file mode 100644 index 0000000000..e49c9d70c4 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_green.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png Binary files differnew file mode 100644 index 0000000000..bbfc03392f --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_orange.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png Binary files differnew file mode 100644 index 0000000000..e189df603f --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/overlay_purple.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_blank.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_blank.png Binary files differnew file mode 100644 index 0000000000..bcd4f367d9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_blank.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_blue.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_blue.png Binary files differnew file mode 100644 index 0000000000..3bb337dcf9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_blue.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_cyan.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_cyan.png Binary files differnew file mode 100644 index 0000000000..1595bfde06 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_cyan.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_gray.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_gray.png Binary files differnew file mode 100644 index 0000000000..685bcd0c4a --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_gray.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_green.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_green.png Binary files differnew file mode 100644 index 0000000000..4464db4ef9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_green.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_orange.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_orange.png Binary files differnew file mode 100644 index 0000000000..8838c9b61b --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_orange.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_red.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_red.png Binary files differnew file mode 100644 index 0000000000..d934b38063 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/parameter_red.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/rack_large.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/rack_large.png Binary files differnew file mode 100644 index 0000000000..89b957b19a --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/rack_large.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo.png Binary files differnew file mode 100644 index 0000000000..704d04c26d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo_dark.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo_dark.png Binary files differnew file mode 100644 index 0000000000..bf12f0ccdb --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/tectech_logo_dark.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/indicator.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/indicator.png Binary files differnew file mode 100644 index 0000000000..fc56d4663d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/indicator.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_0.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_0.png Binary files differnew file mode 100644 index 0000000000..a5b0d20b38 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_0.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_1.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_1.png Binary files differnew file mode 100644 index 0000000000..39ec7d8ef0 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_1.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_2.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_2.png Binary files differnew file mode 100644 index 0000000000..b6a26cd8b1 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_2.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_3.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_3.png Binary files differnew file mode 100644 index 0000000000..4bc12814a4 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_3.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_4.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_4.png Binary files differnew file mode 100644 index 0000000000..c4e0f07e22 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_4.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_5.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_5.png Binary files differnew file mode 100644 index 0000000000..1dce4d241d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_5.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_6.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_6.png Binary files differnew file mode 100644 index 0000000000..17c55cb05d --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_6.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_7.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_7.png Binary files differnew file mode 100644 index 0000000000..0d25fffa61 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_7.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_8.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_8.png Binary files differnew file mode 100644 index 0000000000..f7c4d01ff6 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/invalid_8.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor.png Binary files differnew file mode 100644 index 0000000000..2510a1a99c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor_multimachine.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor_multimachine.png Binary files differnew file mode 100644 index 0000000000..b5d1afe3b8 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/monitor_multimachine.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/selected.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/selected.png Binary files differnew file mode 100644 index 0000000000..3837244126 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/selected.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_0.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_0.png Binary files differnew file mode 100644 index 0000000000..aa0d038e86 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_0.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_1.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_1.png Binary files differnew file mode 100644 index 0000000000..66ef4ee2af --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_1.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_2.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_2.png Binary files differnew file mode 100644 index 0000000000..bffac90814 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_2.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_3.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_3.png Binary files differnew file mode 100644 index 0000000000..1c66b00bc1 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_3.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_4.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_4.png Binary files differnew file mode 100644 index 0000000000..17a5f107d4 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_4.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_5.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_5.png Binary files differnew file mode 100644 index 0000000000..68617d1f96 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_5.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_6.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_6.png Binary files differnew file mode 100644 index 0000000000..0ea0bddaed --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_6.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_7.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_7.png Binary files differnew file mode 100644 index 0000000000..1801437459 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_7.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_8.png b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_8.png Binary files differnew file mode 100644 index 0000000000..89181e29e9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/picture/uncertainty/valid_8.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png Binary files differnew file mode 100644 index 0000000000..60e831ab7e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_plasma.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png Binary files differnew file mode 100644 index 0000000000..6c61bd82f3 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_background.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png Binary files differnew file mode 100644 index 0000000000..b3dcc01f22 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png Binary files differnew file mode 100644 index 0000000000..7e24ef4e71 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_blue_inverted.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png Binary files differnew file mode 100644 index 0000000000..526576713f --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png Binary files differnew file mode 100644 index 0000000000..cf0925e421 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_purple_inverted.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png Binary files differnew file mode 100644 index 0000000000..a09d6c94b8 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png Binary files differnew file mode 100644 index 0000000000..dde5ea73c4 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_rainbow_inverted.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png Binary files differnew file mode 100644 index 0000000000..a13093b3f5 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png Binary files differnew file mode 100644 index 0000000000..1945e452d8 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/godforge_progressbar_red_inverted.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_1.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_1.png Binary files differnew file mode 100644 index 0000000000..e1c451f81a --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_1.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_2.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_2.png Binary files differnew file mode 100644 index 0000000000..974a02f281 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_2.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_3.png b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_3.png Binary files differnew file mode 100644 index 0000000000..f1ba80dec7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/progressbar/research_station_3.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayItem.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayItem.png Binary files differnew file mode 100644 index 0000000000..dc9794a424 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayItem.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen1.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen1.png Binary files differnew file mode 100644 index 0000000000..e1e659718c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen1.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen2.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen2.png Binary files differnew file mode 100644 index 0000000000..fd29923b87 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen2.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen3.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen3.png Binary files differnew file mode 100644 index 0000000000..0dbe68fba6 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen3.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen4.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen4.png Binary files differnew file mode 100644 index 0000000000..a9488280c1 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen4.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen5.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen5.png Binary files differnew file mode 100644 index 0000000000..6cefaa0186 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen5.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen6.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen6.png Binary files differnew file mode 100644 index 0000000000..90cb09abac --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen6.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen7.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen7.png Binary files differnew file mode 100644 index 0000000000..6a11d2df4a --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen7.png diff --git a/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen8.png b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen8.png Binary files differnew file mode 100644 index 0000000000..bbe69099c2 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/gui/scanDisplayScreen8.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemAstralArray.png b/tectech/src/main/resources/assets/tectech/textures/items/itemAstralArray.png Binary files differnew file mode 100644 index 0000000000..b6dd9a88e6 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemAstralArray.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta b/tectech/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta new file mode 100644 index 0000000000..24f863c95e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemAstralArray.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorEV.png b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorEV.png Binary files differnew file mode 100644 index 0000000000..124188d3bd --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorEV.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorHV.png b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorHV.png Binary files differnew file mode 100644 index 0000000000..3500d8f6cb --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorHV.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorIV.png b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorIV.png Binary files differnew file mode 100644 index 0000000000..028f8a467e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorIV.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorLV.png b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorLV.png Binary files differnew file mode 100644 index 0000000000..13d1d0667e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorLV.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorLuV.png b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorLuV.png Binary files differnew file mode 100644 index 0000000000..0801e3f0d7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorLuV.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorMV.png b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorMV.png Binary files differnew file mode 100644 index 0000000000..fc364e52c3 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorMV.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorZPM.png b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorZPM.png Binary files differnew file mode 100644 index 0000000000..29b30dc63e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemCapacitorZPM.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemConstructable.png b/tectech/src/main/resources/assets/tectech/textures/items/itemConstructable.png Binary files differnew file mode 100644 index 0000000000..dd2b6911c9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemConstructable.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemDebugContainer.png b/tectech/src/main/resources/assets/tectech/textures/items/itemDebugContainer.png Binary files differnew file mode 100644 index 0000000000..3fdfb7f429 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemDebugContainer.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png Binary files differnew file mode 100644 index 0000000000..173d0c4e6c --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png.mcmeta b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png.mcmeta new file mode 100644 index 0000000000..24f863c95e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionContainer.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png Binary files differnew file mode 100644 index 0000000000..73c5274ef9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png.mcmeta b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png.mcmeta new file mode 100644 index 0000000000..24f863c95e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorage.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png Binary files differnew file mode 100644 index 0000000000..006ae1e62f --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png.mcmeta b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png.mcmeta new file mode 100644 index 0000000000..24f863c95e --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemDefinitionScanStorageOff.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":3 + } +}
\ No newline at end of file diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png b/tectech/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png Binary files differnew file mode 100644 index 0000000000..201f7e4090 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemEnderFluidLinkCover.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemEuMeterGT.png b/tectech/src/main/resources/assets/tectech/textures/items/itemEuMeterGT.png Binary files differnew file mode 100644 index 0000000000..a3297c5dd4 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemEuMeterGT.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemFrontRotate.png b/tectech/src/main/resources/assets/tectech/textures/items/itemFrontRotate.png Binary files differnew file mode 100644 index 0000000000..2d5d2b2ad9 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemFrontRotate.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardLocked.png b/tectech/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardLocked.png Binary files differnew file mode 100644 index 0000000000..2bdbb54ab7 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardLocked.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardUnlocked.png b/tectech/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardUnlocked.png Binary files differnew file mode 100644 index 0000000000..b61a1725af --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemParametrizerMemoryCardUnlocked.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemPowerPassUpgradeCover.png b/tectech/src/main/resources/assets/tectech/textures/items/itemPowerPassUpgradeCover.png Binary files differnew file mode 100644 index 0000000000..85f8a77b77 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemPowerPassUpgradeCover.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaComponent.png b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaComponent.png Binary files differnew file mode 100644 index 0000000000..77441e2b21 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaComponent.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaComponentUltimate.png b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaComponentUltimate.png Binary files differnew file mode 100644 index 0000000000..8a19f7a142 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaComponentUltimate.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaCover.png b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaCover.png Binary files differnew file mode 100644 index 0000000000..f3688b33b8 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaCover.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaCoverUltimate.png b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaCoverUltimate.png Binary files differnew file mode 100644 index 0000000000..e346fc2236 --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaCoverUltimate.png diff --git a/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaStaff.png b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaStaff.png Binary files differnew file mode 100644 index 0000000000..db124817cc --- /dev/null +++ b/tectech/src/main/resources/assets/tectech/textures/items/itemTeslaStaff.png diff --git a/tectech/src/main/resources/mcmod.info b/tectech/src/main/resources/mcmod.info new file mode 100644 index 0000000000..21ecee23f8 --- /dev/null +++ b/tectech/src/main/resources/mcmod.info @@ -0,0 +1,16 @@ +[ +{ + "modid": "${modId}", + "name": "${modName}", + "description": "TecTech - Tec Technology Interdimensional! Replace UUMatter with something overly complicated and annoying! (GT5u Addon)", + "version": "${modVersion}", + "mcversion": "${minecraftVersion}", + "url": "", + "updateUrl": "", + "authorList": ["_Technus_"], + "credits": "The Forge and FML guys, for making this example", + "logoFile": "TecTechIcon.png", + "screenshots": [], + "dependencies": [] +} +] |