From 1a98dbd441115f0bfe072d6848ffa08ff44c988f Mon Sep 17 00:00:00 2001 From: TehNut Date: Fri, 12 Jun 2015 23:24:06 -0700 Subject: [PATCH] Initial commit (re-git) --- .gitignore | 23 ++ LICENSE.md | 128 ++++++++++ README.md | 76 ++++++ build.gradle | 140 +++++++++++ gradle.properties | 8 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 51017 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++++++++++++ gradlew.bat | 90 +++++++ settings.gradle | 1 + .../resourceful/crops/ConfigHandler.java | 53 +++++ .../resourceful/crops/ModInformation.java | 12 + .../resourceful/crops/ResourcefulCrops.java | 97 ++++++++ .../tehnut/resourceful/crops/base/Seed.java | 68 ++++++ .../resourceful/crops/blocks/BlockRCrop.java | 164 +++++++++++++ .../resourceful/crops/blocks/BlockROre.java | 78 +++++++ .../crops/client/gui/ConfigGui.java | 32 +++ .../crops/client/gui/ConfigGuiFactory.java | 30 +++ .../crops/client/render/RenderRCrop.java | 75 ++++++ .../crops/compat/waila/CompatWaila.java | 12 + .../crops/compat/waila/RCropDataProvider.java | 52 +++++ .../resourceful/crops/items/ItemMaterial.java | 63 +++++ .../resourceful/crops/items/ItemPouch.java | 138 +++++++++++ .../resourceful/crops/items/ItemSeed.java | 115 +++++++++ .../resourceful/crops/items/ItemShard.java | 72 ++++++ .../resourceful/crops/items/ItemStone.java | 78 +++++++ .../crops/items/blocks/ItemBlockROre.java | 25 ++ .../crops/proxies/ClientProxy.java | 19 ++ .../crops/proxies/CommonProxy.java | 8 + .../crops/registry/BlockRegistry.java | 24 ++ .../crops/registry/ItemRegistry.java | 34 +++ .../crops/registry/RecipeRegistry.java | 160 +++++++++++++ .../crops/registry/SeedRegistry.java | 42 ++++ .../resourceful/crops/tile/TileRCrop.java | 60 +++++ .../resourceful/crops/util/EventHandler.java | 29 +++ .../crops/util/GenerationHandler.java | 42 ++++ .../resourceful/crops/util/LogHelper.java | 38 +++ .../crops/util/PermanentCache.java | 50 ++++ .../resourceful/crops/util/SeedBuilder.java | 66 ++++++ .../resourceful/crops/util/StartupUtils.java | 109 +++++++++ .../tehnut/resourceful/crops/util/Utils.java | 58 +++++ .../resourceful/crops/util/WorldCache.java | 221 ++++++++++++++++++ .../crops/util/serialization/SeedCreator.java | 125 ++++++++++ .../assets/resourcefulcrops/lang/en_US.lang | 35 +++ .../textures/blocks/crop_base_0.png | Bin 0 -> 18642 bytes .../textures/blocks/crop_base_0_fast.png | Bin 0 -> 17817 bytes .../textures/blocks/crop_base_1.png | Bin 0 -> 18729 bytes .../textures/blocks/crop_base_1_fast.png | Bin 0 -> 17855 bytes .../textures/blocks/crop_base_2.png | Bin 0 -> 18852 bytes .../textures/blocks/crop_base_2_fast.png | Bin 0 -> 17985 bytes .../textures/blocks/crop_base_3.png | Bin 0 -> 18954 bytes .../textures/blocks/crop_base_3_fast.png | Bin 0 -> 18060 bytes .../textures/blocks/crop_base_4.png | Bin 0 -> 19068 bytes .../textures/blocks/crop_base_4_fast.png | Bin 0 -> 18168 bytes .../textures/blocks/crop_base_5.png | Bin 0 -> 19153 bytes .../textures/blocks/crop_base_5_fast.png | Bin 0 -> 18236 bytes .../textures/blocks/crop_base_6.png | Bin 0 -> 19250 bytes .../textures/blocks/crop_base_6_fast.png | Bin 0 -> 18333 bytes .../textures/blocks/crop_base_7.png | Bin 0 -> 19255 bytes .../textures/blocks/crop_base_7_fast.png | Bin 0 -> 18342 bytes .../textures/blocks/crop_overlay_0.png | Bin 0 -> 18616 bytes .../textures/blocks/crop_overlay_1.png | Bin 0 -> 18611 bytes .../textures/blocks/crop_overlay_2.png | Bin 0 -> 18616 bytes .../textures/blocks/crop_overlay_3.png | Bin 0 -> 18615 bytes .../textures/blocks/crop_overlay_4.png | Bin 0 -> 18613 bytes .../textures/blocks/crop_overlay_5.png | Bin 0 -> 18614 bytes .../textures/blocks/crop_overlay_6.png | Bin 0 -> 18613 bytes .../textures/blocks/crop_overlay_7.png | Bin 0 -> 18623 bytes .../textures/blocks/oreGaianite.png | Bin 0 -> 381 bytes .../textures/blocks/oreGaianite_nether.png | Bin 0 -> 850 bytes .../textures/items/pouch_base.png | Bin 0 -> 528 bytes .../textures/items/pouch_base_color.png | Bin 0 -> 15296 bytes .../textures/items/pouch_overlay.png | Bin 0 -> 15176 bytes .../textures/items/seed_base.png | Bin 0 -> 15295 bytes .../textures/items/shard_base.png | Bin 0 -> 15092 bytes .../textures/items/stone_base.png | Bin 0 -> 18284 bytes src/main/resources/mcmod.info | 15 ++ 77 files changed, 2935 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 README.md 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/main/java/tehnut/resourceful/crops/ConfigHandler.java create mode 100644 src/main/java/tehnut/resourceful/crops/ModInformation.java create mode 100644 src/main/java/tehnut/resourceful/crops/ResourcefulCrops.java create mode 100644 src/main/java/tehnut/resourceful/crops/base/Seed.java create mode 100644 src/main/java/tehnut/resourceful/crops/blocks/BlockRCrop.java create mode 100644 src/main/java/tehnut/resourceful/crops/blocks/BlockROre.java create mode 100644 src/main/java/tehnut/resourceful/crops/client/gui/ConfigGui.java create mode 100644 src/main/java/tehnut/resourceful/crops/client/gui/ConfigGuiFactory.java create mode 100644 src/main/java/tehnut/resourceful/crops/client/render/RenderRCrop.java create mode 100644 src/main/java/tehnut/resourceful/crops/compat/waila/CompatWaila.java create mode 100644 src/main/java/tehnut/resourceful/crops/compat/waila/RCropDataProvider.java create mode 100644 src/main/java/tehnut/resourceful/crops/items/ItemMaterial.java create mode 100644 src/main/java/tehnut/resourceful/crops/items/ItemPouch.java create mode 100644 src/main/java/tehnut/resourceful/crops/items/ItemSeed.java create mode 100644 src/main/java/tehnut/resourceful/crops/items/ItemShard.java create mode 100644 src/main/java/tehnut/resourceful/crops/items/ItemStone.java create mode 100644 src/main/java/tehnut/resourceful/crops/items/blocks/ItemBlockROre.java create mode 100644 src/main/java/tehnut/resourceful/crops/proxies/ClientProxy.java create mode 100644 src/main/java/tehnut/resourceful/crops/proxies/CommonProxy.java create mode 100644 src/main/java/tehnut/resourceful/crops/registry/BlockRegistry.java create mode 100644 src/main/java/tehnut/resourceful/crops/registry/ItemRegistry.java create mode 100644 src/main/java/tehnut/resourceful/crops/registry/RecipeRegistry.java create mode 100644 src/main/java/tehnut/resourceful/crops/registry/SeedRegistry.java create mode 100644 src/main/java/tehnut/resourceful/crops/tile/TileRCrop.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/EventHandler.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/GenerationHandler.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/LogHelper.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/PermanentCache.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/SeedBuilder.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/StartupUtils.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/Utils.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/WorldCache.java create mode 100644 src/main/java/tehnut/resourceful/crops/util/serialization/SeedCreator.java create mode 100644 src/main/resources/assets/resourcefulcrops/lang/en_US.lang create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_0.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_0_fast.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_1.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_1_fast.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_2.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_2_fast.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_3.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_3_fast.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_4.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_4_fast.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_5.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_5_fast.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_6.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_6_fast.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_7.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_7_fast.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_0.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_1.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_2.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_3.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_4.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_5.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_6.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_7.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/oreGaianite.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/blocks/oreGaianite_nether.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/items/pouch_base.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/items/pouch_base_color.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/items/pouch_overlay.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/items/seed_base.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/items/shard_base.png create mode 100644 src/main/resources/assets/resourcefulcrops/textures/items/stone_base.png create mode 100644 src/main/resources/mcmod.info diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73e59cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# General use .gitignore for Minecraft modding. + +# Folders +/.gradle/* +/build/* +/eclipse/* +/run/* +/out/* +/asm/* +/bin/* +/libs/* + +# File Extensions +*.psd +*.iml +*.ipr +*.iws +*.classpath +*.project +*.zip + +# Specific files +Thumbs.db \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..b0f3809 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,128 @@ +Minecraft Mod Public License +============================ + +Version 2.0.2 + +0. Definitions +-------------- + +**Game**: Computer software which provides diversion or amusement. Often a form of play. + +**Minecraft**: The Minecraft Game, the Minecraft server, associated software or derivatives, as defined by Mojang. + +**Mod**: Software which modifies the Game, in any form (source, compiled binary, etc). + +**User**: Anyone who that interacts with the Game, Minecraft, or the Mod in any way. + +**Dependency**: Software required for the Mod to execute, compile, or otherwise "work" correctly. + +**API**: Software intermediary for interaction with the Mod. + +**Derivative**: Software which includes any portion of the Mod other than the API, with modifications, additions, or subtractions. + +**Addon**: Software that extends the Mod, but is not a derivative. + +**Modpack**: A collection of mods and configuration files pre-tested to work when installed together. + +**Modpack Creator**: An individual who creates modpacks. + +**Author(s)**: Original Programmer or programmers responsible for writing the Mod. + +**Contributor**: Programmer or programmers who contribute code to the Mod, but are not the Author. + +**Codebase**: The Mod source code, complete with source history and Contributor records. + +**Distributor**: Anyone who distributes the compiled mod. + +1. Scope +-------- + +The present license is granted to any User of the Mod. + +Should the Mod be for Minecraft, as a prerequisite, the User is expected to comply with the Mojang EULA as it exists at the time the Mod is distributed. + +This license is separate from the license of any Mod it depends on and does not invalidate any license requirement of the dependency. + +2. Liability +-------- + +The User accepts the following liability: + - The Mod is provided 'as is' with no warranties, implied or otherwise. + - The Author is not responsible for dragon, troll, pirate, or ninja attacks. + - Slaying any and all mythological creatures is the sole responsibility of the User. + - The Author takes no responsibility for any damages incurred from the use or misues of the Mod. + - The Mod may alter fundamental parts of the Game. + - The User is liable for all damages resulting from the use or misuse of the Mod. + - The Author may not be held responsible for the incompetency or sadism of a Modpack Creator. + +3. Right to use +-------- + +The User is allowed to install the Mod and play without restriction. +The User may not limit access to the Mod in any way, except as provided by the Game. + +4. Right to examine +-------- + +The User may decompile compiled binaries of the Mod. +The User may examine the Mod's source code. + +5. Right to distribute +-------- + +The Author reserves the right to distribute the Mod. +The Author may designate a person or organization as a Distributor. +A Distributor is granted the right to distribute the Mod. +The Author may require that a Distributor provides a direct link to the Codebase. +The User may not distribute the Mod without being granted distribution rights from the Author. +The Author may revoke distribution rights from any Distributor. + +6. Right to contribute +-------- + +The User may "fork" the Codebase. +The User may compile the Codebase. +The User may submit contributions to the Author for inclusion in the Mod. +The User grants the Author all rights to any contribution. +The User renounces all rights to their contribution except as specified under this license. +The User retains the right to re-use code they've written. +The Author may specify a Contributor License Agreement allowing a Contributor to retain some or all rights. + +7. Right to derive +-------- + +The User may create Derivative(s) based on the Mod. +A Derivative must contain changes which a reasonably informed person would consider significant. + +The User may distribute a Derivative if the following conditions are met: + - The Derivative does not generate revenue. + - The Derivative provides credit to the Author. + - The Derivative complies with the Mod license. + +8. Right to distribute addons +-------- + +The User may develop non-Derivative Addons. +An Addon may include the Mod API without being considered a Derivative. +The Addon may be distributed under a different license. + +9. Right to create Modpack(s) +-------- + +The User may create Modpack(s) which include the Mod. + +Modpacks containing the Mod may not be used to generate revenue unless specifically granted this right by the Author. + +Modpacks containing the Mod may be made and distributed by the Modpack Creator through any distribution channel they choose. + +10. Author responsibilities +-------- + +The Author must make the Mod source freely and publically available. + +11. Author rights +-------- + +The Author may grant a User the status of Contributor or Author. +The Author retains the right to the Mod name. +The Author may change the Mod license, but cannot do so retroactively. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a37fccc --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +#Resourceful Crops + +**Simply JSON based crops. No fluff, no problems.** + +Uses only 2 Block ID's and 5 Item ID's. Everything else is done through NBT or Metadata. + +##Example File + +The current system will find any `.json` file in `../config/ResourcefulCrops/seeds` and attempt to read it. This can be useful for sorting. + +Each file must start with a `seeds` field which contains a list of seeds. After that, specify as many seeds as you want in each file. + +``` +{ + "seeds": [ + { + "name": "Example", // Sets the name to Example + "tier": 2, // Sets the tier to 2: Magical + "amount": 4, // Number of seeds to give when crafting them + "input": "ingotIron", // Input OreDict entry + "output": "minecraft:rotten_flesh:0#8", // Output ItemStack. Syntax is: domain:name:meta#amount + "color": "#D0CBC7" // Color of the seed/crop/shard/pouch + }, + { + "name": "Example 2", // Sets the name to Example 2 + "tier": 1, // Sets the tier to 1: Mundane + "amount": 8, // Number of seeds to give when crafting them + "input": "minecraft:iron_ingot:0#0", // Input ItemStack. Syntax is: domain:name:meta#amount + "output": "ingotGold#8", // Output OreDict entry. Syntax is: entry#amount + "color": "#D0CBC7" // Color of the seed/crop/shard/pouch + } + ] +} +``` + +##Field Explanations + +| Field | Type | Explanation | +|----------|--------|-------------------------------------------------------------------------------------------------------------------------------| +| `seeds` | List | List of seeds to add to the game | +| `name` | String | Name of the seed. Gets run through the localization process, so if you have a resource loader, you can use unlocalized names. | +| `tier` | int | Tier of the seed. Determines how far into the game the user must be to craft that seed. | +| `amount` | int | Amount of seeds to return in a craft. | +| `input` | String | OreDict entry or ItemStack of the item used to craft the seeds. See below for syntax. | +| `output` | String | OreDict entry or ItemStack of the item returned from the shard crafting. See below for syntax. | +| `color` | String | Hex color of the seeds. I suggest [this](http://www.color-hex.com/) page for getting your colors. Does require the "#". | + +###Custom ItemStack +ItemStacks determine the Amount and Meta of an item. The syntax is: + +`domain:reg_name:meta#amount` + +* domain + * Generally the modid of the Block/Item. *EG: minecraft* +* reg_name + * The registered name of the Block/Item. *EG: wheat_seeds* +* meta + * The meta data (or damage value) of the Block/Item. *EG: 0* +* amount + * The amount of the item you want to return. For input, this does not matter, but is still required. *EG: 4* + +###Custom OreDict +Using the OreDict for input/output is also viable. + +**For input:** +`shapeType` *EG: `ingotIron`* + +**For output:** +The only difference is defining the size of the output. +`shapeType#amount` *EG: `ingotIron#8`* + +##Data Caching + +A cache is kept to ensure that adding/removing crops does not mess with Seed/Shard/Pouch meta's. The cache is global, meaning across all worlds the user creates. + +To reset this cache, delete `ResourcefulCropsCache.dat` from `../saves/`. \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..a0135f7 --- /dev/null +++ b/build.gradle @@ -0,0 +1,140 @@ +buildscript { + repositories { + mavenCentral() + maven { url = "http://files.minecraftforge.net/maven" } + maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + classpath 'org.ajoberstar:gradle-git:0.10.1' + } +} + +plugins { + id 'com.matthewprenger.cursegradle' version '1.0.1' +} + +apply plugin: 'forge' +apply plugin: 'maven-publish' + +def build_number = 'CUSTOM' + +if (System.getenv('BUILD_NUMBER') != null) + build_number = System.getenv('BUILD_NUMBER') + +group = package_group +archivesBaseName = mod_name +version = "${mc_version}-${mod_version}-${build_number}" + +import org.ajoberstar.grgit.Grgit + +def gitHash = 'unknown' +if (new File(projectDir, '.git').exists()) { + def repo = Grgit.open(project.file('.')) + //gitHash = repo.log().find().abbreviatedId +} + +repositories { + maven { url "http://mobiusstrip.eu/maven" } +} + +dependencies { + compile "org.projectlombok:lombok:1.16.4" + compile "mcp.mobius.waila:Waila:${waila_version}_${mc_version}:dev" +} + +minecraft { + version = "${mc_version}-${forge_version}" + runDir = "run" + + replace "@VERSION@", project.version + replaceIn "ModInformation.java" + + if (project.hasProperty('mappings_version')) + mappings = project.mappings_version +} + +processResources { + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + from(sourceSets.main.resources.srcDirs) { + include '**/*.info' + include '**/*.properties' + + expand 'version': project.version, 'mcversion': project.minecraft.version + } + from(sourceSets.main.resources.srcDirs) { + exclude '**/*.info' + exclude '**/*.properties' + } +} + +jar { + classifier = '' + manifest.mainAttributes( + "Built-By": System.getProperty('user.name'), + "Created-By": "${System.getProperty('java.vm.version')} + (${System.getProperty('java.vm.vendor')})", + "Implementation-Title": project.name, + "Implementation-Version": project.version, + "Git-Hash": gitHash + ) +} + +// Source jar +task sourceJar(type: Jar) { + from sourceSets.main.allSource + classifier = 'sources' +} + +// Javadoc jar +task javadocJar(type: Jar, dependsOn: javadoc) { + from javadoc.destinationDir + classifier = 'javadoc' +} + +// Deobfuscated jar +task deobfJar(type: Jar) { + from sourceSets.main.output + classifier = 'deobf' +} + +tasks.build.dependsOn sourceJar, javadocJar, deobfJar + +tasks.withType(JavaCompile) { task -> + task.options.encoding = 'UTF-8' +} + +publishing { + tasks.publish.dependsOn 'build' + publications { + mavenJava(MavenPublication) { + from components.java + artifact sourceJar + artifact javadocJar + artifact deobfJar + } + } + repositories { + if (project.hasProperty('maven_repo')) { + maven { url maven_repo } + } else { + mavenLocal() + } + } +} + +curseforge { + if (project.hasProperty('curse_key')) + apiKey = project.curse_key + + project { + id = "${curse_id}" + changelog = project.hasProperty('changelog') ? project.changelog : '' + releaseType = 'release' + + addArtifact deobfJar + addArtifact sourceJar + addArtifact javadocJar + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..a157fe9 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,8 @@ +mod_name=ResourcefulCrops +package_group=info.tehnut.resourcefulcrops +mod_version=1.0.0 +mc_version=1.7.10 +forge_version=latest +curse_id=0 + +waila_version=1.5.11-RC2-NONEI \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..3d0dee6e8edfecc92e04653ec780de06f7b34f8b GIT binary patch literal 51017 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 H-~Rf4?cF@p literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..fbe9865 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Sep 26 11:20:52 CDT 2014 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.3-bin.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..91a7e26 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# 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 +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +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" ] ; 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"` + + # 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 + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@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 + +@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= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@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 Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_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=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +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..af59ceb --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'ResourcefulCrops' \ No newline at end of file diff --git a/src/main/java/tehnut/resourceful/crops/ConfigHandler.java b/src/main/java/tehnut/resourceful/crops/ConfigHandler.java new file mode 100644 index 0000000..4910249 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/ConfigHandler.java @@ -0,0 +1,53 @@ +package tehnut.resourceful.crops; + +import net.minecraftforge.common.config.Configuration; + +import java.io.File; + +public class ConfigHandler { + + public static Configuration config; + + // Settings + public static boolean enableSeedCrafting; + public static boolean enableShardCrafting; + public static boolean enablePouchCrafting; + + public static boolean enableSeedPouches; + + public static boolean enableWorldGeneration; + + public static boolean enableConsoleLogging; + public static boolean enableFancyRender; + public static boolean enableRightClickHarvest; + + public static void init(File file) { + config = new Configuration(file); + syncConfig(); + } + + public static void syncConfig() { + String category; + + category = "Crafting"; + config.addCustomCategoryComment(category, "Crafting settings"); + enableSeedCrafting = config.getBoolean("enableSeedCrafting", category, true, "Allows crafting of materials into seeds. Disable if you wish to use custom recipes."); + enableShardCrafting = config.getBoolean("enableShardCrafting", category, true, "Allows crafting of shards into materials. Disable if you wish to use custom recipes."); + enablePouchCrafting = config.getBoolean("enablePouchCrafting", category, true, "Allows crafting of seeds into pouches. Disable if you wish to use custom recipes."); + + category = "Balance"; + config.addCustomCategoryComment(category, "Balance settings"); + enableSeedPouches = config.getBoolean("enableSeedPouches", category, true, "Allows registering of seed pouches. These plant a 3x3 (9 total) seeds around a central block."); + + category = "World"; + config.addCustomCategoryComment(category, "World settings"); + enableWorldGeneration = config.getBoolean("enableWorldGeneration", category, true, "Allows Gaianite Ore to generate in the world."); + + category = "General"; + config.addCustomCategoryComment(category, "Miscellaneous settings"); + enableConsoleLogging = config.getBoolean("enableConsoleLogging", category, true, "Enables extra information being printed to the console."); + enableRightClickHarvest = config.getBoolean("enableRightClickHarvest", category, true, "Allows crops to be right clicked to automatically harvest and replant if the crop is mature."); + + config.save(); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/ModInformation.java b/src/main/java/tehnut/resourceful/crops/ModInformation.java new file mode 100644 index 0000000..a617bc4 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/ModInformation.java @@ -0,0 +1,12 @@ +package tehnut.resourceful.crops; + +public class ModInformation { + + public static final String NAME = "Resourceful Crops"; + public static final String ID = "ResourcefulCrops"; + public static final String VERSION = "@VERSION@"; + public static final String REQUIRED = ""; + public static final String GUIFACTORY = "tehnut.resourceful.crops.client.gui.ConfigGuiFactory"; + public static final String CLIENTPROXY = "tehnut.resourceful.crops.proxies.ClientProxy"; + public static final String COMMONPROXY = "tehnut.resourceful.crops.proxies.CommonProxy"; +} diff --git a/src/main/java/tehnut/resourceful/crops/ResourcefulCrops.java b/src/main/java/tehnut/resourceful/crops/ResourcefulCrops.java new file mode 100644 index 0000000..316febc --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/ResourcefulCrops.java @@ -0,0 +1,97 @@ +package tehnut.resourceful.crops; + +import com.google.gson.GsonBuilder; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; +import tehnut.resourceful.crops.base.Seed; +import tehnut.resourceful.crops.compat.waila.CompatWaila; +import tehnut.resourceful.crops.proxies.CommonProxy; +import tehnut.resourceful.crops.registry.BlockRegistry; +import tehnut.resourceful.crops.registry.ItemRegistry; +import tehnut.resourceful.crops.registry.RecipeRegistry; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.util.*; +import tehnut.resourceful.crops.util.serialization.SeedCreator; + +import java.io.File; + +@Mod(modid = ModInformation.ID, name = ModInformation.NAME, version = ModInformation.VERSION, dependencies = ModInformation.REQUIRED, guiFactory = ModInformation.GUIFACTORY) +public class ResourcefulCrops { + + @SidedProxy(clientSide = ModInformation.CLIENTPROXY, serverSide = ModInformation.COMMONPROXY) + public static CommonProxy proxy; + + public static CreativeTabs tabResourcefulCrops = new CreativeTabs(ModInformation.ID + ".creativeTab") { + @Override + public ItemStack getIconItemStack() { + return new ItemStack(ItemRegistry.stone, 1, 0); + } + + @Override + public Item getTabIconItem() { + return ItemRegistry.stone; + } + }; + + @Mod.Instance + public static ResourcefulCrops instance; + public static int renderIDCrop; + private static File configDir; + public static PermanentCache seedCache; + + public static File getConfigDir() { + return configDir; + } + + @Mod.EventHandler + public void preInit(FMLPreInitializationEvent event) { + configDir = new File(event.getModConfigurationDirectory() + "/" + ModInformation.ID); + configDir.mkdirs(); + ConfigHandler.init(new File(configDir.getPath(), ModInformation.ID + ".cfg")); + + proxy.load(); + + seedCache = new PermanentCache(ModInformation.ID + "Cache"); + for (Seed seed : SeedRegistry.getSeedList()) + seedCache.addObject(seed, seed.getName()); + + BlockRegistry.registerBlocks(); + ItemRegistry.registerItems(); + GameRegistry.registerWorldGenerator(new GenerationHandler(), 2); + } + + @Mod.EventHandler + public void init(FMLInitializationEvent event) { + FMLCommonHandler.instance().bus().register(new EventHandler()); + MinecraftForge.EVENT_BUS.register(new EventHandler()); + + SeedRegistry.seedBuilder = new GsonBuilder(); + SeedCreator.registerCustomSerializers(SeedRegistry.seedBuilder); + + File seedsFolder = new File(getConfigDir().getPath() + "/seeds"); + seedsFolder.mkdir(); + File defaultSeedsFile = new File(seedsFolder, "DefaultSeeds.json"); + if (!defaultSeedsFile.exists()) + StartupUtils.initDefaults(); + + SeedCreator.registerJsonSeeds(SeedRegistry.seedBuilder, seedsFolder); + RecipeRegistry.registerItemRecipes(); + + if (Loader.isModLoaded("Waila")) + CompatWaila.load(); + } + + @Mod.EventHandler + public void postInit(FMLPostInitializationEvent event) { + } +} \ No newline at end of file diff --git a/src/main/java/tehnut/resourceful/crops/base/Seed.java b/src/main/java/tehnut/resourceful/crops/base/Seed.java new file mode 100644 index 0000000..9dc1e26 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/base/Seed.java @@ -0,0 +1,68 @@ +package tehnut.resourceful.crops.base; + +import net.minecraft.item.ItemStack; + +import java.awt.*; + +public class Seed { + + private String name; + private int tier; + private int amount; + private String input; + private ItemStack output; + private Color color; + + /** + * @param name - Name of the seed (Localized or Unlocalized). + * @param tier - The tier of the seed.
  • 1 - Mundane
  • 2 - Magical
  • 3 - Infused
  • 4 - Arcane
