From 89a89a6e21c2e9f9f199663eab0e45771c6e6fc4 Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Sun, 26 Mar 2023 16:20:21 +0700 Subject: [PATCH] Everything was done --- .gitignore | 118 +++++++++ build.gradle | 130 ++++++++++ gradle.properties | 2 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 56177 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 +++++++++++++ gradlew.bat | 84 +++++++ settings.gradle | 1 + src/generated/resources/.cache/cache | 40 +++ .../blockstates/exquisite_mana_altar.json | 19 ++ .../blockstates/greater_mana_altar.json | 19 ++ .../blockstates/lesser_mana_altar.json | 19 ++ .../blockstates/mana_transformer.json | 19 ++ .../blockstates/mana_transformer_mk2.json | 19 ++ .../assets/electromana/lang/en_us.json | 15 ++ .../models/block/exquisite_mana_altar.json | 9 + .../models/block/greater_mana_altar.json | 9 + .../models/block/lesser_mana_altar.json | 9 + .../models/block/mana_transformer.json | 9 + .../models/block/mana_transformer_mk2.json | 9 + .../models/item/exquisite_mana_altar.json | 3 + .../models/item/greater_mana_altar.json | 3 + .../models/item/lesser_mana_altar.json | 3 + .../models/item/mana_transformer.json | 3 + .../models/item/mana_transformer_mk2.json | 3 + .../models/item/reinforced_nether_star.json | 6 + .../item/reinforced_nether_star_piece.json | 6 + .../models/item/reinforced_plate.json | 6 + .../electromana/exquisite_mana_altar.json | 32 +++ .../electromana/greater_mana_altar.json | 32 +++ .../electromana/lesser_mana_altar.json | 32 +++ .../recipes/electromana/mana_transformer.json | 35 +++ .../electromana/mana_transformer_mk2.json | 32 +++ .../electromana/reinforced_nether_star.json | 35 +++ .../reinforced_nether_star_piece.json | 32 +++ .../recipes/electromana/reinforced_plate.json | 35 +++ .../blocks/exquisite_mana_altar.json | 26 ++ .../blocks/greater_mana_altar.json | 26 ++ .../loot_tables/blocks/lesser_mana_altar.json | 26 ++ .../loot_tables/blocks/mana_transformer.json | 26 ++ .../blocks/mana_transformer_mk2.json | 26 ++ .../recipes/exquisite_mana_altar.json | 23 ++ .../recipes/greater_mana_altar.json | 23 ++ .../recipes/lesser_mana_altar.json | 23 ++ .../electromana/recipes/mana_transformer.json | 23 ++ .../recipes/mana_transformer_mk2.json | 23 ++ .../recipes/reinforced_nether_star.json | 20 ++ .../recipes/reinforced_nether_star_piece.json | 19 ++ .../electromana/recipes/reinforced_plate.json | 23 ++ .../nuark/mods/electromana/ElectroMana.java | 37 +++ .../mods/electromana/ElectroManaBlocks.java | 30 +++ .../electromana/ElectroManaContainers.java | 20 ++ .../mods/electromana/ElectroManaItems.java | 71 ++++++ .../electromana/ElectroManaStructures.java | 178 ++++++++++++++ .../mods/electromana/ElectroManaTiles.java | 50 ++++ .../block/ExquisiteManaAltarBlock.java | 92 +++++++ .../block/GreaterManaAltarBlock.java | 93 +++++++ .../block/LesserManaAltarBlock.java | 90 +++++++ .../block/ManaTransformerBlock.java | 116 +++++++++ .../block/ManaTransformerMK2Block.java | 116 +++++++++ .../capabilities/ManaAltarEnergyStorage.java | 82 +++++++ .../ManaTransformerItemHandler.java | 36 +++ .../capabilities/ManaTransformerStorage.java | 94 +++++++ .../client/screens/ManaTransformerScreen.java | 112 +++++++++ .../container/ManaTransformerContainer.java | 148 +++++++++++ .../data/GeneratorBlockStates.java | 58 +++++ .../electromana/data/GeneratorItemModels.java | 41 ++++ .../electromana/data/GeneratorLanguage.java | 30 +++ .../mods/electromana/data/GeneratorLoots.java | 97 ++++++++ .../electromana/data/GeneratorRecipes.java | 118 +++++++++ .../mods/electromana/data/Generators.java | 26 ++ .../electromana/item/ManaTransformerItem.java | 43 ++++ .../item/ReinforcedNetherStarItem.java | 23 ++ .../item/ReinforcedNetherStarPieceItem.java | 18 ++ .../electromana/item/ReinforcedPlateItem.java | 23 ++ .../mods/electromana/setup/ClientSetup.java | 17 ++ .../nuark/mods/electromana/setup/Config.java | 48 ++++ .../mods/electromana/setup/ModSetup.java | 27 ++ .../mods/electromana/setup/Registration.java | 15 ++ .../electromana/structure/BlockArray.java | 62 +++++ .../electromana/structure/StructureType.java | 54 ++++ .../electromana/tile/BaseManaAltarTile.java | 32 +++ .../tile/BaseManaTransformerTile.java | 69 ++++++ .../tile/ExquisiteManaAltarTile.java | 153 ++++++++++++ .../tile/GreaterManaAltarTile.java | 155 ++++++++++++ .../electromana/tile/IMultiblockTile.java | 10 + .../electromana/tile/LesserManaAltarTile.java | 163 ++++++++++++ .../tile/ManaTransformerMK2Tile.java | 232 ++++++++++++++++++ .../electromana/tile/ManaTransformerTile.java | 232 ++++++++++++++++++ .../utils/BrokenStructureException.java | 7 + .../mods/electromana/utils/MathUtils.java | 7 + .../mods/electromana/utils/NetworkUtils.java | 16 ++ .../mods/electromana/utils/StringHelpers.java | 21 ++ .../mods/electromana/utils/SupplierUtils.java | 24 ++ src/main/resources/META-INF/mods.toml | 65 +++++ .../blocks/exquisite_mana_altar_front.png | Bin 0 -> 3132 bytes .../blocks/exquisite_mana_altar_side.png | Bin 0 -> 3225 bytes .../blocks/greater_mana_altar_front.png | Bin 0 -> 3119 bytes .../blocks/greater_mana_altar_side.png | Bin 0 -> 3225 bytes .../blocks/lesser_mana_altar_front.png | Bin 0 -> 3023 bytes .../blocks/lesser_mana_altar_side.png | Bin 0 -> 3225 bytes .../blocks/mana_transformer_mk2_side.png | Bin 0 -> 2870 bytes .../textures/blocks/mana_transformer_side.png | Bin 0 -> 2870 bytes .../textures/gui/mana_transformer.png | Bin 0 -> 2185 bytes .../textures/items/reinforced_nether_star.png | Bin 0 -> 423 bytes .../items/reinforced_nether_star_piece.png | Bin 0 -> 238 bytes .../textures/items/reinforced_plate.png | Bin 0 -> 359 bytes src/main/resources/pack.mcmeta | 7 + 108 files changed, 4570 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/generated/resources/.cache/cache create mode 100644 src/generated/resources/assets/electromana/blockstates/exquisite_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/blockstates/greater_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/blockstates/lesser_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/blockstates/mana_transformer.json create mode 100644 src/generated/resources/assets/electromana/blockstates/mana_transformer_mk2.json create mode 100644 src/generated/resources/assets/electromana/lang/en_us.json create mode 100644 src/generated/resources/assets/electromana/models/block/exquisite_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/models/block/greater_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/models/block/lesser_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/models/block/mana_transformer.json create mode 100644 src/generated/resources/assets/electromana/models/block/mana_transformer_mk2.json create mode 100644 src/generated/resources/assets/electromana/models/item/exquisite_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/models/item/greater_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/models/item/lesser_mana_altar.json create mode 100644 src/generated/resources/assets/electromana/models/item/mana_transformer.json create mode 100644 src/generated/resources/assets/electromana/models/item/mana_transformer_mk2.json create mode 100644 src/generated/resources/assets/electromana/models/item/reinforced_nether_star.json create mode 100644 src/generated/resources/assets/electromana/models/item/reinforced_nether_star_piece.json create mode 100644 src/generated/resources/assets/electromana/models/item/reinforced_plate.json create mode 100644 src/generated/resources/data/electromana/advancements/recipes/electromana/exquisite_mana_altar.json create mode 100644 src/generated/resources/data/electromana/advancements/recipes/electromana/greater_mana_altar.json create mode 100644 src/generated/resources/data/electromana/advancements/recipes/electromana/lesser_mana_altar.json create mode 100644 src/generated/resources/data/electromana/advancements/recipes/electromana/mana_transformer.json create mode 100644 src/generated/resources/data/electromana/advancements/recipes/electromana/mana_transformer_mk2.json create mode 100644 src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_nether_star.json create mode 100644 src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_nether_star_piece.json create mode 100644 src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_plate.json create mode 100644 src/generated/resources/data/electromana/loot_tables/blocks/exquisite_mana_altar.json create mode 100644 src/generated/resources/data/electromana/loot_tables/blocks/greater_mana_altar.json create mode 100644 src/generated/resources/data/electromana/loot_tables/blocks/lesser_mana_altar.json create mode 100644 src/generated/resources/data/electromana/loot_tables/blocks/mana_transformer.json create mode 100644 src/generated/resources/data/electromana/loot_tables/blocks/mana_transformer_mk2.json create mode 100644 src/generated/resources/data/electromana/recipes/exquisite_mana_altar.json create mode 100644 src/generated/resources/data/electromana/recipes/greater_mana_altar.json create mode 100644 src/generated/resources/data/electromana/recipes/lesser_mana_altar.json create mode 100644 src/generated/resources/data/electromana/recipes/mana_transformer.json create mode 100644 src/generated/resources/data/electromana/recipes/mana_transformer_mk2.json create mode 100644 src/generated/resources/data/electromana/recipes/reinforced_nether_star.json create mode 100644 src/generated/resources/data/electromana/recipes/reinforced_nether_star_piece.json create mode 100644 src/generated/resources/data/electromana/recipes/reinforced_plate.json create mode 100644 src/main/java/xyz/nuark/mods/electromana/ElectroMana.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/ElectroManaBlocks.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/ElectroManaContainers.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/ElectroManaItems.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/ElectroManaStructures.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/ElectroManaTiles.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/block/ExquisiteManaAltarBlock.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/block/GreaterManaAltarBlock.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/block/LesserManaAltarBlock.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/block/ManaTransformerBlock.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/block/ManaTransformerMK2Block.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/capabilities/ManaAltarEnergyStorage.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/capabilities/ManaTransformerItemHandler.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/capabilities/ManaTransformerStorage.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/client/screens/ManaTransformerScreen.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/container/ManaTransformerContainer.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/data/GeneratorBlockStates.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/data/GeneratorItemModels.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/data/GeneratorLanguage.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/data/GeneratorLoots.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/data/GeneratorRecipes.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/data/Generators.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/item/ManaTransformerItem.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/item/ReinforcedNetherStarItem.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/item/ReinforcedNetherStarPieceItem.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/item/ReinforcedPlateItem.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/setup/ClientSetup.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/setup/Config.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/setup/ModSetup.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/setup/Registration.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/structure/BlockArray.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/structure/StructureType.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/tile/BaseManaAltarTile.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/tile/BaseManaTransformerTile.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/tile/ExquisiteManaAltarTile.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/tile/GreaterManaAltarTile.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/tile/IMultiblockTile.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/tile/LesserManaAltarTile.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/tile/ManaTransformerMK2Tile.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/tile/ManaTransformerTile.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/utils/BrokenStructureException.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/utils/MathUtils.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/utils/NetworkUtils.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/utils/StringHelpers.java create mode 100644 src/main/java/xyz/nuark/mods/electromana/utils/SupplierUtils.java create mode 100644 src/main/resources/META-INF/mods.toml create mode 100644 src/main/resources/assets/electromana/textures/blocks/exquisite_mana_altar_front.png create mode 100644 src/main/resources/assets/electromana/textures/blocks/exquisite_mana_altar_side.png create mode 100644 src/main/resources/assets/electromana/textures/blocks/greater_mana_altar_front.png create mode 100644 src/main/resources/assets/electromana/textures/blocks/greater_mana_altar_side.png create mode 100644 src/main/resources/assets/electromana/textures/blocks/lesser_mana_altar_front.png create mode 100644 src/main/resources/assets/electromana/textures/blocks/lesser_mana_altar_side.png create mode 100644 src/main/resources/assets/electromana/textures/blocks/mana_transformer_mk2_side.png create mode 100644 src/main/resources/assets/electromana/textures/blocks/mana_transformer_side.png create mode 100644 src/main/resources/assets/electromana/textures/gui/mana_transformer.png create mode 100644 src/main/resources/assets/electromana/textures/items/reinforced_nether_star.png create mode 100644 src/main/resources/assets/electromana/textures/items/reinforced_nether_star_piece.png create mode 100644 src/main/resources/assets/electromana/textures/items/reinforced_plate.png create mode 100644 src/main/resources/pack.mcmeta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c37caf --- /dev/null +++ b/.gitignore @@ -0,0 +1,118 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Cache of project +.gradletasknamecache + +**/build/ + +# Common working directory +run/ + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..cfafe63 --- /dev/null +++ b/build.gradle @@ -0,0 +1,130 @@ +buildscript { + repositories { + maven { url = 'https://files.minecraftforge.net/maven' } + jcenter() + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true + } +} + +repositories { + maven { url 'https://maven.blamejared.com' } + maven { url 'https://maven.theillusivec4.top' } + maven { url 'https://maven.hellfiredev.net' } +} + +apply plugin: 'net.minecraftforge.gradle' + +group = 'xyz.nuark.mods' +version = '1.16.5-1.1.0' +archivesBaseName = 'ElectroMana' + +sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' + +minecraft { + mappings channel: 'snapshot', version: '20210309-1.16.5' + // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. + + // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + + runs { + client { + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + mods { + electromana { + source sourceSets.main + } + } + } + + server { + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + mods { + electromana { + source sourceSets.main + } + } + } + + data { + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + args '--mod', 'electromana', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + + mods { + electromana { + source sourceSets.main + } + } + } + } +} + +// Include resources generated by data generators. +sourceSets.main.resources { srcDir 'src/generated/resources' } + +dependencies { + minecraft 'net.minecraftforge:forge:1.16.5-36.1.16' + + def curios_version = "1.16.5-4.0.5.1" + def patchouli_version = "1.16.4-51" + def botania_version = "1.16.5-416" + + compileOnly "top.theillusivec4.curios:curios-forge:$curios_version:api" + runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:$curios_version") + + compileOnly fg.deobf("vazkii.patchouli:Patchouli:$patchouli_version:api") + runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:$patchouli_version") + + compileOnly fg.deobf("vazkii.botania:Botania:$botania_version:api") + runtimeOnly fg.deobf("vazkii.botania:Botania:$botania_version") +} + +// Example for how to get properties into the manifest for reading by the runtime.. +jar { + manifest { + attributes([ + "Specification-Title" : "electromana", + "Specification-Vendor" : "nuark", + "Specification-Version" : "1", // We are version 1 of ourselves + "Implementation-Title" : project.name, + "Implementation-Version" : project.version, + "Implementation-Vendor" : "nuark", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} + +jar.finalizedBy('reobfJar') diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..29b2ac4 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..94336fcae912db8a11d55634156fa011f4686124 GIT binary patch literal 56177 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 i;x|p)^~-yfPOPa3(|vBayXKz \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem 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= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +: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 %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..aba4cb9 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'ElectroMana' diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache new file mode 100644 index 0000000..2bd1147 --- /dev/null +++ b/src/generated/resources/.cache/cache @@ -0,0 +1,40 @@ +fc34001f56ccdf901b1e4b6868b1fd8823cb1d65 assets/electromana/blockstates/exquisite_mana_altar.json +25880ffbda8c120090630f93e049aea9a61ba53a assets/electromana/blockstates/greater_mana_altar.json +d17a596253235bc124b60a1d274694ab4712d758 assets/electromana/blockstates/lesser_mana_altar.json +14de5a2ca00f6042ca4ae23134d021e20018021b assets/electromana/blockstates/mana_transformer.json +06b8314324a3b297ec0526eaa4cfde52cd647846 assets/electromana/blockstates/mana_transformer_mk2.json +0c7c2951c1780184e9e8360bb5bb5a7048e9def5 assets/electromana/lang/en_us.json +5a7662a513336702499549af054d4ab93c3ac786 assets/electromana/models/block/exquisite_mana_altar.json +e44bbebffc4a41a346ecc2de19d4f3ff90ea7c95 assets/electromana/models/block/greater_mana_altar.json +17efee728cd3fa87e2de40f5785fcbc29a13eed3 assets/electromana/models/block/lesser_mana_altar.json +93f66170e29647ed2fb61aa53fa776c537866bd9 assets/electromana/models/block/mana_transformer.json +3337e8b56b3f8a58e2af6b01ba006bf1b6105dee assets/electromana/models/block/mana_transformer_mk2.json +fb6f49c561c954baa55ecdf314f063703334f90c assets/electromana/models/item/exquisite_mana_altar.json +2870b3cba0a892cef0bede4dcbff2cb10541a6a6 assets/electromana/models/item/greater_mana_altar.json +3303ab1db0e593d0c7f82ada8f2bb07cd172a163 assets/electromana/models/item/lesser_mana_altar.json +e25d5f927eb586ab9a473bc9c5fdc7681f389d8b assets/electromana/models/item/mana_transformer.json +8308adb6ac0fae9a742532bda2192bca35dfac6e assets/electromana/models/item/mana_transformer_mk2.json +e4e6e959a9856a03669d18890a4d626956664bae assets/electromana/models/item/reinforced_nether_star.json +0e80283003810968c48355c90dd0876475e84fd8 assets/electromana/models/item/reinforced_nether_star_piece.json +56ca4076dd581cfe45d4fee103e3a907fbdf98de assets/electromana/models/item/reinforced_plate.json +3ec95caae98f6533e1b76057f48be049763d0f48 data/electromana/advancements/recipes/electromana/exquisite_mana_altar.json +c5ecfe8b3eff83e243e7cb1bd8d2cdf0474b0b07 data/electromana/advancements/recipes/electromana/greater_mana_altar.json +7cc0a2332ec7515d9d2fac490667ccad227bc86c data/electromana/advancements/recipes/electromana/lesser_mana_altar.json +8fd1f37dd3228c7723d983f860cab7a39b0636bb data/electromana/advancements/recipes/electromana/mana_transformer.json +b575e20bb6d44a30067b7451e54edfa194c82971 data/electromana/advancements/recipes/electromana/mana_transformer_mk2.json +df4d565ee00fa4bc52c390995ee037a7fd54b51f data/electromana/advancements/recipes/electromana/reinforced_nether_star.json +3e564b34a8d7c1e5dc513d1bec1fdfed02debf88 data/electromana/advancements/recipes/electromana/reinforced_nether_star_piece.json +5db99dde40bb18c275bef16b0969632ed283d09e data/electromana/advancements/recipes/electromana/reinforced_plate.json +673469adf39785c71afdb0d2a2852f46c4bf2da0 data/electromana/loot_tables/blocks/exquisite_mana_altar.json +43c4a74271401d607308053cffcc51a3110f1e7b data/electromana/loot_tables/blocks/greater_mana_altar.json +510ceed371e14a5583d5616908d3f1b7f50af725 data/electromana/loot_tables/blocks/lesser_mana_altar.json +897cce21980e7d90d7a9194d99dddc2cb8c576e1 data/electromana/loot_tables/blocks/mana_transformer.json +0a40ef01b3286cf63081f788207c9e038c909ea3 data/electromana/loot_tables/blocks/mana_transformer_mk2.json +ffe0c79f7e04357196755f31d449564ebdcd6c82 data/electromana/recipes/exquisite_mana_altar.json +ade5957cec8d40bc305b14c4ccdba1174689c239 data/electromana/recipes/greater_mana_altar.json +c8c72bce25887a8612ded89485b66170407c12b2 data/electromana/recipes/lesser_mana_altar.json +46f2dea06029206f839201d9bd7bbc3eb5acf3c0 data/electromana/recipes/mana_transformer.json +f7a045d657a558ac4837d1186ad657bbc27b5cf9 data/electromana/recipes/mana_transformer_mk2.json +8f89f67b162e69594bae0dd5b025e4f6e5ddd472 data/electromana/recipes/reinforced_nether_star.json +c3b635315ae25b0e4899f22add9694cd4946877a data/electromana/recipes/reinforced_nether_star_piece.json +27af7685a92151721edda80ce85ad266e708fd07 data/electromana/recipes/reinforced_plate.json diff --git a/src/generated/resources/assets/electromana/blockstates/exquisite_mana_altar.json b/src/generated/resources/assets/electromana/blockstates/exquisite_mana_altar.json new file mode 100644 index 0000000..7096246 --- /dev/null +++ b/src/generated/resources/assets/electromana/blockstates/exquisite_mana_altar.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "electromana:block/exquisite_mana_altar" + }, + "facing=south": { + "model": "electromana:block/exquisite_mana_altar", + "y": 180 + }, + "facing=west": { + "model": "electromana:block/exquisite_mana_altar", + "y": 270 + }, + "facing=east": { + "model": "electromana:block/exquisite_mana_altar", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/blockstates/greater_mana_altar.json b/src/generated/resources/assets/electromana/blockstates/greater_mana_altar.json new file mode 100644 index 0000000..1219001 --- /dev/null +++ b/src/generated/resources/assets/electromana/blockstates/greater_mana_altar.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "electromana:block/greater_mana_altar" + }, + "facing=south": { + "model": "electromana:block/greater_mana_altar", + "y": 180 + }, + "facing=west": { + "model": "electromana:block/greater_mana_altar", + "y": 270 + }, + "facing=east": { + "model": "electromana:block/greater_mana_altar", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/blockstates/lesser_mana_altar.json b/src/generated/resources/assets/electromana/blockstates/lesser_mana_altar.json new file mode 100644 index 0000000..8567d6f --- /dev/null +++ b/src/generated/resources/assets/electromana/blockstates/lesser_mana_altar.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "electromana:block/lesser_mana_altar" + }, + "facing=south": { + "model": "electromana:block/lesser_mana_altar", + "y": 180 + }, + "facing=west": { + "model": "electromana:block/lesser_mana_altar", + "y": 270 + }, + "facing=east": { + "model": "electromana:block/lesser_mana_altar", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/blockstates/mana_transformer.json b/src/generated/resources/assets/electromana/blockstates/mana_transformer.json new file mode 100644 index 0000000..ca90208 --- /dev/null +++ b/src/generated/resources/assets/electromana/blockstates/mana_transformer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "electromana:block/mana_transformer" + }, + "facing=south": { + "model": "electromana:block/mana_transformer", + "y": 180 + }, + "facing=west": { + "model": "electromana:block/mana_transformer", + "y": 270 + }, + "facing=east": { + "model": "electromana:block/mana_transformer", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/blockstates/mana_transformer_mk2.json b/src/generated/resources/assets/electromana/blockstates/mana_transformer_mk2.json new file mode 100644 index 0000000..623bc16 --- /dev/null +++ b/src/generated/resources/assets/electromana/blockstates/mana_transformer_mk2.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "electromana:block/mana_transformer_mk2" + }, + "facing=south": { + "model": "electromana:block/mana_transformer_mk2", + "y": 180 + }, + "facing=west": { + "model": "electromana:block/mana_transformer_mk2", + "y": 270 + }, + "facing=east": { + "model": "electromana:block/mana_transformer_mk2", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/lang/en_us.json b/src/generated/resources/assets/electromana/lang/en_us.json new file mode 100644 index 0000000..ece2c15 --- /dev/null +++ b/src/generated/resources/assets/electromana/lang/en_us.json @@ -0,0 +1,15 @@ +{ + "block.electromana.exquisite_mana_altar": "Exquisite Mana Altar", + "block.electromana.greater_mana_altar": "Greater Mana Altar", + "block.electromana.lesser_mana_altar": "Lesser Mana Altar", + "block.electromana.mana_transformer": "Mana Transformer", + "block.electromana.mana_transformer_mk2": "Mana Transformer MK2", + "item.electromana.reinforced_nether_star": "Reinforced Nether Star", + "item.electromana.reinforced_nether_star_piece": "Reinforced Nether Star Piece", + "item.electromana.reinforced_plate": "Reinforced Plate", + "itemGroup.electromana": "ElectroMana", + "screen.electromana.burn_time": "Burn time left: %ss", + "screen.electromana.energy": "Energy: %s/%s FE", + "screen.electromana.mana": "Mana: %s/%s", + "screen.electromana.no_fuel": "Fuel source empty" +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/block/exquisite_mana_altar.json b/src/generated/resources/assets/electromana/models/block/exquisite_mana_altar.json new file mode 100644 index 0000000..5dce9e6 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/block/exquisite_mana_altar.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "side": "electromana:blocks/exquisite_mana_altar_side", + "front": "electromana:blocks/exquisite_mana_altar_front", + "bottom": "electromana:blocks/exquisite_mana_altar_side", + "top": "electromana:blocks/exquisite_mana_altar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/block/greater_mana_altar.json b/src/generated/resources/assets/electromana/models/block/greater_mana_altar.json new file mode 100644 index 0000000..0066294 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/block/greater_mana_altar.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "side": "electromana:blocks/greater_mana_altar_side", + "front": "electromana:blocks/greater_mana_altar_front", + "bottom": "electromana:blocks/greater_mana_altar_side", + "top": "electromana:blocks/greater_mana_altar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/block/lesser_mana_altar.json b/src/generated/resources/assets/electromana/models/block/lesser_mana_altar.json new file mode 100644 index 0000000..823b3f3 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/block/lesser_mana_altar.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "side": "electromana:blocks/lesser_mana_altar_side", + "front": "electromana:blocks/lesser_mana_altar_front", + "bottom": "electromana:blocks/lesser_mana_altar_side", + "top": "electromana:blocks/lesser_mana_altar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/block/mana_transformer.json b/src/generated/resources/assets/electromana/models/block/mana_transformer.json new file mode 100644 index 0000000..22fc12f --- /dev/null +++ b/src/generated/resources/assets/electromana/models/block/mana_transformer.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "side": "electromana:blocks/mana_transformer_side", + "front": "electromana:blocks/mana_transformer_side", + "bottom": "electromana:blocks/mana_transformer_side", + "top": "electromana:blocks/mana_transformer_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/block/mana_transformer_mk2.json b/src/generated/resources/assets/electromana/models/block/mana_transformer_mk2.json new file mode 100644 index 0000000..3df26d6 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/block/mana_transformer_mk2.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "side": "electromana:blocks/mana_transformer_mk2_side", + "front": "electromana:blocks/mana_transformer_mk2_side", + "bottom": "electromana:blocks/mana_transformer_mk2_side", + "top": "electromana:blocks/mana_transformer_mk2_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/item/exquisite_mana_altar.json b/src/generated/resources/assets/electromana/models/item/exquisite_mana_altar.json new file mode 100644 index 0000000..146ed46 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/item/exquisite_mana_altar.json @@ -0,0 +1,3 @@ +{ + "parent": "electromana:block/exquisite_mana_altar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/item/greater_mana_altar.json b/src/generated/resources/assets/electromana/models/item/greater_mana_altar.json new file mode 100644 index 0000000..f04a701 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/item/greater_mana_altar.json @@ -0,0 +1,3 @@ +{ + "parent": "electromana:block/greater_mana_altar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/item/lesser_mana_altar.json b/src/generated/resources/assets/electromana/models/item/lesser_mana_altar.json new file mode 100644 index 0000000..6fa3264 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/item/lesser_mana_altar.json @@ -0,0 +1,3 @@ +{ + "parent": "electromana:block/lesser_mana_altar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/item/mana_transformer.json b/src/generated/resources/assets/electromana/models/item/mana_transformer.json new file mode 100644 index 0000000..c47642f --- /dev/null +++ b/src/generated/resources/assets/electromana/models/item/mana_transformer.json @@ -0,0 +1,3 @@ +{ + "parent": "electromana:block/mana_transformer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/item/mana_transformer_mk2.json b/src/generated/resources/assets/electromana/models/item/mana_transformer_mk2.json new file mode 100644 index 0000000..d9222c1 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/item/mana_transformer_mk2.json @@ -0,0 +1,3 @@ +{ + "parent": "electromana:block/mana_transformer_mk2" +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/item/reinforced_nether_star.json b/src/generated/resources/assets/electromana/models/item/reinforced_nether_star.json new file mode 100644 index 0000000..4cecadf --- /dev/null +++ b/src/generated/resources/assets/electromana/models/item/reinforced_nether_star.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "electromana:items/reinforced_nether_star" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/item/reinforced_nether_star_piece.json b/src/generated/resources/assets/electromana/models/item/reinforced_nether_star_piece.json new file mode 100644 index 0000000..98cb9e7 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/item/reinforced_nether_star_piece.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "electromana:items/reinforced_nether_star_piece" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/electromana/models/item/reinforced_plate.json b/src/generated/resources/assets/electromana/models/item/reinforced_plate.json new file mode 100644 index 0000000..4ae5315 --- /dev/null +++ b/src/generated/resources/assets/electromana/models/item/reinforced_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "electromana:items/reinforced_plate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/advancements/recipes/electromana/exquisite_mana_altar.json b/src/generated/resources/data/electromana/advancements/recipes/electromana/exquisite_mana_altar.json new file mode 100644 index 0000000..2d16203 --- /dev/null +++ b/src/generated/resources/data/electromana/advancements/recipes/electromana/exquisite_mana_altar.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "electromana:exquisite_mana_altar" + ] + }, + "criteria": { + "mana_altar_greater": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "electromana:greater_mana_altar" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "electromana:exquisite_mana_altar" + } + } + }, + "requirements": [ + [ + "mana_altar_greater", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/advancements/recipes/electromana/greater_mana_altar.json b/src/generated/resources/data/electromana/advancements/recipes/electromana/greater_mana_altar.json new file mode 100644 index 0000000..680f6cd --- /dev/null +++ b/src/generated/resources/data/electromana/advancements/recipes/electromana/greater_mana_altar.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "electromana:greater_mana_altar" + ] + }, + "criteria": { + "mana_altar_lesser": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "electromana:lesser_mana_altar" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "electromana:greater_mana_altar" + } + } + }, + "requirements": [ + [ + "mana_altar_lesser", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/advancements/recipes/electromana/lesser_mana_altar.json b/src/generated/resources/data/electromana/advancements/recipes/electromana/lesser_mana_altar.json new file mode 100644 index 0000000..5b7c0ab --- /dev/null +++ b/src/generated/resources/data/electromana/advancements/recipes/electromana/lesser_mana_altar.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "electromana:lesser_mana_altar" + ] + }, + "criteria": { + "mana_mk2": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "electromana:mana_transformer_mk2" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "electromana:lesser_mana_altar" + } + } + }, + "requirements": [ + [ + "mana_mk2", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/advancements/recipes/electromana/mana_transformer.json b/src/generated/resources/data/electromana/advancements/recipes/electromana/mana_transformer.json new file mode 100644 index 0000000..6d752fc --- /dev/null +++ b/src/generated/resources/data/electromana/advancements/recipes/electromana/mana_transformer.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "electromana:mana_transformer" + ] + }, + "criteria": { + "created_reinforced_nether_star_and_pieces": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "electromana:reinforced_nether_star" + }, + { + "item": "electromana:reinforced_nether_star_piece" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "electromana:mana_transformer" + } + } + }, + "requirements": [ + [ + "created_reinforced_nether_star_and_pieces", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/advancements/recipes/electromana/mana_transformer_mk2.json b/src/generated/resources/data/electromana/advancements/recipes/electromana/mana_transformer_mk2.json new file mode 100644 index 0000000..7b611c3 --- /dev/null +++ b/src/generated/resources/data/electromana/advancements/recipes/electromana/mana_transformer_mk2.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "electromana:mana_transformer_mk2" + ] + }, + "criteria": { + "mana_mk1": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "electromana:mana_transformer" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "electromana:mana_transformer_mk2" + } + } + }, + "requirements": [ + [ + "mana_mk1", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_nether_star.json b/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_nether_star.json new file mode 100644 index 0000000..30954d6 --- /dev/null +++ b/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_nether_star.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "electromana:reinforced_nether_star" + ] + }, + "criteria": { + "killed_wither_mined_scrap": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:netherite_scrap" + }, + { + "item": "minecraft:nether_star" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "electromana:reinforced_nether_star" + } + } + }, + "requirements": [ + [ + "killed_wither_mined_scrap", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_nether_star_piece.json b/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_nether_star_piece.json new file mode 100644 index 0000000..3922fe9 --- /dev/null +++ b/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_nether_star_piece.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "electromana:reinforced_nether_star_piece" + ] + }, + "criteria": { + "created_reinforced_nether_star": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "electromana:reinforced_nether_star" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "electromana:reinforced_nether_star_piece" + } + } + }, + "requirements": [ + [ + "created_reinforced_nether_star", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_plate.json b/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_plate.json new file mode 100644 index 0000000..6150938 --- /dev/null +++ b/src/generated/resources/data/electromana/advancements/recipes/electromana/reinforced_plate.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "electromana:reinforced_plate" + ] + }, + "criteria": { + "created_reinforced_nether_star_and_pieces": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "electromana:reinforced_nether_star" + }, + { + "item": "electromana:reinforced_nether_star_piece" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "electromana:reinforced_plate" + } + } + }, + "requirements": [ + [ + "created_reinforced_nether_star_and_pieces", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/loot_tables/blocks/exquisite_mana_altar.json b/src/generated/resources/data/electromana/loot_tables/blocks/exquisite_mana_altar.json new file mode 100644 index 0000000..a6a090c --- /dev/null +++ b/src/generated/resources/data/electromana/loot_tables/blocks/exquisite_mana_altar.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "name": "electromana:exquisite_mana_altar", + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "electromana:lesser_mana_altar" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/loot_tables/blocks/greater_mana_altar.json b/src/generated/resources/data/electromana/loot_tables/blocks/greater_mana_altar.json new file mode 100644 index 0000000..594ba45 --- /dev/null +++ b/src/generated/resources/data/electromana/loot_tables/blocks/greater_mana_altar.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "name": "electromana:greater_mana_altar", + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "electromana:lesser_mana_altar" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/loot_tables/blocks/lesser_mana_altar.json b/src/generated/resources/data/electromana/loot_tables/blocks/lesser_mana_altar.json new file mode 100644 index 0000000..fc91f9e --- /dev/null +++ b/src/generated/resources/data/electromana/loot_tables/blocks/lesser_mana_altar.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "name": "electromana:lesser_mana_altar", + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "electromana:lesser_mana_altar" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/loot_tables/blocks/mana_transformer.json b/src/generated/resources/data/electromana/loot_tables/blocks/mana_transformer.json new file mode 100644 index 0000000..51db1d2 --- /dev/null +++ b/src/generated/resources/data/electromana/loot_tables/blocks/mana_transformer.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "name": "electromana:mana_transformer", + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "electromana:mana_transformer" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/loot_tables/blocks/mana_transformer_mk2.json b/src/generated/resources/data/electromana/loot_tables/blocks/mana_transformer_mk2.json new file mode 100644 index 0000000..75001fd --- /dev/null +++ b/src/generated/resources/data/electromana/loot_tables/blocks/mana_transformer_mk2.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "name": "electromana:mana_transformer_mk2", + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "electromana:mana_transformer_mk2" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/recipes/exquisite_mana_altar.json b/src/generated/resources/data/electromana/recipes/exquisite_mana_altar.json new file mode 100644 index 0000000..64d38d5 --- /dev/null +++ b/src/generated/resources/data/electromana/recipes/exquisite_mana_altar.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "electromana", + "pattern": [ + "ppp", + "pcp", + "ttt" + ], + "key": { + "c": { + "item": "electromana:reinforced_nether_star" + }, + "t": { + "item": "electromana:greater_mana_altar" + }, + "p": { + "item": "electromana:reinforced_plate" + } + }, + "result": { + "item": "electromana:exquisite_mana_altar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/recipes/greater_mana_altar.json b/src/generated/resources/data/electromana/recipes/greater_mana_altar.json new file mode 100644 index 0000000..a85d896 --- /dev/null +++ b/src/generated/resources/data/electromana/recipes/greater_mana_altar.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "electromana", + "pattern": [ + "ppp", + "pcp", + "ttt" + ], + "key": { + "c": { + "item": "electromana:reinforced_nether_star" + }, + "t": { + "item": "electromana:lesser_mana_altar" + }, + "p": { + "item": "electromana:reinforced_plate" + } + }, + "result": { + "item": "electromana:greater_mana_altar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/recipes/lesser_mana_altar.json b/src/generated/resources/data/electromana/recipes/lesser_mana_altar.json new file mode 100644 index 0000000..57de384 --- /dev/null +++ b/src/generated/resources/data/electromana/recipes/lesser_mana_altar.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "electromana", + "pattern": [ + "ppp", + "pcp", + "ttt" + ], + "key": { + "c": { + "item": "electromana:reinforced_nether_star" + }, + "t": { + "item": "electromana:mana_transformer_mk2" + }, + "p": { + "item": "electromana:reinforced_plate" + } + }, + "result": { + "item": "electromana:lesser_mana_altar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/recipes/mana_transformer.json b/src/generated/resources/data/electromana/recipes/mana_transformer.json new file mode 100644 index 0000000..9b6a2dc --- /dev/null +++ b/src/generated/resources/data/electromana/recipes/mana_transformer.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "electromana", + "pattern": [ + "iii", + "dcd", + "iii" + ], + "key": { + "i": { + "item": "electromana:reinforced_nether_star_piece" + }, + "c": { + "item": "electromana:reinforced_nether_star" + }, + "d": { + "item": "electromana:reinforced_plate" + } + }, + "result": { + "item": "electromana:mana_transformer" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/recipes/mana_transformer_mk2.json b/src/generated/resources/data/electromana/recipes/mana_transformer_mk2.json new file mode 100644 index 0000000..e213e3f --- /dev/null +++ b/src/generated/resources/data/electromana/recipes/mana_transformer_mk2.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "electromana", + "pattern": [ + "tpt", + "pcp", + "tpt" + ], + "key": { + "t": { + "item": "electromana:mana_transformer" + }, + "p": { + "item": "electromana:reinforced_nether_star_piece" + }, + "c": { + "item": "electromana:reinforced_nether_star" + } + }, + "result": { + "item": "electromana:mana_transformer_mk2" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/recipes/reinforced_nether_star.json b/src/generated/resources/data/electromana/recipes/reinforced_nether_star.json new file mode 100644 index 0000000..617f0db --- /dev/null +++ b/src/generated/resources/data/electromana/recipes/reinforced_nether_star.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "electromana", + "pattern": [ + "sss", + "scs", + "sss" + ], + "key": { + "s": { + "item": "minecraft:netherite_scrap" + }, + "c": { + "item": "minecraft:nether_star" + } + }, + "result": { + "item": "electromana:reinforced_nether_star" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/recipes/reinforced_nether_star_piece.json b/src/generated/resources/data/electromana/recipes/reinforced_nether_star_piece.json new file mode 100644 index 0000000..56f69d0 --- /dev/null +++ b/src/generated/resources/data/electromana/recipes/reinforced_nether_star_piece.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "electromana", + "ingredients": [ + { + "item": "electromana:reinforced_nether_star" + }, + { + "item": "minecraft:gunpowder" + }, + { + "item": "minecraft:flint" + } + ], + "result": { + "item": "electromana:reinforced_nether_star_piece", + "count": 2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/electromana/recipes/reinforced_plate.json b/src/generated/resources/data/electromana/recipes/reinforced_plate.json new file mode 100644 index 0000000..179f477 --- /dev/null +++ b/src/generated/resources/data/electromana/recipes/reinforced_plate.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "electromana", + "pattern": [ + "isi", + "scs", + "isi" + ], + "key": { + "s": { + "item": "electromana:reinforced_nether_star_piece" + }, + "c": { + "item": "electromana:reinforced_nether_star" + }, + "i": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "electromana:reinforced_plate" + } +} \ No newline at end of file diff --git a/src/main/java/xyz/nuark/mods/electromana/ElectroMana.java b/src/main/java/xyz/nuark/mods/electromana/ElectroMana.java new file mode 100644 index 0000000..be92666 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/ElectroMana.java @@ -0,0 +1,37 @@ +package xyz.nuark.mods.electromana; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import xyz.nuark.mods.electromana.setup.ClientSetup; +import xyz.nuark.mods.electromana.setup.Config; +import xyz.nuark.mods.electromana.setup.ModSetup; +import xyz.nuark.mods.electromana.setup.Registration; + +@Mod(ElectroMana.ID) +public class ElectroMana { + public static final String ID = "electromana"; + public static final String NAME = "ElectroMana"; + + private static final Logger LOGGER = LogManager.getLogger(); + + public ElectroMana() { + ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, Config.CLIENT_CONFIG); + ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, Config.SERVER_CONFIG); + + Registration.init(); + + FMLJavaModLoadingContext.get().getModEventBus().addListener(ModSetup::init); + FMLJavaModLoadingContext.get().getModEventBus().addListener(ClientSetup::init); + + MinecraftForge.EVENT_BUS.register(this); + } + + public static Logger getLOGGER() { + return LOGGER; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/ElectroManaBlocks.java b/src/main/java/xyz/nuark/mods/electromana/ElectroManaBlocks.java new file mode 100644 index 0000000..eb917f3 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/ElectroManaBlocks.java @@ -0,0 +1,30 @@ +package xyz.nuark.mods.electromana; + +import net.minecraft.block.Block; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import xyz.nuark.mods.electromana.block.ExquisiteManaAltarBlock; +import xyz.nuark.mods.electromana.block.GreaterManaAltarBlock; +import xyz.nuark.mods.electromana.block.LesserManaAltarBlock; +import xyz.nuark.mods.electromana.block.ManaTransformerBlock; +import xyz.nuark.mods.electromana.block.ManaTransformerMK2Block; + +public class ElectroManaBlocks { + private static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, ElectroMana.ID); + + public static final RegistryObject MANA_TRANSFORMER = BLOCKS.register("mana_transformer", ManaTransformerBlock::new); + + public static final RegistryObject MANA_TRANSFORMER_MK2 = BLOCKS.register("mana_transformer_mk2", ManaTransformerMK2Block::new); + + public static final RegistryObject LESSER_MANA_ALTAR = BLOCKS.register("lesser_mana_altar", LesserManaAltarBlock::new); + + public static final RegistryObject GREATER_MANA_ALTAR = BLOCKS.register("greater_mana_altar", GreaterManaAltarBlock::new); + + public static final RegistryObject EXQUISITE_MANA_ALTAR = BLOCKS.register("exquisite_mana_altar", ExquisiteManaAltarBlock::new); + + public static void register() { + BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/ElectroManaContainers.java b/src/main/java/xyz/nuark/mods/electromana/ElectroManaContainers.java new file mode 100644 index 0000000..44d8bcc --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/ElectroManaContainers.java @@ -0,0 +1,20 @@ +package xyz.nuark.mods.electromana; + +import net.minecraft.inventory.container.ContainerType; +import net.minecraftforge.common.extensions.IForgeContainerType; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import xyz.nuark.mods.electromana.container.ManaTransformerContainer; + +public class ElectroManaContainers { + public static final DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.CONTAINERS, ElectroMana.ID); + + public static final RegistryObject> MANA_TRANSFORMER_CONTAINER = + CONTAINERS.register("mana_transformer_container", () -> IForgeContainerType.create(ManaTransformerContainer::new)); + + public static void register() { + CONTAINERS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/ElectroManaItems.java b/src/main/java/xyz/nuark/mods/electromana/ElectroManaItems.java new file mode 100644 index 0000000..e8a7ce2 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/ElectroManaItems.java @@ -0,0 +1,71 @@ +package xyz.nuark.mods.electromana; + +import net.minecraft.item.Item; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import xyz.nuark.mods.electromana.item.ManaTransformerItem; +import xyz.nuark.mods.electromana.item.ReinforcedNetherStarItem; +import xyz.nuark.mods.electromana.item.ReinforcedNetherStarPieceItem; +import xyz.nuark.mods.electromana.item.ReinforcedPlateItem; +import xyz.nuark.mods.electromana.setup.ModSetup; + +public class ElectroManaItems { + private static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ElectroMana.ID); + + public static final RegistryObject MANA_TRANSFORMER_ITEM = + ITEMS.register( + "mana_transformer", + () -> new ManaTransformerItem(ElectroManaBlocks.MANA_TRANSFORMER.get(), ModSetup.ITEM_PROPS) + ); + + public static final RegistryObject MANA_TRANSFORMER_ITEM_MK2 = + ITEMS.register( + "mana_transformer_mk2", + () -> new ManaTransformerItem(ElectroManaBlocks.MANA_TRANSFORMER_MK2.get(), ModSetup.ITEM_PROPS) + ); + + public static final RegistryObject LESSER_MANA_ALTAR_ITEM = + ITEMS.register( + "lesser_mana_altar", + () -> new ManaTransformerItem(ElectroManaBlocks.LESSER_MANA_ALTAR.get(), ModSetup.ITEM_PROPS) + ); + + public static final RegistryObject GREATER_MANA_ALTAR_ITEM = + ITEMS.register( + "greater_mana_altar", + () -> new ManaTransformerItem(ElectroManaBlocks.GREATER_MANA_ALTAR.get(), ModSetup.ITEM_PROPS) + ); + + public static final RegistryObject EXQUISITE_MANA_ALTAR_ITEM = + ITEMS.register( + "exquisite_mana_altar", + () -> new ManaTransformerItem(ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get(), ModSetup.ITEM_PROPS) + ); + + + public static final RegistryObject REINFORCED_NETHER_STAR = + ITEMS.register( + "reinforced_nether_star", + ReinforcedNetherStarItem::new + ); + + + public static final RegistryObject REINFORCED_NETHER_STAR_PIECE = + ITEMS.register( + "reinforced_nether_star_piece", + ReinforcedNetherStarPieceItem::new + ); + + + public static final RegistryObject REINFORCED_PLATE = + ITEMS.register( + "reinforced_plate", + ReinforcedPlateItem::new + ); + + public static void register() { + ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/ElectroManaStructures.java b/src/main/java/xyz/nuark/mods/electromana/ElectroManaStructures.java new file mode 100644 index 0000000..10192b3 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/ElectroManaStructures.java @@ -0,0 +1,178 @@ +package xyz.nuark.mods.electromana; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.registries.ForgeRegistries; +import xyz.nuark.mods.electromana.structure.BlockArray; +import xyz.nuark.mods.electromana.structure.StructureType; + +public class ElectroManaStructures { + public static final StructureType LESSER_MANA_ALTAR_STRUCTURE = new StructureType( + new ResourceLocation(ElectroMana.ID, "lesser_mana_altar"), + new BlockPos(2,3,2), + () -> { + BlockArray struct = new BlockArray(5, 4); + + Block a = null; + Block c = ElectroManaBlocks.LESSER_MANA_ALTAR.get(); + Block p = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:mana_pylon")); + Block s = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:manasteel_block")); + Block d = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:mana_diamond_block")); + + Block[][][] blocksMatrix = { + { + {s,s,s,s,s}, + {s,s,s,s,s}, + {s,s,d,s,s}, + {s,s,s,s,s}, + {s,s,s,s,s}, + }, + { + {p,a,a,a,p}, + {a,d,d,d,a}, + {a,d,d,d,a}, + {a,d,d,d,a}, + {p,a,a,a,p}, + }, + { + {a,a,a,a,a}, + {a,a,a,a,a}, + {a,a,d,a,a}, + {a,a,a,a,a}, + {a,a,a,a,a}, + }, + { + {a,a,a,a,a}, + {a,a,a,a,a}, + {a,a,c,a,a}, + {a,a,a,a,a}, + {a,a,a,a,a}, + } + }; + + for (int y = 0; y < blocksMatrix.length; y++) { + for (int x = 0; x < blocksMatrix[y].length; x++) { + for (int z = 0; z < blocksMatrix[y][x].length; z++) { + struct.addBlock(blocksMatrix[y][x][z], x, y, z); + } + } + } + + return struct; + } + ); + + public static final StructureType GREATER_MANA_ALTAR_STRUCTURE = new StructureType( + new ResourceLocation(ElectroMana.ID, "greater_mana_altar"), + new BlockPos(2,3,2), + () -> { + BlockArray struct = new BlockArray(5, 4); + + Block a = null; + Block c = ElectroManaBlocks.GREATER_MANA_ALTAR.get(); + Block p = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:natura_pylon")); + Block t = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:terrasteel_block")); + Block s = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:manasteel_block")); + Block d = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:mana_diamond_block")); + + Block[][][] blocksMatrix = { + { + {s,s,s,s,s}, + {s,s,s,s,s}, + {s,s,d,s,s}, + {s,s,s,s,s}, + {s,s,s,s,s}, + }, + { + {p,a,a,a,p}, + {a,t,t,t,a}, + {a,t,d,t,a}, + {a,t,t,t,a}, + {p,a,a,a,p}, + }, + { + {a,a,a,a,a}, + {a,a,a,a,a}, + {a,a,d,a,a}, + {a,a,a,a,a}, + {a,a,a,a,a}, + }, + { + {a,a,a,a,a}, + {a,a,a,a,a}, + {a,a,c,a,a}, + {a,a,a,a,a}, + {a,a,a,a,a}, + } + }; + + for (int y = 0; y < blocksMatrix.length; y++) { + for (int x = 0; x < blocksMatrix[y].length; x++) { + for (int z = 0; z < blocksMatrix[y][x].length; z++) { + struct.addBlock(blocksMatrix[y][x][z], x, y, z); + } + } + } + + return struct; + } + ); + + public static final StructureType EXQUISITE_MANA_ALTAR_STRUCTURE = new StructureType( + new ResourceLocation(ElectroMana.ID, "exquisite_mana_altar"), + new BlockPos(2,3,2), + () -> { + BlockArray struct = new BlockArray(5, 4); + + Block a = null; + Block c = ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get(); + Block p = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:gaia_pylon")); + Block t = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:terrasteel_block")); + Block e = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:elementium_block")); + Block d = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("botania:mana_diamond_block")); + + Block[][][] blocksMatrix = { + { + {t,t,t,t,t}, + {t,t,t,t,t}, + {t,t,d,t,t}, + {t,t,t,t,t}, + {t,t,t,t,t}, + }, + { + {p,a,a,a,p}, + {a,e,e,e,a}, + {a,e,d,e,a}, + {a,e,e,e,a}, + {p,a,a,a,p}, + }, + { + {a,a,a,a,a}, + {a,a,a,a,a}, + {a,a,d,a,a}, + {a,a,a,a,a}, + {a,a,a,a,a}, + }, + { + {a,a,a,a,a}, + {a,a,a,a,a}, + {a,a,c,a,a}, + {a,a,a,a,a}, + {a,a,a,a,a}, + } + }; + + for (int y = 0; y < blocksMatrix.length; y++) { + for (int x = 0; x < blocksMatrix[y].length; x++) { + for (int z = 0; z < blocksMatrix[y][x].length; z++) { + struct.addBlock(blocksMatrix[y][x][z], x, y, z); + } + } + } + + return struct; + } + ); +} diff --git a/src/main/java/xyz/nuark/mods/electromana/ElectroManaTiles.java b/src/main/java/xyz/nuark/mods/electromana/ElectroManaTiles.java new file mode 100644 index 0000000..e01fa0c --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/ElectroManaTiles.java @@ -0,0 +1,50 @@ +package xyz.nuark.mods.electromana; + +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import xyz.nuark.mods.electromana.tile.ExquisiteManaAltarTile; +import xyz.nuark.mods.electromana.tile.GreaterManaAltarTile; +import xyz.nuark.mods.electromana.tile.LesserManaAltarTile; +import xyz.nuark.mods.electromana.tile.ManaTransformerTile; +import xyz.nuark.mods.electromana.tile.ManaTransformerMK2Tile; + +public class ElectroManaTiles { + private static final DeferredRegister> TILES = DeferredRegister.create(ForgeRegistries.TILE_ENTITIES, ElectroMana.ID); + + public static final RegistryObject> MANA_TRANSFORMER_TILE = + TILES.register( + "mana_transformer_tile", + () -> TileEntityType.Builder.create(ManaTransformerTile::new, ElectroManaBlocks.MANA_TRANSFORMER.get()).build(null) + ); + + public static final RegistryObject> MANA_TRANSFORMER_TILE_MK2 = + TILES.register( + "mana_transformer_tile_mk2", + () -> TileEntityType.Builder.create(ManaTransformerMK2Tile::new, ElectroManaBlocks.MANA_TRANSFORMER_MK2.get()).build(null) + ); + + public static final RegistryObject> LESSER_MANA_ALTAR_TILE = + TILES.register( + "lesser_mana_altar_tile", + () -> TileEntityType.Builder.create(LesserManaAltarTile::new, ElectroManaBlocks.LESSER_MANA_ALTAR.get()).build(null) + ); + + public static final RegistryObject> GREATER_MANA_ALTAR_TILE = + TILES.register( + "greater_mana_altar_tile", + () -> TileEntityType.Builder.create(GreaterManaAltarTile::new, ElectroManaBlocks.GREATER_MANA_ALTAR.get()).build(null) + ); + + public static final RegistryObject> EXQUISITE_MANA_ALTAR_TILE = + TILES.register( + "exquisite_mana_altar_tile", + () -> TileEntityType.Builder.create(ExquisiteManaAltarTile::new, ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get()).build(null) + ); + + public static void register() { + TILES.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/block/ExquisiteManaAltarBlock.java b/src/main/java/xyz/nuark/mods/electromana/block/ExquisiteManaAltarBlock.java new file mode 100644 index 0000000..3fc61da --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/block/ExquisiteManaAltarBlock.java @@ -0,0 +1,92 @@ +package xyz.nuark.mods.electromana.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import xyz.nuark.mods.electromana.ElectroManaItems; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.tile.ExquisiteManaAltarTile; +import xyz.nuark.mods.electromana.utils.BrokenStructureException; + +import javax.annotation.Nullable; +import java.util.UUID; + +public class ExquisiteManaAltarBlock extends Block { + private static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + public ExquisiteManaAltarBlock() { + super(Properties.create(Material.IRON, MaterialColor.RED_TERRACOTTA) + .hardnessAndResistance(0.3F) + .sound(SoundType.METAL) + .setLightLevel((state) -> 15) + .harvestLevel(1) + .harvestTool(ToolType.PICKAXE) + ); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + builder.add(FACING); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + @Override + @SuppressWarnings("deprecation") + public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { + if (worldIn.isRemote) { + return ActionResultType.SUCCESS; + } + + TileEntity te = worldIn.getTileEntity(pos); + if (!(te instanceof ExquisiteManaAltarTile)) + return ActionResultType.FAIL; + + UUID block_uuid = UUID.randomUUID(); + if (player.getHeldItemOffhand().getItem() == ElectroManaItems.REINFORCED_PLATE.get()) { + player.sendMessage(new StringTextComponent(((ExquisiteManaAltarTile) te).hasMultiblock()? "Formed" : "Not formed"), block_uuid); + } + else { + try { + ((ExquisiteManaAltarTile) te).validateMultiblock(); + player.sendMessage(new StringTextComponent("Structure is formed correctly"), block_uuid); + } catch (BrokenStructureException e) { + player.sendMessage(new StringTextComponent(e.getMessage()), block_uuid); + } + } + + return ActionResultType.SUCCESS; + } + + @Nullable + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return ElectroManaTiles.EXQUISITE_MANA_ALTAR_TILE.get().create(); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/block/GreaterManaAltarBlock.java b/src/main/java/xyz/nuark/mods/electromana/block/GreaterManaAltarBlock.java new file mode 100644 index 0000000..4dad812 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/block/GreaterManaAltarBlock.java @@ -0,0 +1,93 @@ +package xyz.nuark.mods.electromana.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import xyz.nuark.mods.electromana.ElectroManaItems; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.tile.ExquisiteManaAltarTile; +import xyz.nuark.mods.electromana.tile.GreaterManaAltarTile; +import xyz.nuark.mods.electromana.utils.BrokenStructureException; + +import javax.annotation.Nullable; +import java.util.UUID; + +public class GreaterManaAltarBlock extends Block { + private static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + public GreaterManaAltarBlock() { + super(Properties.create(Material.IRON, MaterialColor.ORANGE_TERRACOTTA) + .hardnessAndResistance(0.3F) + .sound(SoundType.METAL) + .setLightLevel((state) -> 15) + .harvestLevel(1) + .harvestTool(ToolType.PICKAXE) + ); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + builder.add(FACING); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + @Override + @SuppressWarnings("deprecation") + public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { + if (worldIn.isRemote) { + return ActionResultType.SUCCESS; + } + + TileEntity te = worldIn.getTileEntity(pos); + if (!(te instanceof GreaterManaAltarTile)) + return ActionResultType.FAIL; + + UUID block_uuid = UUID.randomUUID(); + if (player.getHeldItemOffhand().getItem() == ElectroManaItems.REINFORCED_PLATE.get()) { + player.sendMessage(new StringTextComponent(((GreaterManaAltarTile) te).hasMultiblock()? "Formed" : "Not formed"), block_uuid); + } + else { + try { + ((GreaterManaAltarTile) te).validateMultiblock(); + player.sendMessage(new StringTextComponent("Structure is formed correctly"), block_uuid); + } catch (BrokenStructureException e) { + player.sendMessage(new StringTextComponent(e.getMessage()), block_uuid); + } + } + + return ActionResultType.SUCCESS; + } + + @Nullable + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return ElectroManaTiles.GREATER_MANA_ALTAR_TILE.get().create(); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/block/LesserManaAltarBlock.java b/src/main/java/xyz/nuark/mods/electromana/block/LesserManaAltarBlock.java new file mode 100644 index 0000000..9daabad --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/block/LesserManaAltarBlock.java @@ -0,0 +1,90 @@ +package xyz.nuark.mods.electromana.block; + +import net.minecraft.block.*; +import net.minecraft.block.material.Material; +import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import xyz.nuark.mods.electromana.ElectroManaItems; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.tile.ExquisiteManaAltarTile; +import xyz.nuark.mods.electromana.tile.LesserManaAltarTile; +import xyz.nuark.mods.electromana.utils.BrokenStructureException; + +import javax.annotation.Nullable; +import java.util.UUID; + +public class LesserManaAltarBlock extends Block { + private static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + public LesserManaAltarBlock() { + super(AbstractBlock.Properties.create(Material.IRON, MaterialColor.YELLOW_TERRACOTTA) + .hardnessAndResistance(0.3F) + .sound(SoundType.METAL) + .setLightLevel((state) -> 15) + .harvestLevel(1) + .harvestTool(ToolType.PICKAXE) + ); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + builder.add(FACING); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + @Override + @SuppressWarnings("deprecation") + public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { + if (worldIn.isRemote) { + return ActionResultType.SUCCESS; + } + + TileEntity te = worldIn.getTileEntity(pos); + if (!(te instanceof LesserManaAltarTile)) + return ActionResultType.FAIL; + + UUID block_uuid = UUID.randomUUID(); + if (player.getHeldItemOffhand().getItem() == ElectroManaItems.REINFORCED_PLATE.get()) { + player.sendMessage(new StringTextComponent(((LesserManaAltarTile) te).hasMultiblock()? "Formed" : "Not formed"), block_uuid); + } + else { + try { + ((LesserManaAltarTile) te).validateMultiblock(); + player.sendMessage(new StringTextComponent("Structure is formed correctly"), block_uuid); + } catch (BrokenStructureException e) { + player.sendMessage(new StringTextComponent(e.getMessage()), block_uuid); + } + } + + return ActionResultType.SUCCESS; + } + + @Nullable + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return ElectroManaTiles.LESSER_MANA_ALTAR_TILE.get().create(); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/block/ManaTransformerBlock.java b/src/main/java/xyz/nuark/mods/electromana/block/ManaTransformerBlock.java new file mode 100644 index 0000000..04557ad --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/block/ManaTransformerBlock.java @@ -0,0 +1,116 @@ +package xyz.nuark.mods.electromana.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.item.ManaTransformerItem; +import xyz.nuark.mods.electromana.tile.ManaTransformerTile; + +import javax.annotation.Nullable; +import java.util.List; + +public class ManaTransformerBlock extends Block { + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + public ManaTransformerBlock() { + super(Properties.create(Material.IRON).hardnessAndResistance(1.9F).sound(SoundType.METAL)); + + setDefaultState(getStateContainer().getBaseState().with(FACING, Direction.NORTH)); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + builder.add(FACING); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + @Override + @SuppressWarnings("deprecation") + public List getDrops(BlockState state, LootContext.Builder builder) { + TileEntity te = builder.get(LootParameters.BLOCK_ENTITY); + + List drops = super.getDrops(state, builder); + if (te instanceof ManaTransformerTile) { + ManaTransformerTile tileEntity = (ManaTransformerTile) te; + drops.stream() + .filter(e -> e.getItem() instanceof ManaTransformerItem) + .findFirst() + .ifPresent(e -> e.getOrCreateTag().putInt("energy", tileEntity.energyStorage.getEnergyStored())); + } + + return drops; + } + + @Override + @SuppressWarnings("deprecation") + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (newState.getBlock() != this) { + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (tileEntity != null) { + LazyOptional cap = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + cap.ifPresent(handler -> { + for (int i = 0; i < handler.getSlots(); i++) + InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), handler.getStackInSlot(i)); + }); + } + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } + + @Override + @SuppressWarnings("deprecation") + public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { + if (worldIn.isRemote) { + return ActionResultType.SUCCESS; + } + + TileEntity te = worldIn.getTileEntity(pos); + if (!(te instanceof ManaTransformerTile)) + return ActionResultType.FAIL; + + NetworkHooks.openGui((ServerPlayerEntity) player, (INamedContainerProvider) te, pos); + return ActionResultType.SUCCESS; + } + + @Nullable + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return ElectroManaTiles.MANA_TRANSFORMER_TILE.get().create(); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/block/ManaTransformerMK2Block.java b/src/main/java/xyz/nuark/mods/electromana/block/ManaTransformerMK2Block.java new file mode 100644 index 0000000..a40b73a --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/block/ManaTransformerMK2Block.java @@ -0,0 +1,116 @@ +package xyz.nuark.mods.electromana.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.item.ManaTransformerItem; +import xyz.nuark.mods.electromana.tile.ManaTransformerMK2Tile; + +import javax.annotation.Nullable; +import java.util.List; + +public class ManaTransformerMK2Block extends Block { + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + public ManaTransformerMK2Block() { + super(Properties.create(Material.IRON).hardnessAndResistance(1.9F).sound(SoundType.METAL)); + + setDefaultState(getStateContainer().getBaseState().with(FACING, Direction.NORTH)); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + builder.add(FACING); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + @Override + @SuppressWarnings("deprecation") + public List getDrops(BlockState state, LootContext.Builder builder) { + TileEntity te = builder.get(LootParameters.BLOCK_ENTITY); + + List drops = super.getDrops(state, builder); + if (te instanceof ManaTransformerMK2Tile) { + ManaTransformerMK2Tile tileEntity = (ManaTransformerMK2Tile) te; + drops.stream() + .filter(e -> e.getItem() instanceof ManaTransformerItem) + .findFirst() + .ifPresent(e -> e.getOrCreateTag().putInt("energy", tileEntity.energyStorage.getEnergyStored())); + } + + return drops; + } + + @Override + @SuppressWarnings("deprecation") + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (newState.getBlock() != this) { + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (tileEntity != null) { + LazyOptional cap = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + cap.ifPresent(handler -> { + for (int i = 0; i < handler.getSlots(); i++) + InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), handler.getStackInSlot(i)); + }); + } + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } + + @Override + @SuppressWarnings("deprecation") + public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) { + if (worldIn.isRemote) { + return ActionResultType.SUCCESS; + } + + TileEntity te = worldIn.getTileEntity(pos); + if (!(te instanceof ManaTransformerMK2Tile)) + return ActionResultType.FAIL; + + NetworkHooks.openGui((ServerPlayerEntity) player, (INamedContainerProvider) te, pos); + return ActionResultType.SUCCESS; + } + + @Nullable + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return ElectroManaTiles.MANA_TRANSFORMER_TILE_MK2.get().create(); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaAltarEnergyStorage.java b/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaAltarEnergyStorage.java new file mode 100644 index 0000000..ef82794 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaAltarEnergyStorage.java @@ -0,0 +1,82 @@ +package xyz.nuark.mods.electromana.capabilities; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.energy.IEnergyStorage; +import xyz.nuark.mods.electromana.tile.BaseManaAltarTile; + +public class ManaAltarEnergyStorage implements IEnergyStorage, INBTSerializable { + private static final String KEY = "energy"; + private int energy; + private final int capacity = 5_000_000; + private final int maxInOut = 1_000_000; + private BaseManaAltarTile tile; + + public ManaAltarEnergyStorage(BaseManaAltarTile tile, int energy) { + this.tile = tile; + this.energy = energy; + } + + @Override + public CompoundNBT serializeNBT() { + CompoundNBT tag = new CompoundNBT(); + tag.putInt(KEY, this.energy); + return tag; + } + + @Override + public void deserializeNBT(CompoundNBT nbt) { + this.energy = nbt.getInt(KEY); + } + + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + int energyReceived = Math.min(capacity - energy, Math.min(this.maxInOut, maxReceive)); + + if (!simulate) { + energy += energyReceived; + this.tile.markDirty(); + } + + return energyReceived; + } + + public int consumeEnergy(int maxExtract, boolean simulate) { + int energyExtracted = Math.min(energy, Math.min(this.maxInOut, maxExtract)); + + if (!simulate) + energy -= energyExtracted; + + return energyExtracted; + } + + public void setEnergy(int energy) { + this.energy = energy; + } + + // We don't use this method and thus we don't let other people use it either + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + return 0; + } + + @Override + public int getEnergyStored() { + return this.energy; + } + + @Override + public int getMaxEnergyStored() { + return this.capacity; + } + + @Override + public boolean canExtract() { + return false; + } + + @Override + public boolean canReceive() { + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaTransformerItemHandler.java b/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaTransformerItemHandler.java new file mode 100644 index 0000000..1947d62 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaTransformerItemHandler.java @@ -0,0 +1,36 @@ +package xyz.nuark.mods.electromana.capabilities; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.items.ItemStackHandler; +import xyz.nuark.mods.electromana.tile.BaseManaTransformerTile; +import xyz.nuark.mods.electromana.tile.ManaTransformerTile; + +import javax.annotation.Nonnull; + +public class ManaTransformerItemHandler extends ItemStackHandler { + private final BaseManaTransformerTile tile; + + public ManaTransformerItemHandler(BaseManaTransformerTile tile) { + super(2); + this.tile = tile; + } + + @Override + protected void onContentsChanged(int slot) { + tile.markDirty(); + } + + @Nonnull + @Override + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { + if (slot == BaseManaTransformerTile.Slots.FUEL.getId() && stack.getItem() == Items.BUCKET) + return super.insertItem(slot, stack, simulate); + + if (slot == BaseManaTransformerTile.Slots.FUEL.getId() && ForgeHooks.getBurnTime(stack) <= 0) + return stack; + + return super.insertItem(slot, stack, simulate); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaTransformerStorage.java b/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaTransformerStorage.java new file mode 100644 index 0000000..2d795db --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/capabilities/ManaTransformerStorage.java @@ -0,0 +1,94 @@ +package xyz.nuark.mods.electromana.capabilities; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.energy.IEnergyStorage; +import xyz.nuark.mods.electromana.tile.BaseManaTransformerTile; +import xyz.nuark.mods.electromana.tile.ManaTransformerTile; + +public class ManaTransformerStorage implements IEnergyStorage, INBTSerializable { + private static final String KEY = "energy"; + private int energy; + private int capacity; + private int maxInOut = 1000000; + private BaseManaTransformerTile tile; + + public ManaTransformerStorage(BaseManaTransformerTile tile, int energy, int capacity) { + this.energy = energy; + this.capacity = capacity; + this.tile = tile; + } + + @Override + public CompoundNBT serializeNBT() { + CompoundNBT tag = new CompoundNBT(); + tag.putInt(KEY, this.energy); + return tag; + } + + @Override + public void deserializeNBT(CompoundNBT nbt) { + this.energy = nbt.getInt(KEY); + } + + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + int energyReceived = Math.min(capacity - energy, Math.min(this.maxInOut, maxReceive)); + + if (!simulate) { + energy += energyReceived; + this.tile.markDirty(); + } + + return energyReceived; + } + + public int consumeEnergy(int maxExtract, boolean simulate) { + int energyExtracted = Math.min(energy, Math.min(this.maxInOut, maxExtract)); + + if (!simulate) + energy -= energyExtracted; + + return energyExtracted; + } + + public void setEnergy(int energy) { + this.energy = energy; + } + + // We don't use this method and thus we don't let other people use it either + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + return 0; + } + + @Override + public int getEnergyStored() { + return this.energy; + } + + @Override + public int getMaxEnergyStored() { + return this.capacity; + } + + @Override + public boolean canExtract() { + return false; + } + + @Override + public boolean canReceive() { + return true; + } + + @Override + public String toString() { + return "ManaTransformerStorage{" + + "energy=" + energy + + ", capacity=" + capacity + + ", maxInOut=" + maxInOut + + ", tile=" + tile + + '}'; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/client/screens/ManaTransformerScreen.java b/src/main/java/xyz/nuark/mods/electromana/client/screens/ManaTransformerScreen.java new file mode 100644 index 0000000..052f5cc --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/client/screens/ManaTransformerScreen.java @@ -0,0 +1,112 @@ +package xyz.nuark.mods.electromana.client.screens; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.LanguageMap; +import net.minecraft.util.text.TranslationTextComponent; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.container.ManaTransformerContainer; +import xyz.nuark.mods.electromana.utils.MathUtils; +import xyz.nuark.mods.electromana.utils.StringHelpers; + +import java.awt.*; +import java.util.Arrays; + +public class ManaTransformerScreen extends ContainerScreen { + private static final ResourceLocation background = new ResourceLocation(ElectroMana.ID, "textures/gui/mana_transformer.png"); + + private final ManaTransformerContainer container; + public ManaTransformerScreen(ManaTransformerContainer container, PlayerInventory playerInventory, ITextComponent title) { + super(container, playerInventory, title); + this.container = container; + } + + @Override + public void render(MatrixStack stack, int mouseX, int mouseY, float partialTicks) { + this.renderBackground(stack); + super.render(stack, mouseX, mouseY, partialTicks); + + this.renderHoveredTooltip(stack, mouseX, mouseY); + if (MathUtils.inRect(mouseX, mouseY, guiLeft + 7, guiTop + 7, guiLeft + 7 + 18, guiTop + 7 + 73)) { + this.renderTooltip(stack, LanguageMap.getInstance().func_244260_a(Arrays.asList( + new TranslationTextComponent("screen.electromana.energy", StringHelpers.withSuffix(this.container.getEnergy()), StringHelpers.withSuffix(this.container.getMaxPower())), + this.container.getRemaining() <= 0 ? + new TranslationTextComponent("screen.electromana.no_fuel") : + new TranslationTextComponent("screen.electromana.burn_time", StringHelpers.ticksInSeconds(this.container.getRemaining())) + )), mouseX, mouseY); + } + + if (MathUtils.inRect(mouseX, mouseY, guiLeft + 151, guiTop + 7, guiLeft + 151 + 18, guiTop + 7 + 73)) { +// TODO: MAYBE OLD WAY +// int[] poolInfo = this.container.getManaPoolInfo(); +// this.renderTooltip(stack, +// new TranslationTextComponent("screen.electromana.mana", poolInfo[0], poolInfo[1]), +// mouseX, mouseY); + this.renderTooltip(stack, + new TranslationTextComponent("screen.electromana.mana", this.container.getCurrentMana(), this.container.getManaCap()), + mouseX, mouseY); + } + } + + @Override + public void init() { + super.init(); + } + + @Override + protected void drawGuiContainerBackgroundLayer(MatrixStack stack, float partialTicks, int mouseX, int mouseY) { + RenderSystem.color4f(1, 1, 1, 1); + getMinecraft().getTextureManager().bindTexture(background); + this.blit(stack, guiLeft, guiTop, 0, 0, xSize, ySize); + + // Drawing fire + { + int posX = 81; + int posY = 45; + int maxHeight = 13; + if (this.container.getMaxBurn() > 0) { + int remaining = (this.container.getRemaining() * maxHeight) / this.container.getMaxBurn(); + this.blit(stack, guiLeft + posX, guiTop + posY + 13 - remaining, 176, 13 - remaining, 14, remaining + 1); + } + } + + // Drawing energy + { + int posX = 7; + int posY = 78; + int maxEnergy = this.container.getMaxPower(), height = 70; + if (maxEnergy > 0) { + int remaining = (this.container.getEnergy() * height) / maxEnergy; + this.blit(stack, guiLeft + posX, guiTop + posY - remaining, 176, 84 - remaining, 16, remaining + 1); + } + } + + // Drawing mana + { + int posX = 151; + int posY = 78; +// TODO: MAYBE OLD WAY +// int[] poolInfo = this.container.getManaPoolInfo(); +// int maxEnergy = poolInfo[1], height = 70; +// if (maxEnergy > 0) { +// int remaining = (poolInfo[0] * height) / maxEnergy; +// this.blit(stack, guiLeft + posX, guiTop + posY - remaining, 192, 84 - remaining, 16, remaining + 1); +// } + int maxEnergy = this.container.getManaCap(), height = 70; + if (maxEnergy > 0) { + int remaining = (this.container.getCurrentMana() * height) / maxEnergy; + this.blit(stack, guiLeft + posX, guiTop + posY - remaining, 192, 84 - remaining, 16, remaining + 1); + } + } + } + + @Override + protected void drawGuiContainerForegroundLayer(MatrixStack stack, int mouseX, int mouseY) { + Minecraft.getInstance().fontRenderer.drawString(stack, "Mana Transformer", 42, 8, Color.DARK_GRAY.getRGB()); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/container/ManaTransformerContainer.java b/src/main/java/xyz/nuark/mods/electromana/container/ManaTransformerContainer.java new file mode 100644 index 0000000..ba9f118 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/container/ManaTransformerContainer.java @@ -0,0 +1,148 @@ +package xyz.nuark.mods.electromana.container; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.IIntArray; +import net.minecraft.util.IntArray; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; +import xyz.nuark.mods.electromana.ElectroManaContainers; +import xyz.nuark.mods.electromana.tile.BaseManaTransformerTile; +import xyz.nuark.mods.electromana.tile.ManaTransformerTile; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class ManaTransformerContainer extends Container { + private static final int SLOTS = 1; + + public final IIntArray data; + public ItemStackHandler handler; + + private BaseManaTransformerTile tile; + + public ManaTransformerContainer(int windowId, PlayerInventory playerInventory, PacketBuffer extraData) { + this((BaseManaTransformerTile) playerInventory.player.world.getTileEntity(extraData.readBlockPos()), new IntArray(6), windowId, playerInventory, new ItemStackHandler(2)); + } + + public ManaTransformerContainer(@Nullable BaseManaTransformerTile tile, IIntArray manaTransformerData, int windowId, PlayerInventory playerInventory, ItemStackHandler handler) { + super(ElectroManaContainers.MANA_TRANSFORMER_CONTAINER.get(), windowId); + + this.handler = handler; + this.tile = tile; + + this.data = manaTransformerData; + this.setup(playerInventory); + + trackIntArray(manaTransformerData); + } + + public void setup(PlayerInventory inventory) { + addSlot(new RestrictedSlot(handler, 0, 80, 62)); + + // Slots for the hotbar + for (int row = 0; row < 9; ++row) { + int x = 8 + row * 18; + int y = 56 + 86; + addSlot(new Slot(inventory, row, x, y)); + } + // Slots for the main inventory + for (int row = 1; row < 4; ++row) { + for (int col = 0; col < 9; ++col) { + int x = 8 + col * 18; + int y = row * 18 + (56 + 10); + addSlot(new Slot(inventory, col + row * 9, x, y)); + } + } + } + + @Override + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.inventorySlots.get(index); + + if (slot != null && slot.getHasStack()) { + ItemStack currentStack = slot.getStack(); + itemstack = currentStack.copy(); + + if (index < SLOTS) { + if (!this.mergeItemStack(currentStack, SLOTS, this.inventorySlots.size(), false)) { + return ItemStack.EMPTY; + } + } else if (!this.mergeItemStack(currentStack, 0, SLOTS, false)) { + return ItemStack.EMPTY; + } + + if (currentStack.isEmpty()) { + slot.putStack(ItemStack.EMPTY); + } else { + slot.onSlotChanged(); + } + } + + return itemstack; + } + + @Override + public boolean canInteractWith(PlayerEntity playerIn) { + BlockPos pos = this.tile.getPos(); + return this.tile != null && !this.tile.isRemoved() && playerIn.getDistanceSq(new Vector3d(pos.getX(), pos.getY(), pos.getZ()).add(0.5D, 0.5D, 0.5D)) <= 64D; + } + + public int getMaxPower() { + return this.data.get(1) * 32; + } + + public int getEnergy() { + return this.data.get(0) * 32; + } + + public int getMaxBurn() { + return this.data.get(3); + } + + public int getRemaining() { + return this.data.get(2); + } + + public int getCurrentMana() { + return this.data.get(4); + } + + public int getManaCap() { + return this.data.get(5); + } + +// public int[] getManaPoolInfo() { +// int[] data = {0, 0}; +// +// if (tile != null) { +// data = tile.getManaPoolInfo(); +// } +// +// return data; +// } + + static class RestrictedSlot extends SlotItemHandler { + public RestrictedSlot(IItemHandler itemHandler, int index, int xPosition, int yPosition) { + super(itemHandler, index, xPosition, yPosition); + } + + @Override + public boolean isItemValid(@Nonnull ItemStack stack) { + if (getSlotIndex() == ManaTransformerTile.Slots.FUEL.getId()) { + return ForgeHooks.getBurnTime(stack) != 0; + } + + return super.isItemValid(stack); + } + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/data/GeneratorBlockStates.java b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorBlockStates.java new file mode 100644 index 0000000..db72dc5 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorBlockStates.java @@ -0,0 +1,58 @@ +package xyz.nuark.mods.electromana.data; + +import net.minecraft.data.DataGenerator; +import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.common.data.ExistingFileHelper; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaBlocks; + +import java.util.Objects; + +public class GeneratorBlockStates extends BlockStateProvider { + public GeneratorBlockStates(DataGenerator gen, ExistingFileHelper exFileHelper) { + super(gen, ElectroMana.ID, exFileHelper); + } + + @Override + protected void registerStatesAndModels() { + horizontalBlock(ElectroManaBlocks.MANA_TRANSFORMER.get(), models().orientableWithBottom( + Objects.requireNonNull(ElectroManaBlocks.MANA_TRANSFORMER.get().getRegistryName()).getPath(), + modLoc("blocks/mana_transformer_side"), + modLoc("blocks/mana_transformer_side"), + modLoc("blocks/mana_transformer_side"), + modLoc("blocks/mana_transformer_side") + )); + + horizontalBlock(ElectroManaBlocks.MANA_TRANSFORMER_MK2.get(), models().orientableWithBottom( + Objects.requireNonNull(ElectroManaBlocks.MANA_TRANSFORMER_MK2.get().getRegistryName()).getPath(), + modLoc("blocks/mana_transformer_mk2_side"), + modLoc("blocks/mana_transformer_mk2_side"), + modLoc("blocks/mana_transformer_mk2_side"), + modLoc("blocks/mana_transformer_mk2_side") + )); + + horizontalBlock(ElectroManaBlocks.LESSER_MANA_ALTAR.get(), models().orientableWithBottom( + Objects.requireNonNull(ElectroManaBlocks.LESSER_MANA_ALTAR.get().getRegistryName()).getPath(), + modLoc("blocks/lesser_mana_altar_side"), + modLoc("blocks/lesser_mana_altar_front"), + modLoc("blocks/lesser_mana_altar_side"), + modLoc("blocks/lesser_mana_altar_side") + )); + + horizontalBlock(ElectroManaBlocks.GREATER_MANA_ALTAR.get(), models().orientableWithBottom( + Objects.requireNonNull(ElectroManaBlocks.GREATER_MANA_ALTAR.get().getRegistryName()).getPath(), + modLoc("blocks/greater_mana_altar_side"), + modLoc("blocks/greater_mana_altar_front"), + modLoc("blocks/greater_mana_altar_side"), + modLoc("blocks/greater_mana_altar_side") + )); + + horizontalBlock(ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get(), models().orientableWithBottom( + Objects.requireNonNull(ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get().getRegistryName()).getPath(), + modLoc("blocks/exquisite_mana_altar_side"), + modLoc("blocks/exquisite_mana_altar_front"), + modLoc("blocks/exquisite_mana_altar_side"), + modLoc("blocks/exquisite_mana_altar_side") + )); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/data/GeneratorItemModels.java b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorItemModels.java new file mode 100644 index 0000000..37755a5 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorItemModels.java @@ -0,0 +1,41 @@ +package xyz.nuark.mods.electromana.data; + +import net.minecraft.data.DataGenerator; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ItemModelProvider; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.data.ExistingFileHelper; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaBlocks; +import xyz.nuark.mods.electromana.ElectroManaItems; + +public class GeneratorItemModels extends ItemModelProvider { + public GeneratorItemModels(DataGenerator generator, ExistingFileHelper existingFileHelper) { + super(generator, ElectroMana.ID, existingFileHelper); + } + + @SuppressWarnings("ConstantConditions") // Like, I gurantee + @Override + protected void registerModels() { + generateBlockTexture(ElectroManaBlocks.MANA_TRANSFORMER.get().getRegistryName()); + generateBlockTexture(ElectroManaBlocks.MANA_TRANSFORMER_MK2.get().getRegistryName()); + generateBlockTexture(ElectroManaBlocks.LESSER_MANA_ALTAR.get().getRegistryName()); + generateBlockTexture(ElectroManaBlocks.GREATER_MANA_ALTAR.get().getRegistryName()); + generateBlockTexture(ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get().getRegistryName()); + + generateItemTexture(ElectroManaItems.REINFORCED_NETHER_STAR.get().getRegistryName()); + generateItemTexture(ElectroManaItems.REINFORCED_NETHER_STAR_PIECE.get().getRegistryName()); + generateItemTexture(ElectroManaItems.REINFORCED_PLATE.get().getRegistryName()); + } + + private void generateBlockTexture(ResourceLocation blockRegistryName) { + getBuilder(blockRegistryName.getPath()).parent(new ModelFile.UncheckedModelFile(modLoc("block/" + blockRegistryName.getPath()))); + } + + private void generateItemTexture(ResourceLocation itemRegistryName) { + getBuilder(itemRegistryName.getPath()) + .parent(new ModelFile.UncheckedModelFile(new ResourceLocation("minecraft", "item/generated"))) + .texture("layer0", "items/" + itemRegistryName.getPath()); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/data/GeneratorLanguage.java b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorLanguage.java new file mode 100644 index 0000000..e1b5c1f --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorLanguage.java @@ -0,0 +1,30 @@ +package xyz.nuark.mods.electromana.data; + +import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.LanguageProvider; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaBlocks; +import xyz.nuark.mods.electromana.ElectroManaItems; + +public class GeneratorLanguage extends LanguageProvider { + public GeneratorLanguage(DataGenerator gen) { + super(gen, ElectroMana.ID, "en_us"); + } + + @Override + protected void addTranslations() { + addBlock(ElectroManaBlocks.MANA_TRANSFORMER, "Mana Transformer"); + addBlock(ElectroManaBlocks.MANA_TRANSFORMER_MK2, "Mana Transformer MK2"); + addBlock(ElectroManaBlocks.LESSER_MANA_ALTAR, "Lesser Mana Altar"); + addBlock(ElectroManaBlocks.GREATER_MANA_ALTAR, "Greater Mana Altar"); + addBlock(ElectroManaBlocks.EXQUISITE_MANA_ALTAR, "Exquisite Mana Altar"); + addItem(ElectroManaItems.REINFORCED_NETHER_STAR, "Reinforced Nether Star"); + addItem(ElectroManaItems.REINFORCED_NETHER_STAR_PIECE, "Reinforced Nether Star Piece"); + addItem(ElectroManaItems.REINFORCED_PLATE, "Reinforced Plate"); + add("itemGroup.electromana", "ElectroMana"); + add("screen.electromana.energy", "Energy: %s/%s FE"); + add("screen.electromana.mana", "Mana: %s/%s"); + add("screen.electromana.no_fuel", "Fuel source empty"); + add("screen.electromana.burn_time", "Burn time left: %ss"); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/data/GeneratorLoots.java b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorLoots.java new file mode 100644 index 0000000..5aeb536 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorLoots.java @@ -0,0 +1,97 @@ +package xyz.nuark.mods.electromana.data; + +import com.google.common.collect.ImmutableList; +import com.mojang.datafixers.util.Pair; +import net.minecraft.block.Block; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.LootTableProvider; +import net.minecraft.data.loot.BlockLootTables; +import net.minecraft.loot.*; +import net.minecraft.loot.conditions.SurvivesExplosion; +import net.minecraft.loot.functions.CopyName; +import net.minecraft.util.ResourceLocation; +import xyz.nuark.mods.electromana.ElectroManaBlocks; + +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class GeneratorLoots extends LootTableProvider { + public GeneratorLoots(DataGenerator dataGeneratorIn) { + super(dataGeneratorIn); + } + + @Override + protected List>>, LootParameterSet>> getTables() { + return ImmutableList.of(Pair.of(Blocks::new, LootParameterSets.BLOCK)); + } + + private static class Blocks extends BlockLootTables { + @Override + protected void addTables() { + LootPool.Builder manaTransformer = LootPool.builder() + .name(ElectroManaBlocks.MANA_TRANSFORMER.get().getRegistryName().toString()) + .rolls(ConstantRange.of(1)) + .acceptCondition(SurvivesExplosion.builder()) + .addEntry(ItemLootEntry.builder(ElectroManaBlocks.MANA_TRANSFORMER.get()) + .acceptFunction(CopyName.builder(CopyName.Source.BLOCK_ENTITY)) + ); + + LootPool.Builder manaTransformerMK2 = LootPool.builder() + .name(ElectroManaBlocks.MANA_TRANSFORMER_MK2.get().getRegistryName().toString()) + .rolls(ConstantRange.of(1)) + .acceptCondition(SurvivesExplosion.builder()) + .addEntry(ItemLootEntry.builder(ElectroManaBlocks.MANA_TRANSFORMER_MK2.get()) + .acceptFunction(CopyName.builder(CopyName.Source.BLOCK_ENTITY)) + ); + + LootPool.Builder lesserManaAltar = LootPool.builder() + .name(ElectroManaBlocks.LESSER_MANA_ALTAR.get().getRegistryName().toString()) + .rolls(ConstantRange.of(1)) + .acceptCondition(SurvivesExplosion.builder()) + .addEntry(ItemLootEntry.builder(ElectroManaBlocks.LESSER_MANA_ALTAR.get()) + .acceptFunction(CopyName.builder(CopyName.Source.BLOCK_ENTITY)) + ); + + LootPool.Builder greaterManaAltar = LootPool.builder() + .name(ElectroManaBlocks.GREATER_MANA_ALTAR.get().getRegistryName().toString()) + .rolls(ConstantRange.of(1)) + .acceptCondition(SurvivesExplosion.builder()) + .addEntry(ItemLootEntry.builder(ElectroManaBlocks.LESSER_MANA_ALTAR.get()) + .acceptFunction(CopyName.builder(CopyName.Source.BLOCK_ENTITY)) + ); + + LootPool.Builder exquisiteManaAltar = LootPool.builder() + .name(ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get().getRegistryName().toString()) + .rolls(ConstantRange.of(1)) + .acceptCondition(SurvivesExplosion.builder()) + .addEntry(ItemLootEntry.builder(ElectroManaBlocks.LESSER_MANA_ALTAR.get()) + .acceptFunction(CopyName.builder(CopyName.Source.BLOCK_ENTITY)) + ); + + this.registerLootTable(ElectroManaBlocks.MANA_TRANSFORMER.get(), LootTable.builder().addLootPool(manaTransformer)); + this.registerLootTable(ElectroManaBlocks.MANA_TRANSFORMER_MK2.get(), LootTable.builder().addLootPool(manaTransformerMK2)); + this.registerLootTable(ElectroManaBlocks.LESSER_MANA_ALTAR.get(), LootTable.builder().addLootPool(lesserManaAltar)); + this.registerLootTable(ElectroManaBlocks.GREATER_MANA_ALTAR.get(), LootTable.builder().addLootPool(greaterManaAltar)); + this.registerLootTable(ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get(), LootTable.builder().addLootPool(exquisiteManaAltar)); + } + + @Override + protected Iterable getKnownBlocks() { + return ImmutableList.of( + ElectroManaBlocks.MANA_TRANSFORMER.get(), + ElectroManaBlocks.MANA_TRANSFORMER_MK2.get(), + ElectroManaBlocks.LESSER_MANA_ALTAR.get(), + ElectroManaBlocks.GREATER_MANA_ALTAR.get(), + ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get() + ); + } + } + + @Override + protected void validate(Map map, ValidationTracker validationtracker) { + map.forEach((name, table) -> LootTableManager.validateLootTable(validationtracker, name, table)); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/data/GeneratorRecipes.java b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorRecipes.java new file mode 100644 index 0000000..a486ad1 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/data/GeneratorRecipes.java @@ -0,0 +1,118 @@ +package xyz.nuark.mods.electromana.data; + +import net.minecraft.advancements.criterion.InventoryChangeTrigger; +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Blocks; +import net.minecraft.block.DragonEggBlock; +import net.minecraft.data.*; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraftforge.common.Tags; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaBlocks; +import xyz.nuark.mods.electromana.ElectroManaItems; + +import javax.annotation.Nonnull; +import java.util.function.Consumer; + +public class GeneratorRecipes extends RecipeProvider { + public GeneratorRecipes(DataGenerator generator) { + super(generator); + } + + @Override + protected void registerRecipes(@Nonnull Consumer consumer) { + ShapedRecipeBuilder + .shapedRecipe(ElectroManaItems.REINFORCED_NETHER_STAR.get()) + .key('s', Items.NETHERITE_SCRAP) + .key('c', Items.NETHER_STAR) + .patternLine("sss") + .patternLine("scs") + .patternLine("sss") + .setGroup(ElectroMana.ID) + .addCriterion("killed_wither_mined_scrap", InventoryChangeTrigger.Instance.forItems(Items.NETHERITE_SCRAP, Items.NETHER_STAR)) + .build(consumer, ElectroManaItems.REINFORCED_NETHER_STAR.getId()); + + ShapelessRecipeBuilder + .shapelessRecipe(ElectroManaItems.REINFORCED_NETHER_STAR_PIECE.get(), 2) + .addIngredient(ElectroManaItems.REINFORCED_NETHER_STAR.get()) + .addIngredient(Items.GUNPOWDER) + .addIngredient(Items.FLINT) + .setGroup(ElectroMana.ID) + .addCriterion("created_reinforced_nether_star", InventoryChangeTrigger.Instance.forItems(ElectroManaItems.REINFORCED_NETHER_STAR.get())) + .build(consumer, ElectroManaItems.REINFORCED_NETHER_STAR_PIECE.getId()); + + ShapedRecipeBuilder + .shapedRecipe(ElectroManaItems.REINFORCED_PLATE.get()) + .key('s', ElectroManaItems.REINFORCED_NETHER_STAR_PIECE.get()) + .key('c', ElectroManaItems.REINFORCED_NETHER_STAR.get()) + .key('i', Items.IRON_INGOT) + .patternLine("isi") + .patternLine("scs") + .patternLine("isi") + .setGroup(ElectroMana.ID) + .addCriterion("created_reinforced_nether_star_and_pieces", InventoryChangeTrigger.Instance.forItems(ElectroManaItems.REINFORCED_NETHER_STAR.get(), ElectroManaItems.REINFORCED_NETHER_STAR_PIECE.get())) + .build(consumer, ElectroManaItems.REINFORCED_PLATE.getId()); + + ShapedRecipeBuilder + .shapedRecipe(ElectroManaBlocks.MANA_TRANSFORMER.get()) + .key('d', ElectroManaItems.REINFORCED_NETHER_STAR_PIECE.get()) + .key('c', ElectroManaItems.REINFORCED_NETHER_STAR.get()) + .key('i', ElectroManaItems.REINFORCED_PLATE.get()) + .patternLine("iii") + .patternLine("dcd") + .patternLine("iii") + .setGroup(ElectroMana.ID) + .addCriterion("created_reinforced_nether_star_and_pieces", InventoryChangeTrigger.Instance.forItems(ElectroManaItems.REINFORCED_NETHER_STAR.get(), ElectroManaItems.REINFORCED_NETHER_STAR_PIECE.get())) + .build(consumer, ElectroManaBlocks.MANA_TRANSFORMER.getId()); + + ShapedRecipeBuilder + .shapedRecipe(ElectroManaBlocks.MANA_TRANSFORMER_MK2.get()) + .key('t', ElectroManaItems.MANA_TRANSFORMER_ITEM.get()) + .key('p', ElectroManaItems.REINFORCED_PLATE.get()) + .key('c', ElectroManaItems.REINFORCED_NETHER_STAR.get()) + .patternLine("tpt") + .patternLine("pcp") + .patternLine("tpt") + .setGroup(ElectroMana.ID) + .addCriterion("mana_mk1", InventoryChangeTrigger.Instance.forItems(ElectroManaItems.MANA_TRANSFORMER_ITEM.get())) + .build(consumer, ElectroManaBlocks.MANA_TRANSFORMER_MK2.getId()); + + ShapedRecipeBuilder + .shapedRecipe(ElectroManaBlocks.LESSER_MANA_ALTAR.get()) + .key('c', ElectroManaItems.REINFORCED_NETHER_STAR.get()) + .key('t', ElectroManaItems.MANA_TRANSFORMER_ITEM_MK2.get()) + .key('p', ElectroManaItems.REINFORCED_PLATE.get()) + .patternLine("ppp") + .patternLine("pcp") + .patternLine("ttt") + .setGroup(ElectroMana.ID) + .addCriterion("mana_mk2", InventoryChangeTrigger.Instance.forItems(ElectroManaItems.MANA_TRANSFORMER_ITEM_MK2.get())) + .build(consumer, ElectroManaBlocks.LESSER_MANA_ALTAR.getId()); + + ShapedRecipeBuilder + .shapedRecipe(ElectroManaBlocks.GREATER_MANA_ALTAR.get()) + .key('c', ElectroManaItems.REINFORCED_NETHER_STAR.get()) + .key('t', ElectroManaItems.LESSER_MANA_ALTAR_ITEM.get()) + .key('p', ElectroManaItems.REINFORCED_PLATE.get()) + .patternLine("ppp") + .patternLine("pcp") + .patternLine("ttt") + .setGroup(ElectroMana.ID) + .addCriterion("mana_altar_lesser", InventoryChangeTrigger.Instance.forItems(ElectroManaItems.LESSER_MANA_ALTAR_ITEM.get())) + .build(consumer, ElectroManaBlocks.GREATER_MANA_ALTAR.getId()); + + ShapedRecipeBuilder + .shapedRecipe(ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get()) + .key('c', ElectroManaItems.REINFORCED_NETHER_STAR.get()) + .key('t', ElectroManaItems.GREATER_MANA_ALTAR_ITEM.get()) + .key('p', ElectroManaItems.REINFORCED_PLATE.get()) + .patternLine("ppp") + .patternLine("pcp") + .patternLine("ttt") + .setGroup(ElectroMana.ID) + .addCriterion("mana_altar_greater", InventoryChangeTrigger.Instance.forItems(ElectroManaItems.GREATER_MANA_ALTAR_ITEM.get())) + .build(consumer, ElectroManaBlocks.EXQUISITE_MANA_ALTAR.getId()); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/data/Generators.java b/src/main/java/xyz/nuark/mods/electromana/data/Generators.java new file mode 100644 index 0000000..4002d95 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/data/Generators.java @@ -0,0 +1,26 @@ +package xyz.nuark.mods.electromana.data; + +import net.minecraft.data.DataGenerator; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; +import xyz.nuark.mods.electromana.ElectroMana; + +@Mod.EventBusSubscriber(modid= ElectroMana.ID, bus= Mod.EventBusSubscriber.Bus.MOD) +public class Generators { + @SubscribeEvent + public static void gatherData(GatherDataEvent event) { + DataGenerator generator = event.getGenerator(); + + if (event.includeServer()) { + generator.addProvider(new GeneratorRecipes(generator)); + generator.addProvider(new GeneratorLoots(generator)); + } + + if (event.includeClient()) { + generator.addProvider(new GeneratorLanguage(generator)); + generator.addProvider(new GeneratorBlockStates(generator, event.getExistingFileHelper())); + generator.addProvider(new GeneratorItemModels(generator, event.getExistingFileHelper())); + } + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/item/ManaTransformerItem.java b/src/main/java/xyz/nuark/mods/electromana/item/ManaTransformerItem.java new file mode 100644 index 0000000..7d2ae6a --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/item/ManaTransformerItem.java @@ -0,0 +1,43 @@ +package xyz.nuark.mods.electromana.item; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.World; +import xyz.nuark.mods.electromana.tile.ManaTransformerTile; + +import javax.annotation.Nullable; +import java.util.List; + +public class ManaTransformerItem extends BlockItem { + + public ManaTransformerItem(Block blockIn, Properties builder) { + super(blockIn, builder); + } + + @Override + public void addInformation(ItemStack stack, @Nullable World worldIn, List tooltip, ITooltipFlag flagIn) { + super.addInformation(stack, worldIn, tooltip, flagIn); + + tooltip.add(new StringTextComponent("Transforming FE into Mana since 2021!").mergeStyle(TextFormatting.GREEN)); + } + + @Override + protected boolean onBlockPlaced(BlockPos pos, World worldIn, @Nullable PlayerEntity player, ItemStack stack, BlockState state) { + TileEntity te = worldIn.getTileEntity(pos); + if (te instanceof ManaTransformerTile) { + ManaTransformerTile tile = (ManaTransformerTile) te; + tile.energyStorage.receiveEnergy(stack.getOrCreateTag().getInt("energy"), false); + } + + return super.onBlockPlaced(pos, worldIn, player, stack, state); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedNetherStarItem.java b/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedNetherStarItem.java new file mode 100644 index 0000000..b08c93a --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedNetherStarItem.java @@ -0,0 +1,23 @@ +package xyz.nuark.mods.electromana.item; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Rarity; +import net.minecraft.world.World; +import xyz.nuark.mods.electromana.setup.ModSetup; + +public class ReinforcedNetherStarItem extends Item { + public ReinforcedNetherStarItem() { + super(ModSetup.ITEM_PROPS.rarity(Rarity.RARE).isImmuneToFire()); + } + + @Override + public int getEntityLifespan(ItemStack stack, World world) { + return Integer.MAX_VALUE; + } + + @Override + public boolean hasEffect(ItemStack stack) { + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedNetherStarPieceItem.java b/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedNetherStarPieceItem.java new file mode 100644 index 0000000..489a0c0 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedNetherStarPieceItem.java @@ -0,0 +1,18 @@ +package xyz.nuark.mods.electromana.item; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Rarity; +import net.minecraft.world.World; +import xyz.nuark.mods.electromana.setup.ModSetup; + +public class ReinforcedNetherStarPieceItem extends Item { + public ReinforcedNetherStarPieceItem() { + super(ModSetup.ITEM_PROPS.rarity(Rarity.RARE).isImmuneToFire()); + } + + @Override + public int getEntityLifespan(ItemStack stack, World world) { + return Integer.MAX_VALUE; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedPlateItem.java b/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedPlateItem.java new file mode 100644 index 0000000..cf2b5ec --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/item/ReinforcedPlateItem.java @@ -0,0 +1,23 @@ +package xyz.nuark.mods.electromana.item; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Rarity; +import net.minecraft.world.World; +import xyz.nuark.mods.electromana.setup.ModSetup; + +public class ReinforcedPlateItem extends Item { + public ReinforcedPlateItem() { + super(ModSetup.ITEM_PROPS.rarity(Rarity.RARE).isImmuneToFire()); + } + + @Override + public int getEntityLifespan(ItemStack stack, World world) { + return Integer.MAX_VALUE; + } + + @Override + public boolean hasEffect(ItemStack stack) { + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/setup/ClientSetup.java b/src/main/java/xyz/nuark/mods/electromana/setup/ClientSetup.java new file mode 100644 index 0000000..85fe99b --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/setup/ClientSetup.java @@ -0,0 +1,17 @@ +package xyz.nuark.mods.electromana.setup; + +import net.minecraft.client.gui.ScreenManager; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaContainers; +import xyz.nuark.mods.electromana.client.screens.ManaTransformerScreen; + +@Mod.EventBusSubscriber(modid=ElectroMana.ID, value=Dist.CLIENT, bus=Mod.EventBusSubscriber.Bus.MOD) +public class ClientSetup { + + public static void init(final FMLClientSetupEvent event) { + ScreenManager.registerFactory(ElectroManaContainers.MANA_TRANSFORMER_CONTAINER.get(), ManaTransformerScreen::new); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/setup/Config.java b/src/main/java/xyz/nuark/mods/electromana/setup/Config.java new file mode 100644 index 0000000..7c6fa22 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/setup/Config.java @@ -0,0 +1,48 @@ +package xyz.nuark.mods.electromana.setup; + +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.config.ModConfig; + +@Mod.EventBusSubscriber +public class Config { + public static ForgeConfigSpec SERVER_CONFIG; + public static ForgeConfigSpec CLIENT_CONFIG; + + public static ForgeConfigSpec.IntValue CHARGE_MAX_POWER; + public static ForgeConfigSpec.IntValue CHARGE_MAX_POWER_MK2; + + public static ForgeConfigSpec.IntValue GENERATION_MAX_MANA; + public static ForgeConfigSpec.IntValue GENERATION_MAX_MANA_MK2; + + public static ForgeConfigSpec.IntValue POWER_USAGE; + public static ForgeConfigSpec.IntValue POWER_USAGE_MK2; + + static { + ForgeConfigSpec.Builder SERVER_BUILDER = new ForgeConfigSpec.Builder(); + ForgeConfigSpec.Builder CLIENT_BUILDER = new ForgeConfigSpec.Builder(); + + SERVER_BUILDER.comment("General settings").push("general"); + + CHARGE_MAX_POWER = SERVER_BUILDER.defineInRange("charge_max_power", 10000, 0, Integer.MAX_VALUE); + CHARGE_MAX_POWER_MK2 = SERVER_BUILDER.defineInRange("charge_max_power_mk2", 1000000000, 0, Integer.MAX_VALUE); + + GENERATION_MAX_MANA = SERVER_BUILDER.defineInRange("generation_max_mana", 1, 0, Integer.MAX_VALUE); + GENERATION_MAX_MANA_MK2 = SERVER_BUILDER.defineInRange("generation_max_mana_mk2", 1000, 0, Integer.MAX_VALUE); + + POWER_USAGE = SERVER_BUILDER.defineInRange("power_usage", 10000, 0, Integer.MAX_VALUE); + POWER_USAGE_MK2 = SERVER_BUILDER.defineInRange("power_usage_mk2", 1000, 0, Integer.MAX_VALUE); + + SERVER_BUILDER.pop(); + + SERVER_CONFIG = SERVER_BUILDER.build(); + CLIENT_CONFIG = CLIENT_BUILDER.build(); + } + + @SubscribeEvent + public static void onLoad(final ModConfig.Loading configEvent) {} + + @SubscribeEvent + public static void onReload(final ModConfig.Reloading configEvent) {} +} diff --git a/src/main/java/xyz/nuark/mods/electromana/setup/ModSetup.java b/src/main/java/xyz/nuark/mods/electromana/setup/ModSetup.java new file mode 100644 index 0000000..95b83b9 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/setup/ModSetup.java @@ -0,0 +1,27 @@ +package xyz.nuark.mods.electromana.setup; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaBlocks; + +@Mod.EventBusSubscriber(modid= ElectroMana.ID, value= Dist.CLIENT, bus=Mod.EventBusSubscriber.Bus.FORGE) +public class ModSetup { + + public static final ItemGroup ITEM_GROUP = new ItemGroup(ElectroMana.ID) { + @Override + public ItemStack createIcon() { + return new ItemStack(ElectroManaBlocks.EXQUISITE_MANA_ALTAR.get()); + } + }; + + public static final Item.Properties ITEM_PROPS = new Item.Properties().group(ITEM_GROUP); + + public static void init(final FMLCommonSetupEvent event) { + + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/setup/Registration.java b/src/main/java/xyz/nuark/mods/electromana/setup/Registration.java new file mode 100644 index 0000000..75008e7 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/setup/Registration.java @@ -0,0 +1,15 @@ +package xyz.nuark.mods.electromana.setup; + +import xyz.nuark.mods.electromana.ElectroManaBlocks; +import xyz.nuark.mods.electromana.ElectroManaContainers; +import xyz.nuark.mods.electromana.ElectroManaItems; +import xyz.nuark.mods.electromana.ElectroManaTiles; + +public class Registration { + public static void init() { + ElectroManaItems.register(); + ElectroManaBlocks.register(); + ElectroManaTiles.register(); + ElectroManaContainers.register(); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/structure/BlockArray.java b/src/main/java/xyz/nuark/mods/electromana/structure/BlockArray.java new file mode 100644 index 0000000..9de6e7d --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/structure/BlockArray.java @@ -0,0 +1,62 @@ +package xyz.nuark.mods.electromana.structure; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.utils.BrokenStructureException; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class BlockArray { + Map _blocks; + int width, height; + + public BlockArray(int width, int height) { + this.width = width; + this.height = height; + _blocks = new HashMap<>(); + } + + public void addBlock(Block block, BlockPos pos) { + _blocks.put(pos, block); + } + + public void addBlock(Block block, int x, int y, int z) { + this.addBlock(block, new BlockPos(x, y, z)); + } + + boolean check(BlockPos realPos, BlockPos inStructPos, IWorld world) throws BrokenStructureException { + int startX = realPos.getX() - inStructPos.getX(); + int startY = realPos.getY() - inStructPos.getY(); + int startZ = realPos.getZ() - inStructPos.getZ(); + for (int posX = 0; posX < width; posX++) { + for (int posZ = 0; posZ < width; posZ++) { + for (int posY = 0; posY < height; posY++) { + Block structBlock = _blocks.getOrDefault(new BlockPos(posX, posY, posZ), null); + BlockPos worldBlockPos = new BlockPos(startX + posX, startY + posY, startZ + posZ); + Block worldBlock = world.getBlockState(worldBlockPos) + .getBlock(); + + if (structBlock == null) { + continue; + } + + if (structBlock != worldBlock) { + String message = String.format( + Locale.CANADA, "Required '%s' at [x=%d, y=%d, z=%d], but found '%s'", + structBlock.getTranslatedName().getString(), worldBlockPos.getX(), worldBlockPos.getY(), + worldBlockPos.getZ(), worldBlock.getTranslatedName().getString() + ); + throw new BrokenStructureException(message); + } + } + } + } + + return true; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/structure/StructureType.java b/src/main/java/xyz/nuark/mods/electromana/structure/StructureType.java new file mode 100644 index 0000000..bd67264 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/structure/StructureType.java @@ -0,0 +1,54 @@ +package xyz.nuark.mods.electromana.structure; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.registries.IForgeRegistryEntry; +import xyz.nuark.mods.electromana.utils.BrokenStructureException; +import xyz.nuark.mods.electromana.utils.SupplierUtils; + +import javax.annotation.Nullable; +import java.util.function.Supplier; + +public class StructureType implements IForgeRegistryEntry { + + private final BlockPos inStructPos; + private final ResourceLocation name; + private final Supplier structureSupplier; + + public StructureType(ResourceLocation name, BlockPos inStructPos, Supplier structureSupplier) { + this.name = name; + this.inStructPos = inStructPos; + this.structureSupplier = SupplierUtils.memoizeLock(structureSupplier); + } + + public BlockArray getStructure() { + return this.structureSupplier.get(); + } + + public ITextComponent getDisplayName() { + return new TranslationTextComponent(String.format("structure.%s.%s.name", name.getNamespace(), name.getPath())); + } + + public boolean check(World world, BlockPos pos) throws BrokenStructureException { + return structureSupplier.get().check(pos, inStructPos, world); + } + + @Override + public final StructureType setRegistryName(ResourceLocation name) { + return this; + } + + @Nullable + @Override + public ResourceLocation getRegistryName() { + return this.name; + } + + @Override + public Class getRegistryType() { + return StructureType.class; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/tile/BaseManaAltarTile.java b/src/main/java/xyz/nuark/mods/electromana/tile/BaseManaAltarTile.java new file mode 100644 index 0000000..3704853 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/tile/BaseManaAltarTile.java @@ -0,0 +1,32 @@ +package xyz.nuark.mods.electromana.tile; + +import net.minecraft.block.BlockState; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.math.BlockPos; +import vazkii.botania.api.mana.IManaPool; + +public abstract class BaseManaAltarTile extends TileEntity implements ITickableTileEntity, IMultiblockTile, INamedContainerProvider { + public BaseManaAltarTile(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + } + + protected IManaPool getUpperManaPool() { + if (getWorld() == null) { + return null; + } + + BlockPos upperBlock = getPos().up(); + BlockState bs = getWorld().getBlockState(upperBlock); + if (bs.hasTileEntity()) { + TileEntity te = getWorld().getTileEntity(upperBlock); + if (te instanceof IManaPool) { + return (IManaPool) te; + } + } + + return null; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/tile/BaseManaTransformerTile.java b/src/main/java/xyz/nuark/mods/electromana/tile/BaseManaTransformerTile.java new file mode 100644 index 0000000..006fde4 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/tile/BaseManaTransformerTile.java @@ -0,0 +1,69 @@ +package xyz.nuark.mods.electromana.tile; + +import net.minecraft.block.BlockState; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SUpdateTileEntityPacket; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.math.BlockPos; +import vazkii.botania.api.mana.IManaPool; + +public abstract class BaseManaTransformerTile extends TileEntity implements ITickableTileEntity, INamedContainerProvider { + public enum Slots { + FUEL(0); + + int id; + + Slots(int number) { + id = number; + } + + public int getId() { + return id; + } + } + + public BaseManaTransformerTile(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + } + + protected IManaPool getUpperManaPool() { + if (getWorld() == null) { + return null; + } + + BlockPos upperBlock = getPos().up(); + BlockState bs = getWorld().getBlockState(upperBlock); + if (bs.hasTileEntity()) { + TileEntity te = getWorld().getTileEntity(upperBlock); + if (te instanceof IManaPool) { + return (IManaPool) te; + } + } + + return null; + } + + @Override + public SUpdateTileEntityPacket getUpdatePacket() { + return new SUpdateTileEntityPacket(pos, 0, getUpdateTag()); + } + + @Override + public CompoundNBT getUpdateTag() { + return write(new CompoundNBT()); + } + + @Override + public void handleUpdateTag(BlockState stateIn, CompoundNBT tag) { + read(stateIn, tag); + } + + @Override + public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { + read(this.getBlockState(), pkt.getNbtCompound()); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/tile/ExquisiteManaAltarTile.java b/src/main/java/xyz/nuark/mods/electromana/tile/ExquisiteManaAltarTile.java new file mode 100644 index 0000000..6ba947b --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/tile/ExquisiteManaAltarTile.java @@ -0,0 +1,153 @@ +package xyz.nuark.mods.electromana.tile; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.CapabilityEnergy; +import vazkii.botania.api.mana.IManaReceiver; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaStructures; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.capabilities.ManaAltarEnergyStorage; +import xyz.nuark.mods.electromana.structure.StructureType; +import xyz.nuark.mods.electromana.utils.BrokenStructureException; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +// m'kay +// 1 hour for full pool = 3600 seconds +// Full pool = 2000000 points of mana +// +// Each second adds 555 mana to the pool (if presented) -> a little more than 1 hour to fill a full pool +public class ExquisiteManaAltarTile extends BaseManaAltarTile { + protected boolean hasMultiblock = false; + protected int ticksFormed = 0; + protected StructureType _structure; + + public ManaAltarEnergyStorage energyStorage; + private LazyOptional energy; + + public ExquisiteManaAltarTile() { + super(ElectroManaTiles.EXQUISITE_MANA_ALTAR_TILE.get()); + + _structure = this.getRequiredStructureType(); + this.energyStorage = new ManaAltarEnergyStorage(this, 0); + this.energy = LazyOptional.of(() -> this.energyStorage); + } + + @Override + public void tick() { + if (!this.hasMultiblock) { + return; + } + ticksFormed += 1; + + IManaReceiver mr = this.getUpperManaPool(); + if (mr == null || mr.isFull() || (ticksFormed % 20) != 0) { + return; + } + + this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> { + ManaAltarEnergyStorage mts = (ManaAltarEnergyStorage) energyStorage; + int mxe = 1_000_000; + boolean canExtractEnergy = mts.consumeEnergy(mxe, true) == mxe; + if (canExtractEnergy) { + mts.consumeEnergy(mxe, false); + mr.receiveMana(555); // Y 555? See heading of class + } + }); + } + + public boolean validateMultiblock() throws BrokenStructureException { + if (getWorld().isRemote()) { + return this.hasMultiblock; + } + + if (this.getRequiredStructureType() == null) { + resetMultiblockState(); + return false; + } + + boolean prevFound = this.hasMultiblock; + boolean found = _structure.check(getWorld(), getPos()); + if (prevFound != found) { + ElectroMana.getLOGGER().info( + "Structure match updated: " + this.getClass().getName() + " at " + this.getPos() + + " (" + this.hasMultiblock + " -> " + found + ")" + ); + this.hasMultiblock = found; + this.markForUpdate(); + } + return this.hasMultiblock; + } + + private void resetMultiblockState() { + ticksFormed = 0; + if (this.hasMultiblock) { + this.hasMultiblock = false; + this.markForUpdate(); + } + } + + @Nullable + @Override + public StructureType getRequiredStructureType() { + return ElectroManaStructures.EXQUISITE_MANA_ALTAR_STRUCTURE; + } + + public void markForUpdate() { + if (getWorld() != null) { + BlockState thisState = this.getBlockState(); + getWorld().notifyBlockUpdate(getPos(), thisState, thisState, 3); + } + markDirty(); + } + + @Override + public void read(BlockState stateIn, CompoundNBT compound) { + super.read(stateIn, compound); + + energy.ifPresent(h -> h.deserializeNBT(compound.getCompound("energy"))); + this.hasMultiblock = compound.getBoolean("hasMultiblock"); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + energy.ifPresent(h -> compound.put("energy", h.serializeNBT())); + compound.putBoolean("hasMultiblock", this.hasMultiblock); + + return super.write(compound); + } + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, final @Nullable Direction side) { + if (cap == CapabilityEnergy.ENERGY) + return energy.cast(); + + return super.getCapability(cap, side); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("Exquisite Mana Altar"); + } + + @Nullable + @Override + public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { + return null; + } + + public boolean hasMultiblock() { + return hasMultiblock; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/tile/GreaterManaAltarTile.java b/src/main/java/xyz/nuark/mods/electromana/tile/GreaterManaAltarTile.java new file mode 100644 index 0000000..48d32e2 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/tile/GreaterManaAltarTile.java @@ -0,0 +1,155 @@ +package xyz.nuark.mods.electromana.tile; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.CapabilityEnergy; +import vazkii.botania.api.mana.IManaReceiver; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaStructures; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.capabilities.ManaAltarEnergyStorage; +import xyz.nuark.mods.electromana.capabilities.ManaTransformerStorage; +import xyz.nuark.mods.electromana.setup.Config; +import xyz.nuark.mods.electromana.structure.StructureType; +import xyz.nuark.mods.electromana.utils.BrokenStructureException; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +// m'kay +// 3 hours for full pool = 10800 seconds +// Full pool = 2000000 points of mana +// +// Each second adds 185 mana to the pool (if presented) -> a little more than 3 hours to fill a full pool +public class GreaterManaAltarTile extends BaseManaAltarTile { + protected boolean hasMultiblock = false; + protected int ticksFormed = 0; + protected StructureType _structure; + + public ManaAltarEnergyStorage energyStorage; + private LazyOptional energy; + + public GreaterManaAltarTile() { + super(ElectroManaTiles.GREATER_MANA_ALTAR_TILE.get()); + + _structure = this.getRequiredStructureType(); + this.energyStorage = new ManaAltarEnergyStorage(this, 0); + this.energy = LazyOptional.of(() -> this.energyStorage); + } + + @Override + public void tick() { + if (!this.hasMultiblock) { + return; + } + ticksFormed += 1; + + IManaReceiver mr = this.getUpperManaPool(); + if (mr == null || mr.isFull() || (ticksFormed % 20) != 0) { + return; + } + + this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> { + ManaAltarEnergyStorage mts = (ManaAltarEnergyStorage) energyStorage; + int mxe = 1_000_000; + boolean canExtractEnergy = mts.consumeEnergy(mxe, true) == mxe; + if (canExtractEnergy) { + mts.consumeEnergy(mxe, false); + mr.receiveMana(185); // Y 185? See heading of class + } + }); + } + + public boolean validateMultiblock() throws BrokenStructureException { + if (getWorld().isRemote()) { + return this.hasMultiblock; + } + + if (this.getRequiredStructureType() == null) { + resetMultiblockState(); + return false; + } + + boolean prevFound = this.hasMultiblock; + boolean found = _structure.check(getWorld(), getPos()); + if (prevFound != found) { + ElectroMana.getLOGGER().info( + "Structure match updated: " + this.getClass().getName() + " at " + this.getPos() + + " (" + this.hasMultiblock + " -> " + found + ")" + ); + this.hasMultiblock = found; + this.markForUpdate(); + } + return this.hasMultiblock; + } + + private void resetMultiblockState() { + ticksFormed = 0; + if (this.hasMultiblock) { + this.hasMultiblock = false; + this.markForUpdate(); + } + } + + @Nullable + @Override + public StructureType getRequiredStructureType() { + return ElectroManaStructures.GREATER_MANA_ALTAR_STRUCTURE; + } + + public void markForUpdate() { + if (getWorld() != null) { + BlockState thisState = this.getBlockState(); + getWorld().notifyBlockUpdate(getPos(), thisState, thisState, 3); + } + markDirty(); + } + + @Override + public void read(BlockState stateIn, CompoundNBT compound) { + super.read(stateIn, compound); + + energy.ifPresent(h -> h.deserializeNBT(compound.getCompound("energy"))); + this.hasMultiblock = compound.getBoolean("hasMultiblock"); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + energy.ifPresent(h -> compound.put("energy", h.serializeNBT())); + compound.putBoolean("hasMultiblock", this.hasMultiblock); + + return super.write(compound); + } + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, final @Nullable Direction side) { + if (cap == CapabilityEnergy.ENERGY) + return energy.cast(); + + return super.getCapability(cap, side); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("Greater Mana Altar"); + } + + @Nullable + @Override + public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { + return null; + } + + public boolean hasMultiblock() { + return hasMultiblock; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/tile/IMultiblockTile.java b/src/main/java/xyz/nuark/mods/electromana/tile/IMultiblockTile.java new file mode 100644 index 0000000..71aedf7 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/tile/IMultiblockTile.java @@ -0,0 +1,10 @@ +package xyz.nuark.mods.electromana.tile; + +import xyz.nuark.mods.electromana.structure.StructureType; + +import javax.annotation.Nullable; + +public interface IMultiblockTile { + @Nullable + public StructureType getRequiredStructureType(); +} diff --git a/src/main/java/xyz/nuark/mods/electromana/tile/LesserManaAltarTile.java b/src/main/java/xyz/nuark/mods/electromana/tile/LesserManaAltarTile.java new file mode 100644 index 0000000..c3f8b65 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/tile/LesserManaAltarTile.java @@ -0,0 +1,163 @@ +package xyz.nuark.mods.electromana.tile; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SUpdateTileEntityPacket; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.items.CapabilityItemHandler; +import vazkii.botania.api.mana.IManaPool; +import vazkii.botania.api.mana.IManaReceiver; +import xyz.nuark.mods.electromana.ElectroMana; +import xyz.nuark.mods.electromana.ElectroManaStructures; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.capabilities.ManaAltarEnergyStorage; +import xyz.nuark.mods.electromana.capabilities.ManaTransformerStorage; +import xyz.nuark.mods.electromana.setup.Config; +import xyz.nuark.mods.electromana.structure.StructureType; +import xyz.nuark.mods.electromana.utils.BrokenStructureException; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +// m'kay +// 6 hours for full pool = 21600 seconds +// Full pool = 2000000 points of mana +// +// Each second adds 111 mana to the pool (if presented) -> a little more than 5 hours to fill a full pool +public class LesserManaAltarTile extends BaseManaAltarTile { + protected boolean hasMultiblock = false; + protected int ticksFormed = 0; + protected StructureType _structure; + + public ManaAltarEnergyStorage energyStorage; + private LazyOptional energy; + + public LesserManaAltarTile() { + super(ElectroManaTiles.LESSER_MANA_ALTAR_TILE.get()); + + _structure = this.getRequiredStructureType(); + this.energyStorage = new ManaAltarEnergyStorage(this, 0); + this.energy = LazyOptional.of(() -> this.energyStorage); + } + + @Override + public void tick() { + if (!this.hasMultiblock) { + return; + } + ticksFormed += 1; + + IManaReceiver mr = this.getUpperManaPool(); + if (mr == null || mr.isFull() || (ticksFormed % 20) != 0) { + return; + } + + this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> { + ManaAltarEnergyStorage mts = (ManaAltarEnergyStorage) energyStorage; + int mxe = 1_000_000; + boolean canExtractEnergy = mts.consumeEnergy(mxe, true) == mxe; + if (canExtractEnergy) { + mts.consumeEnergy(mxe, false); + mr.receiveMana(111); // Y 111? See heading of class + } + }); + } + + public boolean validateMultiblock() throws BrokenStructureException { + if (getWorld().isRemote()) { + return this.hasMultiblock; + } + + if (this.getRequiredStructureType() == null) { + resetMultiblockState(); + return false; + } + + boolean prevFound = this.hasMultiblock; + boolean found = _structure.check(getWorld(), getPos()); + if (prevFound != found) { + ElectroMana.getLOGGER().info( + "Structure match updated: " + this.getClass().getName() + " at " + this.getPos() + + " (" + this.hasMultiblock + " -> " + found + ")" + ); + this.hasMultiblock = found; + this.markForUpdate(); + } + return this.hasMultiblock; + } + + private void resetMultiblockState() { + ticksFormed = 0; + if (this.hasMultiblock) { + this.hasMultiblock = false; + this.markForUpdate(); + } + } + + @Nullable + @Override + public StructureType getRequiredStructureType() { + return ElectroManaStructures.LESSER_MANA_ALTAR_STRUCTURE; + } + + public void markForUpdate() { + if (getWorld() != null) { + BlockState thisState = this.getBlockState(); + getWorld().notifyBlockUpdate(getPos(), thisState, thisState, 3); + } + markDirty(); + } + + @Override + public void read(BlockState stateIn, CompoundNBT compound) { + super.read(stateIn, compound); + + energy.ifPresent(h -> h.deserializeNBT(compound.getCompound("energy"))); + this.hasMultiblock = compound.getBoolean("hasMultiblock"); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + energy.ifPresent(h -> compound.put("energy", h.serializeNBT())); + compound.putBoolean("hasMultiblock", this.hasMultiblock); + + return super.write(compound); + } + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, final @Nullable Direction side) { + if (cap == CapabilityEnergy.ENERGY) + return energy.cast(); + + return super.getCapability(cap, side); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("Lesser Mana Altar"); + } + + @Nullable + @Override + public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) { + return null; + } + + public boolean hasMultiblock() { + return hasMultiblock; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/tile/ManaTransformerMK2Tile.java b/src/main/java/xyz/nuark/mods/electromana/tile/ManaTransformerMK2Tile.java new file mode 100644 index 0000000..ec31480 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/tile/ManaTransformerMK2Tile.java @@ -0,0 +1,232 @@ +package xyz.nuark.mods.electromana.tile; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.item.BucketItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SUpdateTileEntityPacket; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.IIntArray; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.IEnergyStorage; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import vazkii.botania.api.mana.IManaPool; +import vazkii.botania.api.mana.IManaReceiver; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.capabilities.ManaTransformerItemHandler; +import xyz.nuark.mods.electromana.capabilities.ManaTransformerStorage; +import xyz.nuark.mods.electromana.container.ManaTransformerContainer; +import xyz.nuark.mods.electromana.setup.Config; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class ManaTransformerMK2Tile extends BaseManaTransformerTile { + private int counter = 0; + private int maxBurn = 0; + + public ManaTransformerStorage energyStorage; + private LazyOptional energy; + private LazyOptional inventory = LazyOptional.of(() -> new ManaTransformerItemHandler(this)); + + public final IIntArray manaTransformerData = new IIntArray() { + @Override + public int get(int index) { + switch (index) { + case 0: + return ManaTransformerMK2Tile.this.energyStorage.getEnergyStored() / 32; + case 1: + return ManaTransformerMK2Tile.this.energyStorage.getMaxEnergyStored() / 32; + case 2: + return ManaTransformerMK2Tile.this.counter; + case 3: + return ManaTransformerMK2Tile.this.maxBurn; + case 4: + return ManaTransformerMK2Tile.this.getUpperManaPool() != null ? ManaTransformerMK2Tile.this.getUpperManaPool().getCurrentMana() : 0; + case 5: + return ManaTransformerMK2Tile.this.getUpperManaPool() != null ? ManaTransformerMK2Tile.this.getUpperManaPool().tileEntity().getUpdateTag().getInt("manaCap") : 0; + default: + throw new IllegalArgumentException("Invalid index: " + index); + } + } + + @Override + public void set(int index, int value) { + throw new IllegalStateException("Cannot set values through IIntArray"); + } + + @Override + public int size() { + return 6; + } + }; + + public ManaTransformerMK2Tile() { + super(ElectroManaTiles.MANA_TRANSFORMER_TILE_MK2.get()); + this.energyStorage = new ManaTransformerStorage(this, 0, Config.CHARGE_MAX_POWER_MK2.get()); + this.energy = LazyOptional.of(() -> this.energyStorage); + } + + @Nullable + @Override + public Container createMenu(int i, PlayerInventory playerInventory, PlayerEntity playerEntity) { + assert world != null; + return new ManaTransformerContainer(this, this.manaTransformerData, i, playerInventory, this.inventory.orElse(new ItemStackHandler(1))); + } + + @Override + public void tick() { + if (getWorld() == null) { + return; + } + + tryPushMana(); + + inventory.ifPresent(handler -> { + tryBurn(); + }); + } + + private void tryBurn() { + if (world == null) + return; + + this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> { + boolean canInsertEnergy = energyStorage.receiveEnergy(625, true) > 0; + if (counter > 0 && canInsertEnergy) { + burn(energyStorage); + } else if (canInsertEnergy) { + if (initBurn()) { + burn(energyStorage); + } + } + }); + } + + private void tryPushMana() { + if (world == null) + return; + + IManaReceiver mr = getUpperManaPool(); + if (mr == null) { + return; + } + + this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> { + ManaTransformerStorage mts = (ManaTransformerStorage) energyStorage; + int mxe = Config.POWER_USAGE_MK2.get(); + boolean canExtractEnergy = mts.consumeEnergy(mxe, true) == mxe; + if (canExtractEnergy && !mr.isFull()) { + mts.consumeEnergy(mxe, false); + mr.receiveMana(1); + } + }); + } + + private void burn(IEnergyStorage energyStorage) { + energyStorage.receiveEnergy(5000, false); + + counter--; + if (counter == 0) { + maxBurn = 0; + initBurn(); + } + } + + private boolean initBurn() { + ItemStackHandler handler = inventory.orElseThrow(RuntimeException::new); + ItemStack stack = handler.getStackInSlot(Slots.FUEL.id); + + int burnTime = ForgeHooks.getBurnTime(stack); + if (burnTime > 0) { + Item fuelStack = handler.getStackInSlot(Slots.FUEL.id).getItem(); + handler.extractItem(0, 1, false); + if (fuelStack instanceof BucketItem && fuelStack != Items.BUCKET) + handler.insertItem(0, new ItemStack(Items.BUCKET, 1), false); + + markDirty(); + counter = (int) Math.floor(burnTime) / 50; + maxBurn = counter; + return true; + } + return false; + } + + @Override + public void read(BlockState stateIn, CompoundNBT compound) { + super.read(stateIn, compound); + + inventory.ifPresent(h -> h.deserializeNBT(compound.getCompound("inv"))); + energy.ifPresent(h -> h.deserializeNBT(compound.getCompound("energy"))); + counter = compound.getInt("counter"); + maxBurn = compound.getInt("maxburn"); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + inventory.ifPresent(h -> compound.put("inv", h.serializeNBT())); + energy.ifPresent(h -> compound.put("energy", h.serializeNBT())); + + compound.putInt("counter", counter); + compound.putInt("maxburn", maxBurn); + return super.write(compound); + } + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, final @Nullable Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return inventory.cast(); + + if (cap == CapabilityEnergy.ENERGY) + return energy.cast(); + + return super.getCapability(cap, side); + } + + @Override + public SUpdateTileEntityPacket getUpdatePacket() { + return new SUpdateTileEntityPacket(pos, 0, getUpdateTag()); + } + + @Override + public CompoundNBT getUpdateTag() { + return write(new CompoundNBT()); + } + + @Override + public void handleUpdateTag(BlockState stateIn, CompoundNBT tag) { + read(stateIn, tag); + } + + @Override + public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { + read(this.getBlockState(), pkt.getNbtCompound()); + } + + @Override + public void remove() { + energy.invalidate(); + inventory.invalidate(); + super.remove(); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("Mana Transformer Tile MK2"); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/tile/ManaTransformerTile.java b/src/main/java/xyz/nuark/mods/electromana/tile/ManaTransformerTile.java new file mode 100644 index 0000000..946eaef --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/tile/ManaTransformerTile.java @@ -0,0 +1,232 @@ +package xyz.nuark.mods.electromana.tile; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.item.BucketItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SUpdateTileEntityPacket; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.IIntArray; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.IEnergyStorage; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import vazkii.botania.api.mana.IManaPool; +import vazkii.botania.api.mana.IManaReceiver; +import xyz.nuark.mods.electromana.ElectroManaTiles; +import xyz.nuark.mods.electromana.capabilities.ManaTransformerItemHandler; +import xyz.nuark.mods.electromana.capabilities.ManaTransformerStorage; +import xyz.nuark.mods.electromana.container.ManaTransformerContainer; +import xyz.nuark.mods.electromana.setup.Config; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class ManaTransformerTile extends BaseManaTransformerTile { + private int counter = 0; + private int maxBurn = 0; + + public ManaTransformerStorage energyStorage; + private LazyOptional energy; + private LazyOptional inventory = LazyOptional.of(() -> new ManaTransformerItemHandler(this)); + + public final IIntArray manaTransformerData = new IIntArray() { + @Override + public int get(int index) { + switch (index) { + case 0: + return ManaTransformerTile.this.energyStorage.getEnergyStored() / 32; + case 1: + return ManaTransformerTile.this.energyStorage.getMaxEnergyStored() / 32; + case 2: + return ManaTransformerTile.this.counter; + case 3: + return ManaTransformerTile.this.maxBurn; + case 4: + return ManaTransformerTile.this.getUpperManaPool() != null ? ManaTransformerTile.this.getUpperManaPool().getCurrentMana() : 0; + case 5: + return ManaTransformerTile.this.getUpperManaPool() != null ? ManaTransformerTile.this.getUpperManaPool().tileEntity().getUpdateTag().getInt("manaCap") : 0; + default: + throw new IllegalArgumentException("Invalid index: " + index); + } + } + + @Override + public void set(int index, int value) { + throw new IllegalStateException("Cannot set values through IIntArray"); + } + + @Override + public int size() { + return 6; + } + }; + + public ManaTransformerTile() { + super(ElectroManaTiles.MANA_TRANSFORMER_TILE.get()); + this.energyStorage = new ManaTransformerStorage(this, 0, Config.CHARGE_MAX_POWER.get()); + this.energy = LazyOptional.of(() -> this.energyStorage); + } + + @Nullable + @Override + public Container createMenu(int i, PlayerInventory playerInventory, PlayerEntity playerEntity) { + assert world != null; + return new ManaTransformerContainer(this, this.manaTransformerData, i, playerInventory, this.inventory.orElse(new ItemStackHandler(1))); + } + + @Override + public void tick() { + if (getWorld() == null) { + return; + } + + tryPushMana(); + + inventory.ifPresent(handler -> { + tryBurn(); + }); + } + + private void tryBurn() { + if (world == null) + return; + + this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> { + boolean canInsertEnergy = energyStorage.receiveEnergy(625, true) > 0; + if (counter > 0 && canInsertEnergy) { + burn(energyStorage); + } else if (canInsertEnergy) { + if (initBurn()) { + burn(energyStorage); + } + } + }); + } + + private void tryPushMana() { + if (world == null) + return; + + IManaReceiver mr = getUpperManaPool(); + if (mr == null) { + return; + } + + this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> { + ManaTransformerStorage mts = (ManaTransformerStorage) energyStorage; + int mxe = Config.POWER_USAGE.get(); + boolean canExtractEnergy = mts.consumeEnergy(mxe, true) == mxe; + if (canExtractEnergy && !mr.isFull()) { + mts.consumeEnergy(mxe, false); + mr.receiveMana(Config.GENERATION_MAX_MANA.get()); + } + }); + } + + private void burn(IEnergyStorage energyStorage) { + energyStorage.receiveEnergy(625, false); + + counter--; + if (counter == 0) { + maxBurn = 0; + initBurn(); + } + } + + private boolean initBurn() { + ItemStackHandler handler = inventory.orElseThrow(RuntimeException::new); + ItemStack stack = handler.getStackInSlot(Slots.FUEL.id); + + int burnTime = ForgeHooks.getBurnTime(stack); + if (burnTime > 0) { + Item fuelStack = handler.getStackInSlot(Slots.FUEL.id).getItem(); + handler.extractItem(0, 1, false); + if (fuelStack instanceof BucketItem && fuelStack != Items.BUCKET) + handler.insertItem(0, new ItemStack(Items.BUCKET, 1), false); + + markDirty(); + counter = (int) Math.floor(burnTime) / 50; + maxBurn = counter; + return true; + } + return false; + } + + @Override + public void read(BlockState stateIn, CompoundNBT compound) { + super.read(stateIn, compound); + + inventory.ifPresent(h -> h.deserializeNBT(compound.getCompound("inv"))); + energy.ifPresent(h -> h.deserializeNBT(compound.getCompound("energy"))); + counter = compound.getInt("counter"); + maxBurn = compound.getInt("maxburn"); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + inventory.ifPresent(h -> compound.put("inv", h.serializeNBT())); + energy.ifPresent(h -> compound.put("energy", h.serializeNBT())); + + compound.putInt("counter", counter); + compound.putInt("maxburn", maxBurn); + return super.write(compound); + } + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability cap, final @Nullable Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return inventory.cast(); + + if (cap == CapabilityEnergy.ENERGY) + return energy.cast(); + + return super.getCapability(cap, side); + } + + @Override + public SUpdateTileEntityPacket getUpdatePacket() { + return new SUpdateTileEntityPacket(pos, 0, getUpdateTag()); + } + + @Override + public CompoundNBT getUpdateTag() { + return write(new CompoundNBT()); + } + + @Override + public void handleUpdateTag(BlockState stateIn, CompoundNBT tag) { + read(stateIn, tag); + } + + @Override + public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { + read(this.getBlockState(), pkt.getNbtCompound()); + } + + @Override + public void remove() { + energy.invalidate(); + inventory.invalidate(); + super.remove(); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("Mana Transformer Tile"); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/utils/BrokenStructureException.java b/src/main/java/xyz/nuark/mods/electromana/utils/BrokenStructureException.java new file mode 100644 index 0000000..ca098d8 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/utils/BrokenStructureException.java @@ -0,0 +1,7 @@ +package xyz.nuark.mods.electromana.utils; + +public class BrokenStructureException extends Exception { + public BrokenStructureException(String message) { + super(message); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/utils/MathUtils.java b/src/main/java/xyz/nuark/mods/electromana/utils/MathUtils.java new file mode 100644 index 0000000..62d5b6b --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/utils/MathUtils.java @@ -0,0 +1,7 @@ +package xyz.nuark.mods.electromana.utils; + +public class MathUtils { + public static boolean inRect(int x, int y, int x0, int y0, int x1, int y1) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/utils/NetworkUtils.java b/src/main/java/xyz/nuark/mods/electromana/utils/NetworkUtils.java new file mode 100644 index 0000000..6e636b6 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/utils/NetworkUtils.java @@ -0,0 +1,16 @@ +package xyz.nuark.mods.electromana.utils; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class NetworkUtils { + public static ActionResultType activateBlock(World world, BlockPos pos, PlayerEntity player, Runnable action) { + if (!world.isRemote) { + action.run(); + } + + return ActionResultType.SUCCESS; + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/utils/StringHelpers.java b/src/main/java/xyz/nuark/mods/electromana/utils/StringHelpers.java new file mode 100644 index 0000000..616d685 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/utils/StringHelpers.java @@ -0,0 +1,21 @@ +package xyz.nuark.mods.electromana.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class StringHelpers { + public static String withSuffix(int count) { + if (count < 1000) return "" + count; + int exp = (int) (Math.log(count) / Math.log(1000)); + return String.format("%.1f%c", + count / Math.pow(1000, exp), + "kMGTPE".charAt(exp - 1)); + } + + private static final BigDecimal TWENTY = new BigDecimal(20); + public static String ticksInSeconds(int ticks) { + BigDecimal value = new BigDecimal(ticks); + value = value.divide(TWENTY, 1, RoundingMode.HALF_UP); + return value.toString(); + } +} diff --git a/src/main/java/xyz/nuark/mods/electromana/utils/SupplierUtils.java b/src/main/java/xyz/nuark/mods/electromana/utils/SupplierUtils.java new file mode 100644 index 0000000..699a445 --- /dev/null +++ b/src/main/java/xyz/nuark/mods/electromana/utils/SupplierUtils.java @@ -0,0 +1,24 @@ +package xyz.nuark.mods.electromana.utils; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +public class SupplierUtils { + public static Supplier memoizeLock(Supplier delegate) { + AtomicReference value = new AtomicReference<>(); + return () -> { + T val = value.get(); + if (val == null) { + synchronized(value) { + val = value.get(); + if (val == null) { + val = Objects.requireNonNull(delegate.get()); + value.set(val); + } + } + } + return val; + }; + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..9649317 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,65 @@ +# This is an example mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml +# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml +modLoader="javafml" #mandatory +# A version range to match for said mod loader - for regular FML @Mod it will be the forge version +loaderVersion="[36,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. +# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. +license="All rights reserved" +# A URL to refer people to when problems occur with this mod +#issueTrackerURL="http://my.issue.tracker/" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId="electromana" #mandatory +# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it +# ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata +# see the associated build.gradle script for how to populate this completely automatically during a build +version="${file.jarVersion}" #mandatory +# A display name for the mod +displayName="ElectroMana" #mandatory +# A URL to query for updates for this mod. See the JSON update specification +#updateJSONURL="http://myurl.me/" #optional +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="http://example.com/" #optional +# A file name (in the root of the mod JAR) containing a logo for display +#logoFile="ElectroMana.png" #optional +# A text field displayed in the mod UI +#credits="Thanks for this example mod goes to Java" #optional +# A text field displayed in the mod UI +authors="nuark" #optional +# The description text for the mod (multi line!) (#mandatory) +description=''' +Use a lot of FE to passively generate Botania Mana +''' +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.ElectroMana]] #optional + # the modid of the dependency + modId="forge" #mandatory + # Does this dependency have to exist - if not, ordering below must be specified + mandatory=true #mandatory + # The version range of the dependency + versionRange="[36,)" #mandatory + # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT or SERVER + side="BOTH" +# Here's another dependency +[[dependencies.ElectroMana]] + modId="minecraft" + mandatory=true + # This version range declares a minimum of the current minecraft version up to but not including the next major version + versionRange="[1.16.5,1.17)" + ordering="NONE" + side="BOTH" + +[[dependencies.ElectroMana]] + modId="botania" + mandatory = true + versionRange = "[r1.16.4-414,)" + ordering = "NONE" + side="BOTH" diff --git a/src/main/resources/assets/electromana/textures/blocks/exquisite_mana_altar_front.png b/src/main/resources/assets/electromana/textures/blocks/exquisite_mana_altar_front.png new file mode 100644 index 0000000000000000000000000000000000000000..c11d0ecdf05ce99d2d012e6cabb13c0d95a18996 GIT binary patch literal 3132 zcmV-C48!w@P)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`gH|hTglt0MdJtUPWP;8DJ;_ z4l^{dA)*2iMMRn+NKnLp(NH8-M6nPQRImpm2q-ZaMN}+rM%Ih2ti1Q~^84egZ|$@9 zx%=$B&srA%lBX}1mj+7#kjfMAgFKw+5s^`J>;QlP9$S?PR%=$HTzo3l9?ED;xoI3-JvF1F8#m>QQXW*8-A zz9>Nv%ZWK*kqtikEV84R*{M9Xh{ZXlvs2k(?iKO2Od&_ah_8qXGr62B5#JKAMv5?% zE8;ie*i;TP0{|3BY!`4?i6S-;F^L}%f`(o2L0Dz>ZZynda zx(`h}FNp#{x{a}MR#uh~m%}m=7xWMPPlvyuufAs_KJJh5&|Nw4Oks+EF0LCZEhSCJ zr)Q)ySsc3IpNIG#2mW;)20@&74xhslMTCi_jLS<9wVTK03b<)JI+ypKn)naH{-njZ z7KzgM5l~}{fYfy=Kz{89C<+lE(fh?+|D$id_%I-TdEqLPi*x_)H~nY9rQ#)noA5c# zB`Ac>67n+__r%Wu$9dISw03U@r;Pdb`_%=KWKZEBGfDjQH zqKX(I48#TTN1~8;gpaI8ijWGV0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2w zRf4KU9Y%GadQmq~W2jlwM>H9&h}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwC(y4k7z_=g zjj_UbVj?j~n6;P^%sxyT<{V}aGme?VVzKgAeXJeUAIroFu!Yzv>{0Al>=1SW`vynE zso>0T?zku%50{Utz#YMz!42UiaSM1Uye8fT?~iBWbMU43MtnE^I(`DbK#(SA6YK~f zge1ZyLM5SA?cA^NYNxAX$R>L=^W`U z=_Q#=)*?HSqsRjC4stX30{Id7jRZx)NWx2kEwMqOMxsMvNaDF9UQ$!iNpiJhu4IMe z3CZh{Gg5ddEh!f%rqp_=8mW^~BT{qH6lqgwf9X`|66qt-SEQ$8urgXQZZd3{0-1v{ z7i7jM2t}RZLSa!hQyM83DHBu-Rh#NXO`;Z4zoQONXJut%m&u07X3N&do|YY@Av7(T z7cGTWN;^&)roCIDw8Uu%XUX;@txJZM%*!p6bCl!A70I>9-IjYNPnUO-PnO>$-zoo4 z0i~d)5U7x)uwUV#!pu_YQro4hrA14RFTJM-E9xl*DXvvKsMxPKr=+app_HyvrF21Q zMwzDUsGOu+u6#y$T7{xwufkO+S2?TllrBqmqNmU+>Amz>RYg@#RiSFV>VWEknzmY~ zTE1GF+Cz1MIzv5Pys-#cBCZ~; zMXm#GGH#)6)ozd6)!Y-@Tijj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x( zW?3$*y{uH6t~>7#3G*6dj`%lF|oWk4CLGP(p*(a%)B zP)E2$IF@OjS(EuDD=h0owsbZxyFW)SXM4_Mu6ypcYf)=iYkTrk^ETy;t#evezaCm2 zx4vhC`i6oH6B|7?9^ORQl)UMue3SgL{8yX9H+L5(6>KaR-{P^QrBI@fUpTVWc5B@> z)Hd$6f$iqotG0hEVi#R4HYu(seqX{Wx%!RiH@;dd*9H0$NjB!N_E9`?+$Pe+^P4d?`Y6!s5po@n0fF?V_0L~w~TL_n-rRgn?4-k z9U46xbhx+Ks=4`y;*ru8xJB49eKh*$jqhB)>uNP@t#6~X6(0k~gvXwKAN&3Aai8No zCm1JMf6)A)ww=;m)B$zmbj)@pc8+#Mb`75NKH1Z4+ui=7(T|5tsh+AiEql834Bs>djZ*&hXA3QVUFm(Q=>&;8Iyl!2)z2f%ZaOm)z zk?4`pJM24CcT?`ZxR-fv;r_-4=m$j)r5;v1Qhe0#v+mDrqn4wm$6Uwy9|u3aKh7F| z_DjYu?mT-%DP~zdZD6*{hzpfVoGnQ(rI47rl{xbNDUeZQr}_casZQ@3HSIKj?nw{^;}Z z!Kc(upZ)~{nDhK^CfpAI006g8OjJeVL3HCuS?Q{!<5^zgOGJgL^z!fY@#*yR@&Et-_4V=X>gMn5=kV?3?ds(e6&dgD=kxRM|8VZ@?d9p=-th0} z@&EGd>E!L|;_K(*=il7q+1TSrY3}Rg^z-lT z>*nt4=Irg|<3(i2v$x|#Xz~C2?d#{@*VgLi;^Reh+{w${)Y9MC*SMIU<2{JuO;v*< z$wmMG010qNS#tmY3ljhU3ljkVnw%H_006W}L_t(2Q#H@W7J@Jk1<)9Xl8Ce!8%D5T z!QQa{|93gb!Mm8ndvj8l)!>fX;6gN8E^|Fks8nm#IgAIPQc}t&ijxSyVIn}% zHG}lb2KM_npg}OFLKwAKMjF2&&*QGU~L#MMj=whLls{(LcQc#!HCZlWf z?G9icrvQM5WBrc5)0u+c5{99=LZLO@Oi-6rbvGLw`kd^-004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`gH|hTglt0MdJtUPWP;8DJ;_ z4l^{dA)*2iMMRn+NKnLp(NH8-M6nPQRImpm2q-ZaMN}+rM%Ih2ti1Q~^84egZ|$@9 zx%=$B&srA%lBX}1mj+7#kjfMAgFKw+5s^`J>;QlP9$S?PR%=$HTzo3l9?ED;xoI3-JvF1F8#m>QQXW*8-A zz9>Nv%ZWK*kqtikEV84R*{M9Xh{ZXlvs2k(?iKO2Od&_ah_8qXGr62B5#JKAMv5?% zE8;ie*i;TP0{|3BY!`4?i6S-;F^L}%f`(o2L0Dz>ZZynda zx(`h}FNp#{x{a}MR#uh~m%}m=7xWMPPlvyuufAs_KJJh5&|Nw4Oks+EF0LCZEhSCJ zr)Q)ySsc3IpNIG#2mW;)20@&74xhslMTCi_jLS<9wVTK03b<)JI+ypKn)naH{-njZ z7KzgM5l~}{fYfy=Kz{89C<+lE(fh?+|D$id_%I-TdEqLPi*x_)H~nY9rQ#)noA5c# zB`Ac>67n+__r%Wu$9dISw03U@r;Pdb`_%=KWKZEBGfDjQH zqKX(I48#TTN1~8;gpaI8ijWGV0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2w zRf4KU9Y%GadQmq~W2jlwM>H9&h}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwC(y4k7z_=g zjj_UbVj?j~n6;P^%sxyT<{V}aGme?VVzKgAeXJeUAIroFu!Yzv>{0Al>=1SW`vynE zso>0T?zku%50{Utz#YMz!42UiaSM1Uye8fT?~iBWbMU43MtnE^I(`DbK#(SA6YK~f zge1ZyLM5SA?cA^NYNxAX$R>L=^W`U z=_Q#=)*?HSqsRjC4stX30{Id7jRZx)NWx2kEwMqOMxsMvNaDF9UQ$!iNpiJhu4IMe z3CZh{Gg5ddEh!f%rqp_=8mW^~BT{qH6lqgwf9X`|66qt-SEQ$8urgXQZZd3{0-1v{ z7i7jM2t}RZLSa!hQyM83DHBu-Rh#NXO`;Z4zoQONXJut%m&u07X3N&do|YY@Av7(T z7cGTWN;^&)roCIDw8Uu%XUX;@txJZM%*!p6bCl!A70I>9-IjYNPnUO-PnO>$-zoo4 z0i~d)5U7x)uwUV#!pu_YQro4hrA14RFTJM-E9xl*DXvvKsMxPKr=+app_HyvrF21Q zMwzDUsGOu+u6#y$T7{xwufkO+S2?TllrBqmqNmU+>Amz>RYg@#RiSFV>VWEknzmY~ zTE1GF+Cz1MIzv5Pys-#cBCZ~; zMXm#GGH#)6)ozd6)!Y-@Tijj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x( zW?3$*y{uH6t~>7#3G*6dj`%lF|oWk4CLGP(p*(a%)B zP)E2$IF@OjS(EuDD=h0owsbZxyFW)SXM4_Mu6ypcYf)=iYkTrk^ETy;t#evezaCm2 zx4vhC`i6oH6B|7?9^ORQl)UMue3SgL{8yX9H+L5(6>KaR-{P^QrBI@fUpTVWc5B@> z)Hd$6f$iqotG0hEVi#R4HYu(seqX{Wx%!RiH@;dd*9H0$NjB!N_E9`?+$Pe+^P4d?`Y6!s5po@n0fF?V_0L~w~TL_n-rRgn?4-k z9U46xbhx+Ks=4`y;*ru8xJB49eKh*$jqhB)>uNP@t#6~X6(0k~gvXwKAN&3Aai8No zCm1JMf6)A)ww=;m)B$zmbj)@pc8+#Mb`75NKH1Z4+ui=7(T|5tsh+AiEql834Bs>djZ*&hXA3QVUFm(Q=>&;8Iyl!2)z2f%ZaOm)z zk?4`pJM24CcT?`ZxR-fv;r_-4=m$j)r5;v1Qhe0#v+mDrqn4wm$6Uwy9|u3aKh7F| z_DjYu?mT-%DP~zdZD6*{hzpfVoGnQ(rI47rl{xbNDUeZQr}_casZQ@3HSIKj?nw{^;}Z z!Kc(upZ)~{nDhK^CfpAI008h%OjJeVL3HCuS?Q{!<5^zgOGJgL^z!fY@#*yR@&Et-_4V=X>gMn5=kV?3?ds+4?&t06=k49q?B?O=+1Bdk<@59K z?(602E!C=;_T?-=hM*f@aN{-+UD8V>EYh(>g4e6=<)yZ>4}T} z{{HUl=IiI<>gD0*)6ew&_3iZV>*wO<-`wQc*yBlQ@cjAc*3<3j*L1)T=H^8Jd3~+nrA+PQq9-l1mO!Tsd zptV+QIN$UdL655H&CWyd@;yM)KPN3dKEIaVKdg)qrGH)s{yX~vdjlG?&Q_&S00000 LNkvXXu0mjf7Kdlg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/blocks/greater_mana_altar_front.png b/src/main/resources/assets/electromana/textures/blocks/greater_mana_altar_front.png new file mode 100644 index 0000000000000000000000000000000000000000..2b024f78ddc1c5928fecfc26898adc1eb47cf75c GIT binary patch literal 3119 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 LNkvXXu0mjfdXZ~K literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/blocks/lesser_mana_altar_front.png b/src/main/resources/assets/electromana/textures/blocks/lesser_mana_altar_front.png new file mode 100644 index 0000000000000000000000000000000000000000..57f56cbadd1dc15e708a0de2acb8e563c7409804 GIT binary patch literal 3023 zcmV;=3o!JFP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`gH|hTglt0MdJtUPWP;8DJ;_ z4l^{dA)*2iMMRn+NKnLp(NH8-M6nPQRImpm2q-ZaMN}+rM%Ih2ti1Q~^84egZ|$@9 zx%=$B&srA%lBX}1mj+7#kjfMAgFKw+5s^`J>;QlP9$S?PR%=$HTzo3l9?ED;xoI3-JvF1F8#m>QQXW*8-A zz9>Nv%ZWK*kqtikEV84R*{M9Xh{ZXlvs2k(?iKO2Od&_ah_8qXGr62B5#JKAMv5?% zE8;ie*i;TP0{|3BY!`4?i6S-;F^L}%f`(o2L0Dz>ZZynda zx(`h}FNp#{x{a}MR#uh~m%}m=7xWMPPlvyuufAs_KJJh5&|Nw4Oks+EF0LCZEhSCJ zr)Q)ySsc3IpNIG#2mW;)20@&74xhslMTCi_jLS<9wVTK03b<)JI+ypKn)naH{-njZ z7KzgM5l~}{fYfy=Kz{89C<+lE(fh?+|D$id_%I-TdEqLPi*x_)H~nY9rQ#)noA5c# zB`Ac>67n+__r%Wu$9dISw03U@r;Pdb`_%=KWKZEBGfDjQH zqKX(I48#TTN1~8;gpaI8ijWGV0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2w zRf4KU9Y%GadQmq~W2jlwM>H9&h}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwC(y4k7z_=g zjj_UbVj?j~n6;P^%sxyT<{V}aGme?VVzKgAeXJeUAIroFu!Yzv>{0Al>=1SW`vynE zso>0T?zku%50{Utz#YMz!42UiaSM1Uye8fT?~iBWbMU43MtnE^I(`DbK#(SA6YK~f zge1ZyLM5SA?cA^NYNxAX$R>L=^W`U z=_Q#=)*?HSqsRjC4stX30{Id7jRZx)NWx2kEwMqOMxsMvNaDF9UQ$!iNpiJhu4IMe z3CZh{Gg5ddEh!f%rqp_=8mW^~BT{qH6lqgwf9X`|66qt-SEQ$8urgXQZZd3{0-1v{ z7i7jM2t}RZLSa!hQyM83DHBu-Rh#NXO`;Z4zoQONXJut%m&u07X3N&do|YY@Av7(T z7cGTWN;^&)roCIDw8Uu%XUX;@txJZM%*!p6bCl!A70I>9-IjYNPnUO-PnO>$-zoo4 z0i~d)5U7x)uwUV#!pu_YQro4hrA14RFTJM-E9xl*DXvvKsMxPKr=+app_HyvrF21Q zMwzDUsGOu+u6#y$T7{xwufkO+S2?TllrBqmqNmU+>Amz>RYg@#RiSFV>VWEknzmY~ zTE1GF+Cz1MIzv5Pys-#cBCZ~; zMXm#GGH#)6)ozd6)!Y-@Tijj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x( zW?3$*y{uH6t~>7#3G*6dj`%lF|oWk4CLGP(p*(a%)B zP)E2$IF@OjS(EuDD=h0owsbZxyFW)SXM4_Mu6ypcYf)=iYkTrk^ETy;t#evezaCm2 zx4vhC`i6oH6B|7?9^ORQl)UMue3SgL{8yX9H+L5(6>KaR-{P^QrBI@fUpTVWc5B@> z)Hd$6f$iqotG0hEVi#R4HYu(seqX{Wx%!RiH@;dd*9H0$NjB!N_E9`?+$Pe+^P4d?`Y6!s5po@n0fF?V_0L~w~TL_n-rRgn?4-k z9U46xbhx+Ks=4`y;*ru8xJB49eKh*$jqhB)>uNP@t#6~X6(0k~gvXwKAN&3Aai8No zCm1JMf6)A)ww=;m)B$zmbj)@pc8+#Mb`75NKH1Z4+ui=7(T|5tsh+AiEql834Bs>djZ*&hXA3QVUFm(Q=>&;8Iyl!2)z2f%ZaOm)z zk?4`pJM24CcT?`ZxR-fv;r_-4=m$j)r5;v1Qhe0#v+mDrqn4wm$6Uwy9|u3aKh7F| z_DjYu?mT-%DP~zdZD6*{hzpfVoGnQ(rI47rl{xbNDUeZQr}_casZQ@3HSIKj?nw{^;}Z z!Kc(upZ)~{nDhK^CfpAI003!FOjJeVr9tD#N$KgO>Fv$!@#*pP z>GA*X|Nrmt|LOn#@x5s|>+$FR|NnS_|9Fl6?e*vF@#pLD<>}#xVL=(|?d9XSN#nUi zfu>+Rp;sYT$_$&z_=G00009a7bBm000XU000XU0RWnu7ytkO zl}SWFR47wjkI@doAPhwr8#-2?n+{~^Hue8M(n~|k;tAp5+_q39G`j5?ZOrN1sjlzs zK+aj~2BM)=+J^(&Dl>-ZQkepw0^&!w>c19S#LOIH#Kp{Wg18+hL%nC41=Pg_qK1M? zcy=T!%s709sG*P_rNR^b{AAASx)o7FVShn*!gA=(+qUm-l?0QpyfON-d;vVD52}T> R>aG9)002ovPDHLkV1mNf&Km## literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/blocks/lesser_mana_altar_side.png b/src/main/resources/assets/electromana/textures/blocks/lesser_mana_altar_side.png new file mode 100644 index 0000000000000000000000000000000000000000..63326b093974b951bf5f2f1cf05666227bf2bf6d GIT binary patch literal 3225 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 LNkvXXu0mjfr6g^` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/blocks/mana_transformer_mk2_side.png b/src/main/resources/assets/electromana/textures/blocks/mana_transformer_mk2_side.png new file mode 100644 index 0000000000000000000000000000000000000000..68655b207fa965725fad3ae90d05a7d63ae63960 GIT binary patch literal 2870 zcmV-63(53}P)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv 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 UJk61wW&i*H07*qoM6N<$f?VZO5C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/blocks/mana_transformer_side.png b/src/main/resources/assets/electromana/textures/blocks/mana_transformer_side.png new file mode 100644 index 0000000000000000000000000000000000000000..215251d89d86dc1da48e68628725d8bc60c3e8d3 GIT binary patch literal 2870 zcmV-63(53}P)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv 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 UJk61wW&i*H07*qoM6N<$g6xS>CIA2c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/gui/mana_transformer.png b/src/main/resources/assets/electromana/textures/gui/mana_transformer.png new file mode 100644 index 0000000000000000000000000000000000000000..deb8e07afeb79d006af0433b9e5e4edd7659b0c3 GIT binary patch literal 2185 zcmbVO2~<;88vfrS2#H`IXpt>YMj-0233ZS)${r|-P!>UgrLu^Mfb0o*ma%|{;i$zT zR6wDiR0I)G)~G-RWFM)lvJD~>5Rd{15GHi&@tmH{Oxt_TJNNs~f6x1t_wKnj*~!6L zk|0k207+XLi^Bkj5F#MHML2nf75Z;h;fJjcL2;Ynq_DsR9Q^bkKq-6c+A&dKjXz`K z84j@R+2(_ALkhnD5GUJO9CVHLnHki*=xr@0HYaJ3l(XI0(Bj}7kJ&)Q{wUH}@$H?D zb7__dl#`QzR00i=)Oehmn|HIsNY*CLywb?CI8D{lDWmx&Uit!9QeHFTLN5RGRc86} zjK{mB)%Cpj%)y$>(bE$fuQSVE`y64+HbtL*#aya2F)7jc)Bm@+Z>pto=o6HgD%FKlFBOkoNk@da3oNe@(bSz{<+XO2wF! z%+;lZ*on4pNn7Y=*7-zP7Vk-B3X!$+YNbV%f^5mhdFiq~#Xxa})?2YThFJ+XWIdW>$4IH#m5PktpMNq9dMqga&&-{;&{3$3;>Oiw0eXQ4gdeO^8v<|0=Az zplRtO4gvd0h-Ep|T=Q=AuedB1@!}kn<{^d&*XwMB&jwaG!voy}y zT=pLun`&v;0Vzlo2Q`i&1(8p-rOPvaWk&{N1}Yv$OM+fZ<~S6y!T;kP*i!U%3MfveC32Vftp-=t+N3rvOo>0$iXS*sH+Q zhnRdxdojb!5I8tA$Kk_wP%lLbT{a#4q2>4FVfpP4eV{rfobjNB$xPrr$<{qr(DyRi zv1pl1@{PKKfJxtHfYU(n;BSR5F+#CkXLS0KBVrS*seWUqmPL@N8gOaQ;tf_sajpCH z90pC1MYbBq>Np&|SSG0T-im1x2OY0D zGG;y9A8HekxuzaRTRdmruA@Mz-Neq$gqHwVJq~uMgNiN!$#}4_2kPf2kYph3o8M}6 zzk|q#shRot($GB@T`ES5LF`NWVT&A1xq{Qz#tftjl{C;(O$HHFid;gDQrv%e%l{_G z5_b*Asyv!HW{gGdCyVd`1j%K>^;tFKV7Z=!pT|8B)Ldg zEBte!Z{;{aB|fQ_CDrm=OWkaYkdyQ^r{{d}%!!47x_Ofwkd{gUo8V8N*6_hSiJ9@- zhIjdQy_lM{f}e7k%s|VSneJSs<_+L)mnmOq?=Y3?VP7( zOGtl{@{nwt$bRIQl`7m6&X@30sq7NwE6Yhd!@-~97wAdcD;+A}uh z#YkZjiSIW_=}{b2QIyP5HQpwYY^J-drTzs_SZ>p|avQ8}`aRjaCH#pI9huUw0c)&S VuX8o=!fOM7t)+uS@gd(Y{|&JrY=Qs) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/items/reinforced_nether_star.png b/src/main/resources/assets/electromana/textures/items/reinforced_nether_star.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa87b566105f9e268c9c3c95e5a0f6b351c1a25 GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lhb0G|-ou&k`kCCifHVu1puuO+7X^BY^)R85(B`dZfRsdh{Z`X-uM1+DF; zuU)M#G7Yi_XJSw#P2<&sU31*fPKDtRaKt?f*Gzh4k$1H%vLt_(Sm* Zqtb5aIZNG4=K$Ts;OXk;vd$@?2>^+Vt}g%p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/items/reinforced_nether_star_piece.png b/src/main/resources/assets/electromana/textures/items/reinforced_nether_star_piece.png new file mode 100644 index 0000000000000000000000000000000000000000..3f255323f174e2b69fcd11c1322e69ce35519094 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Ddev#}EtuWC>OihQ!Fo)eC$+IR?eNsZZ9P z{XaB#*}rzKhb%q;Qmh8`ca9wR@lW>f_Wt<`lvJ41*!~_@n-!&S`#bP0l+XkKYLZfI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/electromana/textures/items/reinforced_plate.png b/src/main/resources/assets/electromana/textures/items/reinforced_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..c5781e9ab4d3b90467a5696a04f3b2161d8a3ebd GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%LiI0G|-oswq>$va*umVvVhA3R>Hfq9Z$(EIWNIG1Z^nL{kf>sw`8-L{p$F zI&$|^J0=G8vS^mhIn1{=s5=?ypT3qAWDzbe+g_Pj#>CLLa_ZF6*RIwVnPymZnu`CE zmn|!cHU*kc#~7Rnq!den{DS`z01WdFUQh%o<}C1tEM{QfI|Ravq8eTeK*0o07sn8d z;N$=Y<{c~zBFb}?9yoF2%z;BEPMqO-)L