diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..973b917 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +/bin +/out +/run +*.classpath +*.project +.settings/ +CREDITS-fml.txt +LICENSE-fml.txt +MinecraftForge-Credits.txt +MinecraftForge-License.txt +build/ +eclipse/ +forge-1.6.4-9.11.1.964-changelog.txt +.gradle/ +output/ +.cache +*.iml +*.ipr +*.iws +*.idea/ +logs/ +html/downloads/ +downloads/ +*.xml +VoltzEngine.txt +APP-AuthTest/ +CompiledWith.txt +banned-ips.json +banned-players.json +ops.json +whitelist.json +libs/CodeChickenCore-1.7.10-1.0.7.47-dev.jar +libs/CodeChickenLib-1.7.10-1.1.3.140-dev.jar +libs/NotEnoughItems-1.7.10-1.0.5.118-dev.jar +libs/Botania r1.7-229-deobf.jar +libs/industrialcraft-2-2.2.817-experimental-api.jar +libs/industrialcraft-2-2.2.817-experimental-dev.jar diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..017cb3e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "BuiltBrokenScripts"] + path = BuiltBrokenScripts + url = https://github.com/BuiltBrokenModding/BuiltBrokenScripts diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..d72a14f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,25 @@ +language: java +before_install: + - git submodule update --init --recursive + - chmod a+x gradlew +cache: + directories: + - $HOME/.gradle + - .gradle +sudo: false +notifications: + irc: + channels: + - "irc.esper.net#BBM-bots" + skip_join: true + template: + - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} " + - "Change view : %{compare_url}" + - "Build details : %{build_url} : duration : %{duration}" +install: true +script: + - ./gradlew build javadoc coveralls jacocoTestReport publish -PbambooshortPlanName=VoltzEngine -Pdmodcurse=61545 -Plocal=true -S -i --refresh-dependencies +jdk: + - oraclejdk7 +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/AI-Improvements.txt b/AI-Improvements.txt new file mode 100644 index 0000000..ff30087 --- /dev/null +++ b/AI-Improvements.txt @@ -0,0 +1 @@ +1.7.10-0.0.3b20160406094043 \ No newline at end of file diff --git a/AIImprovements.txt b/AIImprovements.txt new file mode 100644 index 0000000..28eb753 --- /dev/null +++ b/AIImprovements.txt @@ -0,0 +1 @@ +1.7.10-0.0.3b20160406094040 \ No newline at end of file diff --git a/BuiltBrokenScripts b/BuiltBrokenScripts new file mode 160000 index 0000000..e87651e --- /dev/null +++ b/BuiltBrokenScripts @@ -0,0 +1 @@ +Subproject commit e87651ec78fe330a681ee1c022199b39daf15174 diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..f667e85 --- /dev/null +++ b/build.gradle @@ -0,0 +1,130 @@ +buildscript { + repositories { + mavenCentral() + jcenter() + maven { + name = "forge" + url = "http://files.minecraftforge.net/maven" + } + maven { + name = "sonatype" + url = "https://oss.sonatype.org/content/repositories/snapshots/" + } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + } +} + +plugins { + id 'com.matthewprenger.cursegradle' version '1.0.1' + id 'net.saliman.cobertura' version '2.2.5' + id 'com.github.kt3k.coveralls' version '2.0.1' +} + +apply from: 'https://raw.githubusercontent.com/BuiltBrokenModding/BuiltBrokenScripts/buildScripts/index/index.gradle' +apply plugin: 'forge' +apply plugin: 'curseforge' +apply plugin: 'com.github.kt3k.coveralls' +apply plugin: 'jacoco' + +ext.buildProps = file "build.properties" + +println "Current Minecraft version = " + minecraft.apiVersion + +def currentJvm = org.gradle.internal.jvm.Jvm.current() +println "Current Java version = " + currentJvm + +buildProps.withReader { + def prop = new Properties() + prop.load(it) + ext.config = new ConfigSlurper().parse prop +} + +if (project.getProperty("bambooshortPlanName") == "BBM-Dev") { + group = "dev.builtbroken.woodenbucket" + archivesBaseName = "WoodenBucket" +} else { + group = "com.builtbroken.woodenbucket" + archivesBaseName = "WoodenBucket" +} + +println archivesBaseName + +version = "${project.minecraft.version}-${config.version.mod.major}.${config.version.mod.minor}.${config.version.mod.revis}b" + +// This is used to set the local version +if (project.hasProperty("bambooBuildNumber")) + version += project.bambooBuildNumber +else + version += getDate() + +println "version = "+ version + +minecraft { + replace "@MAJOR@", config.version.mod.major + replace "@MINOR@", config.version.mod.minor + replace "@REVIS@", config.version.mod.revis + + if (project.hasProperty("bambooBuildNumber")) { + replace "@BUILD@", project.bambooBuildNumber + } + else { + replace "@BUILD@", getDate() + } +} +processResources { + from(sourceSets.main.resources.srcDirs) { + //include '**/*.lang' + include '**/*.info' + include '**/*.properties' + + expand 'version': project.version, 'mcversion': project.minecraft.version + // replace version and MCVersion + } + + // copy everything else, thats not text + from(sourceSets.main.resources.srcDirs) { + exclude '**/*.info' + exclude '**/*.properties' + } +} + +archivesBaseName = "WoodenBucket" + +repositories { + maven { + name "BuiltBroken" + url "http://ci.builtbroken.com/maven/" + } +} + +jar { + manifest.mainAttributes( + "Built-By": System.getProperty('user.name'), + "Created-By": currentJvm, + "Implementation-Title": archivesBaseName, + "Implementation-Version": project.version, + "FMLAT": "AI_at.cfg", + ) +} + +dependencies +{ + testCompile 'junit:junit:4.11' +} + +def getDate() { + def date = new Date() + def formattedDate = date.format('yyyyMMddHHmmss') + return formattedDate +} + +jacocoTestReport { + reports { + xml.enabled = true // coveralls plugin depends on xml format report + html.enabled = true + } +} + +file("AI-Improvements.txt").text = version; diff --git a/build.properties b/build.properties new file mode 100644 index 0000000..b426fe6 --- /dev/null +++ b/build.properties @@ -0,0 +1,4 @@ +version.mod.major=0 +version.mod.minor=0 +version.mod.revis=3 + diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..66accd5 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +version_major=0 +version_minor=0 +version_revis=3 +archivebase=AIImprovements +groupid=aiimprovements +org=builtbroken \ 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 0000000..2c6137b Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..504eba0 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 06 09:40:47 EDT 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-bin.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..9d82f78 --- /dev/null +++ b/gradlew @@ -0,0 +1,160 @@ +#!/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 + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +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"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# 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..5f19212 --- /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 Windows 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..539181a --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'WoodenBucket' + diff --git a/src/main/java/com/builtbroken/woodenbucket/WoodenBucket.java b/src/main/java/com/builtbroken/woodenbucket/WoodenBucket.java new file mode 100644 index 0000000..aa75e68 --- /dev/null +++ b/src/main/java/com/builtbroken/woodenbucket/WoodenBucket.java @@ -0,0 +1,143 @@ +package com.builtbroken.woodenbucket; + +import com.builtbroken.woodenbucket.bucket.ItemWoodenBucket; +import com.builtbroken.woodenbucket.bucket.PamBucketRecipe; +import com.builtbroken.woodenbucket.fluid.BlockMilk; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Mod; +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.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.RecipeSorter; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.File; + +import static net.minecraftforge.oredict.RecipeSorter.Category.SHAPED; + +/** + * Created by Dark on 7/25/2015. + */ +@Mod(modid = WoodenBucket.DOMAIN, name = "Wooden Bucket", version = "@MAJOR@.@MINOR@.@REVIS@.@BUILD@") +public class WoodenBucket +{ + public static final String DOMAIN = "woodenbucket"; + public static final String PREFIX = DOMAIN + ":"; + + public static Logger LOGGER; + + public static Item itemBucket; + + public static Fluid fluid_milk; + + public static Configuration config; + + public static boolean PREVENT_HOT_FLUID_USAGE = true; + public static boolean DAMAGE_BUCKET_WITH_HOT_FLUID = true; + public static boolean BURN_ENTITY_WITH_HOT_FLUID = true; + public static boolean GENERATE_MILK_FLUID = true; + + + @Mod.EventHandler + public void preInit(FMLPreInitializationEvent event) + { + LOGGER = LogManager.getLogger("WoodenBucket"); + config = new Configuration(new File(event.getModConfigurationDirectory(), "bbm/Wooden_Bucket.cfg")); + config.load(); + PREVENT_HOT_FLUID_USAGE = config.getBoolean("PreventHotFluidUsage", "WoodenBucketUsage", PREVENT_HOT_FLUID_USAGE, "Enables settings that attempt to prevent players from wanting to use the bucket for moving hot fluids"); + DAMAGE_BUCKET_WITH_HOT_FLUID = config.getBoolean("DamageBucketWithHotFluid", "WoodenBucketUsage", DAMAGE_BUCKET_WITH_HOT_FLUID, "Will randomly destroy the bucket if it contains hot fluid, lava in other words"); + BURN_ENTITY_WITH_HOT_FLUID = config.getBoolean("BurnPlayerWithHotFluid", "WoodenBucketUsage", BURN_ENTITY_WITH_HOT_FLUID, "Will light the player on fire if the bucket contains a hot fluid, lava in other words"); + GENERATE_MILK_FLUID = config.getBoolean("EnableMilkFluidGeneration", Configuration.CATEGORY_GENERAL, GENERATE_MILK_FLUID, "Will generate a fluid for milk allowing for the bucket to be used for gathering milk from cows"); + + + itemBucket = new ItemWoodenBucket(); + GameRegistry.registerItem(itemBucket, "wbBucket", DOMAIN); + } + + @Mod.EventHandler + public void init(FMLInitializationEvent event) + { + + } + + @Mod.EventHandler + public void postInit(FMLPostInitializationEvent event) + { + if (GENERATE_MILK_FLUID && FluidRegistry.getFluid("milk") == null) + { + fluid_milk = new Fluid("milk"); + FluidRegistry.registerFluid(fluid_milk); + Block blockMilk = new BlockMilk(fluid_milk); + GameRegistry.registerBlock(blockMilk, "wbBlockMilk"); + } + + + //TODO add crafting recipes for milk bucket + // TODO add proper ore shaped recipes so modded sticks and other items can be used in the recipes + GameRegistry.addShapedRecipe(new ItemStack(itemBucket, 1, ItemWoodenBucket.BucketTypes.OAK.ordinal()), " s ", "wcw", " w ", 'w', new ItemStack(Blocks.planks, 1, 0), 's', Items.stick, 'c', new ItemStack(Items.dye, 1, 2)); + GameRegistry.addShapedRecipe(new ItemStack(itemBucket, 1, ItemWoodenBucket.BucketTypes.SPRUCE.ordinal()), " s ", "wcw", " w ", 'w', new ItemStack(Blocks.planks, 1, 1), 's', Items.stick, 'c', new ItemStack(Items.dye, 1, 2)); + GameRegistry.addShapedRecipe(new ItemStack(itemBucket, 1, ItemWoodenBucket.BucketTypes.BIRCH.ordinal()), " s ", "wcw", " w ", 'w', new ItemStack(Blocks.planks, 1, 2), 's', Items.stick, 'c', new ItemStack(Items.dye, 1, 2)); + GameRegistry.addShapedRecipe(new ItemStack(itemBucket, 1, ItemWoodenBucket.BucketTypes.JUNGLE.ordinal()), " s ", "wcw", " w ", 'w', new ItemStack(Blocks.planks, 1, 3), 's', Items.stick, 'c', new ItemStack(Items.dye, 1, 2)); + GameRegistry.addShapedRecipe(new ItemStack(itemBucket, 1, ItemWoodenBucket.BucketTypes.ACACIA.ordinal()), " s ", "wcw", " w ", 'w', new ItemStack(Blocks.planks, 1, 4), 's', Items.stick, 'c', new ItemStack(Items.dye, 1, 2)); + GameRegistry.addShapedRecipe(new ItemStack(itemBucket, 1, ItemWoodenBucket.BucketTypes.BIG_OAK.ordinal()), " s ", "wcw", " w ", 'w', new ItemStack(Blocks.planks, 1, 5), 's', Items.stick, 'c', new ItemStack(Items.dye, 1, 2)); + for (ItemStack itemstack : OreDictionary.getOres("planks")) + { + if (itemstack != null && itemstack.getItem() != Item.getItemFromBlock(Blocks.planks)) + { + GameRegistry.addShapedRecipe(new ItemStack(itemBucket, 1, ItemWoodenBucket.BucketTypes.OAK.ordinal()), " s ", "wcw", " w ", 'w', itemstack, 's', Items.stick, 'c', new ItemStack(Items.dye, 1, 2)); + } + } + + //TODO add pam's harvest craft support + if (Loader.isModLoaded("harvestcraft")) + { + if (config.getBoolean("EnableRegisteringMilkBucket", "PamHarvestCraftSupport", true, "Registers the milk bucket to the ore dictionary to be used in Pam's Harvest Craft recipes")) + { + RecipeSorter.register(PREFIX + "woodenBucketFreshMilk", PamBucketRecipe.class, SHAPED, "after:minecraft:shaped"); + if (FluidRegistry.getFluid("milk") != null) + { + Item itemFreshMilk = (Item) Item.itemRegistry.getObject("harvestcraft:freshmilkItem"); + if (itemFreshMilk == null) + LOGGER.error("Failed to find item harvestcraft:freshmilkItem"); + + FluidStack milkFluidStack = new FluidStack(FluidRegistry.getFluid("milk"), FluidContainerRegistry.BUCKET_VOLUME); + for (ItemWoodenBucket.BucketTypes type : ItemWoodenBucket.BucketTypes.values()) + { + ItemStack milkBucket = new ItemStack(itemBucket, 1, type.ordinal()); + ((ItemWoodenBucket) itemBucket).fill(milkBucket, milkFluidStack, true); + /** OreDictionary.registerOre("listAllmilk", milkBucket); */ + + GameRegistry.addRecipe(new PamBucketRecipe(milkBucket, new ItemStack(itemFreshMilk, 4, 0))); + } + } + } + } + + /** + if(config.getBoolean("listAllWater", "OreDictionary", true, "Lists all water buckets under the ore dictionary name listAllWater")) + { + FluidStack waterFluidStack = new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME); + for (ItemWoodenBucket.BucketTypes type : ItemWoodenBucket.BucketTypes.values()) + { + ItemStack waterBucket = new ItemStack(itemBucket, 1, type.ordinal()); + ((ItemWoodenBucket) itemBucket).fill(waterBucket, waterFluidStack, true); + OreDictionary.registerOre("listAllWater", waterBucket); + } + } + */ + config.save(); + } +} diff --git a/src/main/java/com/builtbroken/woodenbucket/bucket/ItemWoodenBucket.java b/src/main/java/com/builtbroken/woodenbucket/bucket/ItemWoodenBucket.java new file mode 100644 index 0000000..b45b96f --- /dev/null +++ b/src/main/java/com/builtbroken/woodenbucket/bucket/ItemWoodenBucket.java @@ -0,0 +1,802 @@ +package com.builtbroken.woodenbucket.bucket; + +import com.builtbroken.woodenbucket.WoodenBucket; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +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.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.passive.EntityCow; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.fluids.*; + +import java.util.HashMap; +import java.util.List; + +/** + * Improved version of the vanilla bucket that can accept any fluid type. This + * version uses a wooden texture for the bucket body. + * + * @author Dark + * @version 7/25/2015. + */ +public class ItemWoodenBucket extends Item implements IFluidContainerItem +{ + @SideOnly(Side.CLIENT) + public static IIcon fluidTextureWater; + + @SideOnly(Side.CLIENT) + public static IIcon fluidTextureWhite; + + @SideOnly(Side.CLIENT) + public static IIcon fluidTextureLava; + + @SideOnly(Side.CLIENT) + public static IIcon blankTexture; + + @SideOnly(Side.CLIENT) + public static IIcon acaciaTexture; + + @SideOnly(Side.CLIENT) + public static IIcon birchTexture; + + @SideOnly(Side.CLIENT) + public static IIcon jungleTexture; + + @SideOnly(Side.CLIENT) + public static IIcon spruceTexture; + + @SideOnly(Side.CLIENT) + public static IIcon charredTexture; + + @SideOnly(Side.CLIENT) + public static IIcon bigOakTexture; + + public static HashMap fluidToIconMap = new HashMap(); + + //TODO rename to fluid.molten + public static String[] supportedFluidTextures = new String[]{"milk", "blood", "slime.blue", "fuel", "aluminum.molten", "glue", "alubrass.molten", "alumite.molten", "angmallen.molten", "ardite.molten", "bronze.molten", "cobalt.molten", "copper.molten", "electrum.molten", "emerald.molten", "ender.molten", "enderium.molten", "glass.molten", "gold.molten", "invar.molten", "iron.molten", "lead.molten", "lumium.molten", "manyullyn.molten", "mithril.molten", "nickel.molten", "obsidian.molten", "pigiron.molten", "shiny.molten", "signalum.molten", "silver.molten", "steel.molten", "tin.molten", "oil", "redplasma"}; + + public ItemWoodenBucket() + { + this.maxStackSize = 1; + this.setUnlocalizedName(WoodenBucket.PREFIX + "WoodenBucket"); + this.setCreativeTab(CreativeTabs.tabMisc); + this.setHasSubtypes(true); + MinecraftForge.EVENT_BUS.register(this); + } + + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) + { + if (!isEmpty(stack)) + { + list.add(StatCollector.translateToLocal(getUnlocalizedName() + ".fluid.name") + ": " + getFluid(stack).getLocalizedName()); + list.add(StatCollector.translateToLocal(getUnlocalizedName() + ".fluid.amount.name") + ": " + getFluid(stack).amount + "mb"); + } + else if (player.capabilities.isCreativeMode) + { + list.add("\u00a7c" + StatCollector.translateToLocal(getUnlocalizedName() + ".creative.void")); + } + } + + @SubscribeEvent + public void onRightClickEvent(PlayerInteractEvent event) + { + if (!event.world.isRemote && event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK && event.entityPlayer.getCurrentEquippedItem() != null && event.entityPlayer.getCurrentEquippedItem().getItem() == this) + { + TileEntity tile = event.world.getTileEntity(event.x, event.y, event.z); + + if (tile instanceof IFluidHandler) + { + boolean isBucketEmpty = this.isEmpty(event.entityPlayer.getCurrentEquippedItem()); + ForgeDirection side = ForgeDirection.getOrientation(event.face); + if (isBucketEmpty) + { + FluidStack drainedFromTank = ((IFluidHandler) tile).drain(side, getCapacity(event.entityPlayer.getCurrentEquippedItem()), false); + if (drainedFromTank != null && drainedFromTank.getFluid() != null && ((IFluidHandler) tile).canDrain(side, drainedFromTank.getFluid())) + { + if (event.entityPlayer.capabilities.isCreativeMode) + { + ((IFluidHandler) tile).drain(side, FluidContainerRegistry.BUCKET_VOLUME, true); + } + else + { + ItemStack bucket = new ItemStack(this, 1, event.entityPlayer.getCurrentEquippedItem().getItemDamage()); + int filledIntoBucket = fill(bucket, drainedFromTank, true); + if (filledIntoBucket > 0) + { + ((IFluidHandler) tile).drain(side, filledIntoBucket, true); + event.entityPlayer.inventory.setInventorySlotContents(event.entityPlayer.inventory.currentItem, consumeBucket(event.entityPlayer.getCurrentEquippedItem(), event.entityPlayer, bucket)); + event.entityPlayer.inventoryContainer.detectAndSendChanges(); + } + } + } + } + else + { + FluidStack containedFluid = getFluid(event.entityPlayer.getCurrentEquippedItem()); + if (((IFluidHandler) tile).canFill(side, containedFluid.getFluid())) + { + int filled = ((IFluidHandler) tile).fill(side, containedFluid, true); + if (!event.entityPlayer.capabilities.isCreativeMode) + { + drain(event.entityPlayer.getCurrentEquippedItem(), filled, true); + containedFluid = getFluid(event.entityPlayer.getCurrentEquippedItem()); + if (containedFluid == null || containedFluid.amount == 0) + { + event.entityPlayer.inventory.setInventorySlotContents(event.entityPlayer.inventory.currentItem, consumeBucket(event.entityPlayer.getCurrentEquippedItem(), event.entityPlayer, new ItemStack(this, 1, event.entityPlayer.getCurrentEquippedItem().getItemDamage()))); + event.entityPlayer.inventoryContainer.detectAndSendChanges(); + } + } + } + } + if (event.isCancelable()) + { + event.setCanceled(true); + } + } + } + } + + @Override + public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player) + { + boolean isBucketEmpty = this.isEmpty(itemstack); + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, isBucketEmpty); + + if (movingobjectposition != null) + { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + TileEntity tile = world.getTileEntity(i, j, k); + + if (tile instanceof IFluidHandler) + { + return itemstack; + } + + + if (!world.canMineBlock(player, i, j, k)) + { + return itemstack; + } + + //Fill bucket code + if (isBucketEmpty) + { + if (player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, itemstack)) + { + return pickupFluid(player, itemstack, world, i, j, k); + } + } + else //Empty bucket code + { + Block block = world.getBlock(i, j, k); + Material material = block.getMaterial(); + + if (!material.isSolid() && block.isReplaceable(world, i, j, k) && player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, itemstack)) + { + return placeFluid(player, itemstack, world, i, j, k); + } + + //Offset position based on side hit + if (movingobjectposition.sideHit == 0) + { + --j; + } + + if (movingobjectposition.sideHit == 1) + { + ++j; + } + + if (movingobjectposition.sideHit == 2) + { + --k; + } + + if (movingobjectposition.sideHit == 3) + { + ++k; + } + + if (movingobjectposition.sideHit == 4) + { + --i; + } + + if (movingobjectposition.sideHit == 5) + { + ++i; + } + + if (player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, itemstack)) + { + return placeFluid(player, itemstack, world, i, j, k); + } + } + } + } + return itemstack; + + } + + protected ItemStack consumeBucket(ItemStack currentStack, EntityPlayer player, ItemStack newStack) + { + //Creative mode we don't care about items + if (player.capabilities.isCreativeMode) + { + return currentStack; + } + //If we only have one bucket consume and replace slot with new bucket + else if (--currentStack.stackSize <= 0) + { + return newStack; + } + //If we have more than one bucket try to add the new one to the player's inventory + else + { + if (!player.inventory.addItemStackToInventory(newStack)) + { + player.dropPlayerItemWithRandomChoice(newStack, false); + } + + return currentStack; + } + } + + public ItemStack pickupFluid(EntityPlayer player, ItemStack itemstack, World world, int i, int j, int k) + { + Block block = world.getBlock(i, j, k); + int l = world.getBlockMetadata(i, j, k); + + if (block == Blocks.water && l == 0) + { + if (world.setBlockToAir(i, j, k)) + { + ItemStack bucket = new ItemStack(this, 1, itemstack.getItemDamage()); + fill(bucket, new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME), true); + return this.consumeBucket(itemstack, player, bucket); + } + } + else if (block == Blocks.lava && l == 0) + { + if (world.setBlockToAir(i, j, k)) + { + ItemStack bucket = new ItemStack(this, 1, itemstack.getItemDamage()); + fill(bucket, new FluidStack(FluidRegistry.LAVA, FluidContainerRegistry.BUCKET_VOLUME), true); + return this.consumeBucket(itemstack, player, bucket); + } + } + else if (block instanceof IFluidBlock && ((IFluidBlock) block).canDrain(world, i, j, k)) + { + int meta = world.getBlockMetadata(i, j, k); + FluidStack drainedFluid = ((IFluidBlock) block).drain(world, i, j, k, false); + + //TODO allow partial fills + if (isValidFluidStack(drainedFluid)) + { + ItemStack bucket = new ItemStack(this, 1, itemstack.getItemDamage()); + drainedFluid = ((IFluidBlock) block).drain(world, i, j, k, true); + + if (isValidFluidStack(drainedFluid)) + { + fill(bucket, drainedFluid, true); + return this.consumeBucket(itemstack, player, bucket); + } + else if (world.getBlock(i, j, k) != block) + { + world.setBlock(i, j, k, block, meta, 3); + } + } + } + return itemstack; + } + + private boolean isValidFluidStack(FluidStack drainedFluid) + { + return drainedFluid != null && drainedFluid.getFluid() != null && drainedFluid.amount == FluidContainerRegistry.BUCKET_VOLUME; + } + + /** + * Attempts to place the liquid contained inside the bucket. + */ + public ItemStack placeFluid(EntityPlayer player, ItemStack itemstack, World world, int x, int y, int z) + { + Block block = world.getBlock(x, y, z); + //Material material = block.getMaterial(); + if (isFull(itemstack)) + { + if (world.isAirBlock(x, y, z) || block.isReplaceable(world, x, y, z)) + { + FluidStack stack = getFluid(itemstack); + if (stack != null && stack.getFluid() != null && stack.getFluid().canBePlacedInWorld() && stack.getFluid().getBlock() != null) + { + //TODO add support for oil and other fuel types to explode in the nether + if (world.provider.isHellWorld && stack.getFluid().getUnlocalizedName().contains("water")) + { + world.playSoundEffect((double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + + for (int l = 0; l < 8; ++l) + { + world.spawnParticle("largesmoke", (double) x + Math.random(), (double) y + Math.random(), (double) z + Math.random(), 0.0D, 0.0D, 0.0D); + } + return consumeBucket(itemstack, player, new ItemStack(this, 1, itemstack.getItemDamage())); + } + else + { + if (!world.isRemote) + { + world.func_147480_a(x, y, z, true); + } + if (stack.getFluid() == FluidRegistry.WATER) + { + world.setBlock(x, y, z, Blocks.flowing_water); + } + else if (stack.getFluid() == FluidRegistry.LAVA) + { + world.setBlock(x, y, z, Blocks.flowing_lava); + } + else + { + world.setBlock(x, y, z, stack.getFluid().getBlock()); + } + return consumeBucket(itemstack, player, new ItemStack(this, 1, itemstack.getItemDamage())); + } + } + } + } + else if (!world.isRemote) + { + player.addChatComponentMessage(new ChatComponentText(getUnlocalizedName() + ".volume.notEnoughForFullBlock")); + } + return itemstack; + } + + /** + * Helper method to check if the bucket is empty + * + * @param container - bucket + * @return true if it is empty + */ + public boolean isEmpty(ItemStack container) + { + return getFluid(container) == null; + } + + /** + * Helper method to check if the bucket is full + * + * @param container - bucket + * @return true if it is full + */ + public boolean isFull(ItemStack container) + { + FluidStack stack = getFluid(container); + if (stack != null) + { + return stack.amount == getCapacity(container); + } + return false; + } + + /* IFluidContainerItem */ + @Override + public FluidStack getFluid(ItemStack container) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid")) + { + return null; + } + return FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid")); + } + + @Override + public int getCapacity(ItemStack container) + { + return FluidContainerRegistry.BUCKET_VOLUME; + } + + @Override + public int fill(ItemStack container, FluidStack resource, boolean doFill) + { + if (resource != null) + { + if (!doFill) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid")) + { + return Math.min(getCapacity(container), resource.amount); + } + + FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid")); + + if (stack == null) + { + return Math.min(getCapacity(container), resource.amount); + } + + if (!stack.isFluidEqual(resource)) + { + return 0; + } + + return Math.min(getCapacity(container) - stack.amount, resource.amount); + } + + if (container.stackTagCompound == null) + { + container.stackTagCompound = new NBTTagCompound(); + } + + if (!container.stackTagCompound.hasKey("Fluid")) + { + NBTTagCompound fluidTag = resource.writeToNBT(new NBTTagCompound()); + + if (getCapacity(container) < resource.amount) + { + fluidTag.setInteger("Amount", getCapacity(container)); + container.stackTagCompound.setTag("Fluid", fluidTag); + return getCapacity(container); + } + + container.stackTagCompound.setTag("Fluid", fluidTag); + return resource.amount; + } + else + { + + NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag("Fluid"); + FluidStack stack = FluidStack.loadFluidStackFromNBT(fluidTag); + + if (!stack.isFluidEqual(resource)) + { + return 0; + } + + int filled = getCapacity(container) - stack.amount; + if (resource.amount < filled) + { + stack.amount += resource.amount; + filled = resource.amount; + } + else + { + stack.amount = getCapacity(container); + } + + container.stackTagCompound.setTag("Fluid", stack.writeToNBT(fluidTag)); + return filled; + } + } + return 0; + } + + @Override + public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid")) + { + return null; + } + + FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid")); + if (stack == null) + { + return null; + } + + int currentAmount = stack.amount; + stack.amount = Math.min(stack.amount, maxDrain); + if (doDrain) + { + if (currentAmount == stack.amount) + { + container.stackTagCompound.removeTag("Fluid"); + + if (container.stackTagCompound.hasNoTags()) + { + container.stackTagCompound = null; + } + return stack; + } + + NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag("Fluid"); + fluidTag.setInteger("Amount", currentAmount - stack.amount); + container.stackTagCompound.setTag("Fluid", fluidTag); + } + return stack; + } + + @Override + public int getItemStackLimit(ItemStack stack) + { + return isEmpty(stack) ? Items.bucket.getItemStackLimit() : 1; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister reg) + { + //Bucket textures + itemIcon = reg.registerIcon(WoodenBucket.PREFIX + "bucket.oak"); + acaciaTexture = reg.registerIcon(WoodenBucket.PREFIX + "bucket.acacia"); + birchTexture = reg.registerIcon(WoodenBucket.PREFIX + "bucket.birch"); + jungleTexture = reg.registerIcon(WoodenBucket.PREFIX + "bucket.jungle"); + spruceTexture = reg.registerIcon(WoodenBucket.PREFIX + "bucket.spruce"); + charredTexture = reg.registerIcon(WoodenBucket.PREFIX + "bucket.charred"); + bigOakTexture = reg.registerIcon(WoodenBucket.PREFIX + "bucket.big_oak"); + + //Fluid overlay defaults + fluidTextureWater = reg.registerIcon(WoodenBucket.PREFIX + "bucket.fluid"); + fluidTextureWhite = reg.registerIcon(WoodenBucket.PREFIX + "bucket.fluid2"); + fluidTextureLava = reg.registerIcon(WoodenBucket.PREFIX + "bucket.lava"); + //Fluid overlay blank + blankTexture = reg.registerIcon(WoodenBucket.PREFIX + "blank"); + + //Supported fluids + for (String string : supportedFluidTextures) + { + fluidToIconMap.put(string, reg.registerIcon(WoodenBucket.PREFIX + "bucket." + string)); + } + + //Register defaults + fluidToIconMap.put("water", fluidTextureWater); + fluidToIconMap.put("lava", fluidTextureLava); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(ItemStack stack, int pass) + { + if (pass == 1) + { + if (isEmpty(stack)) + { + return blankTexture; + } + else + { + Fluid fluid = getFluid(stack).getFluid(); + if (fluidToIconMap.containsKey(fluid.getName())) + { + return fluidToIconMap.get(getFluid(stack).getFluid().getName()); + } + else if (fluid.getColor() != 0xFFFFFF) + { + return fluidTextureWhite; + } + else if (getFluid(stack).getFluid().getTemperature() > 600) + { + return fluidTextureLava; + } + else + { + return fluidTextureWater; + } + } + } + return super.getIcon(stack, pass); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIconFromDamage(int meta) + { + if (meta > 0 && meta < BucketTypes.values().length) + { + switch (BucketTypes.values()[meta]) + { + case ACACIA: + return acaciaTexture; + case BIRCH: + return birchTexture; + case JUNGLE: + return jungleTexture; + case SPRUCE: + return spruceTexture; + case BIG_OAK: + return bigOakTexture; + case CHARRED: + return charredTexture; + } + } + return this.itemIcon; + } + + @Override + public String getUnlocalizedName(ItemStack stack) + { + int meta = stack.getItemDamage(); + if (meta > 0 && meta < BucketTypes.values().length) + { + switch (BucketTypes.values()[meta]) + { + case OAK: + return super.getUnlocalizedName() + ".oak"; + case ACACIA: + return super.getUnlocalizedName() + ".acacia"; + case BIRCH: + return super.getUnlocalizedName() + ".birch"; + case JUNGLE: + return super.getUnlocalizedName() + ".jungle"; + case SPRUCE: + return super.getUnlocalizedName() + ".spruce"; + case BIG_OAK: + return super.getUnlocalizedName() + ".big_oak"; + case CHARRED: + return super.getUnlocalizedName() + ".charred"; + } + } + return super.getUnlocalizedName(); + } + + @SideOnly(Side.CLIENT) + @Override + public boolean requiresMultipleRenderPasses() + { + return true; + } + + @SideOnly(Side.CLIENT) + @Override + public int getColorFromItemStack(ItemStack stack, int pass) + { + if (!isEmpty(stack) && pass == 1) + return getFluid(stack).getFluid().getColor(); + return 16777215; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean held) + { + FluidStack fluid = getFluid(stack); + if (world.getWorldTime() % 5 == 0) + { + if (WoodenBucket.PREVENT_HOT_FLUID_USAGE && fluid != null && fluid.getFluid() != null && fluid.getFluid().getTemperature(fluid) > 400) + { + //Default 26% chance to be caught on fire + if (WoodenBucket.BURN_ENTITY_WITH_HOT_FLUID && entity instanceof EntityLivingBase && world.rand.nextFloat() < ((float) fluid.getFluid().getTemperature(fluid) / 1500f)) + { + EntityLivingBase living = (EntityLivingBase) entity; + if (!living.isImmuneToFire()) + { + living.setFire(1 + world.rand.nextInt(15)); + } + //TODO implement direct damage based on armor, or leave that to ItHurtsToDie? + } + if (WoodenBucket.DAMAGE_BUCKET_WITH_HOT_FLUID && world.rand.nextFloat() < ((float) fluid.getFluid().getTemperature(fluid) / 1500f)) + { + //TODO play sound effect of items burning + stack.setItemDamage(BucketTypes.CHARRED.ordinal()); + } + } + } + } + + @Override + public boolean onEntityItemUpdate(EntityItem entityItem) + { + FluidStack fluid = getFluid(entityItem.getEntityItem()); + if (entityItem.worldObj.getWorldTime() % 5 == 0) + { + if (WoodenBucket.PREVENT_HOT_FLUID_USAGE && fluid != null && fluid.getFluid() != null && fluid.getFluid().getTemperature(fluid) > 400) + { + if (WoodenBucket.DAMAGE_BUCKET_WITH_HOT_FLUID && entityItem.worldObj.rand.nextFloat() < ((float) fluid.getFluid().getTemperature(fluid) / 1500f)) + { + //TODO play sound effect of items burning + //TODO add slightly burnt, crisp, and ash version of the bucket to simulate each time it gets damaged + entityItem.getEntityItem().setItemDamage(BucketTypes.CHARRED.ordinal()); + } + //TODO chance to catch area on fire around it + } + } + return false; + } + + @Override + public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer player, EntityLivingBase entity) + { + if (entity instanceof EntityCow && isEmpty(stack)) + { + if (player.worldObj.isRemote) + return true; + + Fluid fluid = FluidRegistry.getFluid("milk"); + if (fluid != null) + { + ItemStack newBucket = new ItemStack(this, 1, stack.getItemDamage()); + fill(newBucket, new FluidStack(fluid, FluidContainerRegistry.BUCKET_VOLUME), true); + stack.stackSize--; + player.inventory.addItemStackToInventory(newBucket); + player.inventoryContainer.detectAndSendChanges(); + } + else + { + ((EntityCow) entity).playLivingSound(); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal(getUnlocalizedName() + ".error.fluid.milk.notRegistered"))); + } + return true; + } + return false; + } + + @SideOnly(Side.CLIENT) + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) + { + for (BucketTypes type : BucketTypes.values()) + { + list.add(new ItemStack(item, 1, type.ordinal())); + } + + ItemStack waterBucket = new ItemStack(item); + fill(waterBucket, new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME), true); + list.add(waterBucket); + + for (String string : supportedFluidTextures) + { + if (FluidRegistry.getFluid(string) != null) + { + ItemStack milkBucket = new ItemStack(item); + fill(milkBucket, new FluidStack(FluidRegistry.getFluid(string), FluidContainerRegistry.BUCKET_VOLUME), true); + list.add(milkBucket); + } + } + } + + @Override + public ItemStack getContainerItem(ItemStack itemstack) + { + if (isEmpty(itemstack)) + return null; + return new ItemStack(WoodenBucket.itemBucket, 1, itemstack.getItemDamage()); + } + + @Override + public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack) + { + return isEmpty(stack); + } + + @Override + public boolean hasContainerItem(ItemStack stack) + { + return getFluid(stack) != null; + } + + public enum BucketTypes + { + OAK, + ACACIA, + BIRCH, + JUNGLE, + SPRUCE, + BIG_OAK, + CHARRED + } +} diff --git a/src/main/java/com/builtbroken/woodenbucket/bucket/PamBucketRecipe.java b/src/main/java/com/builtbroken/woodenbucket/bucket/PamBucketRecipe.java new file mode 100644 index 0000000..1aa24f3 --- /dev/null +++ b/src/main/java/com/builtbroken/woodenbucket/bucket/PamBucketRecipe.java @@ -0,0 +1,36 @@ +package com.builtbroken.woodenbucket.bucket; + +import com.builtbroken.woodenbucket.WoodenBucket; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; + +/** + * Simple recipe to handle integration with Pam's Harvestcraft fresh milk buckets + * Created by Dark on 8/24/2015. + */ +public class PamBucketRecipe extends ShapedRecipes +{ + public PamBucketRecipe(ItemStack bucket, ItemStack pamBucket) + { + super(3, 3, new ItemStack[]{null, null, null, null, bucket, null, null, null, null}, pamBucket); + } + + @Override + public boolean matches(InventoryCrafting grid, World world) + { + if (grid.getSizeInventory() == 9) + { + ItemStack stack = grid.getStackInSlot(4); + if (stack != null && stack.getItem() instanceof ItemWoodenBucket) + { + ItemWoodenBucket item = (ItemWoodenBucket) grid.getStackInSlot(4).getItem(); + FluidStack fluidStack = item.getFluid(stack); + return fluidStack != null && fluidStack.getFluid() == WoodenBucket.fluid_milk; + } + } + return false; + } +} diff --git a/src/main/java/com/builtbroken/woodenbucket/fluid/BlockMilk.java b/src/main/java/com/builtbroken/woodenbucket/fluid/BlockMilk.java new file mode 100644 index 0000000..6d0daf7 --- /dev/null +++ b/src/main/java/com/builtbroken/woodenbucket/fluid/BlockMilk.java @@ -0,0 +1,33 @@ +package com.builtbroken.woodenbucket.fluid; + +import com.builtbroken.woodenbucket.WoodenBucket; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraftforge.fluids.BlockFluidClassic; +import net.minecraftforge.fluids.Fluid; + +/** + * Created by Dark on 8/8/2015. + */ +public class BlockMilk extends BlockFluidClassic +{ + IIcon blockFlowing; + + public BlockMilk(Fluid fluid) + { + super(fluid, Material.water); + setBlockName(WoodenBucket.PREFIX + "milk"); + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) + { + this.blockIcon = reg.registerIcon(WoodenBucket.PREFIX + "milk_still"); + this.blockFlowing = reg.registerIcon(WoodenBucket.PREFIX + "milk_flow"); + getFluid().setFlowingIcon(blockFlowing); + getFluid().setStillIcon(blockIcon); + } +} diff --git a/src/main/resources/assets/woodenbucket/lang/en_US.lang b/src/main/resources/assets/woodenbucket/lang/en_US.lang new file mode 100644 index 0000000..f8f35bf --- /dev/null +++ b/src/main/resources/assets/woodenbucket/lang/en_US.lang @@ -0,0 +1,15 @@ +item.woodenbucket:WoodenBucket.name=Wooden Bucket +item.woodenbucket:WoodenBucket.oak.name=Oak Bucket +item.woodenbucket:WoodenBucket.acacia.name=Acacia Bucket +item.woodenbucket:WoodenBucket.birch.name=Birch Bucket +item.woodenbucket:WoodenBucket.jungle.name=Jungle Bucket +item.woodenbucket:WoodenBucket.spruce.name=Spruce Bucket +item.woodenbucket:WoodenBucket.big_oak.name=Dark Oak Bucket +item.woodenbucket:WoodenBucket.charred.name=Charred Bucket +item.woodenbucket:WoodenBucket.fluid.name=Fluid +item.woodenbucket:WoodenBucket.fluid.amount.name=Amount +item.woodenbucket:WoodenBucket.error.fluid.milk.notRegistered=The cow seem to dislike the bucket +item.woodenbucket:WoodenBucket.volume.notEnoughForFullBlock=Need a 1000mb to place a full block of fluid +item.woodenbucket:WoodenBucket.creative.void=Voids Fluids in Creative Mode +fluid.milk=Milk +tile.woodenBucket:milk.name=Milk \ No newline at end of file diff --git a/src/main/resources/assets/woodenbucket/textures/blocks/milk_flow.png b/src/main/resources/assets/woodenbucket/textures/blocks/milk_flow.png new file mode 100644 index 0000000..bbe04df Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/blocks/milk_flow.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/blocks/milk_flow.png.mcmeta b/src/main/resources/assets/woodenbucket/textures/blocks/milk_flow.png.mcmeta new file mode 100644 index 0000000..4f0718a --- /dev/null +++ b/src/main/resources/assets/woodenbucket/textures/blocks/milk_flow.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": {} +} \ No newline at end of file diff --git a/src/main/resources/assets/woodenbucket/textures/blocks/milk_still.png b/src/main/resources/assets/woodenbucket/textures/blocks/milk_still.png new file mode 100644 index 0000000..0fa2fa3 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/blocks/milk_still.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/blocks/milk_still.png.mcmeta b/src/main/resources/assets/woodenbucket/textures/blocks/milk_still.png.mcmeta new file mode 100644 index 0000000..0645f48 --- /dev/null +++ b/src/main/resources/assets/woodenbucket/textures/blocks/milk_still.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/woodenbucket/textures/items/blank.png b/src/main/resources/assets/woodenbucket/textures/items/blank.png new file mode 100644 index 0000000..1018874 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/blank.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.acacia.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.acacia.png new file mode 100644 index 0000000..33b8e44 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.acacia.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.alubrass.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.alubrass.molten.png new file mode 100644 index 0000000..9f0fb24 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.alubrass.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.aluminum.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.aluminum.molten.png new file mode 100644 index 0000000..537bc08 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.aluminum.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.alumite.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.alumite.molten.png new file mode 100644 index 0000000..cd19c8a Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.alumite.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.angmallen.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.angmallen.molten.png new file mode 100644 index 0000000..9d47b15 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.angmallen.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.ardite.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.ardite.molten.png new file mode 100644 index 0000000..4caa67c Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.ardite.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.big_oak.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.big_oak.png new file mode 100644 index 0000000..d41138f Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.big_oak.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.birch.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.birch.png new file mode 100644 index 0000000..604338e Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.birch.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.blood.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.blood.png new file mode 100644 index 0000000..bda1eb0 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.blood.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.bronze.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.bronze.molten.png new file mode 100644 index 0000000..275e963 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.bronze.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.charred.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.charred.png new file mode 100644 index 0000000..9385b19 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.charred.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.cobalt.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.cobalt.molten.png new file mode 100644 index 0000000..5ca3772 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.cobalt.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.copper.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.copper.molten.png new file mode 100644 index 0000000..096bdd0 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.copper.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.electrum.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.electrum.molten.png new file mode 100644 index 0000000..ea2dcc5 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.electrum.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.emerald.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.emerald.molten.png new file mode 100644 index 0000000..8192e0c Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.emerald.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.ender.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.ender.molten.png new file mode 100644 index 0000000..4022967 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.ender.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.enderium.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.enderium.molten.png new file mode 100644 index 0000000..36b5033 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.enderium.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.fluid.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.fluid.png new file mode 100644 index 0000000..38f66f3 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.fluid.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.fluid2.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.fluid2.png new file mode 100644 index 0000000..abd4ed9 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.fluid2.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.fuel.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.fuel.png new file mode 100644 index 0000000..fbd17c6 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.fuel.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.glass.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.glass.molten.png new file mode 100644 index 0000000..e98cccc Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.glass.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.glue.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.glue.png new file mode 100644 index 0000000..0e7a23e Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.glue.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.gold.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.gold.molten.png new file mode 100644 index 0000000..54836be Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.gold.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.invar.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.invar.molten.png new file mode 100644 index 0000000..9766f9a Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.invar.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.iron.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.iron.molten.png new file mode 100644 index 0000000..87054c8 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.iron.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.jungle.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.jungle.png new file mode 100644 index 0000000..eaf23ea Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.jungle.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.lava.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.lava.png new file mode 100644 index 0000000..244b551 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.lava.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.lead.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.lead.molten.png new file mode 100644 index 0000000..fb03fb7 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.lead.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.lumium.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.lumium.molten.png new file mode 100644 index 0000000..3f4abb9 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.lumium.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.manyullyn.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.manyullyn.molten.png new file mode 100644 index 0000000..36dcc25 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.manyullyn.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.milk.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.milk.png new file mode 100644 index 0000000..eecb054 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.milk.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.mithril.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.mithril.molten.png new file mode 100644 index 0000000..37bc3a5 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.mithril.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.nickel.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.nickel.molten.png new file mode 100644 index 0000000..56355fe Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.nickel.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.oak.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.oak.png new file mode 100644 index 0000000..c2af85a Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.oak.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.obsidian.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.obsidian.molten.png new file mode 100644 index 0000000..c6ad491 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.obsidian.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.oil.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.oil.png new file mode 100644 index 0000000..e04577d Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.oil.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.pigiron.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.pigiron.molten.png new file mode 100644 index 0000000..e9e958c Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.pigiron.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.redplasma.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.redplasma.png new file mode 100644 index 0000000..f9d4c2d Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.redplasma.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.shiny.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.shiny.molten.png new file mode 100644 index 0000000..aeb1e35 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.shiny.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.signalum.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.signalum.molten.png new file mode 100644 index 0000000..cff0b5d Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.signalum.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.silver.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.silver.molten.png new file mode 100644 index 0000000..313358e Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.silver.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.slime.blue.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.slime.blue.png new file mode 100644 index 0000000..031fd6e Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.slime.blue.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.spruce.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.spruce.png new file mode 100644 index 0000000..2f3ee8c Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.spruce.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.steel.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.steel.molten.png new file mode 100644 index 0000000..c7c15bd Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.steel.molten.png differ diff --git a/src/main/resources/assets/woodenbucket/textures/items/bucket.tin.molten.png b/src/main/resources/assets/woodenbucket/textures/items/bucket.tin.molten.png new file mode 100644 index 0000000..4ff8c36 Binary files /dev/null and b/src/main/resources/assets/woodenbucket/textures/items/bucket.tin.molten.png differ diff --git a/temp-icon.png b/temp-icon.png new file mode 100644 index 0000000..b7c4d0b Binary files /dev/null and b/temp-icon.png differ diff --git a/woodenBucketIcon36x36.png b/woodenBucketIcon36x36.png new file mode 100644 index 0000000..4d849da Binary files /dev/null and b/woodenBucketIcon36x36.png differ