+ * @param amount - Amount of seeds to produce per craft. + * @param input - Input ItemStack or OreDict entry for creating the seeds. + * @param output - Output ItemStack or OreDict entry from crafting the shards. + * @param color - Color of the Seed/Shard/Crop + */ + public Seed(String name, int tier, int amount, String input, ItemStack output, Color color) { + this.name = name; + this.tier = tier; + this.amount = amount; + this.input = input; + this.output = output; + this.color = color; + } + + public String getName() { + return name; + } + + public int getTier() { + return tier; + } + + public int getAmount() { + return amount; + } + + public String getInput() { + return input; + } + + public ItemStack getOutput() { + return output; + } + + public Color getColor() { + return color; + } + + @Override + public String toString() { + return "Seed{" + + "name='" + name + '\'' + + ", tier=" + tier + + ", amount=" + amount + + ", input='" + input + '\'' + + ", output=" + output + + ", color=" + color + + '}'; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/blocks/BlockRCrop.java b/src/main/java/tehnut/resourceful/crops/blocks/BlockRCrop.java new file mode 100644 index 0000000..0713451 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/blocks/BlockRCrop.java @@ -0,0 +1,164 @@ +package tehnut.resourceful.crops.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockCrops; +import net.minecraft.block.ITileEntityProvider; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.EnumPlantType; +import tehnut.resourceful.crops.ConfigHandler; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.registry.BlockRegistry; +import tehnut.resourceful.crops.registry.ItemRegistry; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.tile.TileRCrop; +import tehnut.resourceful.crops.util.Utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class BlockRCrop extends BlockCrops implements ITileEntityProvider { + + public IIcon[] cropIcons = new IIcon[8]; + public IIcon[] cropOverlay = new IIcon[8]; + + public BlockRCrop() { + super(); + + setBlockName(ModInformation.ID + ".crop"); + } + + public static int getTileSeedIndex(World world, int x, int y, int z) { + TileEntity crop = world.getTileEntity(x, y, z); + int seedIndex = SeedRegistry.getSize() + 1; + + if (crop != null && crop instanceof TileRCrop) + seedIndex = ((TileRCrop) crop).getSeedIndex(); + + return seedIndex; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if (!player.isSneaking() || player.getHeldItem() == null && ConfigHandler.enableRightClickHarvest) { + if (world.getBlock(x, y, z) == BlockRegistry.crop && world.getBlockMetadata(x, y, z) >= 7) { + if (!world.isRemote) { + world.setBlockMetadataWithNotify(x, y, z, 0, 3); + dropBlockAsItem(world, x, y, z, new ItemStack(ItemRegistry.shard, 1, getTileSeedIndex(world, x, y, z))); + } + player.swingItem(); + return true; + } + } + + return false; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + dropItems(world, x, y, z, meta); + + super.breakBlock(world, x, y, z, block, meta); + } + + @Override + public Item getItemDropped(int meta, Random random, int p_149650_3_) { + return null; + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int meta, int fortune) { + return new ArrayList(); + } + + @Override + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { + TileEntity crop = world.getTileEntity(x, y, z); + + if (crop != null && crop instanceof TileRCrop) + return new ItemStack(ItemRegistry.seed, 1, getTileSeedIndex(world, x, y, z)); + + return new ItemStack(ItemRegistry.seed, 1, 1); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister ir) { + for (int i = 0; i < cropIcons.length; i++) { + if (ConfigHandler.enableFancyRender) { + cropIcons[i] = ir.registerIcon(ModInformation.ID + ":crop_base_" + i); + cropOverlay[i] = ir.registerIcon(ModInformation.ID + ":crop_overlay_" + i); + } else { + cropIcons[i] = ir.registerIcon(ModInformation.ID + ":crop_base_" + i + "_fast"); + } + } + + blockIcon = cropIcons[4]; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return cropIcons[meta]; + } + + @Override + public int getRenderType() { + return ConfigHandler.enableFancyRender ? ResourcefulCrops.renderIDCrop : 1; + } + + @Override + public int colorMultiplier(IBlockAccess blockAccess, int x, int y, int z) { + + TileEntity cropTile = blockAccess.getTileEntity(x, y, z); + + if (cropTile instanceof TileRCrop && !ConfigHandler.enableFancyRender) + return SeedRegistry.getSeed(((TileRCrop) cropTile).getSeedIndex()).getColor().getRGB(); + + return 16777215; + } + + public void dropItems(World world, int x, int y, int z, int meta) { + for (ItemStack stack : getDrops(world, x, y, z, meta)) + dropBlockAsItem(world, x, y, z, stack); + } + + public List getDrops(World world, int x, int y, int z, int meta) { + List drops = new ArrayList(); + int seedIndex = getTileSeedIndex(world, x, y, z); + + if (meta <= 6) { + drops.add(new ItemStack(ItemRegistry.seed, 1, seedIndex)); + } else { + drops.add(new ItemStack(ItemRegistry.seed, 1, seedIndex)); + drops.add(new ItemStack(ItemRegistry.shard, 1, seedIndex)); + } + + return drops; + } + + // IGrowable + + @Override + public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { + return EnumPlantType.Crop; + } + + // ITileEntityProvider + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileRCrop(); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/blocks/BlockROre.java b/src/main/java/tehnut/resourceful/crops/blocks/BlockROre.java new file mode 100644 index 0000000..3872386 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/blocks/BlockROre.java @@ -0,0 +1,78 @@ +package tehnut.resourceful.crops.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.registry.ItemRegistry; + +import java.util.List; +import java.util.Random; + +public class BlockROre extends Block { + + public IIcon[] icons = new IIcon[2]; + Random random = new Random(); + + public BlockROre() { + super(Material.rock); + + setBlockName(ModInformation.ID + ".ore"); + setStepSound(soundTypeStone); + setHardness(4.0F); + setCreativeTab(ResourcefulCrops.tabResourcefulCrops); + setHarvestLevel("pickaxe", 3); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.icons[0] = iconRegister.registerIcon(ModInformation.ID + ":oreGaianite"); + this.icons[1] = iconRegister.registerIcon(ModInformation.ID + ":oreGaianite_nether"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return this.icons[meta]; + } + + @SuppressWarnings("unchecked") + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item id, CreativeTabs tab, List list) { + for (int i = 0; i < 2; i++) + list.add(new ItemStack(id, 1, i)); + } + + @Override + public Item getItemDropped(int int1, Random random, int in2) { + return ItemRegistry.material; + } + + @Override + public int damageDropped(int meta) { + return 0; + } + + @Override + public int quantityDropped(Random random) { + + int drop = random.nextInt(4); + + return drop != 0 ? drop : 1; + } + + @Override + public int getExpDrop(IBlockAccess world, int meta, int fortune) { + return random.nextInt(4); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/client/gui/ConfigGui.java b/src/main/java/tehnut/resourceful/crops/client/gui/ConfigGui.java new file mode 100644 index 0000000..fb2ac1d --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/client/gui/ConfigGui.java @@ -0,0 +1,32 @@ +package tehnut.resourceful.crops.client.gui; + +import cpw.mods.fml.client.config.GuiConfig; +import cpw.mods.fml.client.config.IConfigElement; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.config.ConfigElement; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.ConfigHandler; + +import java.util.ArrayList; +import java.util.List; + +public class ConfigGui extends GuiConfig { + + public ConfigGui(GuiScreen parentScreen) { + super(parentScreen, getConfigElements(parentScreen), ModInformation.ID, false, false, StatCollector.translateToLocal("config.ResourcefulCrops.title")); + } + + @SuppressWarnings("rawtypes") + private static List getConfigElements(GuiScreen parent) { + List list = new ArrayList(); + + // adds sections declared in ConfigHandler. toLowerCase() is used because the configuration class automatically does this, so must we. + list.add(new ConfigElement(ConfigHandler.config.getCategory("Crafting".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("Balance".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("World".toLowerCase()))); + list.add(new ConfigElement(ConfigHandler.config.getCategory("General".toLowerCase()))); + + return list; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/client/gui/ConfigGuiFactory.java b/src/main/java/tehnut/resourceful/crops/client/gui/ConfigGuiFactory.java new file mode 100644 index 0000000..a59df07 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/client/gui/ConfigGuiFactory.java @@ -0,0 +1,30 @@ +package tehnut.resourceful.crops.client.gui; + +import cpw.mods.fml.client.IModGuiFactory; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; + +import java.util.Set; + +public class ConfigGuiFactory implements IModGuiFactory { + + @Override + public void initialize(Minecraft minecraftInstance) { + + } + + @Override + public Class mainConfigGuiClass() { + return ConfigGui.class; + } + + @Override + public Set runtimeGuiCategories() { + return null; + } + + @Override + public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) { + return null; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/client/render/RenderRCrop.java b/src/main/java/tehnut/resourceful/crops/client/render/RenderRCrop.java new file mode 100644 index 0000000..eed24aa --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/client/render/RenderRCrop.java @@ -0,0 +1,75 @@ +package tehnut.resourceful.crops.client.render; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.base.Seed; +import tehnut.resourceful.crops.blocks.BlockRCrop; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.tile.TileRCrop; +import tehnut.resourceful.crops.util.Utils; + +public class RenderRCrop implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + renderer.setOverrideBlockTexture(block.getIcon(0, 0)); + renderer.renderCrossedSquares(Blocks.stone, 0, 0, 0); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + renderer.setOverrideBlockTexture(block.getIcon(world, x, y, z, 0)); + renderer.renderCrossedSquares(block, x, y, z); + renderer.clearOverrideBlockTexture(); + int meta = world.getBlockMetadata(x, y, z); + TileEntity cropTile = world.getTileEntity(x, y, z); + if (cropTile instanceof TileRCrop) { + int seedIndex = ((TileRCrop) cropTile).getSeedIndex(); + + if (Utils.isValidSeed(seedIndex)) { + Seed seed = SeedRegistry.getSeed(seedIndex); + IIcon icon = ((BlockRCrop) block).cropOverlay[meta]; + + Tessellator tessellator = Tessellator.instance; + tessellator.setColorRGBA(seed.getColor().getRed(), seed.getColor().getGreen(), seed.getColor().getBlue(), seed.getColor().getAlpha()); + + if (meta == 0) { + renderer.drawCrossedSquares(icon, x, y, z, 1.0F); + } else if (meta == 1) { + renderer.drawCrossedSquares(icon, x, y, z, 1.0F); + } else if (meta == 2) { + renderer.drawCrossedSquares(icon, x, y, z, 1.0F); + } else if (meta == 3) { + renderer.drawCrossedSquares(icon, x, y, z, 1.0F); + } else if (meta == 4) { + renderer.drawCrossedSquares(icon, x, y, z, 1.0F); + } else if (meta == 5) { + renderer.drawCrossedSquares(icon, x, y, z, 1.0F); + } else if (meta == 6) { + renderer.drawCrossedSquares(icon, x, y + 0.0625F, z, 1.0F); + } else { + renderer.drawCrossedSquares(icon, x, y + 0.125F, z, 1.0F); + } + } + } + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return false; + } + + @Override + public int getRenderId() { + return ResourcefulCrops.renderIDCrop; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/compat/waila/CompatWaila.java b/src/main/java/tehnut/resourceful/crops/compat/waila/CompatWaila.java new file mode 100644 index 0000000..5044e0d --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/compat/waila/CompatWaila.java @@ -0,0 +1,12 @@ +package tehnut.resourceful.crops.compat.waila; + +import mcp.mobius.waila.api.impl.ModuleRegistrar; +import tehnut.resourceful.crops.blocks.BlockRCrop; + +public class CompatWaila { + + public static void load() { +// ModuleRegistrar.instance().addConfig(ModInformation.NAME, ModInformation.NAME, "waila.config.render.fancy", true); + ModuleRegistrar.instance().registerStackProvider(new RCropDataProvider(), BlockRCrop.class); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/compat/waila/RCropDataProvider.java b/src/main/java/tehnut/resourceful/crops/compat/waila/RCropDataProvider.java new file mode 100644 index 0000000..9ef76b9 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/compat/waila/RCropDataProvider.java @@ -0,0 +1,52 @@ +package tehnut.resourceful.crops.compat.waila; + +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import tehnut.resourceful.crops.blocks.BlockRCrop; +import tehnut.resourceful.crops.registry.ItemRegistry; +import tehnut.resourceful.crops.tile.TileRCrop; +import tehnut.resourceful.crops.util.Utils; + +import java.util.List; + +public class RCropDataProvider implements IWailaDataProvider { + + @Override + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { + + if (accessor.getBlock() instanceof BlockRCrop) { + TileEntity cropTile = accessor.getTileEntity(); + + if (cropTile != null && cropTile instanceof TileRCrop) + return new ItemStack(ItemRegistry.seed, 1, ((TileRCrop) cropTile).getSeedIndex()); + } + + return null; + } + + @Override + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + return null; + } + + @Override + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + return null; + } + + @Override + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + return null; + } + + @Override + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, int x, int y, int z) { + return null; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/items/ItemMaterial.java b/src/main/java/tehnut/resourceful/crops/items/ItemMaterial.java new file mode 100644 index 0000000..74d30dc --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/items/ItemMaterial.java @@ -0,0 +1,63 @@ +package tehnut.resourceful.crops.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.ResourcefulCrops; + +import java.util.List; + +public class ItemMaterial extends Item { + + String[] materials = { "", ".mundane", ".magical", ".infused", ".arcane" }; + + public ItemMaterial() { + super(); + + setUnlocalizedName(ModInformation.ID + ".dust"); + setTextureName(ModInformation.ID + ":dust_base"); + setCreativeTab(ResourcefulCrops.tabResourcefulCrops); + setHasSubtypes(true); + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return getUnlocalizedName() + materials[stack.getItemDamage() % materials.length]; + } + + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + for (int i = 0; i < materials.length; i++) + list.add(new ItemStack(this, 1, i)); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean hasEffect(ItemStack stack, int pass) { + return stack.getItemDamage() == 4; + } + + @Override + public EnumRarity getRarity(ItemStack stack) { + switch (stack.getItemDamage()) { + case 0: + return EnumRarity.common; + case 1: + return EnumRarity.common; + case 2: + return EnumRarity.uncommon; + case 3: + return EnumRarity.rare; + case 4: + return EnumRarity.epic; + default: + return EnumRarity.common; + } + } +} diff --git a/src/main/java/tehnut/resourceful/crops/items/ItemPouch.java b/src/main/java/tehnut/resourceful/crops/items/ItemPouch.java new file mode 100644 index 0000000..bc64d73 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/items/ItemPouch.java @@ -0,0 +1,138 @@ +package tehnut.resourceful.crops.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.EnumPlantType; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.ForgeDirection; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.base.Seed; +import tehnut.resourceful.crops.registry.BlockRegistry; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.tile.TileRCrop; +import tehnut.resourceful.crops.util.Utils; + +import java.util.List; + +public class ItemPouch extends Item implements IPlantable { + + public IIcon[] icons = new IIcon[2]; + + public ItemPouch() { + super(); + + setUnlocalizedName(ModInformation.ID + ".pouch"); + setTextureName(ModInformation.ID + ":pouch_base"); + setCreativeTab(ResourcefulCrops.tabResourcefulCrops); + setHasSubtypes(true); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + + boolean success = false; + + for (int posX = x - 1; posX <= x + 1; posX++) { + for (int posZ = z - 1; posZ <= z + 1; posZ++) { + Block placed = world.getBlock(posX, y, posZ); + + if (placed.canSustainPlant(world, posX, y, posZ, ForgeDirection.UP, this) && ForgeDirection.getOrientation(side) == ForgeDirection.UP && Utils.isValidSeed(stack) && world.isAirBlock(posX, y + 1, posZ)) { + world.setBlock(posX, y + 1, posZ, BlockRegistry.crop); + ((TileRCrop) world.getTileEntity(posX, y + 1, posZ)).setSeedIndex(Utils.getItemDamage(stack)); + if (!player.capabilities.isCreativeMode) + player.inventory.decrStackSize(player.inventory.currentItem, 1); + + success = true; + } + } + } + + return success; + } + + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + for (Seed seed : SeedRegistry.getSeedList()) + list.add(new ItemStack(this, 1, SeedRegistry.getIndexOf(seed))); + } + + @SideOnly(Side.CLIENT) + @Override + public String getItemStackDisplayName(ItemStack stack) { + if (Utils.isValidSeed(stack)) + return String.format(StatCollector.translateToLocal(getUnlocalizedName()), StatCollector.translateToLocal(SeedRegistry.getSeed(Utils.getItemDamage(stack)).getName())); + else + return String.format(StatCollector.translateToLocal(getUnlocalizedName()), StatCollector.translateToLocal("info.ResourcefulCrops.torn")); + } + + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + if (!Utils.isValidSeed(stack)) + list.add(EnumChatFormatting.RED + StatCollector.translateToLocal("info.ResourcefulCrops.warn")); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister ir) { + this.icons[0] = ir.registerIcon(ModInformation.ID + ":pouch_base_color"); + this.icons[1] = ir.registerIcon(ModInformation.ID + ":pouch_overlay"); + } + + public IIcon getIcon(ItemStack stack, int pass) { + if (pass == 0) + return icons[0]; + + return icons[1]; + } + + @SideOnly(Side.CLIENT) + @Override + public int getColorFromItemStack(ItemStack stack, int pass) { + if (pass == 1 && Utils.isValidSeed(stack)) + return SeedRegistry.getSeed(Utils.getItemDamage(stack)).getColor().getRGB(); + else + return super.getColorFromItemStack(stack, pass); + } + + @Override + public int getRenderPasses(int metadata) { + return requiresMultipleRenderPasses() ? 2 : 1; + } + + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + // IPlantable + + @Override + public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { + return EnumPlantType.Crop; + } + + @Override + public Block getPlant(IBlockAccess world, int x, int y, int z) { + return BlockRegistry.crop; + } + + @Override + public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { + return world.getBlockMetadata(x, y, z); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/items/ItemSeed.java b/src/main/java/tehnut/resourceful/crops/items/ItemSeed.java new file mode 100644 index 0000000..874c849 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/items/ItemSeed.java @@ -0,0 +1,115 @@ +package tehnut.resourceful.crops.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.EnumPlantType; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.ForgeDirection; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.registry.BlockRegistry; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.tile.TileRCrop; +import tehnut.resourceful.crops.util.Utils; + +import java.util.List; + +public class ItemSeed extends Item implements IPlantable { + + public ItemSeed() { + super(); + + setUnlocalizedName(ModInformation.ID + ".seed"); + setTextureName(ModInformation.ID + ":seed_base"); + setCreativeTab(ResourcefulCrops.tabResourcefulCrops); + setHasSubtypes(true); + } + + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + if (!SeedRegistry.isEmpty()) + for (int i = 0; i < SeedRegistry.getSize(); i++) + list.add(new ItemStack(this, 1, i)); + } + + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + + Block placed = world.getBlock(x, y, z); + + if (placed.canSustainPlant(world, x, y, z, ForgeDirection.UP, this) && ForgeDirection.getOrientation(side) == ForgeDirection.UP && Utils.isValidSeed(stack) && world.isAirBlock(x, y + 1, z)) { + world.setBlock(x, y + 1, z, BlockRegistry.crop); + ((TileRCrop) world.getTileEntity(x, y + 1, z)).setSeedIndex(Utils.getItemDamage(stack)); + if (!player.capabilities.isCreativeMode) + player.inventory.decrStackSize(player.inventory.currentItem, 1); + + return true; + } + + return false; + } + + @SideOnly(Side.CLIENT) + @Override + public String getItemStackDisplayName(ItemStack stack) { + if (Utils.isValidSeed(stack)) + return String.format(StatCollector.translateToLocal(getUnlocalizedName()), StatCollector.translateToLocal(SeedRegistry.getSeed(Utils.getItemDamage(stack)).getName())); + else + return String.format(StatCollector.translateToLocal(getUnlocalizedName()), StatCollector.translateToLocal("info.ResourcefulCrops.dead")); + } + + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + if (!Utils.isValidSeed(stack)) + list.add(EnumChatFormatting.RED + StatCollector.translateToLocal("info.ResourcefulCrops.warn")); + else + list.add(String.format(StatCollector.translateToLocal("info.ResourcefulCrops.tier"), SeedRegistry.getSeed(Utils.getItemDamage(stack)).getTier())); + } + + @SideOnly(Side.CLIENT) + @Override + public int getColorFromItemStack(ItemStack stack, int pass) { + if (pass == 1 && Utils.isValidSeed(stack)) + return SeedRegistry.getSeed(Utils.getItemDamage(stack)).getColor().getRGB(); + else + return super.getColorFromItemStack(stack, pass); + } + + @Override + public int getRenderPasses(int metadata) { + return requiresMultipleRenderPasses() ? 2 : 1; + } + + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + // IPlantable + + @Override + public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { + return EnumPlantType.Crop; + } + + @Override + public Block getPlant(IBlockAccess world, int x, int y, int z) { + return BlockRegistry.crop; + } + + @Override + public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { + return world.getBlockMetadata(x, y, z); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/items/ItemShard.java b/src/main/java/tehnut/resourceful/crops/items/ItemShard.java new file mode 100644 index 0000000..905c977 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/items/ItemShard.java @@ -0,0 +1,72 @@ +package tehnut.resourceful.crops.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.util.Utils; + +import java.util.List; + +public class ItemShard extends Item { + + public ItemShard() { + super(); + + setUnlocalizedName(ModInformation.ID + ".shard"); + setTextureName(ModInformation.ID + ":shard_base"); + setCreativeTab(ResourcefulCrops.tabResourcefulCrops); + setHasSubtypes(true); + } + + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + if (!SeedRegistry.isEmpty()) + for (int i = 0; i < SeedRegistry.getSize(); i++) + list.add(new ItemStack(this, 1, i)); + } + + @SideOnly(Side.CLIENT) + @Override + public String getItemStackDisplayName(ItemStack stack) { + if (Utils.isValidSeed(stack)) + return String.format(StatCollector.translateToLocal(getUnlocalizedName()), StatCollector.translateToLocal(SeedRegistry.getSeed(Utils.getItemDamage(stack)).getName())); + else + return String.format(StatCollector.translateToLocal(getUnlocalizedName()), StatCollector.translateToLocal("info.ResourcefulCrops.broken")); + } + + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + if (!Utils.isValidSeed(stack)) + list.add(EnumChatFormatting.RED + StatCollector.translateToLocal("info.ResourcefulCrops.warn")); + } + + @SideOnly(Side.CLIENT) + @Override + public int getColorFromItemStack(ItemStack stack, int pass) { + if (pass == 1 && Utils.isValidSeed(stack)) + return SeedRegistry.getSeed(Utils.getItemDamage(stack)).getColor().getRGB(); + else + return super.getColorFromItemStack(stack, pass); + } + + @Override + public int getRenderPasses(int metadata) { + return requiresMultipleRenderPasses() ? 2 : 1; + } + + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/items/ItemStone.java b/src/main/java/tehnut/resourceful/crops/items/ItemStone.java new file mode 100644 index 0000000..6541949 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/items/ItemStone.java @@ -0,0 +1,78 @@ +package tehnut.resourceful.crops.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.ResourcefulCrops; + +import java.util.List; + +public class ItemStone extends Item { + + String[] stones = {"mundane", "magical", "infused", "arcane", "true"}; + + public ItemStone() { + super(); + + setUnlocalizedName(ModInformation.ID + ".stone"); + setTextureName(ModInformation.ID + ":stone_base"); + setCreativeTab(ResourcefulCrops.tabResourcefulCrops); + setHasSubtypes(true); + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return getUnlocalizedName() + "." + stones[stack.getItemDamage() % stones.length]; + } + + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + for (int i = 0; i < stones.length; i++) + list.add(new ItemStack(this, 1, i)); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean hasEffect(ItemStack stack, int pass) { + return stack.getItemDamage() == 4; + } + + @Override + public EnumRarity getRarity(ItemStack stack) { + switch (stack.getItemDamage()) { + case 0: + return EnumRarity.common; + case 1: + return EnumRarity.common; + case 2: + return EnumRarity.uncommon; + case 3: + return EnumRarity.rare; + case 4: + return EnumRarity.epic; + default: + return EnumRarity.common; + } + } + + @Override + public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack) { + return false; + } + + @Override + public boolean hasContainerItem(ItemStack stack) { + return true; + } + + @Override + public ItemStack getContainerItem(ItemStack stack) { + return stack; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/items/blocks/ItemBlockROre.java b/src/main/java/tehnut/resourceful/crops/items/blocks/ItemBlockROre.java new file mode 100644 index 0000000..cd6aa65 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/items/blocks/ItemBlockROre.java @@ -0,0 +1,25 @@ +package tehnut.resourceful.crops.items.blocks; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemBlockROre extends ItemBlock { + + public static final String[] names = {"", ".nether"}; + + public ItemBlockROre(Block block) { + super(block); + setHasSubtypes(true); + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return getUnlocalizedName() + "" + names[stack.getItemDamage() % names.length]; + } + + @Override + public int getMetadata(int meta) { + return meta; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/proxies/ClientProxy.java b/src/main/java/tehnut/resourceful/crops/proxies/ClientProxy.java new file mode 100644 index 0000000..4d93cb4 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/proxies/ClientProxy.java @@ -0,0 +1,19 @@ +package tehnut.resourceful.crops.proxies; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.client.Minecraft; +import tehnut.resourceful.crops.ConfigHandler; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.client.render.RenderRCrop; + +public class ClientProxy extends CommonProxy { + + @Override + public void load() { + + ConfigHandler.enableFancyRender = Minecraft.getMinecraft().gameSettings.fancyGraphics; + + ResourcefulCrops.renderIDCrop = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new RenderRCrop()); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/proxies/CommonProxy.java b/src/main/java/tehnut/resourceful/crops/proxies/CommonProxy.java new file mode 100644 index 0000000..545629d --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/proxies/CommonProxy.java @@ -0,0 +1,8 @@ +package tehnut.resourceful.crops.proxies; + +public class CommonProxy { + + public void load() { + + } +} diff --git a/src/main/java/tehnut/resourceful/crops/registry/BlockRegistry.java b/src/main/java/tehnut/resourceful/crops/registry/BlockRegistry.java new file mode 100644 index 0000000..e795609 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/registry/BlockRegistry.java @@ -0,0 +1,24 @@ +package tehnut.resourceful.crops.registry; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.block.Block; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.blocks.BlockRCrop; +import tehnut.resourceful.crops.blocks.BlockROre; +import tehnut.resourceful.crops.items.blocks.ItemBlockROre; +import tehnut.resourceful.crops.tile.TileRCrop; + +public class BlockRegistry { + + public static Block ore; + public static Block crop; + + public static void registerBlocks() { + ore = new BlockROre(); + GameRegistry.registerBlock(ore, ItemBlockROre.class, "BlockROre"); + + crop = new BlockRCrop(); + GameRegistry.registerBlock(crop, "BlockRCrop"); + GameRegistry.registerTileEntity(TileRCrop.class, ModInformation.ID + ":TileRCrop"); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/registry/ItemRegistry.java b/src/main/java/tehnut/resourceful/crops/registry/ItemRegistry.java new file mode 100644 index 0000000..b459bbc --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/registry/ItemRegistry.java @@ -0,0 +1,34 @@ +package tehnut.resourceful.crops.registry; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.item.Item; +import tehnut.resourceful.crops.ConfigHandler; +import tehnut.resourceful.crops.items.*; + +public class ItemRegistry { + + public static Item seed; + public static Item shard; + public static Item pouch; + public static Item stone; + public static Item material; + + public static void registerItems() { + stone = new ItemStone(); + GameRegistry.registerItem(stone, "ItemStone"); + + material = new ItemMaterial(); + GameRegistry.registerItem(material, "ItemMaterial"); + + seed = new ItemSeed(); + GameRegistry.registerItem(seed, "ItemSeed"); + + shard = new ItemShard(); + GameRegistry.registerItem(shard, "ItemShard"); + + if (ConfigHandler.enableSeedPouches) { + pouch = new ItemPouch(); + GameRegistry.registerItem(pouch, "ItemPouch"); + } + } +} diff --git a/src/main/java/tehnut/resourceful/crops/registry/RecipeRegistry.java b/src/main/java/tehnut/resourceful/crops/registry/RecipeRegistry.java new file mode 100644 index 0000000..0aec323 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/registry/RecipeRegistry.java @@ -0,0 +1,160 @@ +package tehnut.resourceful.crops.registry; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; +import tehnut.resourceful.crops.ConfigHandler; +import tehnut.resourceful.crops.base.Seed; +import tehnut.resourceful.crops.util.Utils; + +public class RecipeRegistry { + + public static void registerItemRecipes() { + + // Seed/Shard/Pouch Recipes + for (Seed seed : SeedRegistry.getSeedList()) { + if (ConfigHandler.enableSeedCrafting) { + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.seed, seed.getAmount(), SeedRegistry.getIndexOf(seed)), + "IEI", "ESE", "IEI", + 'I', Utils.parseItemStack(seed.getInput(), true) == null ? seed.getInput() : Utils.parseItemStack(seed.getInput(), true), + 'E', new ItemStack(ItemRegistry.material, 1, seed.getTier()), + 'S', Items.wheat_seeds + )); + } + + if (ConfigHandler.enableShardCrafting) { + GameRegistry.addRecipe(new ShapedOreRecipe( + seed.getOutput(), + "SSS", "S S", "SSS", + 'S', new ItemStack(ItemRegistry.shard, 1, SeedRegistry.getIndexOf(seed))) + ); + } + + if (ConfigHandler.enableSeedPouches && ConfigHandler.enableSeedCrafting) { + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.pouch, 1, SeedRegistry.getIndexOf(seed)), + "SSS", "SSS", "SSS", + 'S', new ItemStack(ItemRegistry.seed, 1, SeedRegistry.getIndexOf(seed)) + )); + } + } + + // Stone Recipes + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.stone, 1, 0), + "MMM", "MGM", "MMM", + 'M', new ItemStack(ItemRegistry.material, 1, 0), + 'G', "gemDiamond" + )); + + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.stone, 1, 0), + "MMM", "MGM", "MMM", + 'M', new ItemStack(ItemRegistry.material, 1, 0), + 'G', "gemEmerald" + )); + + for (Seed seed : SeedRegistry.getSeedList()) { + if (seed.getTier() == 0) { + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.stone, 1, 1), + "MMM", "MSM", "MMM", + 'M', new ItemStack(ItemRegistry.shard, 1, SeedRegistry.getIndexOf(seed)), + 'S', new ItemStack(ItemRegistry.stone, 1, 0) + )); + } + + if (seed.getTier() == 1) { + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.stone, 1, 2), + "MMM", "MSM", "MMM", + 'M', new ItemStack(ItemRegistry.shard, 1, SeedRegistry.getIndexOf(seed)), + 'S', new ItemStack(ItemRegistry.stone, 1, 1) + )); + } + + if (seed.getTier() == 2) { + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.stone, 1, 3), + "MMM", "MSM", "MMM", + 'M', new ItemStack(ItemRegistry.shard, 1, SeedRegistry.getIndexOf(seed)), + 'S', new ItemStack(ItemRegistry.stone, 1, 2) + )); + } + + if (seed.getTier() == 3) { + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.stone, 1, 4), + "MMM", "MSM", "MMM", + 'M', new ItemStack(ItemRegistry.shard, 1, SeedRegistry.getIndexOf(seed)), + 'S', new ItemStack(ItemRegistry.stone, 1, 3) + )); + } + } + + // Essence Recipes + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.material, 1, 1), + " M ", "MSM", " M ", + 'M', new ItemStack(ItemRegistry.material, 1, 0), + 'S', new ItemStack(ItemRegistry.stone, 1, 0) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.material, 1, 1), + " M ", "MSM", " M ", + 'M', new ItemStack(ItemRegistry.material, 1, 0), + 'S', new ItemStack(ItemRegistry.stone, 1, 4) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.material, 1, 2), + " M ", "MSM", " M ", + 'M', new ItemStack(ItemRegistry.material, 1, 1), + 'S', new ItemStack(ItemRegistry.stone, 1, 1) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.material, 1, 2), + " M ", "MSM", " M ", + 'M', new ItemStack(ItemRegistry.material, 1, 1), + 'S', new ItemStack(ItemRegistry.stone, 1, 4) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.material, 1, 3), + " M ", "MSM", " M ", + 'M', new ItemStack(ItemRegistry.material, 1, 2), + 'S', new ItemStack(ItemRegistry.stone, 1, 2) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.material, 1, 3), + " M ", "MSM", " M ", + 'M', new ItemStack(ItemRegistry.material, 1, 2), + 'S', new ItemStack(ItemRegistry.stone, 1, 4) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.material, 1, 4), + " M ", "MSM", " M ", + 'M', new ItemStack(ItemRegistry.material, 1, 3), + 'S', new ItemStack(ItemRegistry.stone, 1, 3) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe( + new ItemStack(ItemRegistry.material, 1, 4), + " M ", "MSM", " M ", + 'M', new ItemStack(ItemRegistry.material, 1, 3), + 'S', new ItemStack(ItemRegistry.stone, 1, 4) + )); + + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ItemRegistry.material, 4, 0), new ItemStack(ItemRegistry.material, 1, 1))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ItemRegistry.material, 4, 1), new ItemStack(ItemRegistry.material, 1, 2))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ItemRegistry.material, 4, 2), new ItemStack(ItemRegistry.material, 1, 3))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(ItemRegistry.material, 4, 3), new ItemStack(ItemRegistry.material, 1, 4))); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/registry/SeedRegistry.java b/src/main/java/tehnut/resourceful/crops/registry/SeedRegistry.java new file mode 100644 index 0000000..90830db --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/registry/SeedRegistry.java @@ -0,0 +1,42 @@ +package tehnut.resourceful.crops.registry; + +import com.google.gson.GsonBuilder; +import net.minecraft.item.ItemStack; +import tehnut.resourceful.crops.base.Seed; + +import java.util.ArrayList; +import java.util.List; + +public class SeedRegistry { + + public static GsonBuilder seedBuilder; + private static List seedList = new ArrayList(); + + public static void registerSeed(Seed seed) { + seedList.add(seed); + } + + public static Seed getSeed(int index) { + return seedList.get(index); + } + + public static int getIndexOf(Seed seed) { + return seedList.indexOf(seed); + } + + public static int getSize() { + return seedList.size(); + } + + public static boolean isEmpty() { + return seedList.isEmpty(); + } + + public static List getSeedList() { + return new ArrayList(seedList); + } + + public static ItemStack getItemStackForSeed(Seed seed) { + return new ItemStack(ItemRegistry.seed, 1, getIndexOf(seed)); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/tile/TileRCrop.java b/src/main/java/tehnut/resourceful/crops/tile/TileRCrop.java new file mode 100644 index 0000000..8a6ca97 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/tile/TileRCrop.java @@ -0,0 +1,60 @@ +package tehnut.resourceful.crops.tile; + +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import tehnut.resourceful.crops.registry.SeedRegistry; + +public class TileRCrop extends TileEntity { + + private int seedIndex = SeedRegistry.getSize() + 1; + + public int getSeedIndex() { + return seedIndex; + } + + public void setSeedIndex(int seedIndex) { + this.seedIndex = seedIndex; + } + + @Override + public boolean canUpdate() { + return false; + } + + @Override + public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) { + return oldBlock != newBlock; + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + + tag.setInteger("seedIndex", getSeedIndex()); + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + + setSeedIndex(tag.getInteger("seedIndex")); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound tagCompound = new NBTTagCompound(); + this.writeToNBT(tagCompound); + + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, tagCompound); + } + + @Override + public void onDataPacket(NetworkManager manager, S35PacketUpdateTileEntity packet) { + this.readFromNBT(packet.func_148857_g()); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/util/EventHandler.java b/src/main/java/tehnut/resourceful/crops/util/EventHandler.java new file mode 100644 index 0000000..038421f --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/EventHandler.java @@ -0,0 +1,29 @@ +package tehnut.resourceful.crops.util; + +import cpw.mods.fml.client.event.ConfigChangedEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.util.StatCollector; +import net.minecraftforge.event.entity.player.BonemealEvent; +import tehnut.resourceful.crops.ConfigHandler; +import tehnut.resourceful.crops.ModInformation; +import tehnut.resourceful.crops.blocks.BlockRCrop; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.util.serialization.SeedCreator; + +public class EventHandler { + + @SubscribeEvent + public void onBonemeal(BonemealEvent event) { + if (event.block instanceof BlockRCrop) + event.setCanceled(true); + } + + @SubscribeEvent + public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent eventArgs) { + if (eventArgs.modID.equals(ModInformation.ID)) { + ConfigHandler.syncConfig(); + SeedCreator.registerJsonSeeds(SeedRegistry.seedBuilder); + LogHelper.info(StatCollector.translateToLocal("config.ResourcefulCrops.console.refresh")); + } + } +} diff --git a/src/main/java/tehnut/resourceful/crops/util/GenerationHandler.java b/src/main/java/tehnut/resourceful/crops/util/GenerationHandler.java new file mode 100644 index 0000000..1695559 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/GenerationHandler.java @@ -0,0 +1,42 @@ +package tehnut.resourceful.crops.util; + +import cpw.mods.fml.common.IWorldGenerator; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.feature.WorldGenMinable; +import tehnut.resourceful.crops.ConfigHandler; +import tehnut.resourceful.crops.registry.BlockRegistry; + +import java.util.Random; + +public class GenerationHandler implements IWorldGenerator { + + @Override + public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { + if (ConfigHandler.enableWorldGeneration) { + generateNether(world, random, chunkX * 16, chunkZ * 16); + generateOverworld(world, random, chunkX * 16, chunkZ * 16); + } + } + + private void generateOverworld(World world, Random random, int chunkX, int chunkZ) { + for (int k = 0; k < 10; k++) { + int firstBlockXCoord = chunkX + random.nextInt(16); + int firstBlockZCoord = chunkZ + random.nextInt(16); + int gaianiteY = random.nextInt(16); + + new WorldGenMinable(BlockRegistry.ore, 0, 4, Blocks.stone).generate(world, random, firstBlockXCoord, gaianiteY, firstBlockZCoord); + } + } + + private void generateNether(World world, Random random, int chunkX, int chunkZ) { + for (int k = 0; k < 10; k++) { + int firstBlockXCoord = chunkX + random.nextInt(16); + int firstBlockZCoord = chunkZ + random.nextInt(16); + int gaianiteY = random.nextInt(256); + + new WorldGenMinable(BlockRegistry.ore, 1, 4, Blocks.netherrack).generate(world, random, firstBlockXCoord, gaianiteY, firstBlockZCoord); + } + } +} diff --git a/src/main/java/tehnut/resourceful/crops/util/LogHelper.java b/src/main/java/tehnut/resourceful/crops/util/LogHelper.java new file mode 100644 index 0000000..6365c83 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/LogHelper.java @@ -0,0 +1,38 @@ +package tehnut.resourceful.crops.util; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import tehnut.resourceful.crops.ConfigHandler; +import tehnut.resourceful.crops.ModInformation; + +public class LogHelper { + + private static Logger logger = LogManager.getLogger(ModInformation.NAME); + + /** + * @param info - String to log to the info level + */ + + public static void info(Object info) { + if (ConfigHandler.enableConsoleLogging) + logger.info(info); + } + + /** + * @param error - String to log to the error level + */ + + public static void error(Object error) { + if (ConfigHandler.enableConsoleLogging) + logger.error(error); + } + + /** + * @param debug - String to log to the debug level + */ + + public static void debug(Object debug) { + if (ConfigHandler.enableConsoleLogging) + logger.debug(debug); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/util/PermanentCache.java b/src/main/java/tehnut/resourceful/crops/util/PermanentCache.java new file mode 100644 index 0000000..e2c2698 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/PermanentCache.java @@ -0,0 +1,50 @@ +package tehnut.resourceful.crops.util; + +import com.google.common.collect.Lists; +import lombok.SneakyThrows; + +import java.io.File; +import java.util.List; + +public class PermanentCache extends WorldCache { + + private static final List> allCaches = Lists.newArrayList(); + + @SneakyThrows + public PermanentCache(String ident) { + super(ident); + loadData(getSaveFile()); + } + + @Override + @SneakyThrows + protected File getSaveFile() { + return new File("saves", ident + ".dat"); + } + + @Override + protected void blockOldIDs() { + if (!objToName.isEmpty()) { + super.blockOldIDs(); + } + } + + @Override + protected void mergeNewIDs() { + if (!objToName.isEmpty()) { + super.mergeNewIDs(); + } + } + + @Override + public void addObject(I object, String name) { + super.addObject(object, name); + setID(name); + } + + public static void saveCaches() { + for (PermanentCache c : allCaches) { + c.saveData(c.getSaveFile()); + } + } +} \ No newline at end of file diff --git a/src/main/java/tehnut/resourceful/crops/util/SeedBuilder.java b/src/main/java/tehnut/resourceful/crops/util/SeedBuilder.java new file mode 100644 index 0000000..cf2e85d --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/SeedBuilder.java @@ -0,0 +1,66 @@ +package tehnut.resourceful.crops.util; + +import net.minecraft.item.ItemStack; +import tehnut.resourceful.crops.base.Seed; + +import java.awt.*; + +/** + * Factory for creating Seeds/Crops/Shards. + * Documentation for each field can be found in {@link Seed} + */ +public class SeedBuilder { + + private String name; + private int tier; + private int amount; + private String input; + private ItemStack output; + private Color color; + + public SeedBuilder() { + + } + + public SeedBuilder setName(String name) { + this.name = name; + return this; + } + + public SeedBuilder setTier(int tier) { + if (tier > 4) + this.tier = 4; + else if (tier < 1) + this.tier = 1; + else + this.tier = tier; + return this; + } + + public SeedBuilder setAmount(int amount) { + if (amount > 64) + this.amount = 64; + else + this.amount = amount; + return this; + } + + public SeedBuilder setInput(String input) { + this.input = input; + return this; + } + + public SeedBuilder setOutput(ItemStack output) { + this.output = output; + return this; + } + + public SeedBuilder setColor(Color color) { + this.color = color; + return this; + } + + public Seed build() { + return new Seed(name, tier, amount, input, output, color); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/util/StartupUtils.java b/src/main/java/tehnut/resourceful/crops/util/StartupUtils.java new file mode 100644 index 0000000..eb618fa --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/StartupUtils.java @@ -0,0 +1,109 @@ +package tehnut.resourceful.crops.util; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.registry.GameData; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.base.Seed; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.util.serialization.SeedCreator; + +import java.awt.*; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class StartupUtils { + + private static List defaultSeeds = new ArrayList(); + + public static void initDefaults() { + + // Tier 0 + addDefaultSeedOre(new Seed("Inky", 1, 4, "dyeBlack", new ItemStack(getOreStack("dyeBlack").getItem(), 8, getOreStack("dyeBlack").getItemDamage()), new Color(22, 22, 22)), "dyeBlack"); + addDefaultSeed(new Seed("Fleshy", 1, 4, getItemString(Items.rotten_flesh), new ItemStack(Items.rotten_flesh, 8), new Color(255, 160, 136))); + addDefaultSeed(new Seed("Feathery", 1, 4, getItemString(Items.feather), new ItemStack(Items.feather, 8), new Color(208, 203, 199))); + // Tier 1 + addDefaultSeedOre(new Seed("Tin", 2, 4, "ingotTin", new ItemStack(getOreStack("ingotTin").getItem(), 8, getOreStack("ingotTin").getItemDamage()), new Color(135, 154, 168)), "ingotTin"); + addDefaultSeedOre(new Seed("Copper", 2, 4, "ingotCopper", new ItemStack(getOreStack("ingotCopper").getItem(), 8, getOreStack("ingotCopper").getItemDamage()), new Color(204, 102, 51)), "ingotCopper"); + addDefaultSeedOre(new Seed("Aluminum", 2, 4, "ingotAluminum", new ItemStack(getOreStack("ingotAluminum").getItem(), 8, getOreStack("ingotAluminum").getItemDamage()), new Color(198, 206, 130)), "ingotAluminum"); + addDefaultSeedOre(new Seed("Zinc", 2, 4, "ingotZinc", new ItemStack(getOreStack("ingotZinc").getItem(), 8, getOreStack("ingotZinc").getItemDamage()), new Color(192, 176, 182)), "ingotZinc"); + addDefaultSeed(new Seed("Coal", 2, 4, getItemString(Items.coal), new ItemStack(Items.coal, 8), new Color(45, 44, 47))); + addDefaultSeed(new Seed("Charcoal", 2, 4, getItemString(Items.coal, 1), new ItemStack(Items.coal, 8, 1), new Color(45, 44, 47))); + addDefaultSeedOre(new Seed("Saltpeter", 2, 4, "dustSaltpeter", new ItemStack(getOreStack("dustSaltpeter").getItem(), 8, getOreStack("dustSaltpeter").getItemDamage()), new Color(182, 197, 212)), "dustSaltpeter"); + addDefaultSeedOre(new Seed("Salt", 2, 4, "dustSalt", new ItemStack(getOreStack("dustSalt").getItem(), 8, getOreStack("dustSalt").getItemDamage()), new Color(182, 197, 212)), "dustSalt"); + addDefaultSeed(new Seed("Leathery", 2, 4, getItemString(Items.leather), new ItemStack(Items.leather, 8), new Color(255, 68, 17))); + addDefaultSeed(new Seed("Stringy", 2, 4, getItemString(Items.string), new ItemStack(Items.string, 8), new Color(241, 255, 210))); + addDefaultSeed(new Seed("Boney", 2, 4, getItemString(Items.bone), new ItemStack(Items.bone, 8), new Color(255, 240, 205))); + addDefaultSeed(new Seed("Slimey", 2, 4, getItemString(Items.slime_ball), new ItemStack(Items.slime_ball, 8), new Color(62, 255, 119))); + //Tier 2 + addDefaultSeed(new Seed("Blaze", 3, 4, getItemString(Items.blaze_rod), new ItemStack(Items.blaze_rod, 8), new Color(255, 215, 66))); + addDefaultSeedOre(new Seed("Iron", 3, 4, "ingotIron", new ItemStack(getOreStack("ingotIron").getItem(), 8, getOreStack("ingotIron").getItemDamage()), new Color(159, 156, 160)), "ingotIron"); + addDefaultSeedOre(new Seed("Gold", 3, 4, "ingotGold", new ItemStack(getOreStack("ingotGold").getItem(), 8, getOreStack("ingotGold").getItemDamage()), new Color(255, 255, 0)), "ingotGold"); + addDefaultSeedOre(new Seed("Lead", 3, 4, "ingotLead", new ItemStack(getOreStack("ingotLead").getItem(), 8, getOreStack("ingotLead").getItemDamage()), new Color(102, 102, 153)), "ingotLead"); + addDefaultSeedOre(new Seed("Silver", 3, 4, "ingotSilver", new ItemStack(getOreStack("ingotSilver").getItem(), 8, getOreStack("ingotSilver").getItemDamage()), new Color(187, 189, 184)), "ingotSilver"); + addDefaultSeedOre(new Seed("Nickel", 3, 4, "ingotNickel", new ItemStack(getOreStack("ingotNickel").getItem(), 8, getOreStack("ingotNickel").getItemDamage()), new Color(204, 204, 204)), "ingotNickel"); + addDefaultSeedOre(new Seed("Mithril", 3, 4, "ingotMithril", new ItemStack(getOreStack("ingotMithril").getItem(), 8, getOreStack("ingotMithril").getItemDamage()), new Color(146, 164, 208)), "ingotMithril"); + addDefaultSeedOre(new Seed("Osmium", 3, 4, "ingotOsmium", new ItemStack(getOreStack("ingotOsmium").getItem(), 8, getOreStack("ingotOsmium").getItemDamage()), new Color(68, 60, 190)), "ingotOsmium"); + addDefaultSeed(new Seed("Ender", 3, 4, getItemString(Items.ender_pearl), new ItemStack(Items.ender_pearl, 8), new Color(72, 100, 97))); + addDefaultSeed(new Seed("Teary", 3, 4, getItemString(Items.ghast_tear), new ItemStack(Items.ghast_tear, 8), new Color(212, 255, 241))); + addDefaultSeed(new Seed("Creepy", 3, 4, getItemString(Items.gunpowder), new ItemStack(Items.gunpowder, 8), new Color(0, 255, 33))); + addDefaultSeedOre(new Seed("Glowstone", 3, 4, "dustGlowstone", new ItemStack(getOreStack("dustGlowstone").getItem(), 8, getOreStack("dustGlowstone").getItemDamage()), new Color(233, 255, 84)), "dustGlowstone"); + addDefaultSeedOre(new Seed("Redstone", 3, 4, "dustRedstone", new ItemStack(getOreStack("dustRedstone").getItem(), 8, getOreStack("dustRedstone").getItemDamage()), new Color(159, 13, 0)), "dustRedstone"); + addDefaultSeedOre(new Seed("Sulfur", 3, 4, "dustSulfur", new ItemStack(getOreStack("dustSulfur").getItem(), 8, getOreStack("dustSulfur").getItemDamage()), new Color(212, 190, 85)), "dustSulfur"); + addDefaultSeedOre(new Seed("Lapis", 3, 4, "gemLapis", new ItemStack(getOreStack("gemLapis").getItem(), 8, getOreStack("gemLapis").getItemDamage()), new Color(63, 71, 206)), "gemLapis"); + addDefaultSeedOre(new Seed("Quartz", 3, 4, "gemQuartz", new ItemStack(getOreStack("gemQuartz").getItem(), 8, getOreStack("gemQuartz").getItemDamage()), new Color(255, 255, 255)), "gemQuartz"); + addDefaultSeedOre(new Seed("Certus", 3, 4, "crystalCertusQuartz", new ItemStack(getOreStack("crystalCertusQuartz").getItem(), 8, getOreStack("crystalCertusQuartz").getItemDamage()), new Color(168, 204, 208)), "crystalCertusQuartz"); + addDefaultSeedOre(new Seed("Ruby", 3, 4, "gemRuby", new ItemStack(getOreStack("gemRuby").getItem(), 8, getOreStack("gemRuby").getItemDamage()), new Color(212, 48, 55)), "gemRuby"); + addDefaultSeedOre(new Seed("Peridot", 3, 4, "gemPeridot", new ItemStack(getOreStack("gemPeridot").getItem(), 8, getOreStack("gemPeridot").getItemDamage()), new Color(130, 212, 108)), "gemPeridot"); + addDefaultSeedOre(new Seed("Topaz", 3, 4, "gemTopaz", new ItemStack(getOreStack("gemTopaz").getItem(), 8, getOreStack("gemTopaz").getItemDamage()), new Color(212, 143, 101)), "gemTopaz"); + addDefaultSeedOre(new Seed("Tanzanite", 3, 4, "gemTanzanite", new ItemStack(getOreStack("gemTanzanite").getItem(), 8, getOreStack("gemTanzanite").getItemDamage()), new Color(42, 7, 96)), "gemTanzanite"); + addDefaultSeedOre(new Seed("Malachite", 3, 4, "gemMalachite", new ItemStack(getOreStack("gemMalachite").getItem(), 8, getOreStack("gemMalachite").getItemDamage()), new Color(59, 255, 226)), "gemMalachite"); + addDefaultSeedOre(new Seed("Sapphire", 3, 4, "gemSapphire", new ItemStack(getOreStack("gemSapphire").getItem(), 8, getOreStack("gemSapphire").getItemDamage()), new Color(88, 106, 212)), "gemSapphire"); + addDefaultSeedOre(new Seed("Amber", 3, 4, "gemAmber", new ItemStack(getOreStack("gemAmber").getItem(), 8, getOreStack("gemAmber").getItemDamage()), new Color(212, 121, 60)), "gemAmber"); + addDefaultSeedOre(new Seed("Apatite", 3, 4, "gemApatite", new ItemStack(getOreStack("gemApatite").getItem(), 8, getOreStack("gemApatite").getItemDamage()), new Color(121, 188, 212)), "gemApatite"); + // Tier 3 + addDefaultSeedOre(new Seed("Diamond", 4, 4, "gemDiamond", new ItemStack(getOreStack("gemDiamond").getItem(), 8, getOreStack("gemDiamond").getItemDamage()), new Color(58, 242, 239)), "gemDiamond"); + addDefaultSeedOre(new Seed("Emerald", 4, 4, "gemEmerald", new ItemStack(getOreStack("gemEmerald").getItem(), 8, getOreStack("gemEmerald").getItemDamage()), new Color(87, 242, 111)), "gemEmerald"); + addDefaultSeedOre(new Seed("Platinum", 4, 4, "ingotPlatinum", new ItemStack(getOreStack("ingotPlatinum").getItem(), 8, getOreStack("ingotPlatinum").getItemDamage()), new Color(30, 208, 243)), "ingotPlatinum"); + addDefaultSeedOre(new Seed("Yellorium", 4, 4, "ingotYellorium", new ItemStack(getOreStack("ingotYellorium").getItem(), 8, getOreStack("ingotYellorium").getItemDamage()), new Color(142, 160, 19)), "ingotYellorium"); + addDefaultSeedOre(new Seed("Titanium", 4, 4, "ingotTitanium", new ItemStack(getOreStack("ingotTitanium").getItem(), 8, getOreStack("ingotTitanium").getItemDamage()), new Color(212, 165, 182)), "ingotTitanium"); + addDefaultSeedOre(new Seed("Desh", 4, 4, "ingotDesh", new ItemStack(getOreStack("ingotDesh").getItem(), 8, getOreStack("ingotDesh").getItemDamage()), new Color(39, 39, 40)), "ingotDesh"); + addDefaultSeedOre(new Seed("Cobalt", 4, 4, "ingotCobalt", new ItemStack(getOreStack("ingotCobalt").getItem(), 8, getOreStack("ingotCobalt").getItemDamage()), new Color(0, 60, 255)), "ingotCobalt"); + addDefaultSeedOre(new Seed("Ardite", 4, 4, "ingotArdite", new ItemStack(getOreStack("ingotArdite").getItem(), 8, getOreStack("ingotArdite").getItemDamage()), new Color(255, 102, 0)), "ingotArdite"); + + SeedCreator.createJsonFromSeeds(SeedRegistry.seedBuilder, defaultSeeds, "DefaultSeeds"); + } + + private static void addDefaultSeedMod(Seed seed, String modid) { + if (Loader.isModLoaded(modid)) + defaultSeeds.add(seed); + } + + private static void addDefaultSeedOre(Seed seed, String ore) { + if (OreDictionary.doesOreNameExist(ore)) + defaultSeeds.add(seed); + } + + private static void addDefaultSeed(Seed seed) { + String[] split = seed.getInput().split(":"); + if (GameData.getItemRegistry().containsKey(split[0] + ":" + split[1])) + defaultSeeds.add(seed); + } + + private static String getItemString(Item item) { + return GameData.getItemRegistry().getNameForObject(item) + ":0#0"; + } + + private static String getItemString(Item item, int meta) { + return GameData.getItemRegistry().getNameForObject(item) + ":" + meta + "#0"; + } + + private static ItemStack getOreStack(String entry) { + return OreDictionary.doesOreNameExist(entry) ? OreDictionary.getOres(entry).get(0) : new ItemStack(Blocks.fire); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/util/Utils.java b/src/main/java/tehnut/resourceful/crops/util/Utils.java new file mode 100644 index 0000000..3ef2ea3 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/Utils.java @@ -0,0 +1,58 @@ +package tehnut.resourceful.crops.util; + +import cpw.mods.fml.common.registry.GameData; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.oredict.OreDictionary; +import tehnut.resourceful.crops.registry.SeedRegistry; + +public class Utils { + + public static ItemStack parseItemStack(String stackString, boolean input) { + if (stackString.contains(":")) { + String[] nameInfo = stackString.split(":"); + String name = nameInfo[0] + ":" + nameInfo[1]; + String[] stackInfo = nameInfo[2].split("#"); + int meta = Integer.parseInt(stackInfo[0]); + int amount = Integer.parseInt(stackInfo[1]); + + return new ItemStack(GameData.getItemRegistry().getObject(name), amount, meta); + } else if (!input) { + String[] stackInfo = stackString.split("#"); + ItemStack oreStack = OreDictionary.getOres(stackInfo[0]).get(0); + int amount = Integer.parseInt(stackInfo[1]); + + return new ItemStack(oreStack.getItem(), amount, oreStack.getItemDamage()); + } + + return null; + } + + public static int getItemDamage(ItemStack stack) { + return stack.getItemDamage(); + } + +// public static ItemStack setSeedIndex(ItemStack stack, int seedIndex) { +// if (stack.stackTagCompound == null) +// stack.stackTagCompound = new NBTTagCompound(); +// +// stack.stackTagCompound.setInteger("seedIndex", seedIndex); +// +// return stack; +// } +// +// public static int getSeedIndex(ItemStack stack) { +// if (stack.stackTagCompound == null) +// stack.stackTagCompound = new NBTTagCompound(); +// +// return stack.stackTagCompound.getInteger("seedIndex"); +// } + + public static boolean isValidSeed(int seedIndex) { + return !SeedRegistry.isEmpty() && !(SeedRegistry.getSize() < seedIndex); + } + + public static boolean isValidSeed(ItemStack stack) { + return isValidSeed(getItemDamage(stack)); + } +} diff --git a/src/main/java/tehnut/resourceful/crops/util/WorldCache.java b/src/main/java/tehnut/resourceful/crops/util/WorldCache.java new file mode 100644 index 0000000..e35c99a --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/WorldCache.java @@ -0,0 +1,221 @@ +package tehnut.resourceful.crops.util; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Sets; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import lombok.SneakyThrows; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.event.world.WorldEvent; +import org.apache.commons.lang3.ArrayUtils; + +import java.io.File; +import java.io.IOException; +import java.util.BitSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +public class WorldCache { + + public static final int MAX_ID = Short.MAX_VALUE; + + protected String ident; + protected boolean locked; + protected BitSet usedIDs = new BitSet(MAX_ID); + protected Set blockedIDs = Sets.newHashSet(); + protected BiMap objToName = HashBiMap.create(); + protected BiMap nameToID = HashBiMap.create(); + + public WorldCache(String ident) { + this(ident, true); + } + + protected WorldCache(String ident, boolean registerToEventBus) { + this.ident = ident; + if (registerToEventBus) { + MinecraftForge.EVENT_BUS.register(this); + } + } + + @SubscribeEvent + public void onWorldSave(WorldEvent.Save event) { + if (!event.world.isRemote && event.world.provider.dimensionId == 0) { + saveData(getSaveFile()); + } + } + + @SubscribeEvent + @SneakyThrows + public void onWorldLoad(WorldEvent.Load event) { + if (!event.world.isRemote && event.world.provider.dimensionId == 0) { + loadData(getSaveFile()); + } + locked = true; + } + + @SneakyThrows + protected void loadData(File file) { + try { + if (!file.createNewFile()) { + NBTTagCompound tag = null; + try { + tag = CompressedStreamTools.read(file); + } catch (Exception e) { + generateIDs(); + return; + } + if (tag.hasKey("ItemData")) { + // name <-> id mappings + NBTTagList list = tag.getTagList("ItemData", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < list.tagCount(); i++) { + NBTTagCompound dataTag = list.getCompoundTagAt(i); + int id = dataTag.getInteger("V"); + String name = dataTag.getString("K"); + nameToID.put(name, id); + if (objToName.values().contains(name)) { + usedIDs.set(id, true); + } + } + + // blocked ids + for (int id : tag.getIntArray("BlockedItemIds")) { + blockedIDs.add(id); + } + + blockOldIDs(); + mergeNewIDs(); + return; + } + } + } catch (IOException e) { + + } + generateIDs(); + } + + @SneakyThrows + protected void saveData(File file) { + NBTTagCompound data = new NBTTagCompound(); + + // name <-> id mappings + NBTTagList dataList = new NBTTagList(); + for (String key : nameToID.keySet()) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("K", key); + tag.setInteger("V", nameToID.get(key)); + dataList.appendTag(tag); + } + data.setTag("ItemData", dataList); + // blocked ids + data.setIntArray("BlockedItemIds", ArrayUtils.toPrimitive(blockedIDs.toArray(new Integer[0]))); + + try { + CompressedStreamTools.write(data, file); + } catch (IOException e) { + + } + } + + protected void blockOldIDs() { + for (String s : nameToID.keySet()) { + if (!objToName.containsValue(s)) { + blockedIDs.add(nameToID.get(s)); + } + } + Iterator iter = nameToID.keySet().iterator(); + while (iter.hasNext()) { + if (blockedIDs.contains(nameToID.get(iter.next()))) { + iter.remove(); + } + } + } + + protected void mergeNewIDs() { + for (String s : objToName.values()) { + Integer id = nameToID.get(s); + if (id != null) { + setID(s); + } + } + } + + protected void generateIDs() { + for (Map.Entry e : objToName.entrySet()) { + if (!nameToID.containsKey(e.getValue())) { + setID(e.getValue()); + } + } + } + + protected int getNextAvailableID(String name) { + Integer nextID = nameToID.get(name); + if (nextID != null) { + return nextID; + } else { + nextID = usedIDs.nextClearBit(0); + } + while (blockedIDs.contains(nextID) || nameToID.values().contains(nextID)) { + usedIDs.nextClearBit(nextID++); + } + return nextID; + } + + protected void setID(String name) { + setID(name, getNextAvailableID(name)); + } + + protected void setID(String name, int id) { + nameToID.put(name, id); + usedIDs.set(id, true); + } + + @SneakyThrows + protected File getSaveFile() { + return new File(DimensionManager.getCurrentSaveRootDirectory().getAbsolutePath() + "/" + ident + ".json"); + } + + public void addObject(I object, String name) { + if (locked) { + throw new IllegalStateException("Cannot add to world cache after world load!"); + } + objToName.put(object, name); + } + + public int getID(I obj) { + return nameToID.get(getName(obj)); + } + + public String getName(I obj) { + return objToName.get(obj); + } + + public I getObject(int id) { + return getObject(nameToID.inverse().get(id)); + } + + public I getObject(String string) { + return objToName.inverse().get(string); + } + + public Iterator getObjects() { + return objToName.keySet().iterator(); + } + + public TIntObjectMap getEnumeratedObjects() { + TIntObjectMap ret = new TIntObjectHashMap(); + for (int i = 0; i <= MAX_ID && usedIDs.nextSetBit(i) >= 0; i++) { + if (usedIDs.get(i)) { + ret.put(i, getObject(i)); + } + } + return ret; + } +} diff --git a/src/main/java/tehnut/resourceful/crops/util/serialization/SeedCreator.java b/src/main/java/tehnut/resourceful/crops/util/serialization/SeedCreator.java new file mode 100644 index 0000000..763f104 --- /dev/null +++ b/src/main/java/tehnut/resourceful/crops/util/serialization/SeedCreator.java @@ -0,0 +1,125 @@ +package tehnut.resourceful.crops.util.serialization; + +import com.google.gson.*; +import com.google.gson.reflect.TypeToken; +import cpw.mods.fml.common.registry.GameData; +import org.apache.commons.io.filefilter.FileFilterUtils; +import tehnut.resourceful.crops.ResourcefulCrops; +import tehnut.resourceful.crops.base.Seed; +import tehnut.resourceful.crops.registry.SeedRegistry; +import tehnut.resourceful.crops.util.SeedBuilder; +import tehnut.resourceful.crops.util.Utils; + +import java.awt.*; +import java.io.*; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +public class SeedCreator { + + public static void registerJsonSeeds(GsonBuilder gsonBuilder, File folder) { + File[] files = folder.listFiles((FileFilter) FileFilterUtils.suffixFileFilter(".json")); + for (File file : files) + SeedCreator.createSeedsFromJson(gsonBuilder, file); + } + + public static void registerJsonSeeds(GsonBuilder gsonBuilder) { + File folder = new File(ResourcefulCrops.getConfigDir().getPath() + "/seeds"); + + File[] files = folder.listFiles((FileFilter) FileFilterUtils.suffixFileFilter(".json")); + for (File file : files) + SeedCreator.createSeedsFromJson(gsonBuilder, file); + } + + @SuppressWarnings("unchecked") + public static List createSeedsFromJson(GsonBuilder gsonBuilder, File file) { + try { + Gson gson = gsonBuilder.setPrettyPrinting().disableHtmlEscaping().serializeNulls().create(); + return gson.fromJson(new FileReader(file), ArrayList.class); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + public static void createJsonFromSeeds(GsonBuilder gsonBuilder, List list, String fileName) { + try { + Gson gson = gsonBuilder.setPrettyPrinting().disableHtmlEscaping().serializeNulls().create(); + String reverse = gson.toJson(list, List.class); + FileWriter fw = new FileWriter(new File(ResourcefulCrops.getConfigDir().getPath() + "/seeds", fileName + ".json")); + fw.write("{\n\"seeds\": " + reverse + "\n}"); + fw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void createJsonFromSeeds(GsonBuilder gsonBuilder, List list) { + createJsonFromSeeds(gsonBuilder, list, "PrintedSeeds"); + } + + public static void registerCustomSerializers(GsonBuilder gsonBuilder) { + gsonBuilder.registerTypeAdapter(ArrayList.class, new CustomListJson()); + gsonBuilder.registerTypeAdapter(Seed.class, new CustomSeedJson()); + } + + public static class CustomSeedJson implements JsonDeserializer, JsonSerializer { + + @Override + public Seed deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String name = json.getAsJsonObject().get("name").getAsString(); + int tier = json.getAsJsonObject().get("tier").getAsInt(); + int amount = json.getAsJsonObject().get("amount").getAsInt(); + String input = json.getAsJsonObject().get("input").getAsString(); + String output = json.getAsJsonObject().get("output").getAsString(); + String color = json.getAsJsonObject().get("color").getAsString(); + + SeedBuilder builder = new SeedBuilder(); + builder.setName(name); + builder.setTier(tier); + builder.setAmount(amount); + builder.setInput(input); + builder.setOutput(Utils.parseItemStack(output, false)); + builder.setColor(Color.decode(color)); + + return builder.build(); + } + + @Override + public JsonElement serialize(Seed src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("name", src.getName()); + jsonObject.addProperty("tier", src.getTier()); + jsonObject.addProperty("amount", src.getAmount()); + jsonObject.addProperty("input", src.getInput()); + jsonObject.addProperty("output", GameData.getItemRegistry().getNameForObject(src.getOutput().getItem()) + ":" + src.getOutput().getItemDamage() + "#" + src.getOutput().stackSize); + jsonObject.addProperty("color", "#" + Integer.toHexString(src.getColor().getRGB()).substring(2).toUpperCase()); + + return jsonObject; + } + } + + public static class CustomListJson implements JsonDeserializer>, JsonSerializer> { + + @Override + public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + List list = context.deserialize(json.getAsJsonObject().get("seeds"), new TypeToken>() { + }.getType()); + + for (Seed seed : list) + SeedRegistry.registerSeed(seed); + + return list; + } + + @Override + public JsonElement serialize(List src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject jsonObject = new JsonObject(); + jsonObject.add("seeds", context.serialize(SeedRegistry.getSeedList())); + + return jsonObject; + } + } +} diff --git a/src/main/resources/assets/resourcefulcrops/lang/en_US.lang b/src/main/resources/assets/resourcefulcrops/lang/en_US.lang new file mode 100644 index 0000000..66da301 --- /dev/null +++ b/src/main/resources/assets/resourcefulcrops/lang/en_US.lang @@ -0,0 +1,35 @@ +# Creative Tab +itemGroup.ResourcefulCrops.creativeTab=ResourcefulCrops + +# Items +item.ResourcefulCrops.seed=%s Seeds +item.ResourcefulCrops.shard=%s Shards +item.ResourcefulCrops.pouch=%s Seed Pouch +item.ResourcefulCrops.dust.name=Gaianite Essence +item.ResourcefulCrops.dust.mundane.name=Mundane Gaianite Essence +item.ResourcefulCrops.dust.magical.name=Magical Gaianite Essence +item.ResourcefulCrops.dust.infused.name=Infused Gaianite Essence +item.ResourcefulCrops.dust.arcane.name=Arcane Gaianite Essence +item.ResourcefulCrops.stone.mundane.name=Mundane Stone of Creation +item.ResourcefulCrops.stone.magical.name=Magical Stone of Creation +item.ResourcefulCrops.stone.infused.name=Infused Stone of Creation +item.ResourcefulCrops.stone.arcane.name=Arcane Stone of Creation +item.ResourcefulCrops.stone.true.name=True Stone of Creation + +# Blocks +tile.ResourcefulCrops.ore.name=Gaianite Ore +tile.ResourcefulCrops.ore.nether.name=Nether Gaianite Ore + +# Info +info.ResourcefulCrops.dead=Dead +info.ResourcefulCrops.broken=Broken +info.ResourcefulCrops.torn=Torn +info.ResourcefulCrops.tier=Tier: %d +info.ResourcefulCrops.warn=Warning: Invalid entry + +# Waila +waila.config.render.fancy=Fancy Render + +# Config +config.ResourcefulCrops.title=ResourcefulCrops Configuration +config.ResourcefulCrops.console.refresh=Refreshing configuration file. \ No newline at end of file diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_0.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f37db0293f3d5f4bea659dbea22760fc5230622b GIT binary patch literal 18642 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 UW*>$BISv50I4ra;vEC2vG2M(FMZk;Dr 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 CY?ajj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_1_fast.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_1_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..c2cce3e90e2c2c39e8b62910f8e1b9c45373c469 GIT binary patch literal 17855 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 bg9Uo6BUc*D(;$i-cDJ)yYFTKpZp;4wJ!Z@E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_2_fast.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_2_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..aff963ecebad6a3e50e19fbfbac67956c3afbd05 GIT binary patch literal 17985 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 Z_&YY{Y-3w=EB_>}m6@GszKO@4{{tUo+x!3k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_3.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_3.png new file mode 100644 index 0000000000000000000000000000000000000000..deefb8311f7fa6db816299b898617fe05169256f GIT binary patch literal 18954 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 gD9X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_3_fast.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_3_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..577733085ea902c8d2c836f94f5ff7b1258f6bbf GIT binary patch literal 18060 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_4.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_4.png new file mode 100644 index 0000000000000000000000000000000000000000..e398a5499f584fb05de0b75da021ca4ddd1bb584 GIT binary patch literal 19068 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_4_fast.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_4_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..19a2ce6b7f7149f9c7c1e6f95a5a11477ec2f917 GIT binary patch literal 18168 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 G?*1Q2sxhhn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_5.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d528c14eabd94a2224b66057004ad326dcb2868c GIT binary patch literal 19153 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 V_-DCSJnugPSedOc%`@2=_8(~8TD1TG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_5_fast.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_5_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..949657557f2c9ddcb652914dbe471bd20c1adec7 GIT binary patch literal 18236 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 a4D9{1VgWh4BYpfPWJ^<9a-qrQUH=0lzgC0* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_6.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_6.png new file mode 100644 index 0000000000000000000000000000000000000000..b48b9717bbe87ad40ce4169e9bc12baf25d8548b GIT binary patch literal 19250 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 S`H}Ol2P{l%jPs2=_WlR*N0O=l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_6_fast.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_6_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..6df0f3c8821ce25283bd1127010ead49078c8426 GIT binary patch literal 18333 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_7_fast.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_base_7_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..f91c2dd003b30c4a58e6fd73ed198e5443d989a1 GIT binary patch literal 18342 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

-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 X7HfltsD1bB?ao$acBaK9?)(1-lTm<1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_0.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6efb33bb1aa5eddf1ee4ea103c8435b76d4ec9df GIT binary patch literal 18616 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_1.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bf5c81dc23091ba0ee1ba593393c0b2ec854deb8 GIT binary patch literal 18611 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

-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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_2.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_2.png new file mode 100644 index 0000000000000000000000000000000000000000..37aed20b35009bf6cb031f7a4f88c4b4edb7625c GIT binary patch literal 18616 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_4.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_4.png new file mode 100644 index 0000000000000000000000000000000000000000..f50da79a1171a7699fa19081672115dbb985f804 GIT binary patch literal 18613 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_6.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_6.png new file mode 100644 index 0000000000000000000000000000000000000000..833e013c7d02a4908360d36f459bd24b504bd700 GIT binary patch literal 18613 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_7.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/crop_overlay_7.png new file mode 100644 index 0000000000000000000000000000000000000000..f12cdd8b3a5ff15348de6c3fa1ec82b73da1773f GIT binary patch literal 18623 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 Rdja$#gQu&X%Q~loCIFQ%j;a6v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/blocks/oreGaianite_nether.png b/src/main/resources/assets/resourcefulcrops/textures/blocks/oreGaianite_nether.png new file mode 100644 index 0000000000000000000000000000000000000000..61b70c1b91ee435e8ffe41e4c07a338c86f3f0c6 GIT binary patch literal 850 zcmV-Y1FigtP)oI%|hoR4IhoY@5 zx%;@c2df(!@OohZeyyy)G3`FQTU&!4J39caX0ucTA1IhqEN5?zjYU&Z5~jt+<4|=q zo~N@KW7TSLys;5sz-GhKSy`B-)8U2UVth%|zz-N`Zx_qKc9RKDBqyUKBSYxF?die0 zdOdmy3lY9QyD8Pi>nkJy@9#G^3yw#UK5A&d35NscIy=#pnTaoYoH#_f@Ez2}#Yu2q zS(!MlmX;y}K&qS5)1}&{;bEmU@=u+!No51IbuuLdf%_V*t5bBCR354c7?&uam->}E z!ex5Q@osuo!v2E~oAdH;*6EZsxYtuex1*#4b19J7Ot@SkB=0MU`9snLn7S&~7zx9F zzI4rvGaYtO{7rYaqI`r=erhVl6Mb&$>k~f$e-BsVs&^>CMW$vn%Fw8^52Bt1OcGL? z%to`ixe2+1tv~Bi30R#l`3O(T7u zD(sBMBbMjDOmWM-y-}fA3s7fV0?5IZ1H7b-OrHNg{r-dmNv!&04n7PH;z(^RcG5_{ z9~g+T;0nwndY)8zW=3ppR8?UCGw3QRlB!u0yyW#NGY|o{#sahDpXnky)zX5aH8q%T zFbLzA3X=&KUv_ulK`;oO;1O63@4{iNmSp-3u7Uzcu$y7})e4+BTMAD@A&AjvK&R8e cn9BwK06Xok?VhIJMF0Q*07*qoM6N<$f^=|rP5=M^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/items/pouch_base.png b/src/main/resources/assets/resourcefulcrops/textures/items/pouch_base.png new file mode 100644 index 0000000000000000000000000000000000000000..e95cee7fbb07334898e1bebbaf378b8f6c4210b0 GIT binary patch literal 528 zcmV+r0`L8aP)WFU8GbZ8()Nlj2>E@cM*00DGKL_t(I%dL~ms=_c3 zM!!kZTDvwv`Q*NXAh;+L38EW+P!VdH%-x0FtFFAW4EYW-a}r`^d{Y8n z*8c-$vl$mf;pZxff=8p#$2sNS18XgW5SY*BT-PK#IF6BJ8MW`yJB`cbl24}- zthG=|VX;{Fkk*>pkQcysJmy}nhrwU~Aq0-cBaAWF?RMC1w*&yp%tS;lfXQUS!{HD~ zl0Zs{FbrXgfwdOK7_8T8XsxNeL=VWajHlBnq9{U=B(TlIpSzk`n!@;qlLCE_>+01pU)0A*RyU*+`ecm4sj)XNeG S$iGGa0000qCOhL;+K1rrcvXJ+3!Y!^$n(283Ml+YR?%+B2H4(!e>J5zQ` zG&a0^G+-={016rqjiR6ld>~-35DZa}4+c$0e7^}1qJRQ1cxQLJJH6fBG>Y-d-DDr< z{_i)vE-vrbV%$C&Q{ z)UKDuQ_;AyYl&b!@SuVW_d;CL6y@htCTc)#Fs2^>e~U$$Tc z{1r&aQDISNZay8fDs3^tND3^QPN(f@r(H|6u)N>zXE_J!a4>KNqqnJsm|;|XN-juu zoDk5Zl#(>{9RttkoAtbt3JQfl>v5-n~{k4UD{=e2{3(ubR=0-~X%8Z|8* z%vD)KH$u9)I$Krrw55tFYiWIYfJI%3`(2C%LZShJupZqE=V3U1qr)kgXf%5i=lcJF22RR?;PnE zP;u>*3zePKcMx5R8fh^Fs#;)$^r!Q4QG2?f;RCGsUl3RRgN@L|HUDlK`qx$ebQ?;X zQ2*aH6suT@iE0awgKT#JcMtS$=W_emv$MJngx;MPF#nv)E`}8)X1j+Eu)W5LnRD}- z%x;XgX6Jhy9DK37`I&dM%BX8I-qk9ju0_u!s$v8k`E1Cr#moE$%^mNH;msZhdfaZO zJHVpDs7Hg60r94g0?%RHJWqH}-Uk&*IyU#^Xc6*`xvjF?mSuY|Hwth1;Qc0BxZ&*8 zo`qBFZvH5)=x#uh&zW+x%hVHtoehg?%Q~N_s+}e6T6^z$R%E$^E4X!+zr=YBoAtYc$)^OOzWdj_4_eaipUgh({*7J9&goY#Ojvk(#s|~5pBG#^F(UTq#4*DT{uQ`gGw#TG*K4$Kk3RU~x7YPeZ~P%| zTRuYFlK%5>XI0nMBDm-@B8{pWs%y#M zx<^KyK6Gnq`JTNOhF#h|^OehOSLfT8)z!`#T_ul-bzE7!;ioTMUG&25ZZ6#NV9l9h pqp7h2r&q;V=N`WP^i?Ny>RRW5mtH@3-h9TkuBJY8aL$T#e*?}|xbgr1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/items/pouch_overlay.png b/src/main/resources/assets/resourcefulcrops/textures/items/pouch_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7f5b06a42671b8df00b7b2cff97c42609c1914 GIT binary patch literal 15176 zcmeI3U5pb|6vqcJh$YA-7$wH&Fi3)i>3p=aZO68-Y{6ZmxLHcrO)xT@xzinJXUfc! zc9&>2i$UEG9*6-Y#1Q;QG)h#04{9P21s{m`U>1c3O)&90nh;IQ#^9ZP&fa!!Hj44( zHtEN?=brzW`@84d&dWSIu;t+;fx80~MJ?&?OAW&BF7Lf)A^g1W`V9qs-B#=yb|`A` zGVeW)I(B?HMa6zLGDGfAdb6xrg`lEYSrDugif}eX#n)Dfin<%PbQa_cGr|1&{)Y^0 zXbEP!l;+dLUNB@5;jF+hSs;{e1Y$h_DIy*>_t0+ZI2=ZK~AWdz?6iar#dTE-< zfjlSx({*5+&@rw!V!4(xV$G7W>7F$)+>>;=nY-il7786xJMMlEjwdb`DCri z1{w(I-rj0e(W|!`re>9$2jUzW(%SEq8b~QFNWyxQSiYO(V;M0dOJO-IvU~(qrB9?b z6VXUpnxT)*&=7=-5SBxN>`AsXd^1rE*gu-$Dsxit&-LkOs;pafL2;8tLCFEGXy)Qv zYtT2dSyghcmA7noSs)pTbDf5LQPoP5`%TAHOcnH}l5iks7@91JdPI+eRaVnAffb~1 zgpKNAgwxL8QL!E1^KI@@= zHyS#O5B0mz&{pI&({PhwJsUFYi}L4T@Fu~9=Yx0&E(8ePB)IT=5HG=n0KuCC7oHE|CAbhEc$475^Fh1> z7Xk!t5?pvbh?n3(fZ$Dn3(p7f5?lxnyh(83`5<0`3ju;R2`)Sz#7l4?K=3BPh3A8K z2`&T(-Xys2d=M|eg#f{u1Q(tU;w88cAb6AD!t+7A1Q!AXZxUR1K8Tm#LV(~+EUrN7 z5l&#j=Qhjm0nH~r0ORoCPFn37OjFd@DvBE4Pf>r~fZsn*REejkA9qre{5(b7WgUL} zlZ|lhRDY@`Q@Qf(;kN_(*L9_G(#a#tt+_oz)AO>w9GzY|_0bAu$4ktY_t@s-I{w7A z$veKXUl@Ief8^pp>-@Q+*Y};hwrlvvstJ1h%$=Xb-uNl-=I>9RUw&?I(|eoWTC@1j zweha`Q&*Or77m=5TJy@wS8sXj@`_8&Q_3@itDnEiUf6SR_2h}?PM$t;YFGZ)f$v5S zIJd7~^hN2f?j`5W=006@;`Il$;f0s3^XX-OJaHj<==YAB>dE<=Uc0=F5zqftm{>dg@z)DpTtK}O+L7J0Zr^&iLaKkmmei^BJ171IPnC$J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/items/seed_base.png b/src/main/resources/assets/resourcefulcrops/textures/items/seed_base.png new file mode 100644 index 0000000000000000000000000000000000000000..b98dc86b88992b169e1546c81e024ccc964c66b3 GIT binary patch literal 15295 zcmeI3U5MON6oBtis_mAFtOcbYhFKJaX7V%1%p}ZA+3s}R1!rBhE8V3^dz0LmO*@l} zNp@#;!5^#^^hK#JB7G2i_XormL5rm*BKExqK8jWFr$z9^dXvmg=5FS)umxXkU?y|! zx#ygFzjM!-yyVTL#itKX9-RaL9A22OF5~-y;pf18`1`TjcOkwVY|pRx033QK{7iuN zuRH>Pe$8H44OVN<=%(AsLd!K!w%cms*#MM|ciYgsfCA1y4cjSae*faD3};*A%xSeI z*4ndZ-Jaj}(5dak6?6N7sacuhmB~_9#|~O3fLyoLbbP&A&P0B7{5u>LGF&tzxKPf_ zgaNtL+7dVGdWciADsPIi#1*uxq^gC2e2kMtNfAUzkaE1F>58I@BGy@nuZnkI;{Aj>?S!TVcI0K2^7PsdLBeyYefJ-Z#) zuET|Xq2X=>EYPAP}9KXj7Qxv+eEl62WNHem`flYhEYeq}6OaV1f3ps(0 z?W9z@_PQIm{<=FRHi(_N-c~C$v>%+@#0YvwQ!V|Ktu_*tk?(GJCOWx^ zw=$i!`@pUblQZHe)Qnv_>e^$>LQQNI9fdeUCA?RC)FEsw9vm!+a0Dp(+eeB|MM3B=NGkBIb0ZpoJ-St{9sMsyoKtkJTl!W16V&>pf>9cOr_3*M# zC07#ChEuJouDKB&>lw#HK2C<8ND@v}RJbQ#V|28yXxf#yZCI{pTlz4lWhxpfYB|0j z$|BALQuv}`D!iszdDTLqBG-#0AuL|(Vz{o*Z!|g@F}WSudc$K-tLY1lA3(gFg=z&4 zWNo~%LZNOJifWNpHQC@5P090y0Si1-CB=eLF_$yU=xmId4_DT6-H(o4r*B-$7Zp`T zc;ku&m=o^B!h1o`sGDZq;t|q{e6Fsj zyrvb3d|nidx+ocnk<0f(q`27;YTgd>zD1-V%*`qE;^^ow?@{AzL(fNHTPbJyePz(8 z@zlXpirSM7&9G%x%&_W_RT4%uEO)E%rKUM!HY063i&7%%;7EMEG!XZ)w;&gW=l^{aJfC6>bfTpd?2K2b2L9;qbk7#l{8=dXs<*xZQb7i1A%f)sxD zOp|KTbd7GBRFkGd%jXIv+yIa1lW0BEv=J zLueT;0tj7XxafQcEyG0sp^FR`oe!a9xCkJ0k>R5AA+!t^0fa6xTy#E!mf<3R&_#xe z&WF%4Tm%rh$Z*m55L$+d074fTE;=7V%Wx4u=pw^K=R;^2E&>Q$WVq;j2ra`!0HKRi zT$95$Q;~yTNA2MEPA}d6>FfBNRnDAWt^u(9H~_C+1mK^$`2Gt38zKO=&f(Wx-vi)b z_ww26b9nCNLUm@Pd-KP4XQr-l2lj0}dgHra|N8ijp`SlgzVk%x`6Ky>Z{9ibiu}O7 z;{01y@aI9mfw$+bodE#V4}uS-&h5Vpum1M!A5-Gweonsad_H~c?8F<}-#31k64zds zJ9_JU=M&+^^_Q1_>P#Q|`{zq9UAg%0*D6^2%)9vIhi7i$6@Z14i`9=#oO|s*3Du6} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/items/shard_base.png b/src/main/resources/assets/resourcefulcrops/textures/items/shard_base.png new file mode 100644 index 0000000000000000000000000000000000000000..18e9ed8b4b96bf34c325f351d1d8096a9bb8aec9 GIT binary patch literal 15092 zcmeI3U5MON6oBulmAa*()KU?|blQS~nfy%VFU(B4&b02Lvt75V-KA1{C%H2lI+LVH zrZc;O)QX@FDz-26=RxsBDRiZZ6@T$TeXt;lpjZ$EpA@AJz9@aDH_7~D@622lTJhxu zW|DKyJ?Gqf_necw8kB~Eby!1YkydXalsVt zXg)UK2ju3ih9 zbM&e@TiVwNhoyXM(erFo5L&HPyp@PsPEC-q*{mSSf-LiR2JbGJ9&GcbyCZbc^;1Hw z<`}kTSSIKDg%zvm7P(f_ z(a_%G_*QldyL->5_BUsZCtovi?Wk>xF!ME`S&$0h4(0H@sznDu&vNE0t6m7RY^IBl zD;9&S;_f|Yn7Y++@5>3KNq@il-cSj8sNm-#FUh=^nUh6TR#aKU*ElO9PQsalkFup3 z)g{u0lvWcdRY^yEL}rpcaQ*1egX{7Vog49^YiiYU8qg~k4Ol~hZPs!^e=st$msM)f zs#^|T7Ahoi!m#0pRgh`wl<9iV)X-F^fCu7+p{t2(H7V(0g0G}AX+Bw1QaqHk44;*C zl#!H5B~y_Ch~;wBe86?d(wcs?VAo+|(Jc+T?=PzYrA$)Pl6<#cNqH zt>gWx%5tR}DB^4&(0<3jeGk?nbNqYJaWFBVOOldG@Olc#yn+;&uVfXGhe)pI8Qco1 z5OzZhaWfEV(r|IME=95!=W@{54xnReN4tu;5p*aUIxh0-FCXg`V6Ub1I+kw})UgUR zzqb`MzdVqh6V{COm({cEm>GlHxjqD;|A_hM7_CKQ(#k7z70ep##I>qk3p!|`hBIV6 zl^=RtYeu@y3I4O7Zu|!u;lktBwhim6s%zK=vP1oU+tANqZ4sI^q!)y40(S@2w{zis zuC1(YwGLKd&VM+mxQcN`!Jv9@n;IDFM-J!D`_)))2J_Rhhz~*X|2w8pHEFs)H;t-E z)4t`Srr{OjPBdaTV&y+U!}fjvzwDtxDw#|qa{@U`TFe-2RG%*yxDUI2Kao-$8&WaU zaAA~TMA0z}w<_{l7Sv!kieLKh`=-!);T$N>UKhKb7yUcBo?Z!GEC>OFE;3wnK7^Lx zB7o3EhKtUJ&@x;E5W2{4(fJTshKm3~7a1-(A41D;5kTl7!$s#qXc;a72wh~j=zIt* z!$kn0iwqZ?520na2q1Kk;iB^)vIv+yIa1lW0BEv=JLueT;0tj7XxafQcEyG0sp^FR`oe!a9xCkJ0k>R5A zA+!t^0fa6xTy#E!mf<3R&_#xe&WF%4Tm%rh$Z*m55L$+d074h3xW@aRa3T|bx7orU zXdan=_h)b`xH^Xu1=Pi+Nnys~=n@5~tZ=*k^` zo`37i_G7J6kMHE)es*>Gxys5-?|rCl0j;O^JoNIoSDrX=>DOB?T(EDryt-}T`$O_Y z)P85rlV^XCCz|IEAA0P&&&D>Kee;8rl^b_odEp1JFm~>zt%qNF5w8YJ?VT>2d*H~) Fe*wn;Tr&Uw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/resourcefulcrops/textures/items/stone_base.png b/src/main/resources/assets/resourcefulcrops/textures/items/stone_base.png new file mode 100644 index 0000000000000000000000000000000000000000..859151b3fb223181a1bc5d8b48393ea60f82d504 GIT binary patch literal 18284 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 Tl>c%3re#Z0Ta$d_Eqnh5S=ngg literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 0000000..7a1cd5d --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,15 @@ +[ + { + "modid": "ResourcefulCrops", + "name": "ResourcefulCrops", + "description": "Simply JSON based resource crops.", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "http://tehnut.info/", + "updateUrl": "http://tehnut.info/jenkins/", + "authorList": [ "TehNut" ], + "credits": "Rhodox, BBoldt, and Ganzu for textures", + "logoFile": "", + "screenshots": [ ] + } +]