mirror of
https://github.com/GTNewHorizons/ForestryMC.git
synced 2026-11-14 17:14:46 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa03d733a3 | ||
|
|
8726d0ffab |
No files matched your search
@@ -3,9 +3,9 @@ name: Build and test
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ master, main, release/** ]
|
||||
branches: [ master, main ]
|
||||
push:
|
||||
branches: [ master, main, release/** ]
|
||||
branches: [ master, main ]
|
||||
|
||||
jobs:
|
||||
build-and-test:
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
name: Optimize images
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ master, main, release/** ]
|
||||
paths:
|
||||
- "**/*.png"
|
||||
|
||||
push:
|
||||
branches: [ master, main, release/** ]
|
||||
paths:
|
||||
- "**/*.png"
|
||||
|
||||
jobs:
|
||||
optimize-images:
|
||||
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/optimize-images.yml@master
|
||||
secrets: inherit
|
||||
@@ -30,4 +30,3 @@ src/main/resources/mixins.*.json
|
||||
*.bat
|
||||
*.DS_Store
|
||||
!gradlew.bat
|
||||
layout.json
|
||||
@@ -0,0 +1,29 @@
|
||||
How to submit a bug report to Forestry
|
||||
====================================
|
||||
Please make sure the bug has not already been reported by [searching the issues](https://github.com/ForestryMC/ForestryMC/issues?q=is%3Aissue).
|
||||
|
||||
If you can, see if the bug still happens with the latest unstable build.
|
||||
[The latest unstable builds are available here](http://jenkins.ic2.player.to/job/Forestry_Dev/)
|
||||
|
||||
For crashes, you must post a link to the full crash report.
|
||||
[gist.github.com](gist.github.com) or [pastebin.com](www.pastebin.com) are good places to upload them.
|
||||
Full crash reports are located in [the minecraft data folder](http://hopper.minecraft.net/help/finding-minecraft-data-folder/), in "crash-reports".
|
||||
|
||||
Thank you for reporting bugs!
|
||||
|
||||
How to contribute to Forestry
|
||||
====================================
|
||||
|
||||
### Contributor License Agreement
|
||||
|
||||
Before pull requests can be accepted, the contributor needs to sign a contributor license agreement. (Essentially giving a license for using his code and/or media and for re-licensing it, for details read the agreement linked below.)
|
||||
|
||||
### How do I sign?
|
||||
|
||||
To keep the hassle for everyone involved to a minimum, Forestry uses CLAHub to manage the agreements. To get started, <a href="https://www.clahub.com/agreements/ForestryMC/ForestryMC">sign the Contributor License Agreement</a>.
|
||||
|
||||
### Why is this needed?
|
||||
|
||||
Without CLAs it at some point becomes essentially impossible to change the license of a project which accepts contributions from third parties. Without an explicit agreement every contributor would still own the copyright to his code. So as long as it (or parts of it) remain in the code base, he would have to agree to every license change. If enough time has passed, there may be dozens, perhaps even hundreds of contributors involved and it will be very hard to track down each and every one of them and get them to agree on a new license.
|
||||
|
||||
This would make it impossible to change the license to a more permissive one at a later date, so the code would be locked into CC BY-NC-ND 3.0 until it passes into the public domain about a hundred years from now. This situation is to be avoided and that’s why you are being bothered with this CLA.
|
||||
+4
-6
@@ -1,13 +1,11 @@
|
||||
// Add your dependencies here
|
||||
|
||||
dependencies {
|
||||
api("com.github.GTNewHorizons:GTNHLib:0.9.54:dev")
|
||||
api('curse.maven:cofh-lib-220333:2388748')
|
||||
compileOnlyApi('com.github.GTNewHorizons:Angelica:2.1.19:api')
|
||||
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.8.107-GTNH:dev')
|
||||
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.7.1:api')
|
||||
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.57:api')
|
||||
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-alpha51:api')
|
||||
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.6.0-GTNH:dev')
|
||||
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.6.2:api')
|
||||
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.39:api')
|
||||
compileOnly('net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev')
|
||||
compileOnly('curse.maven:craftguide-75557:2459320')
|
||||
devOnlyNonPublishable('net.xonich.mc:NoHotbarNeeded:0.0.3:dev')
|
||||
}
|
||||
+8
-54
@@ -14,7 +14,7 @@ modId = Forestry
|
||||
modGroup = forestry
|
||||
|
||||
# Whether to use modGroup as the maven publishing group.
|
||||
# When false, com.github.GTNewHorizons is used.
|
||||
# Due to a history of using JitPack, the default is com.github.GTNewHorizons for all mods.
|
||||
useModGroupForPublishing = false
|
||||
|
||||
# Updates your build.gradle and settings.gradle automatically whenever an update is available.
|
||||
@@ -39,33 +39,9 @@ remoteMappings = https\://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/co
|
||||
# `./gradlew runClient --username=AnotherPlayer`, or configuring this command in your IDE.
|
||||
developmentEnvironmentUserName = Developer
|
||||
|
||||
# Enables modern Java syntax support. Valid values:
|
||||
# - false: No modern syntax, Java 8 only
|
||||
# - jabel: Jabel syntax-only support, compiles to J8 bytecode
|
||||
# - jvmDowngrader: Full modern Java via JVM Downgrader (syntax + stdlib APIs)
|
||||
# - modern: Native modern Java bytecode, no downgrading
|
||||
enableModernJavaSyntax = jabel
|
||||
|
||||
# If set, ignores the above setting and compiles with the given toolchain. This may cause unexpected issues,
|
||||
# and should *not* be used in most situations. -1 disables this.
|
||||
# forceToolchainVersion = -1
|
||||
|
||||
# Target JVM version for JVM Downgrader bytecode downgrading.
|
||||
# Only used when enableModernJavaSyntax = jvmDowngrader
|
||||
# downgradeTargetVersion = 8
|
||||
|
||||
# Comma-separated list of Java versions for multi-release jar support (JVM Downgrader only).
|
||||
# Classes will be available in META-INF/versions/N/ for each version N in this list.
|
||||
# Default: "21,25" (J25+ gets native classes, J21-24 gets partial downgrade, J8-20 gets full downgrade).
|
||||
# jvmDowngraderMultiReleaseVersions = 21,25
|
||||
|
||||
# Specifies how JVM Downgrader API stubs are provided. Options:
|
||||
# - shade: Shade minimized stubs into the jar
|
||||
# - gtnhlib: GTNHLib provides stubs at runtime (adds version constraint)
|
||||
# - external: Another dependency provides stubs (no constraint, no warning)
|
||||
# - (empty): Warning reminding you to configure stubs
|
||||
# Note: 'shade' option requires you to verify license compliance, see: https://github.com/unimined/JvmDowngrader/blob/main/LICENSE.md
|
||||
# jvmDowngraderStubsProvider =
|
||||
# Enables using modern Java syntax (up to version 17) via Jabel, while still targeting JVM 8.
|
||||
# See https://github.com/bsideup/jabel for details on how this works.
|
||||
enableModernJavaSyntax = true
|
||||
|
||||
# Enables injecting missing generics into the decompiled source code for a better coding experience.
|
||||
# Turns most publicly visible List, Map, etc. into proper List<E>, Map<K, V> types.
|
||||
@@ -104,25 +80,18 @@ apiPackage = api
|
||||
# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/
|
||||
# There can be multiple files in a space-separated list.
|
||||
# Example value: mymodid_at.cfg nei_at.cfg
|
||||
accessTransformersFile = forestry_at.cfg
|
||||
accessTransformersFile =
|
||||
|
||||
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
|
||||
usesMixins = false
|
||||
|
||||
# Set to a non-empty string to configure mixins in a separate source set under src/VALUE, instead of src/main.
|
||||
# This can speed up compile times thanks to not running the mixin annotation processor on all input sources.
|
||||
# Mixin classes will have access to "main" classes, but not the other way around.
|
||||
separateMixinSourceSet =
|
||||
|
||||
# Adds some debug arguments like verbose output and class export.
|
||||
usesMixinDebug = false
|
||||
|
||||
# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise.
|
||||
mixinPlugin =
|
||||
|
||||
# Specify the package that contains all of your Mixins. The package must exist or
|
||||
# the build will fail. If you have a package property defined in your mixins.<modid>.json,
|
||||
# it must match with this or the build will fail.
|
||||
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
|
||||
mixinsPackage =
|
||||
|
||||
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
|
||||
@@ -148,15 +117,9 @@ minimizeShadowedDependencies = true
|
||||
# If disabled, won't rename the shadowed classes.
|
||||
relocateShadowedDependencies = true
|
||||
|
||||
# Adds CurseMaven, Modrinth, and some more well-known 1.7.10 repositories.
|
||||
# Adds the GTNH maven, CurseMaven, Modrinth, and some more well-known 1.7.10 repositories.
|
||||
includeWellKnownRepositories = true
|
||||
|
||||
# A list of repositories to exclude from the includeWellKnownRepositories setting. Should be a space separated
|
||||
# list of strings, with the acceptable keys being(case does not matter):
|
||||
# cursemaven
|
||||
# modrinth
|
||||
excludeWellKnownRepositories =
|
||||
|
||||
# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven.
|
||||
# Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables.
|
||||
# If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle.
|
||||
@@ -177,7 +140,7 @@ modrinthProjectId =
|
||||
# type can be one of [project, version],
|
||||
# and the name is the Modrinth project or version slug/id of the other mod.
|
||||
# Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech
|
||||
# Note: UniMixins is automatically set as a required dependency if usesMixins = true.
|
||||
# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true
|
||||
modrinthRelations =
|
||||
|
||||
# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens.
|
||||
@@ -198,12 +161,6 @@ curseForgeRelations =
|
||||
# projects. New projects should not use this parameter.
|
||||
# customArchiveBaseName =
|
||||
|
||||
# Optional parameter to customize the default working directory used by the runClient* tasks. Relative to the project directory.
|
||||
# runClientWorkingDirectory = run/client
|
||||
|
||||
# Optional parameter to customize the default working directory used by the runServer* tasks. Relative to the project directory.
|
||||
# runServerWorkingDirectory = run/server
|
||||
|
||||
# Optional parameter to have the build automatically fail if an illegal version is used.
|
||||
# This can be useful if you e.g. only want to allow versions in the form of '1.1.xxx'.
|
||||
# The check is ONLY performed if the version is a git tag.
|
||||
@@ -233,6 +190,3 @@ curseForgeRelations =
|
||||
# This is meant to be set in $HOME/.gradle/gradle.properties.
|
||||
# ideaCheckSpotlessOnBuild = true
|
||||
|
||||
# Non-GTNH properties
|
||||
org.gradle.configuration-cache = true
|
||||
org.gradle.parallel = true
|
||||
@@ -1,12 +0,0 @@
|
||||
#This file is generated by updateDaemonJvm
|
||||
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
|
||||
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
|
||||
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
|
||||
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
|
||||
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/c2dd35c9d0aaf0ba6ad0791320f99dfc/redirect
|
||||
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/e5810bd7fd1f8a586644409d395a7e55/redirect
|
||||
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
|
||||
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
|
||||
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/7b3c4877c0749019e6805bb61e421497/redirect
|
||||
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/8e1d9ee5d0f13e442218f6884a306da1/redirect
|
||||
toolchainVersion=25
|
||||
Vendored
BIN
Binary file not shown.
+1
-1
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015 the original authors.
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -15,8 +15,6 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -57,7 +55,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
@@ -86,7 +84,7 @@ done
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
@@ -114,6 +112,7 @@ case "$( uname )" in #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
@@ -171,6 +170,7 @@ fi
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
@@ -203,14 +203,15 @@ fi
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
|
||||
Vendored
+2
-3
@@ -13,8 +13,6 @@
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@@ -70,10 +68,11 @@ goto fail
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// Add any additional repositiroes for your dependencies here
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
}
|
||||
+1
-1
@@ -17,7 +17,7 @@ pluginManagement {
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'com.gtnewhorizons.gtnhsettingsconvention' version '2.0.24'
|
||||
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.22'
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@ import net.minecraft.item.Item;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
import cpw.mods.fml.common.Loader;
|
||||
import cpw.mods.fml.common.Mod;
|
||||
import cpw.mods.fml.common.Mod.EventHandler;
|
||||
import cpw.mods.fml.common.ModAPIManager;
|
||||
@@ -57,8 +56,7 @@ import forestry.plugins.PluginManager;
|
||||
name = Constants.MOD,
|
||||
version = Constants.VERSION,
|
||||
guiFactory = "forestry.core.config.ForestryGuiConfigFactory",
|
||||
dependencies = "required-after:Forge@[10.13.4.1566,);" + "required-after:gtnhlib@[0.9.41,);"
|
||||
+ "after:Buildcraft|Core@[6.1.7,);"
|
||||
dependencies = "required-after:Forge@[10.13.4.1566,);" + "after:Buildcraft|Core@[6.1.7,);"
|
||||
+ "after:ExtrabiomesXL;"
|
||||
+ "after:BiomesOPlenty;"
|
||||
+ "after:IC2@[2.0.140,);"
|
||||
@@ -81,15 +79,11 @@ public class Forestry {
|
||||
|
||||
public static PacketHandler packetHandler;
|
||||
|
||||
public static boolean isDreamcraftLoaded;
|
||||
|
||||
@EventHandler
|
||||
public void preInit(FMLPreInitializationEvent event) {
|
||||
checkForCoFHLib();
|
||||
packetHandler = new PacketHandler();
|
||||
|
||||
isDreamcraftLoaded = Loader.isModLoaded("dreamcraft");
|
||||
|
||||
// Register event handler
|
||||
EventHandlerCore eventHandlerCore = new EventHandlerCore();
|
||||
MinecraftForge.EVENT_BUS.register(eventHandlerCore);
|
||||
|
||||
@@ -84,12 +84,7 @@ public enum EnumBeeChromosome implements IChromosomeType {
|
||||
*/
|
||||
EFFECT(IAlleleBeeEffect.class);
|
||||
|
||||
final Class<? extends IAllele> clss;
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final EnumBeeChromosome[] VALUES = values();
|
||||
Class<? extends IAllele> clss;
|
||||
|
||||
EnumBeeChromosome(Class<? extends IAllele> clss) {
|
||||
this.clss = clss;
|
||||
|
||||
@@ -17,12 +17,9 @@ public enum EnumBeeType implements ISpeciesType {
|
||||
LARVAE,
|
||||
NONE;
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final EnumBeeType[] VALUES = values();
|
||||
|
||||
private final String name;
|
||||
String name;
|
||||
|
||||
EnumBeeType() {
|
||||
this.name = this.toString().toLowerCase(Locale.ENGLISH);
|
||||
@@ -31,8 +28,4 @@ public enum EnumBeeType implements ISpeciesType {
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public static EnumBeeType fromOrdinal(int ordinal) {
|
||||
return VALUES[ordinal];
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package forestry.api.apiculture;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public interface IArmorApiaristMulti extends IArmorApiarist {
|
||||
|
||||
/**
|
||||
* Called to determine how many pieces an armor "counts for". For instance, if this returns 4, the single piece will
|
||||
* act as full protection.
|
||||
*
|
||||
* @param entity Entity being attacked
|
||||
* @param armor Armor item
|
||||
* @param cause Optional cause of attack, such as a bee effect identifier
|
||||
* @return Amount of effective protected slots
|
||||
*/
|
||||
default int getProtectionCount(EntityLivingBase entity, ItemStack armor, String cause) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -73,14 +73,9 @@ public enum EnumTreeChromosome implements IChromosomeType {
|
||||
/**
|
||||
* Determines if the tree can burn.
|
||||
*/
|
||||
FIREPROOF(IAlleleBoolean.class);
|
||||
FIREPROOF(IAlleleBoolean.class),;
|
||||
|
||||
final Class<? extends IAllele> clss;
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final EnumTreeChromosome[] VALUES = values();
|
||||
Class<? extends IAllele> clss;
|
||||
|
||||
EnumTreeChromosome(Class<? extends IAllele> clss) {
|
||||
this.clss = clss;
|
||||
|
||||
@@ -17,14 +17,9 @@ public enum EnumHumidity {
|
||||
NORMAL("Normal"),
|
||||
DAMP("Damp");
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final EnumHumidity[] VALUES = values();
|
||||
|
||||
public final String name;
|
||||
|
||||
EnumHumidity(String name) {
|
||||
private EnumHumidity(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,15 +27,10 @@ public enum EnumTemperature {
|
||||
HOT("Hot", "habitats/desert"),
|
||||
HELLISH("Hellish", "habitats/nether");
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final EnumTemperature[] VALUES = values();
|
||||
|
||||
public final String name;
|
||||
public final String iconIndex;
|
||||
|
||||
EnumTemperature(String name, String iconIndex) {
|
||||
private EnumTemperature(String name, String iconIndex) {
|
||||
this.name = name;
|
||||
this.iconIndex = iconIndex;
|
||||
}
|
||||
|
||||
@@ -12,15 +12,11 @@ public interface IClimateControlled {
|
||||
|
||||
/**
|
||||
* Change the temperature, but not lower than boundaryDown or higher than boundaryUp.
|
||||
*
|
||||
* When used in an alveary the change applies a 20x stronger effect
|
||||
*/
|
||||
void addTemperatureChange(float change, float boundaryDown, float boundaryUp);
|
||||
|
||||
/**
|
||||
* Change the humidity, but not lower than boundaryDown or higher than boundaryUp.
|
||||
*
|
||||
* When used in an alveary the change applies a 20x stronger effect
|
||||
*/
|
||||
void addHumidityChange(float change, float boundaryDown, float boundaryUp);
|
||||
}
|
||||
@@ -16,11 +16,6 @@ public enum FarmDirection {
|
||||
|
||||
private final ForgeDirection forgeDirection;
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final FarmDirection[] VALUES = values();
|
||||
|
||||
FarmDirection(ForgeDirection forgeDirection) {
|
||||
this.forgeDirection = forgeDirection;
|
||||
}
|
||||
@@ -30,16 +25,17 @@ public enum FarmDirection {
|
||||
}
|
||||
|
||||
public static FarmDirection getFarmDirection(ForgeDirection forgeDirection) {
|
||||
return switch (forgeDirection) {
|
||||
case NORTH -> NORTH;
|
||||
case EAST -> EAST;
|
||||
case SOUTH -> SOUTH;
|
||||
case WEST -> WEST;
|
||||
default -> null;
|
||||
};
|
||||
}
|
||||
|
||||
public static FarmDirection fromOrdinal(int ordinal) {
|
||||
return VALUES[ordinal];
|
||||
switch (forgeDirection) {
|
||||
case NORTH:
|
||||
return NORTH;
|
||||
case EAST:
|
||||
return EAST;
|
||||
case SOUTH:
|
||||
return SOUTH;
|
||||
case WEST:
|
||||
return WEST;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,37 +9,33 @@ import net.minecraft.item.ItemStack;
|
||||
|
||||
public class RainSubstrate {
|
||||
|
||||
public enum WeatherState {
|
||||
CLEAR,
|
||||
RAIN,
|
||||
STORM
|
||||
}
|
||||
|
||||
/**
|
||||
* Rain substrate capable of activating the rainmaker.
|
||||
*/
|
||||
public ItemStack item;
|
||||
/**
|
||||
* Duration of the weather event triggered by this substrate in Minecraft ticks.
|
||||
* Duration of the rain shower triggered by this substrate in Minecraft ticks.
|
||||
*/
|
||||
public int duration;
|
||||
/**
|
||||
* Speed of activation sequence triggered.
|
||||
*/
|
||||
public float speed;
|
||||
/**
|
||||
* The type of weather triggered.
|
||||
*/
|
||||
public WeatherState weather;
|
||||
|
||||
public RainSubstrate(ItemStack item, float speed, WeatherState weather) {
|
||||
this(item, 0, speed, weather);
|
||||
public boolean reverse;
|
||||
|
||||
public RainSubstrate(ItemStack item, int duration, float speed) {
|
||||
this(item, duration, speed, false);
|
||||
}
|
||||
|
||||
public RainSubstrate(ItemStack item, int duration, float speed, WeatherState weather) {
|
||||
public RainSubstrate(ItemStack item, float speed) {
|
||||
this(item, 0, speed, true);
|
||||
}
|
||||
|
||||
public RainSubstrate(ItemStack item, int duration, float speed, boolean reverse) {
|
||||
this.item = item;
|
||||
this.duration = duration;
|
||||
this.speed = speed;
|
||||
this.weather = weather;
|
||||
this.reverse = reverse;
|
||||
}
|
||||
}
|
||||
@@ -52,8 +52,4 @@ public interface IIndividual extends INBTTagable {
|
||||
IIndividual copy();
|
||||
|
||||
boolean isPureBred(IChromosomeType chromosomeType);
|
||||
|
||||
default void addLore(List<String> text) {}
|
||||
|
||||
default void addDiscoveredBy(List<String> text) {}
|
||||
}
|
||||
@@ -77,12 +77,7 @@ public enum EnumButterflyChromosome implements IChromosomeType {
|
||||
*/
|
||||
TERRITORY(IAlleleArea.class),;
|
||||
|
||||
final Class<? extends IAllele> clss;
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final EnumButterflyChromosome[] VALUES = values();
|
||||
Class<? extends IAllele> clss;
|
||||
|
||||
EnumButterflyChromosome(Class<? extends IAllele> clss) {
|
||||
this.clss = clss;
|
||||
|
||||
@@ -49,14 +49,6 @@ public interface IAlvearyComponent<T extends IMultiblockLogicAlveary> extends IM
|
||||
* @param alveary the climate controlled alveary
|
||||
*/
|
||||
void changeClimate(int tickCount, IClimateControlled alveary);
|
||||
|
||||
/**
|
||||
* Get the priority of this climatiser. Called when alveary is constructed.
|
||||
* {@link #changeClimate(int, IClimateControlled)} are run in descending priority.
|
||||
*/
|
||||
default int getPriority() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
package forestry.api.multiblock;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public interface IFarmFertilizerRegistry {
|
||||
|
||||
/**
|
||||
* Gets a list of all fertilizer stacks in the registry.
|
||||
*
|
||||
* @return The current fertilizer registry.
|
||||
*/
|
||||
Collection<ItemStack> getFertilizers();
|
||||
|
||||
/**
|
||||
* Adds a new fertilizer to the registry.
|
||||
*
|
||||
* @apiNote The stack size doesn't matter it always consumes 1.
|
||||
* @apiNote You can use OreDictionary.WILDCARD_VALUE to specific that any meta of the item will be ok.
|
||||
*
|
||||
* @param itemstack The item to add to the registry.
|
||||
*/
|
||||
void addFertilizer(ItemStack itemstack);
|
||||
|
||||
/**
|
||||
* Removes a fertilizer from the fretilizer registry.
|
||||
*
|
||||
* @param itemstack The item to remove from the registry.
|
||||
*/
|
||||
void removeFertilizer(ItemStack itemstack);
|
||||
|
||||
/**
|
||||
* Checks if an item is a usable multi-farm fertilizer.
|
||||
*
|
||||
* @param itemstack - The stack to check with.
|
||||
* @return True if the item is a fertilizer item.
|
||||
*/
|
||||
boolean isFertilizer(ItemStack itemstack);
|
||||
}
|
||||
@@ -9,8 +9,6 @@ import net.minecraft.util.ChunkCoordinates;
|
||||
|
||||
import com.mojang.authlib.GameProfile;
|
||||
|
||||
import forestry.core.inventory.IInventoryAdapter;
|
||||
|
||||
/**
|
||||
* Basic interface for a multiblock machine component. Implemented by TileEntities.
|
||||
*/
|
||||
@@ -47,15 +45,4 @@ public interface IMultiblockComponent {
|
||||
* Called when the machine is broken for game reasons, e.g. a player removed a block or an explosion occurred.
|
||||
*/
|
||||
void onMachineBroken();
|
||||
|
||||
/**
|
||||
* A component with a separate inventory, like the Alveary Swarmer or Alveary Sieve.
|
||||
*/
|
||||
interface HasInventory {
|
||||
|
||||
/**
|
||||
* Called when this part is destroyed to drop its contents.
|
||||
*/
|
||||
IInventoryAdapter getInternalInventory();
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,4 @@ package forestry.api.multiblock;
|
||||
public class MultiblockManager {
|
||||
|
||||
public static IMultiblockLogicFactory logicFactory;
|
||||
|
||||
public static IFarmFertilizerRegistry farmFertilizerRegistry;
|
||||
}
|
||||
@@ -15,20 +15,26 @@ import net.minecraft.item.ItemStack;
|
||||
|
||||
import forestry.api.apiculture.IArmorApiarist;
|
||||
import forestry.api.apiculture.IArmorApiaristHelper;
|
||||
import forestry.api.apiculture.IArmorApiaristMulti;
|
||||
|
||||
public class ArmorApiaristHelper implements IArmorApiaristHelper {
|
||||
|
||||
@Override
|
||||
public boolean isArmorApiarist(ItemStack stack, EntityLivingBase entity, String cause, boolean doProtect) {
|
||||
if (stack == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (stack == null || !(stack.getItem() instanceof IArmorApiarist armor)) return false;
|
||||
Item item = stack.getItem();
|
||||
if (!(item instanceof IArmorApiarist)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
IArmorApiarist armorApiarist = (IArmorApiarist) item;
|
||||
try {
|
||||
return armor.protectEntity(entity, stack, cause, doProtect);
|
||||
return armorApiarist.protectEntity(entity, stack, cause, doProtect);
|
||||
} catch (Throwable ignored) { // protectEntity is new to the API and may not be implemented by the armor
|
||||
if (entity instanceof EntityPlayer) {
|
||||
return armor.protectPlayer((EntityPlayer) entity, stack, cause, doProtect);
|
||||
return armorApiarist.protectPlayer((EntityPlayer) entity, stack, cause, doProtect);
|
||||
} else {
|
||||
return true; // fallback on assuming IArmorApiarist will protect the entity
|
||||
}
|
||||
@@ -42,13 +48,11 @@ public class ArmorApiaristHelper implements IArmorApiaristHelper {
|
||||
for (int i = 1; i <= 4; i++) {
|
||||
ItemStack armorItem = entity.getEquipmentInSlot(i);
|
||||
if (isArmorApiarist(armorItem, entity, cause, doProtect)) {
|
||||
Item item = armorItem.getItem();
|
||||
if (item instanceof IArmorApiaristMulti am) count += am.getProtectionCount(entity, armorItem, cause);
|
||||
else count++;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
return Math.min(count, 4);
|
||||
return count;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,10 +8,7 @@
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.BeeManager;
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
@@ -76,27 +73,4 @@ public class InventoryBeeHousing extends InventoryAdapterRestricted implements I
|
||||
public final boolean addProduct(ItemStack product, boolean all) {
|
||||
return InventoryUtil.tryAddStack(this, product, SLOT_PRODUCT_1, SLOT_PRODUCT_COUNT, all, true);
|
||||
}
|
||||
|
||||
public void dumpInventoryIntoWorld(World world, ChunkCoordinates coordinates) {
|
||||
if (world.isRemote) {
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < SLOT_PRODUCT_COUNT; i++) {
|
||||
ItemStack stack = getStackInSlot(i);
|
||||
if (stack == null) {
|
||||
continue;
|
||||
}
|
||||
setInventorySlotContents(i, null);
|
||||
|
||||
EntityItem entityitem = new EntityItem(
|
||||
world,
|
||||
coordinates.posX + 0.5,
|
||||
coordinates.posY + 0.5,
|
||||
coordinates.posZ + 0.5,
|
||||
stack);
|
||||
entityitem.delayBeforeCanPickup = 10;
|
||||
world.spawnEntityInWorld(entityitem);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -38,7 +38,7 @@ public class CommandBeeGive extends SubCommand {
|
||||
setPermLevel(PermLevel.ADMIN);
|
||||
|
||||
List<String> beeTypeStrings = new ArrayList<>();
|
||||
for (EnumBeeType type : EnumBeeType.VALUES) {
|
||||
for (EnumBeeType type : EnumBeeType.values()) {
|
||||
if (type == EnumBeeType.NONE) {
|
||||
continue;
|
||||
}
|
||||
@@ -166,7 +166,7 @@ public class CommandBeeGive extends SubCommand {
|
||||
}
|
||||
|
||||
private static EnumBeeType getBeeType(String beeTypeName) {
|
||||
for (EnumBeeType beeType : EnumBeeType.VALUES) {
|
||||
for (EnumBeeType beeType : EnumBeeType.values()) {
|
||||
if (beeType.getName().equalsIgnoreCase(beeTypeName)) {
|
||||
return beeType;
|
||||
}
|
||||
|
||||
@@ -213,7 +213,6 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
|
||||
private static boolean isAcceptedFlower(String flowerType, Set<Block> acceptedBlocks, Set<Flower> acceptedFlowers,
|
||||
World world, int x, int y, int z) {
|
||||
if (!world.blockExists(x, y, z)) return false;
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
final int meta;
|
||||
|
||||
@@ -24,7 +24,7 @@ public class GrowthRuleDirtGrass implements IFlowerGrowthRule {
|
||||
@Override
|
||||
public boolean growFlower(IFlowerRegistry flowerRegistry, String flowerType, World world, IIndividual individual,
|
||||
int x, int y, int z) {
|
||||
if (!world.blockExists(x, y, z) || !world.isAirBlock(x, y, z)) {
|
||||
if (!world.isAirBlock(x, y, z)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public class GrowthRuleDirtGrass implements IFlowerGrowthRule {
|
||||
|
||||
@Override
|
||||
public boolean growFlower(IFlowerGrowthHelper helper, String flowerType, World world, int x, int y, int z) {
|
||||
if (!world.blockExists(x, y, z) || !world.isAirBlock(x, y, z)) {
|
||||
if (!world.isAirBlock(x, y, z)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,10 +34,6 @@ public class GrowthRuleFlowerPot implements IFlowerGrowthRule {
|
||||
}
|
||||
|
||||
private static boolean growFlower(String flowerType, World world, int x, int y, int z) {
|
||||
if (!world.blockExists(x, y, z)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
TileEntity tile = world.getTileEntity(x, y, z);
|
||||
if (!(tile instanceof TileEntityFlowerPot)) {
|
||||
return false;
|
||||
|
||||
@@ -8,9 +8,6 @@
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import static forestry.core.utils.MathUtil.safeAdd;
|
||||
import static forestry.core.utils.MathUtil.safeMultiply;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@@ -18,8 +15,6 @@ import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.item.EnumRarity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -378,36 +373,6 @@ public class Bee extends IndividualLiving implements IBee {
|
||||
return suitableBiomes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLore(List<String> text) {
|
||||
IAlleleBeeSpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 0) {
|
||||
String speciesLore = descTokens[0];
|
||||
if (!speciesLore.isEmpty() && !speciesLore.contains("for.description")) {
|
||||
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
|
||||
String formattedLore = EnumChatFormatting.GOLD + speciesLore;
|
||||
List<String> formattedLoreList = fontRenderer.listFormattedStringToWidth(formattedLore, 200);
|
||||
text.addAll(formattedLoreList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addDiscoveredBy(List<String> text) {
|
||||
IAlleleBeeSpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 2) {
|
||||
String discoveredBy = descTokens[2];
|
||||
if (!discoveredBy.isEmpty()) {
|
||||
text.add("");
|
||||
text.add("Discovered by " + EnumChatFormatting.ITALIC + discoveredBy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTooltip(List<String> list) {
|
||||
|
||||
@@ -573,7 +538,7 @@ public class Bee extends IndividualLiving implements IBee {
|
||||
}
|
||||
// / Secondary Products
|
||||
for (Map.Entry<ItemStack, Float> entry : secondary.getProductChances().entrySet()) {
|
||||
if (housing.getWorld().rand.nextFloat() < getFinalChance(entry.getValue() / 2f, speed, prodModifier, 1f)) {
|
||||
if (housing.getWorld().rand.nextFloat() < getFinalChance(entry.getValue() / 2, speed, prodModifier, 1f)) {
|
||||
products.add(entry.getKey().copy());
|
||||
}
|
||||
}
|
||||
@@ -734,9 +699,9 @@ public class Bee extends IndividualLiving implements IBee {
|
||||
|
||||
// boost chance for researched mutations
|
||||
if (breedingTracker.isResearched(beeMutation)) {
|
||||
float mutationBoost = safeMultiply(chance, Config.researchMutationBoostMultiplier - 1.0f);
|
||||
float mutationBoost = chance * (Config.researchMutationBoostMultiplier - 1.0f);
|
||||
mutationBoost = Math.min(Config.maxResearchMutationBoostPercent, mutationBoost);
|
||||
chance = safeAdd(chance, mutationBoost);
|
||||
chance += mutationBoost;
|
||||
}
|
||||
|
||||
if (chance > world.rand.nextFloat() * 100) {
|
||||
@@ -773,9 +738,6 @@ public class Bee extends IndividualLiving implements IBee {
|
||||
for (int i = 0; i < 20; i++) {
|
||||
Vect randomPos = Vect.getRandomPositionInArea(random, area);
|
||||
Vect blockPos = Vect.add(housingPos, randomPos, offset);
|
||||
if (!world.blockExists(blockPos.x, blockPos.y, blockPos.z)) {
|
||||
continue;
|
||||
}
|
||||
TileEntity tile = world.getTileEntity(blockPos.x, blockPos.y, blockPos.z);
|
||||
|
||||
if (tile instanceof IPollinatable) {
|
||||
|
||||
@@ -148,7 +148,7 @@ public enum BeeBranchDefinition implements IBranchDefinition {
|
||||
|
||||
private static IAllele[] getDefaultTemplate() {
|
||||
if (defaultTemplate == null) {
|
||||
defaultTemplate = new IAllele[EnumBeeChromosome.VALUES.length];
|
||||
defaultTemplate = new IAllele[EnumBeeChromosome.values().length];
|
||||
|
||||
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
|
||||
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTER);
|
||||
|
||||
@@ -331,7 +331,7 @@ public enum BeeDefinition implements IBeeDefinition {
|
||||
@Override
|
||||
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
|
||||
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.SIMMERING, 1), 0.55f)
|
||||
.addProduct(PluginCore.items.getAsh(), 0.15f).setTemperature(EnumTemperature.HELLISH)
|
||||
.addProduct(PluginCore.items.ash.getItemStack(), 0.15f).setTemperature(EnumTemperature.HELLISH)
|
||||
.setHumidity(EnumHumidity.ARID);
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
|
||||
IBee bee = (IBee) individual;
|
||||
|
||||
Item beeItem;
|
||||
switch (EnumBeeType.fromOrdinal(type)) {
|
||||
switch (EnumBeeType.VALUES[type]) {
|
||||
case QUEEN:
|
||||
beeItem = PluginApiculture.items.beeQueenGE;
|
||||
// ensure a queen is always mated
|
||||
@@ -353,7 +353,7 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
|
||||
|
||||
@Override
|
||||
public IChromosomeType[] getKaryotype() {
|
||||
return EnumBeeChromosome.VALUES;
|
||||
return EnumBeeChromosome.values();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import static forestry.core.utils.MathUtil.safeMultiply;
|
||||
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@@ -51,8 +49,8 @@ public class BeeMutation extends Mutation implements IBeeMutationCustom {
|
||||
IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
|
||||
IBeeModifier beeModeModifier = BeeManager.beeRoot.getBeekeepingMode(world).getBeeModifier();
|
||||
|
||||
processedChance = safeMultiply(processedChance, beeHousingModifier.getMutationModifier(genome0, genome1, 1.0F));
|
||||
processedChance = safeMultiply(processedChance, beeModeModifier.getMutationModifier(genome0, genome1, 1.0F));
|
||||
processedChance *= beeHousingModifier.getMutationModifier(genome0, genome1, processedChance);
|
||||
processedChance *= beeModeModifier.getMutationModifier(genome0, genome1, processedChance);
|
||||
|
||||
return processedChance;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
@@ -20,23 +22,24 @@ import forestry.core.render.TextureManager;
|
||||
public class DefaultBeeIconProvider implements IBeeIconProvider {
|
||||
|
||||
public static final DefaultBeeIconProvider instance = new DefaultBeeIconProvider();
|
||||
private static final IIcon[][] icons = new IIcon[EnumBeeType.VALUES.length][3];
|
||||
|
||||
private DefaultBeeIconProvider() {}
|
||||
|
||||
private static final IIcon[][] icons = new IIcon[EnumBeeType.values().length][3];
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void registerIcons(IIconRegister register) {
|
||||
String beeIconDir = "bees/default/";
|
||||
IIcon body1 = TextureManager.registerTex(register, beeIconDir + "body1");
|
||||
|
||||
for (int i = 0; i < EnumBeeType.VALUES.length; i++) {
|
||||
EnumBeeType beeType = EnumBeeType.VALUES[i];
|
||||
for (int i = 0; i < EnumBeeType.values().length; i++) {
|
||||
EnumBeeType beeType = EnumBeeType.values()[i];
|
||||
if (beeType == EnumBeeType.NONE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String beeTypeNameBase = beeIconDir + beeType.getName();
|
||||
String beeTypeNameBase = beeIconDir + beeType.toString().toLowerCase(Locale.ENGLISH);
|
||||
|
||||
icons[i][0] = TextureManager.registerTex(register, beeTypeNameBase + ".outline");
|
||||
if (beeType == EnumBeeType.LARVAE) {
|
||||
|
||||
@@ -13,7 +13,6 @@ import java.util.Random;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.world.World;
|
||||
@@ -22,7 +21,7 @@ import forestry.api.apiculture.BeeManager;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
import forestry.apiculture.multiblock.AlvearyController;
|
||||
import forestry.apiculture.blocks.BlockAlveary;
|
||||
import forestry.core.utils.DamageSourceForestry;
|
||||
import forestry.core.utils.vect.Vect;
|
||||
|
||||
@@ -37,13 +36,8 @@ public class AlleleEffectRadioactive extends AlleleEffectThrottled {
|
||||
@Override
|
||||
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
harmEntities(genome, housing);
|
||||
if (isMobGriefingEnabled(housing)) destroyEnvironment(genome, housing);
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
private boolean isMobGriefingEnabled(IBeeHousing housing) {
|
||||
return housing.getWorld().getGameRules().getGameRuleBooleanValue("mobGriefing");
|
||||
return destroyEnvironment(genome, storedData, housing);
|
||||
}
|
||||
|
||||
private void harmEntities(IBeeGenome genome, IBeeHousing housing) {
|
||||
@@ -62,7 +56,7 @@ public class AlleleEffectRadioactive extends AlleleEffectThrottled {
|
||||
}
|
||||
}
|
||||
|
||||
private static void destroyEnvironment(IBeeGenome genome, IBeeHousing housing) {
|
||||
private static IEffectData destroyEnvironment(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
World world = housing.getWorld();
|
||||
Random rand = world.rand;
|
||||
|
||||
@@ -71,66 +65,43 @@ public class AlleleEffectRadioactive extends AlleleEffectThrottled {
|
||||
Vect offset = area.multiply(-1 / 2.0f);
|
||||
Vect posHousing = new Vect(housing.getCoordinates());
|
||||
|
||||
boolean isAlveary = housing instanceof AlvearyController;
|
||||
|
||||
for (int i = 0; i < 20; i++) {
|
||||
Vect randomPos = Vect.getRandomPositionInArea(rand, area);
|
||||
Vect posBlock = randomPos.add(posHousing).add(offset);
|
||||
Vect posBlock = randomPos.add(posHousing);
|
||||
posBlock = posBlock.add(offset);
|
||||
|
||||
// Don't destroy blocks in the protected 3x3x4 area if housing is an Alveary.
|
||||
// Stops the bee destroying itself. Silly behaviour.
|
||||
if (isInAlvearyProtectedArea(posHousing, posBlock)) {
|
||||
if (posBlock.y <= 1 || posBlock.y >= housing.getWorld().getActualHeight()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Don't destroy the block directly below the bee.
|
||||
if (isAlveary) {
|
||||
if (posBlock.y == posHousing.y - 3) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (posBlock.y == posHousing.y - 1) {
|
||||
continue;
|
||||
}
|
||||
// Don't destroy ourselves or blocks below us.
|
||||
if (posBlock.x == posHousing.x && posBlock.z == posHousing.z && posBlock.y <= posHousing.y) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (world.isAirBlock(posBlock.x, posBlock.y, posBlock.z)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Block block = world.getBlock(posBlock.x, posBlock.y, posBlock.z);
|
||||
|
||||
// Never delete a tile entity. Allows far too much griefing and abuse otherwise.
|
||||
if (block instanceof BlockAlveary) {
|
||||
continue;
|
||||
}
|
||||
|
||||
TileEntity tile = world.getTileEntity(posBlock.x, posBlock.y, posBlock.z);
|
||||
if (tile != null) {
|
||||
if (tile instanceof IBeeHousing) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Don't let us delete blocks that are not supposed to be breakable by players.
|
||||
if (block.getBlockHardness(world, posBlock.x, posBlock.y, posBlock.z) < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Some mods might use this logic? Idk, just a safety check. Might stop griefing.
|
||||
EntityPlayer player = world.func_152378_a(housing.getOwner().getId());
|
||||
if (player == null || !world.canMineBlock(player, posHousing.x, posHousing.y, posHousing.z)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
world.setBlockToAir(posBlock.x, posBlock.y, posBlock.z);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isInAlvearyProtectedArea(Vect posHousing, Vect posBlock) {
|
||||
// Alveary protection area is a 3x3x4 area centered on the top middle, down one block.
|
||||
int startX = posHousing.x - 1;
|
||||
int endX = posHousing.x + 1;
|
||||
int startZ = posHousing.z - 1;
|
||||
int endZ = posHousing.z + 1;
|
||||
int startY = posHousing.y - 2;
|
||||
int endY = posHousing.y + 1;
|
||||
|
||||
return posBlock.x >= startX && posBlock.x <= endX
|
||||
&& posBlock.z >= startZ
|
||||
&& posBlock.z <= endZ
|
||||
&& posBlock.y >= startY
|
||||
&& posBlock.y <= endY;
|
||||
return storedData;
|
||||
}
|
||||
}
|
||||
@@ -27,10 +27,6 @@ public abstract class AlleleEffectThrottled extends AlleleEffect {
|
||||
this.requiresWorkingQueen = requiresWorking;
|
||||
}
|
||||
|
||||
public int getThrottle() {
|
||||
return throttle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCombinable() {
|
||||
return isCombinable;
|
||||
|
||||
@@ -15,7 +15,6 @@ import forestry.api.core.Tabs;
|
||||
import forestry.apiculture.gui.GuiBeealyzer;
|
||||
import forestry.apiculture.inventory.ItemInventoryBeealyzer;
|
||||
import forestry.core.gui.ContainerAlyzer;
|
||||
import forestry.core.inventory.ItemLocation;
|
||||
import forestry.core.items.ItemWithGui;
|
||||
|
||||
public class ItemBeealyzer extends ItemWithGui {
|
||||
@@ -25,13 +24,13 @@ public class ItemBeealyzer extends ItemWithGui {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
ItemInventoryBeealyzer inventory = new ItemInventoryBeealyzer(player, heldItem);
|
||||
return new GuiBeealyzer(player, inventory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
ItemInventoryBeealyzer inventory = new ItemInventoryBeealyzer(player, heldItem);
|
||||
return new ContainerAlyzer(inventory, player);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,6 @@ import forestry.apiculture.gui.ContainerHabitatLocator;
|
||||
import forestry.apiculture.gui.GuiHabitatLocator;
|
||||
import forestry.apiculture.inventory.ItemInventoryHabitatLocator;
|
||||
import forestry.apiculture.render.TextureHabitatLocator;
|
||||
import forestry.core.inventory.ItemLocation;
|
||||
import forestry.core.items.ItemWithGui;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
@@ -72,8 +71,9 @@ public class ItemHabitatLocator extends ItemWithGui {
|
||||
public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean flag) {
|
||||
BiomeGenBase currentBiome = player.worldObj.getBiomeGenForCoords((int) player.posX, (int) player.posZ);
|
||||
|
||||
EnumTemperature temperature = EnumTemperature
|
||||
.getFromBiome(currentBiome, (int) player.posX, (int) player.posY, (int) player.posZ);
|
||||
float temperatureValue = currentBiome
|
||||
.getFloatTemperature((int) player.posX, (int) player.posY, (int) player.posZ);
|
||||
EnumTemperature temperature = EnumTemperature.getFromValue(temperatureValue);
|
||||
EnumHumidity humidity = EnumHumidity.getFromValue(currentBiome.rainfall);
|
||||
|
||||
list.add(StringUtil.localize("gui.currentBiome") + ": " + currentBiome.biomeName);
|
||||
@@ -82,12 +82,12 @@ public class ItemHabitatLocator extends ItemWithGui {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
return new GuiHabitatLocator(player, new ItemInventoryHabitatLocator(player, heldItem));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
return new ContainerHabitatLocator(player, new ItemInventoryHabitatLocator(player, heldItem));
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,6 @@ import forestry.api.core.Tabs;
|
||||
import forestry.apiculture.gui.ContainerImprinter;
|
||||
import forestry.apiculture.gui.GuiImprinter;
|
||||
import forestry.apiculture.inventory.ItemInventoryImprinter;
|
||||
import forestry.core.inventory.ItemLocation;
|
||||
import forestry.core.items.ItemWithGui;
|
||||
|
||||
public class ItemImprinter extends ItemWithGui {
|
||||
@@ -25,12 +24,12 @@ public class ItemImprinter extends ItemWithGui {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
return new GuiImprinter(player.inventory, new ItemInventoryImprinter(player, heldItem));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
return new ContainerImprinter(player.inventory, new ItemInventoryImprinter(player, heldItem));
|
||||
}
|
||||
}
|
||||
@@ -9,10 +9,8 @@
|
||||
package forestry.apiculture.multiblock;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -61,9 +59,7 @@ public class AlvearyController extends RectangularMultiblockControllerBase
|
||||
// PARTS
|
||||
private final Set<IBeeModifier> beeModifiers = new HashSet<>();
|
||||
private final Set<IBeeListener> beeListeners = new HashSet<>();
|
||||
private final Set<IAlvearyComponent.Climatiser> climatisers = new TreeSet<>(
|
||||
Comparator.comparingInt(IAlvearyComponent.Climatiser::getPriority).thenComparingInt(Object::hashCode)
|
||||
.reversed());
|
||||
private final Set<IAlvearyComponent.Climatiser> climatisers = new HashSet<>();
|
||||
private final Set<IAlvearyComponent.Active> activeComponents = new HashSet<>();
|
||||
|
||||
// CLIENT
|
||||
@@ -111,14 +107,6 @@ public class AlvearyController extends RectangularMultiblockControllerBase
|
||||
this.readFromNBT(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detachBlock(IMultiblockComponent part, boolean chunkUnloading) {
|
||||
if (!chunkUnloading) {
|
||||
inventory.dumpInventoryIntoWorld(this.worldObj, part.getCoordinates());
|
||||
}
|
||||
super.detachBlock(part, chunkUnloading);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onBlockAdded(IMultiblockComponent newPart) {
|
||||
if (newPart instanceof IAlvearyComponent) {
|
||||
@@ -245,25 +233,26 @@ public class AlvearyController extends RectangularMultiblockControllerBase
|
||||
beekeepingLogic.doWork();
|
||||
}
|
||||
|
||||
tempChange = 0;
|
||||
humidChange = 0;
|
||||
for (IAlvearyComponent.Climatiser climatiser : climatisers) {
|
||||
climatiser.changeClimate(tickCount, this);
|
||||
}
|
||||
|
||||
tempChange = equalizeChange(tempChange);
|
||||
humidChange = equalizeChange(humidChange);
|
||||
|
||||
return canWork;
|
||||
}
|
||||
|
||||
private float applyChange(float base, float currentChange, float extraChange, float boundaryDown,
|
||||
float boundaryUp) {
|
||||
float boundedNewChange = Math.round(
|
||||
(Math.max(boundaryDown, Math.min(base + currentChange + (extraChange * 20), boundaryUp)) - base) * 100)
|
||||
/ 100.0f;
|
||||
if (extraChange > 0) {
|
||||
return Math.max(currentChange, boundedNewChange);
|
||||
} else {
|
||||
return Math.min(currentChange, boundedNewChange);
|
||||
private static float equalizeChange(float change) {
|
||||
if (change == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
change *= 0.95f;
|
||||
if (change <= 0.001f && change >= -0.001f) {
|
||||
change = 0;
|
||||
}
|
||||
return change;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -362,13 +351,12 @@ public class AlvearyController extends RectangularMultiblockControllerBase
|
||||
@Override
|
||||
public float getExactTemperature() {
|
||||
ChunkCoordinates coords = getReferenceCoord();
|
||||
return Math.round((getBiome().getFloatTemperature(coords.posX, coords.posY, coords.posZ) + tempChange) * 100)
|
||||
/ 100.0f;
|
||||
return getBiome().getFloatTemperature(coords.posX, coords.posY, coords.posZ) + tempChange;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getExactHumidity() {
|
||||
return Math.round((getBiome().rainfall + humidChange) * 100) / 100.0f;
|
||||
return getBiome().rainfall + humidChange;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -422,13 +410,19 @@ public class AlvearyController extends RectangularMultiblockControllerBase
|
||||
ChunkCoordinates coordinates = getCoordinates();
|
||||
|
||||
float temperature = getBiome().getFloatTemperature(coordinates.posX, coordinates.posY, coordinates.posZ);
|
||||
tempChange = applyChange(temperature, tempChange, change, boundaryDown, boundaryUp);
|
||||
|
||||
tempChange += change;
|
||||
tempChange = Math.max(boundaryDown - temperature, tempChange);
|
||||
tempChange = Math.min(boundaryUp - temperature, tempChange);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addHumidityChange(float change, float boundaryDown, float boundaryUp) {
|
||||
float humidity = getBiome().rainfall;
|
||||
humidChange = applyChange(humidity, humidChange, change, boundaryDown, boundaryUp);
|
||||
|
||||
humidChange += change;
|
||||
humidChange = Math.max(boundaryDown - humidity, humidChange);
|
||||
humidChange = Math.min(boundaryUp - humidity, humidChange);
|
||||
}
|
||||
|
||||
/* GUI */
|
||||
|
||||
@@ -19,7 +19,6 @@ import net.minecraftforge.fluids.IFluidHandler;
|
||||
|
||||
import forestry.api.core.IClimateControlled;
|
||||
import forestry.api.multiblock.IAlvearyComponent;
|
||||
import forestry.api.multiblock.IMultiblockComponent;
|
||||
import forestry.apiculture.blocks.BlockAlveary;
|
||||
import forestry.apiculture.gui.ContainerAlvearyHygroregulator;
|
||||
import forestry.apiculture.gui.GuiAlvearyHygroregulator;
|
||||
@@ -32,8 +31,8 @@ import forestry.core.fluids.tanks.FilteredTank;
|
||||
import forestry.core.inventory.IInventoryAdapter;
|
||||
import forestry.core.tiles.ILiquidTankTile;
|
||||
|
||||
public class TileAlvearyHygroregulator extends TileAlveary implements IInventory, ILiquidTankTile, IFluidHandler,
|
||||
IAlvearyComponent.Climatiser, IMultiblockComponent.HasInventory {
|
||||
public class TileAlvearyHygroregulator extends TileAlveary
|
||||
implements IInventory, ILiquidTankTile, IFluidHandler, IAlvearyComponent.Climatiser {
|
||||
|
||||
private final HygroregulatorRecipe[] recipes;
|
||||
|
||||
@@ -57,9 +56,9 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
|
||||
this.tankManager = new TankManager(this, liquidTank);
|
||||
|
||||
this.recipes = new HygroregulatorRecipe[] {
|
||||
new HygroregulatorRecipe(new FluidStack(water, 1), 1, +0.01f, -0.005f),
|
||||
new HygroregulatorRecipe(new FluidStack(lava, 1), 10, -0.01f, +0.005f),
|
||||
new HygroregulatorRecipe(new FluidStack(liquidIce, 1), 10, +0.02f, -0.01f) };
|
||||
new HygroregulatorRecipe(new FluidStack(water, 1), 1, +0.01f, -0.0005f),
|
||||
new HygroregulatorRecipe(new FluidStack(lava, 1), 10, -0.01f, +0.0005f),
|
||||
new HygroregulatorRecipe(new FluidStack(liquidIce, 1), 10, +0.02f, -0.001f) };
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -112,11 +111,6 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return 100;
|
||||
}
|
||||
|
||||
/* SAVING & LOADING */
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
|
||||
@@ -18,7 +18,6 @@ import forestry.api.genetics.AlleleManager;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.ISpeciesRoot;
|
||||
import forestry.api.multiblock.IAlvearyComponent;
|
||||
import forestry.api.multiblock.IMultiblockComponent;
|
||||
import forestry.apiculture.blocks.BlockAlveary;
|
||||
import forestry.apiculture.gui.ContainerAlvearySieve;
|
||||
import forestry.apiculture.gui.GuiAlvearySieve;
|
||||
@@ -26,8 +25,7 @@ import forestry.apiculture.inventory.InventoryAlvearySieve;
|
||||
import forestry.core.inventory.IInventoryAdapter;
|
||||
import forestry.core.inventory.watchers.ISlotPickupWatcher;
|
||||
|
||||
public class TileAlvearySieve extends TileAlveary
|
||||
implements IAlvearyComponent.BeeListener, IMultiblockComponent.HasInventory {
|
||||
public class TileAlvearySieve extends TileAlveary implements IAlvearyComponent.BeeListener {
|
||||
|
||||
private final IBeeListener beeListener;
|
||||
private final InventoryAlvearySieve inventory;
|
||||
|
||||
@@ -22,7 +22,6 @@ import forestry.api.apiculture.BeeManager;
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.multiblock.IAlvearyComponent;
|
||||
import forestry.api.multiblock.IMultiblockComponent;
|
||||
import forestry.apiculture.blocks.BlockAlveary;
|
||||
import forestry.apiculture.gui.ContainerAlvearySwarmer;
|
||||
import forestry.apiculture.gui.GuiAlvearySwarmer;
|
||||
@@ -38,8 +37,7 @@ import forestry.core.proxy.Proxies;
|
||||
import forestry.core.tiles.IActivatable;
|
||||
import forestry.core.utils.ItemStackUtil;
|
||||
|
||||
public class TileAlvearySwarmer extends TileAlveary
|
||||
implements ISidedInventory, IActivatable, IAlvearyComponent.Active, IMultiblockComponent.HasInventory {
|
||||
public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory, IActivatable, IAlvearyComponent.Active {
|
||||
|
||||
private final InventorySwarmer inventory;
|
||||
private final Deque<ItemStack> pendingSpawns = new ArrayDeque<>();
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
package forestry.arboriculture;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockLeaves;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/** Based on vanilla leaf decay, but accepts leaves that are connected further from a trunk */
|
||||
public abstract class LeafDecayHelper {
|
||||
|
||||
private static final short SUSTAINS_LEAVES = 0;
|
||||
private static final short NOT_SUSTAINS_LEAVES = -1;
|
||||
private static final short IS_LEAVES = -2;
|
||||
private static int[] leafDecayValues;
|
||||
|
||||
public static void leafDecay(BlockLeaves leaves, World world, int x, int y, int z) {
|
||||
if (world.isRemote) {
|
||||
return;
|
||||
}
|
||||
|
||||
int leafMeta = world.getBlockMetadata(x, y, z);
|
||||
|
||||
if ((leafMeta & 8) != 0 && (leafMeta & 4) == 0) {
|
||||
byte radius = 4;
|
||||
byte yArrayMult = 32;
|
||||
int xArrayMult = yArrayMult * yArrayMult;
|
||||
int arrayOffset = yArrayMult / 2;
|
||||
|
||||
if (leafDecayValues == null) {
|
||||
leafDecayValues = new int[yArrayMult * yArrayMult * yArrayMult];
|
||||
}
|
||||
|
||||
int radius1 = radius + 1;
|
||||
if (world.checkChunksExist(x - radius1, y - radius1, z - radius1, x + radius1, y + radius1, z + radius1)) {
|
||||
for (int xOffset = -radius; xOffset <= radius; ++xOffset) {
|
||||
for (int yOffset = -radius; yOffset <= radius; ++yOffset) {
|
||||
for (int zOffset = -radius; zOffset <= radius; ++zOffset) {
|
||||
Block block = world.getBlock(x + xOffset, y + yOffset, z + zOffset);
|
||||
|
||||
if (!block.canSustainLeaves(world, x + xOffset, y + yOffset, z + zOffset)) {
|
||||
if (block.isLeaves(world, x + xOffset, y + yOffset, z + zOffset)) {
|
||||
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] = IS_LEAVES;
|
||||
} else {
|
||||
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] = NOT_SUSTAINS_LEAVES;
|
||||
}
|
||||
} else {
|
||||
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] = SUSTAINS_LEAVES;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int sustainedValue = 1; sustainedValue <= 8; ++sustainedValue) {
|
||||
for (int xOffset = -radius; xOffset <= radius; ++xOffset) {
|
||||
for (int yOffset = -radius; yOffset <= radius; ++yOffset) {
|
||||
for (int zOffset = -radius; zOffset <= radius; ++zOffset) {
|
||||
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] == sustainedValue - 1) {
|
||||
if (leafDecayValues[(xOffset + arrayOffset - 1) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] == IS_LEAVES) {
|
||||
leafDecayValues[(xOffset + arrayOffset - 1) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] = sustainedValue;
|
||||
}
|
||||
|
||||
if (leafDecayValues[(xOffset + arrayOffset + 1) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] == IS_LEAVES) {
|
||||
leafDecayValues[(xOffset + arrayOffset + 1) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] = sustainedValue;
|
||||
}
|
||||
|
||||
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset - 1) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] == IS_LEAVES) {
|
||||
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset - 1) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] = sustainedValue;
|
||||
}
|
||||
|
||||
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset + 1) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] == IS_LEAVES) {
|
||||
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset + 1) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset] = sustainedValue;
|
||||
}
|
||||
|
||||
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ (zOffset + arrayOffset - 1)] == IS_LEAVES) {
|
||||
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ (zOffset + arrayOffset - 1)] = sustainedValue;
|
||||
}
|
||||
|
||||
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset
|
||||
+ 1] == IS_LEAVES) {
|
||||
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
|
||||
+ (yOffset + arrayOffset) * yArrayMult
|
||||
+ zOffset
|
||||
+ arrayOffset
|
||||
+ 1] = sustainedValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int sustainValue = leafDecayValues[(arrayOffset * xArrayMult) + (arrayOffset * yArrayMult) + arrayOffset];
|
||||
|
||||
if (sustainValue >= 0) {
|
||||
world.setBlockMetadataWithNotify(x, y, z, leafMeta & -9, 4); // stop trying to decay
|
||||
} else {
|
||||
leaves.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
|
||||
world.setBlockToAir(x, y, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,6 @@ import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import com.gtnewhorizon.gtnhlib.blocks.util.BFSLeafDecay;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
@@ -49,6 +48,7 @@ import forestry.api.core.Tabs;
|
||||
import forestry.api.lepidopterology.ButterflyManager;
|
||||
import forestry.api.lepidopterology.EnumFlutterType;
|
||||
import forestry.api.lepidopterology.IButterfly;
|
||||
import forestry.arboriculture.LeafDecayHelper;
|
||||
import forestry.arboriculture.genetics.TreeDefinition;
|
||||
import forestry.arboriculture.items.ItemBlockLeaves;
|
||||
import forestry.arboriculture.render.TextureLeaves;
|
||||
@@ -230,12 +230,7 @@ public class BlockForestryLeaves extends BlockNewLeaf implements ITileEntityProv
|
||||
return;
|
||||
}
|
||||
|
||||
if (!world.isRemote) {
|
||||
final int meta = world.getBlockMetadata(x, y, z);
|
||||
if ((meta & 8) != 0 && (meta & 4) == 0) {
|
||||
BFSLeafDecay.handleDecayChecked(this, world, x, y, z, meta, 4);
|
||||
}
|
||||
}
|
||||
LeafDecayHelper.leafDecay(this, world, x, y, z);
|
||||
|
||||
// check leaves tile again because they can decay in super.updateTick
|
||||
if (tileLeaves.isInvalid()) {
|
||||
|
||||
@@ -36,29 +36,29 @@ public class BlockFruitPod extends BlockCocoa {
|
||||
}
|
||||
|
||||
public static TileFruitPod getPodTile(IBlockAccess world, int x, int y, int z) {
|
||||
final TileEntity tile = world.getTileEntity(x, y, z);
|
||||
if (tile instanceof TileFruitPod) {
|
||||
return (TileFruitPod) tile;
|
||||
TileEntity tile = world.getTileEntity(x, y, z);
|
||||
if (!(tile instanceof TileFruitPod)) {
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
|
||||
return (TileFruitPod) tile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTick(World world, int x, int y, int z, Random rand) {
|
||||
if (!world.checkChunksExist(x - 1, y, z - 1, x + 1, y, z + 1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!canBlockStay(world, x, y, z)) {
|
||||
final int meta = world.getBlockMetadata(x, y, z);
|
||||
this.dropBlockAsItem(world, x, y, z, meta, 0);
|
||||
dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
|
||||
world.setBlockToAir(x, y, z);
|
||||
return;
|
||||
}
|
||||
|
||||
final TileFruitPod tile = getPodTile(world, x, y, z);
|
||||
if (tile != null) {
|
||||
tile.onBlockTick();
|
||||
TileFruitPod tile = getPodTile(world, x, y, z);
|
||||
if (tile == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
tile.onBlockTick();
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
|
||||
@@ -16,8 +16,8 @@ import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.particle.EffectRenderer;
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
@@ -72,7 +72,7 @@ public class BlockSlab extends net.minecraft.block.BlockSlab implements IWoodTyp
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIcon(int side, int meta) {
|
||||
return IconProviderWood.getPlankIcon(EnumWoodType.VALUES[meta]);
|
||||
return IconProviderWood.getPlankIcon(EnumWoodType.LARCH);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -84,8 +84,7 @@ public class BlockSlab extends net.minecraft.block.BlockSlab implements IWoodTyp
|
||||
|
||||
@Override
|
||||
protected ItemStack createStackedBlock(int meta) {
|
||||
Item item = Item.getItemFromBlock(this);
|
||||
return item != null ? new ItemStack(item, 2, 0) : null;
|
||||
return new ItemStack(Blocks.wooden_slab, 2, meta & 7);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -108,18 +107,6 @@ public class BlockSlab extends net.minecraft.block.BlockSlab implements IWoodTyp
|
||||
return new TileWood();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) {
|
||||
// Special case for double slabs placed by building mods (e.g., MatterManipulator)
|
||||
if (stack == null) return;
|
||||
int damage = stack.getItemDamage();
|
||||
if (damage < 0 || damage >= EnumWoodType.VALUES.length) return;
|
||||
TileWood tile = TileWood.getWoodTile(world, x, y, z);
|
||||
if (tile != null) {
|
||||
tile.setWoodType(EnumWoodType.VALUES[damage]);
|
||||
}
|
||||
}
|
||||
|
||||
/* PROPERTIES */
|
||||
@Override
|
||||
public final ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
|
||||
|
||||
@@ -16,8 +16,6 @@ import java.util.List;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
@@ -300,36 +298,6 @@ public class Tree extends Individual implements ITree, IPlantable {
|
||||
return plantTypes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLore(List<String> text) {
|
||||
IAlleleTreeSpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 0) {
|
||||
String speciesLore = descTokens[0];
|
||||
if (!speciesLore.isEmpty() && !speciesLore.contains("for.description")) {
|
||||
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
|
||||
String formattedLore = EnumChatFormatting.GOLD + speciesLore;
|
||||
List<String> formattedLoreList = fontRenderer.listFormattedStringToWidth(formattedLore, 200);
|
||||
text.addAll(formattedLoreList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addDiscoveredBy(List<String> text) {
|
||||
IAlleleTreeSpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 2) {
|
||||
String discoveredBy = descTokens[2];
|
||||
if (!discoveredBy.isEmpty()) {
|
||||
text.add("");
|
||||
text.add("Discovered by " + EnumChatFormatting.ITALIC + discoveredBy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTooltip(List<String> list) {
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ public enum TreeBranchDefinition implements IBranchDefinition {
|
||||
@Override
|
||||
public IAllele[] getTemplate() {
|
||||
if (defaultTemplate == null) {
|
||||
defaultTemplate = new IAllele[EnumTreeChromosome.VALUES.length];
|
||||
defaultTemplate = new IAllele[EnumTreeChromosome.values().length];
|
||||
|
||||
AlleleHelper.instance.set(defaultTemplate, EnumTreeChromosome.FRUITS, AlleleFruit.fruitNone);
|
||||
AlleleHelper.instance.set(defaultTemplate, EnumTreeChromosome.GROWTH, AlleleGrowth.growthLightLevel);
|
||||
|
||||
@@ -1148,14 +1148,6 @@ public enum TreeDefinition implements ITreeDefinition, ITreeGenerator {
|
||||
return species.getUID();
|
||||
}
|
||||
|
||||
public EnumWoodType getWoodType() {
|
||||
return woodType;
|
||||
}
|
||||
|
||||
public ItemStack getVanillaWood() {
|
||||
return vanillaWood;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final ITreeGenome getGenome() {
|
||||
return genome;
|
||||
|
||||
@@ -389,7 +389,7 @@ public class TreeHelper extends SpeciesRoot implements ITreeRoot {
|
||||
|
||||
@Override
|
||||
public IChromosomeType[] getKaryotype() {
|
||||
return EnumTreeChromosome.VALUES;
|
||||
return EnumTreeChromosome.values();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,7 +26,6 @@ public class ItemRegistryArboriculture extends ItemRegistry {
|
||||
OreDictionary.registerOre("treeSapling", sapling.getWildcard());
|
||||
|
||||
pollenFertile = registerItem(new ItemGermlingGE(EnumGermlingType.POLLEN), "pollenFertile");
|
||||
OreDictionary.registerOre("itemPollenFertile", pollenFertile.getWildcard());
|
||||
treealyzer = registerItem(new ItemTreealyzer(), "treealyzer");
|
||||
grafter = registerItem(new ItemGrafter(4), "grafter");
|
||||
grafterProven = registerItem(new ItemGrafter(149), "grafterProven");
|
||||
|
||||
@@ -15,7 +15,6 @@ import forestry.api.core.Tabs;
|
||||
import forestry.arboriculture.gui.GuiTreealyzer;
|
||||
import forestry.arboriculture.inventory.ItemInventoryTreealyzer;
|
||||
import forestry.core.gui.ContainerAlyzer;
|
||||
import forestry.core.inventory.ItemLocation;
|
||||
import forestry.core.items.ItemWithGui;
|
||||
|
||||
public class ItemTreealyzer extends ItemWithGui {
|
||||
@@ -25,12 +24,12 @@ public class ItemTreealyzer extends ItemWithGui {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
return new GuiTreealyzer(player, new ItemInventoryTreealyzer(player, heldItem));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
return new ContainerAlyzer(new ItemInventoryTreealyzer(player, heldItem), player);
|
||||
}
|
||||
}
|
||||
@@ -95,7 +95,8 @@ public class TileWood extends TileEntity implements IStreamable {
|
||||
EnumWoodType woodType = wood.getWoodType();
|
||||
|
||||
int amount = 1;
|
||||
if (block instanceof BlockSlab blockSlab) {
|
||||
if (block instanceof BlockSlab) {
|
||||
BlockSlab blockSlab = (BlockSlab) block;
|
||||
if (blockSlab.isDoubleSlab()) {
|
||||
amount = 2;
|
||||
block = PluginArboriculture.blocks.slabs;
|
||||
@@ -103,7 +104,6 @@ public class TileWood extends TileEntity implements IStreamable {
|
||||
}
|
||||
|
||||
ItemStack itemStack = new ItemStack(block, amount);
|
||||
if (itemStack.getItem() == null) return null;
|
||||
ItemBlockWood.saveToItemStack(woodType, itemStack);
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
@@ -113,7 +113,11 @@ public final class AccessHandler implements IAccessHandler {
|
||||
if (!isOwner(player)) {
|
||||
return false;
|
||||
}
|
||||
setAccess(player.worldObj, access.next());
|
||||
|
||||
int ordinal = (access.ordinal() + 1) % EnumAccess.values().length;
|
||||
EnumAccess newAccess = EnumAccess.values()[ordinal];
|
||||
setAccess(player.worldObj, newAccess);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -152,7 +156,7 @@ public final class AccessHandler implements IAccessHandler {
|
||||
public void readData(DataInputStreamForestry data) throws IOException {
|
||||
byte accessOrdinal = data.readByte();
|
||||
if (accessOrdinal >= 0) {
|
||||
access = EnumAccess.fromOrdinal(accessOrdinal);
|
||||
access = EnumAccess.values()[accessOrdinal];
|
||||
GameProfile owner = new GameProfile(new UUID(data.readLong(), data.readLong()), data.readUTF());
|
||||
setOwner(owner);
|
||||
}
|
||||
@@ -160,7 +164,8 @@ public final class AccessHandler implements IAccessHandler {
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound data) {
|
||||
access = EnumAccess.fromOrdinal(data.getInteger("Access"));
|
||||
access = EnumAccess.values()[data.getInteger("Access")];
|
||||
|
||||
if (data.hasKey("owner")) {
|
||||
owner = NBTUtil.func_152459_a(data.getCompoundTag("owner"));
|
||||
}
|
||||
|
||||
@@ -8,15 +8,22 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.access;
|
||||
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public enum EnumAccess {
|
||||
|
||||
SHARED("gui.rule.shared"),
|
||||
VIEWABLE("gui.rule.restricted"),
|
||||
PRIVATE("gui.rule.private");
|
||||
|
||||
private static final EnumAccess[] VALUES = values();
|
||||
private final String name;
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon icon;
|
||||
|
||||
EnumAccess(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
@@ -24,13 +31,4 @@ public enum EnumAccess {
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public EnumAccess next() {
|
||||
int ordinal = (this.ordinal() + 1) % VALUES.length;
|
||||
return VALUES[ordinal];
|
||||
}
|
||||
|
||||
public static EnumAccess fromOrdinal(int ordinal) {
|
||||
return VALUES[ordinal];
|
||||
}
|
||||
}
|
||||
@@ -8,8 +8,6 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.blocks;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -54,7 +52,7 @@ public class BlockResourceOre extends Block {
|
||||
public void dropBlockAsItemWithChance(World world, int x, int y, int z, int metadata, float par6, int par7) {
|
||||
super.dropBlockAsItemWithChance(world, x, y, z, metadata, par6, par7);
|
||||
|
||||
if (metadata == 0 && !isDreamcraftLoaded) {
|
||||
if (metadata == 0) {
|
||||
this.dropXpOnBlockBreak(world, x, y, z, MathHelper.getRandomIntegerInRange(world.rand, 1, 4));
|
||||
}
|
||||
}
|
||||
@@ -63,7 +61,7 @@ public class BlockResourceOre extends Block {
|
||||
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
|
||||
ArrayList<ItemStack> drops = new ArrayList<>();
|
||||
|
||||
if (metadata == ResourceType.APATITE.ordinal() && !isDreamcraftLoaded) {
|
||||
if (metadata == ResourceType.APATITE.ordinal()) {
|
||||
int fortuneModifier = world.rand.nextInt(fortune + 2) - 1;
|
||||
if (fortuneModifier < 0) {
|
||||
fortuneModifier = 0;
|
||||
|
||||
@@ -84,26 +84,31 @@ public class BlockSoil extends Block implements IItemTyped {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTick(World world, int x, int y, int z, Random random) {
|
||||
public void updateTick(World world, int i, int j, int k, Random random) {
|
||||
if (world.isRemote) {
|
||||
return;
|
||||
}
|
||||
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
int meta = world.getBlockMetadata(i, j, k);
|
||||
|
||||
SoilType type = getTypeFromMeta(meta);
|
||||
|
||||
if (type == SoilType.HUMUS) {
|
||||
if (world.checkChunksExist(x - 1, y + 1, z - 1, x + 1, y + 1, z + 1)) {
|
||||
if (isEnrooted(world, x, y, z)) {
|
||||
degradeSoil(world, x, y, z);
|
||||
}
|
||||
}
|
||||
updateTickHumus(world, i, j, k);
|
||||
} else if (type == SoilType.BOG_EARTH) {
|
||||
if (world.checkChunksExist(x - 2, y, z - 2, x + 2, y, z + 2)) {
|
||||
if (isMoistened(world, x, y, z)) {
|
||||
matureBog(world, x, y, z);
|
||||
}
|
||||
}
|
||||
updateTickBogEarth(world, i, j, k);
|
||||
}
|
||||
}
|
||||
|
||||
private static void updateTickHumus(World world, int i, int j, int k) {
|
||||
if (isEnrooted(world, i, j, k)) {
|
||||
degradeSoil(world, i, j, k);
|
||||
}
|
||||
}
|
||||
|
||||
private static void updateTickBogEarth(World world, int i, int j, int k) {
|
||||
if (isMoistened(world, i, j, k)) {
|
||||
matureBog(world, i, j, k);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,6 +122,7 @@ public class BlockSoil extends Block implements IItemTyped {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -150,6 +156,7 @@ public class BlockSoil extends Block implements IItemTyped {
|
||||
}
|
||||
|
||||
private static boolean isMoistened(World world, int x, int y, int z) {
|
||||
|
||||
for (int i = -2; i < 3; i++) {
|
||||
for (int j = -2; j < 3; j++) {
|
||||
Block block = world.getBlock(x + i, y, z + j);
|
||||
@@ -158,6 +165,7 @@ public class BlockSoil extends Block implements IItemTyped {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -116,12 +116,6 @@ public abstract class BlockStructure extends BlockForestry {
|
||||
InventoryUtil.dropSockets((ISocketable) tile, world, x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
if (tile instanceof IMultiblockComponent.HasInventory) {
|
||||
IMultiblockComponent.HasInventory hasInventory = (IMultiblockComponent.HasInventory) tile;
|
||||
|
||||
InventoryUtil.dropInventory(hasInventory.getInternalInventory(), world, x, y, z);
|
||||
}
|
||||
}
|
||||
super.breakBlock(world, x, y, z, block, meta);
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ public class CircuitBoard<T> implements ICircuitBoard {
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
|
||||
type = EnumCircuitBoardType.VALUES[nbttagcompound.getShort("T")];
|
||||
type = EnumCircuitBoardType.values()[nbttagcompound.getShort("T")];
|
||||
|
||||
// Layout
|
||||
if (nbttagcompound.hasKey("LY")) {
|
||||
|
||||
@@ -15,11 +15,6 @@ public enum EnumCircuitBoardType {
|
||||
REFINED((short) 3, 0x191919, 0xc9c9c9),
|
||||
INTRICATE((short) 4, 0x191919, 0xe2cb6b);
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final EnumCircuitBoardType[] VALUES = values();
|
||||
|
||||
private final short sockets;
|
||||
private final int primaryColor;
|
||||
private final int secondaryColor;
|
||||
|
||||
@@ -63,7 +63,7 @@ public class GuiSolderingIron extends GuiForestry<ContainerSolderingIron, ItemIn
|
||||
try {
|
||||
ICircuitSocketType socketType = layout.getSocketType();
|
||||
if (CircuitSocketType.FARM.equals(socketType)) {
|
||||
FarmDirection farmDirection = FarmDirection.fromOrdinal(i);
|
||||
FarmDirection farmDirection = FarmDirection.values()[i];
|
||||
String farmDirectionString = farmDirection.toString().toLowerCase(Locale.ENGLISH);
|
||||
String localizedDirection = StringUtil.localize("gui.solder." + farmDirectionString);
|
||||
fontRendererObj.drawString(
|
||||
|
||||
@@ -50,7 +50,7 @@ public class ItemCircuitBoard extends ItemForestryMultiPass {
|
||||
|
||||
@Override
|
||||
public int getColorFromItemStack(ItemStack itemstack, int pass) {
|
||||
EnumCircuitBoardType type = EnumCircuitBoardType.VALUES[itemstack.getItemDamage()];
|
||||
EnumCircuitBoardType type = EnumCircuitBoardType.values()[itemstack.getItemDamage()];
|
||||
if (pass == 0) {
|
||||
return type.getPrimaryColor();
|
||||
} else {
|
||||
@@ -60,7 +60,7 @@ public class ItemCircuitBoard extends ItemForestryMultiPass {
|
||||
|
||||
@Override
|
||||
public String getUnlocalizedName(ItemStack stack) {
|
||||
EnumCircuitBoardType type = EnumCircuitBoardType.VALUES[stack.getItemDamage()];
|
||||
EnumCircuitBoardType type = EnumCircuitBoardType.values()[stack.getItemDamage()];
|
||||
return "item.for.circuitboard." + type.toString().toLowerCase(Locale.ENGLISH);
|
||||
}
|
||||
|
||||
|
||||
@@ -137,7 +137,6 @@ public class Config {
|
||||
public static boolean enableHints = true;
|
||||
public static final LinkedListMultimap<String, String> hints = LinkedListMultimap.create();
|
||||
public static boolean enableEnergyStat = true;
|
||||
public static boolean showBackpackDurability = true;
|
||||
|
||||
public static boolean isStructureEnabled(String uid) {
|
||||
return !Config.disabledStructures.contains(uid);
|
||||
@@ -302,9 +301,6 @@ public class Config {
|
||||
configCommon.moveProperty("tweaks.gui", "mail.alert", "tweaks.gui.mail.alert");
|
||||
configCommon.renameProperty("tweaks.gui.mail.alert", "mail.alert", "enabled");
|
||||
|
||||
showBackpackDurability = configCommon
|
||||
.getBooleanLocalized("tweaks.gui", "showBackpackDurability", showBackpackDurability);
|
||||
|
||||
mailAlertEnabled = configCommon.getBooleanLocalized("tweaks.gui.mail.alert", "enabled", mailAlertEnabled);
|
||||
mailAlertXPosition = configCommon.getEnumLocalized(
|
||||
"tweaks.gui.mail.alert",
|
||||
|
||||
@@ -109,7 +109,6 @@ public class Constants implements IForestryConstants {
|
||||
public static final int MACHINE_MAX_ENERGY = 5000;
|
||||
|
||||
public static final int RAINMAKER_RAIN_DURATION_IODINE = 10000;
|
||||
public static final int RAINMAKER_RAIN_DURATION_PHOSPHORICIODINE = 10000;
|
||||
|
||||
public static final int STILL_DESTILLATION_DURATION = 100;
|
||||
public static final int STILL_DESTILLATION_INPUT = 10;
|
||||
|
||||
@@ -14,6 +14,7 @@ import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.StatCollector;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
|
||||
@@ -28,7 +29,6 @@ import forestry.core.gui.GuiHandler;
|
||||
import forestry.core.gui.IGuiHandlerEntity;
|
||||
import forestry.core.gui.IHintSource;
|
||||
import forestry.core.tiles.ITitled;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public abstract class EntityMinecartForestry extends EntityMinecart
|
||||
implements ITitled, IRestrictedAccess, IHintSource, IGuiHandlerEntity {
|
||||
@@ -111,7 +111,7 @@ public abstract class EntityMinecartForestry extends EntityMinecart
|
||||
|
||||
@Override
|
||||
public String getCommandSenderName() {
|
||||
return StringUtil.localizeGuiTitle(getUnlocalizedTitle());
|
||||
return StatCollector.translateToLocal(getUnlocalizedTitle());
|
||||
}
|
||||
|
||||
/* ITitled */
|
||||
|
||||
@@ -193,7 +193,7 @@ public class BlockForestryFluid extends BlockFluidClassic {
|
||||
super.updateTick(world, x, y, z, rand);
|
||||
|
||||
// Start fires if the fluid is lava-like
|
||||
if (getMaterial() == Material.lava && world.checkChunksExist(x - 4, y, z - 4, x + 4, y, z + 4)) {
|
||||
if (getMaterial() == Material.lava) {
|
||||
int rangeUp = rand.nextInt(3);
|
||||
|
||||
for (int i = 0; i < rangeUp; ++i) {
|
||||
|
||||
@@ -202,8 +202,7 @@ public abstract class Genome implements IGenome {
|
||||
private static IChromosome[] getChromosomes(NBTTagCompound genomeNBT, ISpeciesRoot speciesRoot) {
|
||||
|
||||
NBTTagList chromosomesNBT = genomeNBT.getTagList("Chromosomes", 10);
|
||||
IAllele[] defaultTemplate = speciesRoot.getDefaultTemplate();
|
||||
IChromosome[] chromosomes = new IChromosome[defaultTemplate.length];
|
||||
IChromosome[] chromosomes = new IChromosome[speciesRoot.getDefaultTemplate().length];
|
||||
|
||||
for (int i = 0; i < chromosomesNBT.tagCount(); i++) {
|
||||
NBTTagCompound chromosomeNBT = chromosomesNBT.getCompoundTagAt(i);
|
||||
@@ -214,7 +213,7 @@ public abstract class Genome implements IGenome {
|
||||
chromosomes[chromosomeOrdinal] = chromosome;
|
||||
|
||||
if (Config.clearInvalidChromosomes) {
|
||||
IAllele template = defaultTemplate[chromosomeOrdinal];
|
||||
IAllele template = speciesRoot.getDefaultTemplate()[chromosomeOrdinal];
|
||||
Class<? extends IAllele> chromosomeClass = speciesRoot.getKaryotype()[chromosomeOrdinal]
|
||||
.getAlleleClass();
|
||||
if (chromosome.overrideInvalidAlleles(template, chromosomeClass)) {
|
||||
|
||||
@@ -72,12 +72,6 @@ public abstract class ItemGE extends ItemForestry {
|
||||
if (individual.isAnalyzed()) {
|
||||
if (Proxies.common.isShiftDown()) {
|
||||
individual.addTooltip(list);
|
||||
individual.addDiscoveredBy(list);
|
||||
if (Proxies.common.isCtrlDown()) {
|
||||
individual.addLore(list);
|
||||
} else {
|
||||
list.add(EnumChatFormatting.ITALIC + "<" + StringUtil.localize("gui.tooltip.tml") + ">");
|
||||
}
|
||||
} else {
|
||||
list.add(EnumChatFormatting.ITALIC + "<" + StringUtil.localize("gui.tooltip.tmi") + ">");
|
||||
}
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.genetics.mutations;
|
||||
|
||||
import static forestry.core.utils.MathUtil.safeMultiply;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@@ -128,9 +126,7 @@ public abstract class Mutation implements IMutationCustom {
|
||||
IGenome genome1, IClimateProvider climate) {
|
||||
float mutationChance = chance;
|
||||
for (IMutationCondition mutationCondition : mutationConditions) {
|
||||
mutationChance = safeMultiply(
|
||||
mutationChance,
|
||||
mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate));
|
||||
mutationChance *= mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate);
|
||||
if (mutationChance == 0) {
|
||||
return 0;
|
||||
}
|
||||
@@ -176,8 +172,4 @@ public abstract class Mutation implements IMutationCustom {
|
||||
public boolean isSecret() {
|
||||
return isSecret;
|
||||
}
|
||||
|
||||
public List<IMutationCondition> getMutationConditions() {
|
||||
return mutationConditions;
|
||||
}
|
||||
}
|
||||
@@ -32,10 +32,6 @@ public class MutationConditionRequiresResource implements IMutationCondition {
|
||||
blockRequired = new ItemStack(block, 1, meta);
|
||||
}
|
||||
|
||||
public ItemStack getBlockRequired() {
|
||||
return blockRequired.copy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
|
||||
IGenome genome1, IClimateProvider climate) {
|
||||
|
||||
-4
@@ -39,10 +39,6 @@ public class MutationConditionRequiresResourceOreDict implements IMutationCondit
|
||||
}
|
||||
}
|
||||
|
||||
public int getOreDictId() {
|
||||
return oreDictId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
|
||||
IGenome genome1, IClimateProvider climate) {
|
||||
|
||||
@@ -36,7 +36,8 @@ public abstract class ContainerForestry extends Container {
|
||||
// Player inventory
|
||||
for (int row = 0; row < 3; row++) {
|
||||
for (int column = 0; column < 9; column++) {
|
||||
addNormalSlot(playerInventory, column + row * 9 + 9, xInv + column * 18, yInv + row * 18);
|
||||
addSlotToContainer(
|
||||
new Slot(playerInventory, column + row * 9 + 9, xInv + column * 18, yInv + row * 18));
|
||||
}
|
||||
}
|
||||
// Player hotbar
|
||||
@@ -45,10 +46,6 @@ public abstract class ContainerForestry extends Container {
|
||||
}
|
||||
}
|
||||
|
||||
protected void addNormalSlot(InventoryPlayer playerInventory, int slot, int x, int y) {
|
||||
addSlotToContainer(new Slot(playerInventory, slot, x, y));
|
||||
}
|
||||
|
||||
protected void addHotbarSlot(InventoryPlayer playerInventory, int slot, int x, int y) {
|
||||
addSlotToContainer(new Slot(playerInventory, slot, x, y));
|
||||
}
|
||||
|
||||
@@ -26,17 +26,6 @@ public abstract class ContainerItemInventory<I extends ItemInventory> extends Co
|
||||
addPlayerInventory(playerInventory, xInv, yInv);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addNormalSlot(InventoryPlayer playerInventory, int slot, int x, int y) {
|
||||
ItemStack stackInSlot = playerInventory.getStackInSlot(slot);
|
||||
|
||||
if (inventory.isParentItemInventory(stackInSlot)) {
|
||||
addSlotToContainer(new SlotLocked(playerInventory, slot, x, y));
|
||||
} else {
|
||||
addSlotToContainer(new Slot(playerInventory, slot, x, y));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addHotbarSlot(InventoryPlayer playerInventory, int slot, int x, int y) {
|
||||
ItemStack stackInSlot = playerInventory.getStackInSlot(slot);
|
||||
@@ -64,13 +53,4 @@ public abstract class ContainerItemInventory<I extends ItemInventory> extends Co
|
||||
inventory.onSlotClick(player);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectAndSendChanges() {
|
||||
if (!inventory.isParentItemEquipped()) {
|
||||
inventory.getPlayer().closeScreen();
|
||||
return;
|
||||
}
|
||||
super.detectAndSendChanges();
|
||||
}
|
||||
}
|
||||
@@ -10,9 +10,9 @@ package forestry.core.gui;
|
||||
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
import forestry.core.tiles.ITitled;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public abstract class GuiForestryTitled<C extends Container, I extends ITitled & IInventory> extends GuiForestry<C, I> {
|
||||
|
||||
@@ -24,7 +24,7 @@ public abstract class GuiForestryTitled<C extends Container, I extends ITitled &
|
||||
protected void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) {
|
||||
super.drawGuiContainerBackgroundLayer(f, mouseX, mouseY);
|
||||
|
||||
String name = StringUtil.localizeGuiTitle(inventory.getUnlocalizedTitle());
|
||||
String name = StatCollector.translateToLocal(inventory.getUnlocalizedTitle());
|
||||
textLayout.line = 6;
|
||||
textLayout.drawCenteredLine(name, 0, fontColor.get("gui.title"));
|
||||
bindTexture(textureFile);
|
||||
|
||||
@@ -8,10 +8,6 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.gui;
|
||||
|
||||
import static forestry.core.inventory.ItemLocation.Type.PLAYER_INVENTORY;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
@@ -22,7 +18,6 @@ import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.common.network.IGuiHandler;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.core.inventory.ItemLocation;
|
||||
|
||||
public class GuiHandler implements IGuiHandler {
|
||||
|
||||
@@ -44,20 +39,6 @@ public class GuiHandler implements IGuiHandler {
|
||||
entityplayer.openGui(ForestryAPI.instance, guiData, entityplayer.worldObj, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens gui for item placed in player's inventory.
|
||||
*
|
||||
* @param entityPlayer Player.
|
||||
* @param guiHandler GUI handler for item.
|
||||
* @param data Data for item.
|
||||
* @param invSlotIdx Index or slot in player inventory should be in range [0, 40).
|
||||
*/
|
||||
public static void openGui(EntityPlayer entityPlayer, IGuiHandlerItem guiHandler, short data, int invSlotIdx) {
|
||||
assert invSlotIdx >= 0 && invSlotIdx < 40 : "Incorrect inventory index is used: " + invSlotIdx;
|
||||
int guiData = encodeGuiData(guiHandler, data, invSlotIdx);
|
||||
entityPlayer.openGui(ForestryAPI.instance, guiData, entityPlayer.worldObj, 0, 0, 0);
|
||||
}
|
||||
|
||||
public static void openGui(EntityPlayer entityplayer, IGuiHandlerTile guiHandler) {
|
||||
openGui(entityplayer, guiHandler, (short) 0);
|
||||
}
|
||||
@@ -75,32 +56,8 @@ public class GuiHandler implements IGuiHandler {
|
||||
}
|
||||
|
||||
private static int encodeGuiData(IGuiHandlerForestry guiHandler, short data) {
|
||||
return encodeGuiData(guiHandler, data, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes data required for GUI handler to function properly. Because of minecraft implementation we are limited to
|
||||
* 32 bits.
|
||||
*
|
||||
* @param guiHandler GUI handler.
|
||||
* @param data High bits which were encoded by GUI handler.
|
||||
* @param invSlotIdx Slot index in the player's inventory should be in range [0,40).
|
||||
* @return Encoded data.
|
||||
*/
|
||||
private static int encodeGuiData(IGuiHandlerForestry guiHandler, short data, int invSlotIdx) {
|
||||
// inventory slot idx will be encoded in third byte
|
||||
// player inventory has 40 slots which means that we need 6 bits to encode all values.
|
||||
// first 2 bits are reserved for type currently values 0(heldItem) and 1(item inventory) have meaning,
|
||||
// 2 and 3 are reserved for possible extension.
|
||||
if (invSlotIdx < -1 || invSlotIdx >= 40) {
|
||||
throw new IllegalArgumentException("Inventory slot index should be in range [-1, 40)");
|
||||
}
|
||||
|
||||
int invData = invSlotIdx == -1 ? 0 : (0x40 | invSlotIdx);
|
||||
|
||||
GuiId guiId = GuiIdRegistry.getGuiIdForGuiHandler(guiHandler);
|
||||
|
||||
return data << 16 | invData << 8 | guiId.getId();
|
||||
return data << 16 | guiId.getId();
|
||||
}
|
||||
|
||||
private static GuiId decodeGuiID(int guiData) {
|
||||
@@ -112,24 +69,8 @@ public class GuiHandler implements IGuiHandler {
|
||||
return (short) (guiId >> 16);
|
||||
}
|
||||
|
||||
private static int decodeInvSlotIdx(int guiData) {
|
||||
boolean invEncoded = (0x00_00_40_00 & guiData) != 0;
|
||||
|
||||
return invEncoded ? (guiData & 0x00_00_3F_00) >> 8 : -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getClientGuiElement(int guiData, EntityPlayer player, World world, int x, int y, int z) {
|
||||
return getGuiElement(false, guiData, player, world, x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getServerGuiElement(int guiData, EntityPlayer player, World world, int x, int y, int z) {
|
||||
return getGuiElement(true, guiData, player, world, x, y, z);
|
||||
}
|
||||
|
||||
private @Nullable Object getGuiElement(boolean isServerSide, int guiData, EntityPlayer player, World world, int x,
|
||||
int y, int z) {
|
||||
GuiId guiId = decodeGuiID(guiData);
|
||||
if (guiId == null) {
|
||||
return null;
|
||||
@@ -138,25 +79,11 @@ public class GuiHandler implements IGuiHandler {
|
||||
|
||||
switch (guiId.getGuiType()) {
|
||||
case Item: {
|
||||
int slotIdx = decodeInvSlotIdx(guiData);
|
||||
ItemStack heldItem;
|
||||
ItemLocation loc;
|
||||
if (slotIdx == -1) {
|
||||
heldItem = player.getCurrentEquippedItem();
|
||||
loc = ItemLocation.HELD_BY_PLAYER;
|
||||
} else {
|
||||
heldItem = player.inventory.getStackInSlot(slotIdx);
|
||||
loc = new ItemLocation(PLAYER_INVENTORY, slotIdx);
|
||||
}
|
||||
|
||||
ItemStack heldItem = player.getCurrentEquippedItem();
|
||||
if (heldItem != null) {
|
||||
Item item = heldItem.getItem();
|
||||
if (guiId.getGuiHandlerClass().isInstance(item)) {
|
||||
if (isServerSide) {
|
||||
return ((IGuiHandlerItem) item).getContainer(player, heldItem, data, loc);
|
||||
}
|
||||
|
||||
return ((IGuiHandlerItem) item).getGui(player, heldItem, data, loc);
|
||||
return ((IGuiHandlerItem) item).getGui(player, heldItem, data);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -164,9 +91,6 @@ public class GuiHandler implements IGuiHandler {
|
||||
case Tile: {
|
||||
TileEntity tileEntity = world.getTileEntity(x, y, z);
|
||||
if (guiId.getGuiHandlerClass().isInstance(tileEntity)) {
|
||||
if (isServerSide) {
|
||||
return ((IGuiHandlerTile) tileEntity).getContainer(player, data);
|
||||
}
|
||||
return ((IGuiHandlerTile) tileEntity).getGui(player, data);
|
||||
}
|
||||
break;
|
||||
@@ -174,9 +98,6 @@ public class GuiHandler implements IGuiHandler {
|
||||
case Entity: {
|
||||
Entity entity = world.getEntityByID(x);
|
||||
if (guiId.getGuiHandlerClass().isInstance(entity)) {
|
||||
if (isServerSide) {
|
||||
return ((IGuiHandlerEntity) entity).getContainer(player, data);
|
||||
}
|
||||
return ((IGuiHandlerEntity) entity).getGui(player, data);
|
||||
}
|
||||
break;
|
||||
@@ -184,4 +105,41 @@ public class GuiHandler implements IGuiHandler {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getServerGuiElement(int guiData, EntityPlayer player, World world, int x, int y, int z) {
|
||||
GuiId guiId = decodeGuiID(guiData);
|
||||
if (guiId == null) {
|
||||
return null;
|
||||
}
|
||||
short data = decodeGuiData(guiData);
|
||||
|
||||
switch (guiId.getGuiType()) {
|
||||
case Item: {
|
||||
ItemStack heldItem = player.getCurrentEquippedItem();
|
||||
if (heldItem != null) {
|
||||
Item item = heldItem.getItem();
|
||||
if (guiId.getGuiHandlerClass().isInstance(item)) {
|
||||
return ((IGuiHandlerItem) item).getContainer(player, heldItem, data);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Tile: {
|
||||
TileEntity tileEntity = world.getTileEntity(x, y, z);
|
||||
if (guiId.getGuiHandlerClass().isInstance(tileEntity)) {
|
||||
return ((IGuiHandlerTile) tileEntity).getContainer(player, data);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Entity: {
|
||||
Entity entity = world.getEntityByID(x);
|
||||
if (guiId.getGuiHandlerClass().isInstance(entity)) {
|
||||
return ((IGuiHandlerEntity) entity).getContainer(player, data);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -119,13 +119,6 @@ public class GuiIdRegistry {
|
||||
classMap.put(tileGuiHandlerClass, guiId);
|
||||
idMap.put(guiId.getId(), guiId);
|
||||
}
|
||||
|
||||
if (idMap.size() > 256) {
|
||||
// see {@link GuiHandler.encodeGuiData(forestry.core.gui.IGuiHandlerForestry, short, int)}
|
||||
throw new IllegalStateException(
|
||||
"Current implementation can't have more than different 256 GUI handlers "
|
||||
+ "because its id is coded by 8 bits");
|
||||
}
|
||||
}
|
||||
|
||||
public static GuiId getGuiIdForGuiHandler(IGuiHandlerForestry guiHandler) {
|
||||
|
||||
@@ -27,7 +27,6 @@ public class GuiUtil {
|
||||
|
||||
public static void drawItemStack(GuiForestry<?, ?> gui, ItemStack stack, int xPos, int yPos) {
|
||||
GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
|
||||
GL11.glEnable(GL11.GL_DEPTH_TEST);
|
||||
RenderHelper.enableGUIStandardItemLighting();
|
||||
|
||||
RenderItem itemRender = GuiForestry.getItemRenderer();
|
||||
|
||||
@@ -11,11 +11,9 @@ package forestry.core.gui;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import forestry.core.inventory.ItemLocation;
|
||||
|
||||
public interface IGuiHandlerItem extends IGuiHandlerForestry {
|
||||
|
||||
Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc);
|
||||
Object getGui(EntityPlayer player, ItemStack heldItem, int data);
|
||||
|
||||
Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc);
|
||||
Object getContainer(EntityPlayer player, ItemStack heldItem, int data);
|
||||
}
|
||||
@@ -28,17 +28,11 @@ public abstract class ItemInventory implements IInventory, IFilterSlotDelegate {
|
||||
private final EntityPlayer player;
|
||||
private final ItemStack parent;
|
||||
private final ItemStack[] inventoryStacks;
|
||||
private final ItemLocation location;
|
||||
|
||||
public ItemInventory(EntityPlayer player, int size, ItemStack parent) {
|
||||
this(player, size, parent, ItemLocation.UNKNOWN);
|
||||
}
|
||||
|
||||
public ItemInventory(EntityPlayer player, int size, ItemStack parent, ItemLocation loc) {
|
||||
this.player = player;
|
||||
this.parent = parent;
|
||||
this.inventoryStacks = new ItemStack[size];
|
||||
this.location = loc;
|
||||
|
||||
setUID(); // Set a uid to identify the itemstack on SMP
|
||||
|
||||
@@ -84,32 +78,13 @@ public abstract class ItemInventory implements IInventory, IFilterSlotDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isParentItemEquipped() {
|
||||
return switch (location.type()) {
|
||||
case HELD_BY_PLAYER, UNKNOWN -> isSameItemInventory(player.getCurrentEquippedItem(), parent);
|
||||
case PLAYER_INVENTORY -> isSameItemInventory(player.inventory.getStackInSlot(location.slotIdx()), parent);
|
||||
};
|
||||
}
|
||||
|
||||
public EntityPlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public ItemLocation getLocation() {
|
||||
return location;
|
||||
}
|
||||
|
||||
public boolean isParentItemInventory(ItemStack itemStack) {
|
||||
ItemStack parent = getParent();
|
||||
return isSameItemInventory(parent, itemStack);
|
||||
}
|
||||
|
||||
protected ItemStack getParent() {
|
||||
ItemStack equipped = switch (location.type()) {
|
||||
case HELD_BY_PLAYER, UNKNOWN -> player.getCurrentEquippedItem();
|
||||
case PLAYER_INVENTORY -> player.inventory.getStackInSlot(location.slotIdx());
|
||||
};
|
||||
|
||||
ItemStack equipped = player.getCurrentEquippedItem();
|
||||
if (isSameItemInventory(equipped, parent)) {
|
||||
return equipped;
|
||||
}
|
||||
|
||||
@@ -121,11 +121,11 @@ public class ItemInventorySolderingIron extends ItemInventory implements IErrorS
|
||||
}
|
||||
|
||||
// Illegal type
|
||||
if (blank.getItemDamage() < 0 || blank.getItemDamage() >= EnumCircuitBoardType.VALUES.length) {
|
||||
if (blank.getItemDamage() < 0 || blank.getItemDamage() >= EnumCircuitBoardType.values().length) {
|
||||
return;
|
||||
}
|
||||
|
||||
EnumCircuitBoardType type = EnumCircuitBoardType.VALUES[blank.getItemDamage()];
|
||||
EnumCircuitBoardType type = EnumCircuitBoardType.values()[blank.getItemDamage()];
|
||||
if (getCircuitCount() != type.getSockets()) {
|
||||
return;
|
||||
}
|
||||
@@ -172,7 +172,7 @@ public class ItemInventorySolderingIron extends ItemInventory implements IErrorS
|
||||
if (blankCircuitBoard == null) {
|
||||
errorStates.add(EnumErrorCode.NO_CIRCUIT_BOARD);
|
||||
} else {
|
||||
EnumCircuitBoardType type = EnumCircuitBoardType.VALUES[blankCircuitBoard.getItemDamage()];
|
||||
EnumCircuitBoardType type = EnumCircuitBoardType.values()[blankCircuitBoard.getItemDamage()];
|
||||
|
||||
int circuitCount = 0;
|
||||
for (short i = 0; i < type.getSockets(); i++) {
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
package forestry.core.inventory;
|
||||
|
||||
/**
|
||||
* Location of items in inventory.
|
||||
*/
|
||||
public class ItemLocation {
|
||||
|
||||
public enum Type {
|
||||
UNKNOWN,
|
||||
HELD_BY_PLAYER,
|
||||
PLAYER_INVENTORY
|
||||
}
|
||||
|
||||
public static final ItemLocation UNKNOWN = new ItemLocation(Type.UNKNOWN, -1);
|
||||
public static final ItemLocation HELD_BY_PLAYER = new ItemLocation(Type.HELD_BY_PLAYER, -1);
|
||||
|
||||
private final Type type;
|
||||
private final int slotIdx;
|
||||
|
||||
public ItemLocation(Type type, int slotIdx) {
|
||||
this.type = type;
|
||||
this.slotIdx = slotIdx;
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public int slotIdx() {
|
||||
return slotIdx;
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@ public class ItemForestryTool extends ItemForestry {
|
||||
setMaxDamage(200);
|
||||
this.remnants = remnants;
|
||||
if (remnants != null) {
|
||||
MinecraftForge.EVENT_BUS.register(new EventHandler());
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,20 @@ public class ItemForestryTool extends ItemForestry {
|
||||
return ForgeHooks.canToolHarvestBlock(block, 0, stack);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onDestroyCurrentItem(PlayerDestroyItemEvent event) {
|
||||
if (event.original == null || event.original.getItem() != this) {
|
||||
return;
|
||||
}
|
||||
|
||||
EntityPlayer player = event.entityPlayer;
|
||||
World world = player.worldObj;
|
||||
|
||||
if (!world.isRemote && remnants != null) {
|
||||
ItemStackUtil.dropItemStackAsEntity(remnants.copy(), world, player.posX, player.posY, player.posZ);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockDestroyed(ItemStack itemstack, World world, Block block, int x, int y, int z,
|
||||
EntityLivingBase entityliving) {
|
||||
@@ -66,21 +80,4 @@ public class ItemForestryTool extends ItemForestry {
|
||||
public boolean isFull3D() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public class EventHandler {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onDestroyCurrentItem(PlayerDestroyItemEvent event) {
|
||||
if (event.original == null || event.original.getItem() != ItemForestryTool.this) {
|
||||
return;
|
||||
}
|
||||
|
||||
EntityPlayer player = event.entityPlayer;
|
||||
World world = player.worldObj;
|
||||
|
||||
if (!world.isRemote && remnants != null) {
|
||||
ItemStackUtil.dropItemStackAsEntity(remnants.copy(), world, player.posX, player.posY, player.posZ);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,9 +34,6 @@ public class ItemFruit extends ItemForestryFood {
|
||||
DATES("cropDate"),
|
||||
PAPAYA("cropPapaya"); // , COCONUT("cropCoconut");
|
||||
|
||||
/**
|
||||
* Cached values() array for frequent read-only operations, the array should NOT be mutated.
|
||||
*/
|
||||
public static final EnumFruit[] VALUES = values();
|
||||
|
||||
private final String oreDict;
|
||||
@@ -97,13 +94,13 @@ public class ItemFruit extends ItemForestryFood {
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIconFromDamage(int meta) {
|
||||
return EnumFruit.VALUES[meta].getIcon();
|
||||
return EnumFruit.values()[meta].getIcon();
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List itemList) {
|
||||
for (int i = 0; i < EnumFruit.VALUES.length; i++) {
|
||||
for (int i = 0; i < EnumFruit.values().length; i++) {
|
||||
itemList.add(new ItemStack(this, 1, i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,10 +8,6 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.items;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
@@ -67,7 +63,7 @@ public class ItemRegistryCore extends ItemRegistry {
|
||||
|
||||
/* Peat */
|
||||
public final ItemForestry peat;
|
||||
private final ItemForestry ash;
|
||||
public final ItemForestry ash;
|
||||
public final ItemForestry bituminousPeat;
|
||||
|
||||
/* Moistener */
|
||||
@@ -78,7 +74,6 @@ public class ItemRegistryCore extends ItemRegistry {
|
||||
/* Rainmaker */
|
||||
public final ItemForestry iodineCharge;
|
||||
public final ItemForestry phosphor;
|
||||
public final ItemForestry phosphorCharge;
|
||||
|
||||
/* Misc */
|
||||
public final ItemCraftingMaterial craftingMaterial;
|
||||
@@ -92,26 +87,19 @@ public class ItemRegistryCore extends ItemRegistry {
|
||||
fertilizerBio = registerItem(new ItemForestry(), "fertilizerBio");
|
||||
fertilizerCompound = registerItem(new ItemForestryBonemeal(), "fertilizerCompound");
|
||||
|
||||
apatite = registerItem(new ItemForestry(), "apatite");
|
||||
OreDictionary.registerOre("gemApatite", apatite);
|
||||
|
||||
researchNote = registerItem(new ItemResearchNote(), "researchNote");
|
||||
|
||||
if (!isDreamcraftLoaded) {
|
||||
apatite = registerItem(new ItemForestry(), "apatite");
|
||||
OreDictionary.registerOre("gemApatite", apatite);
|
||||
ingotCopper = registerItem(new ItemForestry(), "ingotCopper");
|
||||
OreDictionary.registerOre("ingotCopper", ingotCopper);
|
||||
|
||||
ingotCopper = registerItem(new ItemForestry(), "ingotCopper");
|
||||
OreDictionary.registerOre("ingotCopper", ingotCopper);
|
||||
ingotTin = registerItem(new ItemForestry(), "ingotTin");
|
||||
OreDictionary.registerOre("ingotTin", ingotTin);
|
||||
|
||||
ingotTin = registerItem(new ItemForestry(), "ingotTin");
|
||||
OreDictionary.registerOre("ingotTin", ingotTin);
|
||||
|
||||
ingotBronze = registerItem(new ItemForestry(), "ingotBronze");
|
||||
OreDictionary.registerOre("ingotBronze", ingotBronze);
|
||||
} else {
|
||||
apatite = null;
|
||||
ingotCopper = null;
|
||||
ingotTin = null;
|
||||
ingotBronze = null;
|
||||
}
|
||||
ingotBronze = registerItem(new ItemForestry(), "ingotBronze");
|
||||
OreDictionary.registerOre("ingotBronze", ingotBronze);
|
||||
|
||||
wrench = registerItem(new ItemWrench(), "wrench");
|
||||
pipette = registerItem(new ItemPipette(), "pipette");
|
||||
@@ -182,8 +170,8 @@ public class ItemRegistryCore extends ItemRegistry {
|
||||
|
||||
// / RAINMAKER SUBSTRATES
|
||||
iodineCharge = registerItem(new ItemForestry(), "iodineCapsule");
|
||||
|
||||
phosphor = registerItem(new ItemForestry(), "phosphor");
|
||||
phosphorCharge = registerItem(new ItemForestry(), "phosphoricIodineCapsule");
|
||||
|
||||
// / BEE RESOURCES
|
||||
beeswax = registerItem(new ItemForestry(), "beeswax");
|
||||
@@ -194,17 +182,9 @@ public class ItemRegistryCore extends ItemRegistry {
|
||||
|
||||
// FRUITS
|
||||
fruits = registerItem(new ItemFruit(), "fruits");
|
||||
for (ItemFruit.EnumFruit def : ItemFruit.EnumFruit.VALUES) {
|
||||
for (ItemFruit.EnumFruit def : ItemFruit.EnumFruit.values()) {
|
||||
ItemStack fruit = new ItemStack(fruits, 1, def.ordinal());
|
||||
OreDictionary.registerOre(def.getOreDict(), fruit);
|
||||
}
|
||||
}
|
||||
|
||||
public ItemStack getAsh() {
|
||||
List<ItemStack> options = OreDictionary.getOres("dustAsh");
|
||||
for (ItemStack option : options) {
|
||||
if (option.getItem() != ash) return option.copy();
|
||||
}
|
||||
return ash.getItemStack();
|
||||
}
|
||||
}
|
||||
@@ -15,17 +15,16 @@ import forestry.core.circuits.ContainerSolderingIron;
|
||||
import forestry.core.circuits.GuiSolderingIron;
|
||||
import forestry.core.circuits.ISolderingIron;
|
||||
import forestry.core.inventory.ItemInventorySolderingIron;
|
||||
import forestry.core.inventory.ItemLocation;
|
||||
|
||||
public class ItemSolderingIron extends ItemWithGui implements ISolderingIron {
|
||||
|
||||
@Override
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
return new GuiSolderingIron(player, new ItemInventorySolderingIron(player, heldItem));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
|
||||
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
|
||||
return new ContainerSolderingIron(player, new ItemInventorySolderingIron(player, heldItem));
|
||||
}
|
||||
}
|
||||
@@ -33,7 +33,7 @@ public abstract class ItemWithGui extends ItemForestry implements IGuiHandlerIte
|
||||
}
|
||||
|
||||
protected void openGui(EntityPlayer entityplayer) {
|
||||
GuiHandler.openGui(entityplayer, this, (short) 0, entityplayer.inventory.currentItem);
|
||||
GuiHandler.openGui(entityplayer, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -28,7 +28,7 @@ public enum PacketIdServer implements IPacketId {
|
||||
BEE_LOGIC_ACTIVE_ENTITY_REQUEST,
|
||||
|
||||
// Factory
|
||||
NEI_SELECT,
|
||||
WORKTABLE_NEI_SELECT,
|
||||
|
||||
// Mail
|
||||
LETTER_INFO_REQUEST,
|
||||
|
||||
@@ -61,10 +61,6 @@ public class ProxyCommon {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isCtrlDown() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void playSoundFX(World world, int x, int y, int z, Block block) {
|
||||
Proxies.net.sendNetworkPacket(new PacketFXSignal(PacketFXSignal.SoundFXType.LEAF, x, y, z, block, 0), world);
|
||||
}
|
||||
|
||||
@@ -63,11 +63,6 @@ public class ProxyCommonClient extends ProxyCommon {
|
||||
return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCtrlDown() {
|
||||
return Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName(ItemStack itemstack) {
|
||||
return itemstack.getItem().getItemStackDisplayName(itemstack);
|
||||
|
||||
@@ -23,7 +23,7 @@ import codechicken.nei.api.IOverlayHandler;
|
||||
import codechicken.nei.api.IStackPositioner;
|
||||
import codechicken.nei.recipe.IRecipeHandler;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.factory.network.packets.PacketNEISelect;
|
||||
import forestry.factory.network.packets.PacketWorktableNEISelect;
|
||||
|
||||
/**
|
||||
* @author bdew
|
||||
@@ -40,25 +40,9 @@ public class CustomOverlayHandler implements IOverlayHandler {
|
||||
this.forceShift = forceShift;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean requireShiftForOverlayRecipe() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void overlayRecipe(GuiContainer cont, IRecipeHandler recipe, int recipeIndex, boolean shift) {
|
||||
int offsetX = 25;
|
||||
int offsetY = 6;
|
||||
int gridSpacing = 18;
|
||||
List<PositionedStack> ingr;
|
||||
if (recipe instanceof IGridRecipeHandler gridHandler) {
|
||||
offsetX = gridHandler.getGridStartX();
|
||||
offsetY = gridHandler.getGridStartY();
|
||||
gridSpacing = gridHandler.getGridSpacing();
|
||||
ingr = gridHandler.getGridStacks(recipeIndex);
|
||||
} else {
|
||||
ingr = recipe.getIngredientStacks(recipeIndex);
|
||||
}
|
||||
List<PositionedStack> ingr = recipe.getIngredientStacks(recipeIndex);
|
||||
|
||||
if (shift || forceShift) {
|
||||
NBTTagList stacksnbt = new NBTTagList();
|
||||
@@ -66,8 +50,8 @@ public class CustomOverlayHandler implements IOverlayHandler {
|
||||
for (PositionedStack pstack : ingr) {
|
||||
if (pstack != null) {
|
||||
// This is back-asswards but i don't see a better way :(
|
||||
int x = (pstack.relx - offsetX) / gridSpacing;
|
||||
int y = (pstack.rely - offsetY) / gridSpacing;
|
||||
int x = (pstack.relx - 25) / 18;
|
||||
int y = (pstack.rely - 6) / 18;
|
||||
|
||||
ItemStack stack = pstack.item;
|
||||
NBTTagCompound stacknbt = stack.writeToNBT(new NBTTagCompound());
|
||||
@@ -84,7 +68,7 @@ public class CustomOverlayHandler implements IOverlayHandler {
|
||||
NBTTagCompound data = new NBTTagCompound();
|
||||
data.setTag("stacks", stacksnbt);
|
||||
|
||||
Proxies.net.sendToServer(new PacketNEISelect(data));
|
||||
Proxies.net.sendToServer(new PacketWorktableNEISelect(data));
|
||||
} else {
|
||||
IStackPositioner positioner = new OffsetPositioner(xOffs, yOffs);
|
||||
LayoutManager.overlayRenderer = new DefaultOverlayRenderer(ingr, positioner);
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
package forestry.core.recipes.nei;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import codechicken.nei.PositionedStack;
|
||||
|
||||
public interface IGridRecipeHandler {
|
||||
|
||||
int getGridStartX();
|
||||
|
||||
int getGridStartY();
|
||||
|
||||
int getGridSpacing();
|
||||
|
||||
List<PositionedStack> getGridStacks(int recipeIndex);
|
||||
|
||||
}
|
||||
@@ -19,8 +19,6 @@ import forestry.api.arboriculture.TreeManager;
|
||||
import forestry.api.lepidopterology.ButterflyManager;
|
||||
import forestry.api.lepidopterology.EnumFlutterType;
|
||||
import forestry.core.utils.Log;
|
||||
import forestry.factory.gui.GuiCarpenter;
|
||||
import forestry.factory.gui.GuiFabricator;
|
||||
import forestry.factory.gui.GuiWorktable;
|
||||
import forestry.factory.recipes.nei.NEIHandlerBottler;
|
||||
import forestry.factory.recipes.nei.NEIHandlerCarpenter;
|
||||
@@ -48,8 +46,6 @@ public class NEIIntegrationConfig implements IConfigureNEI {
|
||||
|
||||
CustomOverlayHandler handler = new CustomOverlayHandler(-14, 14, true);
|
||||
API.registerGuiOverlayHandler(GuiWorktable.class, handler, "crafting");
|
||||
API.registerGuiOverlayHandler(GuiCarpenter.class, handler, "forestry.carpenter");
|
||||
API.registerGuiOverlayHandler(GuiFabricator.class, handler, "forestry.fabricator");
|
||||
|
||||
API.addSubset(
|
||||
"Forestry.Bees.Princesses",
|
||||
|
||||
Loaded 100 of 351 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user