mirror of
https://github.com/GTNewHorizons/ForestryMC.git
synced 2026-11-15 17:44:55 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
18e26956ef | ||
|
|
713b0f9d9e | ||
|
|
c6f2e3c7b3 | ||
|
|
c6d8518d82 | ||
|
|
98711e5d34 | ||
|
|
5caab59507 | ||
|
|
41d47d99ca | ||
|
|
3c6d5d04d0 | ||
|
|
137927b3e6 | ||
|
|
8aa7e05bbe | ||
|
|
16414da3f2 | ||
|
|
11eb4b62df | ||
|
|
a172cb379f | ||
|
|
c979d1fa79 | ||
|
|
ef5825edcf | ||
|
|
9570cb2982 | ||
|
|
f89a074393 | ||
|
|
19457080bf | ||
|
|
d6ec27209b | ||
|
|
a0435886ab | ||
|
|
2ab8613bec | ||
|
|
9d31dedd35 | ||
|
|
2dd539c3df | ||
|
|
fd2ac7d172 | ||
|
|
466110d461 | ||
|
|
ecf0d7165c | ||
|
|
dde3514dce | ||
|
|
0f24a4e043 | ||
|
|
3ed2ecfdd0 | ||
|
|
be548b06cc | ||
|
|
7db0dc7767 | ||
|
|
2e20b14e06 |
No files matched your search
@@ -3,17 +3,9 @@ Forestry
|
||||
|
||||
### What is it?
|
||||
|
||||
This is the GTNH fork of Forestry for 1.7.10. Do not report any issues to the original Forestry team. This fork is maintained by the GTNH team and is not supported by the original Forestry team.
|
||||
Forestry is a modification for the game Minecraft and known primarily for its farms and bees.
|
||||
|
||||
### Homepage
|
||||
|
||||
[Wiki](http://forestry.sengir.net/)
|
||||
|
||||
[Latest Builds for 1.7.10](http://jenkins.ic2.player.to/job/Forestry_Dev/)
|
||||
|
||||
[IRC #forestry on esper.net](http://webchat.esper.net/?nick=ForestryGithub...&channels=forestry&prompt=1)
|
||||
|
||||
For those interested in developement, you can also visit #forestry-dev.
|
||||
|
||||
### Building
|
||||
|
||||
@@ -31,8 +23,6 @@ Beware of ugly code.
|
||||
|
||||
Bugfixes are generally welcome. If you want to contribute something which changes game mechanics, please talk to someone with commit privileges first. Nothing is more frustrating than putting a lot of work and effort into a new game mechanic and then having the PR rejected because it doesn’t fit gameplay-wise.
|
||||
|
||||
**If you submit a PR you must accept the [Contributor License Agreement](https://cla-assistant.io/ForestryMC/ForestryMC). There is no way around that, since otherwise changing the license later - even to something more permissive! - , becomes close to impossible.**
|
||||
|
||||
### License & Copyright
|
||||
|
||||
Forestry is (c) 2011 - 2014 SirSengir and licensed under LGPL v3. See the LICENSE.txt for all the gory details or go to http://www.gnu.org/licenses/lgpl-3.0.txt for more information. Forestry also contains code contributed by CovertJaguar, Player, MysteriousAges, Binnie, RichardG, cpw and others.
|
||||
Forestry is (c) 2011 - 2014 SirSengir and licensed under LGPL v3. See the LICENSE.txt for all the gory details or go to http://www.gnu.org/licenses/lgpl-3.0.txt for more information. Forestry also contains code contributed by CovertJaguar, Player, MysteriousAges, Binnie, RichardG, cpw, the GTNH Team, and others.
|
||||
+3
-2
@@ -2,8 +2,9 @@
|
||||
|
||||
dependencies {
|
||||
api('curse.maven:cofh-lib-220333:2388748')
|
||||
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.5.18-GTNH:dev')
|
||||
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.6.2:api')
|
||||
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-beta27:api')
|
||||
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.7.0-GTNH:dev')
|
||||
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.7.0: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')
|
||||
|
||||
+12
-1
@@ -85,6 +85,11 @@ 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
|
||||
|
||||
@@ -117,9 +122,15 @@ minimizeShadowedDependencies = true
|
||||
# If disabled, won't rename the shadowed classes.
|
||||
relocateShadowedDependencies = true
|
||||
|
||||
# Adds the GTNH maven, CurseMaven, IC2/Player maven, and some more well-known 1.7.10 repositories.
|
||||
# Adds 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.
|
||||
|
||||
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-8.6-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -55,7 +57,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
@@ -84,7 +86,8 @@ 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 "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
||||
' "$PWD" ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
Vendored
+2
@@ -13,6 +13,8 @@
|
||||
@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 ##########################################################################
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ pluginManagement {
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.14'
|
||||
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.30'
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ 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;
|
||||
@@ -79,11 +80,15 @@ 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);
|
||||
|
||||
@@ -52,4 +52,8 @@ public interface IIndividual extends INBTTagable {
|
||||
IIndividual copy();
|
||||
|
||||
boolean isPureBred(IChromosomeType chromosomeType);
|
||||
|
||||
default void addLore(List<String> text) {}
|
||||
|
||||
default void addDiscoveredBy(List<String> text) {}
|
||||
}
|
||||
@@ -97,7 +97,7 @@ public class BlockAlveary extends BlockStructure {
|
||||
/* TILE ENTITY CREATION */
|
||||
@Override
|
||||
public TileEntity createTileEntity(World world, int metadata) {
|
||||
if (metadata < 0 || metadata > Type.VALUES.length) {
|
||||
if (metadata < 0 || metadata >= Type.VALUES.length) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
******************************************************************************/
|
||||
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;
|
||||
@@ -15,6 +18,8 @@ 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;
|
||||
@@ -373,6 +378,36 @@ 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) {
|
||||
|
||||
@@ -699,9 +734,9 @@ public class Bee extends IndividualLiving implements IBee {
|
||||
|
||||
// boost chance for researched mutations
|
||||
if (breedingTracker.isResearched(beeMutation)) {
|
||||
float mutationBoost = chance * (Config.researchMutationBoostMultiplier - 1.0f);
|
||||
float mutationBoost = safeMultiply(chance, Config.researchMutationBoostMultiplier - 1.0f);
|
||||
mutationBoost = Math.min(Config.maxResearchMutationBoostPercent, mutationBoost);
|
||||
chance += mutationBoost;
|
||||
chance = safeAdd(chance, mutationBoost);
|
||||
}
|
||||
|
||||
if (chance > world.rand.nextFloat() * 100) {
|
||||
|
||||
@@ -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.ash.getItemStack(), 0.15f).setTemperature(EnumTemperature.HELLISH)
|
||||
.addProduct(PluginCore.items.getAsh(), 0.15f).setTemperature(EnumTemperature.HELLISH)
|
||||
.setHumidity(EnumHumidity.ARID);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import static forestry.core.utils.MathUtil.safeMultiply;
|
||||
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@@ -49,8 +51,8 @@ public class BeeMutation extends Mutation implements IBeeMutationCustom {
|
||||
IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
|
||||
IBeeModifier beeModeModifier = BeeManager.beeRoot.getBeekeepingMode(world).getBeeModifier();
|
||||
|
||||
processedChance *= beeHousingModifier.getMutationModifier(genome0, genome1, processedChance);
|
||||
processedChance *= beeModeModifier.getMutationModifier(genome0, genome1, processedChance);
|
||||
processedChance = safeMultiply(processedChance, beeHousingModifier.getMutationModifier(genome0, genome1, 1.0F));
|
||||
processedChance = safeMultiply(processedChance, beeModeModifier.getMutationModifier(genome0, genome1, 1.0F));
|
||||
|
||||
return processedChance;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ 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;
|
||||
@@ -21,7 +22,7 @@ import forestry.api.apiculture.BeeManager;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
import forestry.apiculture.blocks.BlockAlveary;
|
||||
import forestry.apiculture.multiblock.AlvearyController;
|
||||
import forestry.core.utils.DamageSourceForestry;
|
||||
import forestry.core.utils.vect.Vect;
|
||||
|
||||
@@ -36,8 +37,13 @@ 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 destroyEnvironment(genome, storedData, housing);
|
||||
return storedData;
|
||||
}
|
||||
|
||||
private boolean isMobGriefingEnabled(IBeeHousing housing) {
|
||||
return housing.getWorld().getGameRules().getGameRuleBooleanValue("mobGriefing");
|
||||
}
|
||||
|
||||
private void harmEntities(IBeeGenome genome, IBeeHousing housing) {
|
||||
@@ -56,7 +62,7 @@ public class AlleleEffectRadioactive extends AlleleEffectThrottled {
|
||||
}
|
||||
}
|
||||
|
||||
private static IEffectData destroyEnvironment(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
private static void destroyEnvironment(IBeeGenome genome, IBeeHousing housing) {
|
||||
World world = housing.getWorld();
|
||||
Random rand = world.rand;
|
||||
|
||||
@@ -65,43 +71,66 @@ 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);
|
||||
posBlock = posBlock.add(offset);
|
||||
Vect posBlock = randomPos.add(posHousing).add(offset);
|
||||
|
||||
if (posBlock.y <= 1 || posBlock.y >= housing.getWorld().getActualHeight()) {
|
||||
// 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)) {
|
||||
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;
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
Block block = world.getBlock(posBlock.x, posBlock.y, posBlock.z);
|
||||
|
||||
if (block instanceof BlockAlveary) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Never delete a tile entity. Allows far too much griefing and abuse otherwise.
|
||||
TileEntity tile = world.getTileEntity(posBlock.x, posBlock.y, posBlock.z);
|
||||
if (tile instanceof IBeeHousing) {
|
||||
if (tile != null) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
return storedData;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -15,11 +15,14 @@ import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import forestry.apiculture.blocks.BlockCandle;
|
||||
import forestry.apiculture.tiles.TileCandle;
|
||||
import forestry.core.proxy.Proxies;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RenderCandleBlock implements ISimpleBlockRenderingHandler {
|
||||
|
||||
@Override
|
||||
@@ -58,7 +61,7 @@ public class RenderCandleBlock implements ISimpleBlockRenderingHandler {
|
||||
IIcon iconB = block.getTextureFromPassAndLit(1, isLit);
|
||||
|
||||
int colour = tileCandle.getColour();
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
final Tessellator tessellator = Tessellator.instance;
|
||||
tessellator.setBrightness(world.getLightBrightnessForSkyBlocks(x, y, z, block.getLightValue(world, x, y, z)));
|
||||
tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
|
||||
double d0 = 0.4000000059604645D;
|
||||
@@ -87,7 +90,7 @@ public class RenderCandleBlock implements ISimpleBlockRenderingHandler {
|
||||
|
||||
private static void renderCandleAtAngle(IIcon icon, double x, double y, double z, double par8, double par10,
|
||||
int colour) {
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
final Tessellator tessellator = Tessellator.instance;
|
||||
double minU = icon.getMinU();
|
||||
double minV = icon.getMinV();
|
||||
double maxU = icon.getMaxU();
|
||||
|
||||
@@ -16,6 +16,8 @@ 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;
|
||||
@@ -298,6 +300,36 @@ 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) {
|
||||
|
||||
|
||||
@@ -15,11 +15,14 @@ import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import forestry.arboriculture.blocks.BlockFruitPod;
|
||||
import forestry.arboriculture.tiles.TileFruitPod;
|
||||
import forestry.plugins.PluginArboriculture;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RenderFruitPodBlock implements ISimpleBlockRenderingHandler {
|
||||
|
||||
@Override
|
||||
@@ -37,7 +40,7 @@ public class RenderFruitPodBlock implements ISimpleBlockRenderingHandler {
|
||||
maturity = pod.getMaturity();
|
||||
}
|
||||
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
final Tessellator tessellator = Tessellator.instance;
|
||||
tessellator.setBrightness(blockPod.getMixedBrightnessForBlock(world, x, y, z));
|
||||
tessellator.setColorOpaque_F(1.0f, 1.0f, 1.0f);
|
||||
int metadata = world.getBlockMetadata(x, y, z);
|
||||
|
||||
@@ -14,6 +14,8 @@ import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import forestry.arboriculture.blocks.BlockForestryLeaves;
|
||||
import forestry.arboriculture.tiles.TileLeaves;
|
||||
import forestry.core.render.RenderOverlayBlock;
|
||||
@@ -22,6 +24,7 @@ import forestry.plugins.PluginArboriculture;
|
||||
/**
|
||||
* Ugly but serviceable renderer for leaves, taking fruits into account.
|
||||
*/
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RenderLeavesBlock extends RenderOverlayBlock {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,6 +15,8 @@ import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import forestry.api.arboriculture.EnumGermlingType;
|
||||
import forestry.api.arboriculture.IAlleleTreeSpecies;
|
||||
@@ -22,10 +24,9 @@ import forestry.arboriculture.blocks.BlockSapling;
|
||||
import forestry.arboriculture.tiles.TileSapling;
|
||||
import forestry.plugins.PluginArboriculture;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RenderSaplingBlock implements ISimpleBlockRenderingHandler {
|
||||
|
||||
private static int renderLayer = 0;
|
||||
|
||||
@Override
|
||||
public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) {}
|
||||
|
||||
@@ -45,10 +46,8 @@ public class RenderSaplingBlock implements ISimpleBlockRenderingHandler {
|
||||
|
||||
IAlleleTreeSpecies species = tile.getTree().getGenome().getPrimary();
|
||||
|
||||
renderCrossedSquares(species, world, block, x, y, z);
|
||||
renderLayer = 1;
|
||||
renderCrossedSquares(species, world, block, x, y, z);
|
||||
renderLayer = 0;
|
||||
renderCrossedSquares(species, world, block, x, y, z, 0);
|
||||
renderCrossedSquares(species, world, block, x, y, z, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -63,9 +62,9 @@ public class RenderSaplingBlock implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
private static boolean renderCrossedSquares(IAlleleTreeSpecies species, IBlockAccess world, Block block, int x,
|
||||
int y, int z) {
|
||||
int y, int z, int renderLayer) {
|
||||
|
||||
Tessellator tess = Tessellator.instance;
|
||||
final Tessellator tess = Tessellator.instance;
|
||||
|
||||
tess.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
|
||||
int colourMultiplier = species.getGermlingColour(EnumGermlingType.SAPLING, renderLayer);
|
||||
@@ -81,14 +80,14 @@ public class RenderSaplingBlock implements ISimpleBlockRenderingHandler {
|
||||
}
|
||||
|
||||
tess.setColorOpaque_F(r, g, b);
|
||||
drawCrossedSquares(species, x, y, z, 1.0f);
|
||||
drawCrossedSquares(species, x, y, z, 1.0f, renderLayer);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void drawCrossedSquares(IAlleleTreeSpecies species, double par3, double par5, double par7,
|
||||
float mod) {
|
||||
private static void drawCrossedSquares(IAlleleTreeSpecies species, double par3, double par5, double par7, float mod,
|
||||
int renderLayer) {
|
||||
|
||||
Tessellator tess = Tessellator.instance;
|
||||
final Tessellator tess = Tessellator.instance;
|
||||
IIcon icon = species.getGermlingIcon(EnumGermlingType.SAPLING, renderLayer);
|
||||
|
||||
double d3 = (double) icon.getMinU();
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.blocks;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -52,7 +54,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) {
|
||||
if (metadata == 0 && !isDreamcraftLoaded) {
|
||||
this.dropXpOnBlockBreak(world, x, y, z, MathHelper.getRandomIntegerInRange(world.rand, 1, 4));
|
||||
}
|
||||
}
|
||||
@@ -61,7 +63,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()) {
|
||||
if (metadata == ResourceType.APATITE.ordinal() && !isDreamcraftLoaded) {
|
||||
int fortuneModifier = world.rand.nextInt(fortune + 2) - 1;
|
||||
if (fortuneModifier < 0) {
|
||||
fortuneModifier = 0;
|
||||
|
||||
@@ -72,6 +72,12 @@ 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,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.genetics.mutations;
|
||||
|
||||
import static forestry.core.utils.MathUtil.safeMultiply;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@@ -126,7 +128,9 @@ public abstract class Mutation implements IMutationCustom {
|
||||
IGenome genome1, IClimateProvider climate) {
|
||||
float mutationChance = chance;
|
||||
for (IMutationCondition mutationCondition : mutationConditions) {
|
||||
mutationChance *= mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate);
|
||||
mutationChance = safeMultiply(
|
||||
mutationChance,
|
||||
mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate));
|
||||
if (mutationChance == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -53,4 +53,13 @@ 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();
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,8 @@ import forestry.core.network.packets.PacketAccessUpdate;
|
||||
import forestry.core.network.packets.PacketErrorUpdate;
|
||||
import forestry.core.network.packets.PacketGuiEnergy;
|
||||
import forestry.core.network.packets.PacketGuiUpdate;
|
||||
import forestry.core.network.packets.PacketTileConfiguration;
|
||||
import forestry.core.tiles.IConfigurable;
|
||||
import forestry.core.tiles.IPowerHandler;
|
||||
import forestry.core.tiles.TilePowered;
|
||||
import forestry.core.tiles.TileUtil;
|
||||
@@ -34,6 +36,7 @@ public abstract class ContainerTile<T extends TileEntity> extends ContainerFores
|
||||
|
||||
protected final T tile;
|
||||
private final IAccessHandler accessHandler;
|
||||
private boolean configurationChanged;
|
||||
|
||||
protected ContainerTile(T tile) {
|
||||
this.tile = tile;
|
||||
@@ -43,6 +46,10 @@ public abstract class ContainerTile<T extends TileEntity> extends ContainerFores
|
||||
} else {
|
||||
accessHandler = FakeAccessHandler.getInstance();
|
||||
}
|
||||
|
||||
if (tile instanceof IConfigurable) {
|
||||
configurationChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
protected ContainerTile(T tileForestry, InventoryPlayer playerInventory, int xInv, int yInv) {
|
||||
@@ -128,6 +135,15 @@ public abstract class ContainerTile<T extends TileEntity> extends ContainerFores
|
||||
sendPacketToCrafters(packet);
|
||||
}
|
||||
}
|
||||
|
||||
if (tile instanceof IConfigurable && configurationChanged) {
|
||||
configurationChanged = false;
|
||||
sendPacketToCrafters(new PacketTileConfiguration(tile));
|
||||
}
|
||||
}
|
||||
|
||||
protected void markConfigurationDirty() {
|
||||
configurationChanged = true;
|
||||
}
|
||||
|
||||
public void onGuiEnergy(int energyStored) {
|
||||
|
||||
@@ -138,6 +138,10 @@ public abstract class Ledger {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean acceptMouseButton(int mouseButton) {
|
||||
return mouseButton == 0;
|
||||
}
|
||||
|
||||
public boolean intersectsWith(int mouseX, int mouseY) {
|
||||
return mouseX >= currentShiftX && mouseX <= currentShiftX + currentWidth
|
||||
&& mouseY >= currentShiftY
|
||||
|
||||
@@ -159,29 +159,28 @@ public class LedgerManager {
|
||||
}
|
||||
|
||||
public void handleMouseClicked(int x, int y, int mouseButton) {
|
||||
Ledger ledger = this.getAtPosition(x, y);
|
||||
if (ledger == null || !ledger.acceptMouseButton(mouseButton)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mouseButton == 0) {
|
||||
// Default action only if the mouse click was not handled by the
|
||||
// ledger itself.
|
||||
if (!ledger.handleMouseClicked(x, y, mouseButton)) {
|
||||
|
||||
Ledger ledger = this.getAtPosition(x, y);
|
||||
|
||||
// Default action only if the mouse click was not handled by the
|
||||
// ledger itself.
|
||||
if (ledger != null && !ledger.handleMouseClicked(x, y, mouseButton)) {
|
||||
|
||||
List<? extends Ledger> toggleLedgers;
|
||||
if (ledgers.contains(ledger)) {
|
||||
toggleLedgers = ledgers;
|
||||
} else {
|
||||
toggleLedgers = errorLedgers;
|
||||
}
|
||||
|
||||
for (Ledger other : toggleLedgers) {
|
||||
if (other != ledger && other.isOpen()) {
|
||||
other.toggleOpen();
|
||||
}
|
||||
}
|
||||
ledger.toggleOpen();
|
||||
List<? extends Ledger> toggleLedgers;
|
||||
if (ledgers.contains(ledger)) {
|
||||
toggleLedgers = ledgers;
|
||||
} else {
|
||||
toggleLedgers = errorLedgers;
|
||||
}
|
||||
|
||||
for (Ledger other : toggleLedgers) {
|
||||
if (other != ledger && other.isOpen()) {
|
||||
other.toggleOpen();
|
||||
}
|
||||
}
|
||||
ledger.toggleOpen();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
package forestry.core.gui.ledgers;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
import forestry.core.render.TextureManager;
|
||||
import forestry.core.tiles.IIngredientsSearchController;
|
||||
import forestry.core.tiles.IngredientsStorage;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class SearchIngregientsLedger extends Ledger {
|
||||
|
||||
private final IIngredientsSearchController ingredientsSearch;
|
||||
|
||||
public SearchIngregientsLedger(LedgerManager manager, IIngredientsSearchController ingredientsSearch) {
|
||||
super(manager, "search_ingredients");
|
||||
this.ingredientsSearch = ingredientsSearch;
|
||||
this.maxHeight = 36;
|
||||
}
|
||||
|
||||
private boolean isSwitchButton(int mouseX, int mouseY) {
|
||||
int shiftX = currentShiftX + 20;
|
||||
int shiftY = currentShiftY + 8;
|
||||
return mouseX >= shiftX && mouseX <= currentShiftX + currentWidth && mouseY >= shiftY && mouseY <= shiftY + 24;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(int x, int y) {
|
||||
// Draw background
|
||||
drawBackground(x, y);
|
||||
|
||||
// Draw icon
|
||||
IIcon icon = TextureManager.getInstance().getDefault(
|
||||
"misc/search_ingredients."
|
||||
+ ingredientsSearch.getIngredientsStorage().toString().toLowerCase(Locale.ENGLISH));
|
||||
drawIcon(icon, x + 3, y + 4);
|
||||
|
||||
// Draw description
|
||||
if (!isFullyOpened()) {
|
||||
return;
|
||||
}
|
||||
|
||||
drawHeader(StringUtil.localize("gui.search_ingredients"), x + 22, y + 8);
|
||||
drawText(
|
||||
StringUtil.localize(
|
||||
"gui.search_ingredients."
|
||||
+ ingredientsSearch.getIngredientsStorage().toString().toLowerCase(Locale.ENGLISH)),
|
||||
x + 22,
|
||||
y + 20);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTooltip() {
|
||||
return StringUtil.localize("gui.search_ingredients") + ": "
|
||||
+ StringUtil.localize(
|
||||
"gui.search_ingredients."
|
||||
+ ingredientsSearch.getIngredientsStorage().toString().toLowerCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleMouseClicked(int x, int y, int mouseButton) {
|
||||
if (isSwitchButton(x, y)) {
|
||||
IngredientsStorage ingredientsStorage = ingredientsSearch.getIngredientsStorage();
|
||||
IngredientsStorage newIngredientsStorage = mouseButton == 0 ? ingredientsStorage.next()
|
||||
: ingredientsStorage.previous();
|
||||
ingredientsSearch.setIngredientsStorage(newIngredientsStorage);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean acceptMouseButton(int mouseButton) {
|
||||
return mouseButton == 0 || mouseButton == 1;
|
||||
}
|
||||
}
|
||||
@@ -20,12 +20,14 @@ public class SlotCrafter extends SlotCrafting {
|
||||
|
||||
private final IInventory craftMatrix;
|
||||
private final ICrafterWorktable crafter;
|
||||
private final EntityPlayer player;
|
||||
|
||||
public SlotCrafter(EntityPlayer player, IInventory craftMatrix, ICrafterWorktable crafter, int slot, int xPos,
|
||||
int yPos) {
|
||||
super(player, craftMatrix, craftMatrix, slot, xPos, yPos);
|
||||
this.craftMatrix = craftMatrix;
|
||||
this.crafter = crafter;
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -39,7 +41,7 @@ public class SlotCrafter extends SlotCrafting {
|
||||
|
||||
@Override
|
||||
public boolean canTakeStack(EntityPlayer player) {
|
||||
return crafter.canTakeStack(getSlotIndex());
|
||||
return crafter.canTakeStack(player, getSlotIndex());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -49,7 +51,7 @@ public class SlotCrafter extends SlotCrafting {
|
||||
|
||||
@Override
|
||||
public boolean getHasStack() {
|
||||
return getStack() != null && crafter.canTakeStack(getSlotIndex());
|
||||
return getStack() != null && crafter.canTakeStack(player, getSlotIndex());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -78,6 +78,14 @@ public abstract class ItemInventory implements IInventory, IFilterSlotDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isParentItemEquipped() {
|
||||
return isSameItemInventory(player.getCurrentEquippedItem(), parent);
|
||||
}
|
||||
|
||||
public EntityPlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public boolean isParentItemInventory(ItemStack itemStack) {
|
||||
ItemStack parent = getParent();
|
||||
return isSameItemInventory(parent, itemStack);
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
package forestry.core.inventory;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class MergedInventories implements IInventory {
|
||||
|
||||
private final IInventory first;
|
||||
private final IInventory second;
|
||||
|
||||
public MergedInventories(IInventory first, IInventory second) {
|
||||
this.first = first;
|
||||
this.second = second;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSizeInventory() {
|
||||
return first.getSizeInventory() + second.getSizeInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlot(int slotIn) {
|
||||
if (slotIn < first.getSizeInventory()) {
|
||||
return first.getStackInSlot(slotIn);
|
||||
}
|
||||
return second.getStackInSlot(slotIn - first.getSizeInventory());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack decrStackSize(int index, int count) {
|
||||
if (index < first.getSizeInventory()) {
|
||||
return first.decrStackSize(index, count);
|
||||
}
|
||||
return second.decrStackSize(index - first.getSizeInventory(), count);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlotOnClosing(int index) {
|
||||
if (index < first.getSizeInventory()) {
|
||||
return first.getStackInSlotOnClosing(index);
|
||||
}
|
||||
return second.getStackInSlotOnClosing(index - first.getSizeInventory());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInventorySlotContents(int index, ItemStack stack) {
|
||||
if (index < first.getSizeInventory()) {
|
||||
first.setInventorySlotContents(index, stack);
|
||||
} else {
|
||||
second.setInventorySlotContents(index - first.getSizeInventory(), stack);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return first.getInventoryName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCustomInventoryName() {
|
||||
return first.hasCustomInventoryName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInventoryStackLimit() {
|
||||
return Math.min(first.getInventoryStackLimit(), second.getInventoryStackLimit());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markDirty() {
|
||||
first.markDirty();
|
||||
second.markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUseableByPlayer(EntityPlayer player) {
|
||||
return first.isUseableByPlayer(player) && second.isUseableByPlayer(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openInventory() {
|
||||
first.openInventory();
|
||||
second.openInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeInventory() {
|
||||
first.closeInventory();
|
||||
second.closeInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemValidForSlot(int index, ItemStack stack) {
|
||||
if (index < first.getSizeInventory()) {
|
||||
return first.isItemValidForSlot(index, stack);
|
||||
}
|
||||
return second.isItemValidForSlot(index - first.getSizeInventory(), stack);
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,10 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.items;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
@@ -63,7 +67,7 @@ public class ItemRegistryCore extends ItemRegistry {
|
||||
|
||||
/* Peat */
|
||||
public final ItemForestry peat;
|
||||
public final ItemForestry ash;
|
||||
private final ItemForestry ash;
|
||||
public final ItemForestry bituminousPeat;
|
||||
|
||||
/* Moistener */
|
||||
@@ -87,19 +91,26 @@ 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");
|
||||
|
||||
ingotCopper = registerItem(new ItemForestry(), "ingotCopper");
|
||||
OreDictionary.registerOre("ingotCopper", ingotCopper);
|
||||
if (!isDreamcraftLoaded) {
|
||||
apatite = registerItem(new ItemForestry(), "apatite");
|
||||
OreDictionary.registerOre("gemApatite", apatite);
|
||||
|
||||
ingotTin = registerItem(new ItemForestry(), "ingotTin");
|
||||
OreDictionary.registerOre("ingotTin", ingotTin);
|
||||
ingotCopper = registerItem(new ItemForestry(), "ingotCopper");
|
||||
OreDictionary.registerOre("ingotCopper", ingotCopper);
|
||||
|
||||
ingotBronze = registerItem(new ItemForestry(), "ingotBronze");
|
||||
OreDictionary.registerOre("ingotBronze", ingotBronze);
|
||||
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;
|
||||
}
|
||||
|
||||
wrench = registerItem(new ItemWrench(), "wrench");
|
||||
pipette = registerItem(new ItemPipette(), "pipette");
|
||||
@@ -187,4 +198,12 @@ public class ItemRegistryCore extends ItemRegistry {
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,7 @@ public enum PacketIdClient implements IPacketId {
|
||||
ITEMSTACK_DISPLAY,
|
||||
FX_SIGNAL,
|
||||
TANK_LEVEL_UPDATE,
|
||||
TILE_CONFIGURATION,
|
||||
|
||||
// Core Genome
|
||||
GENOME_TRACKER_UPDATE,
|
||||
|
||||
@@ -27,6 +27,7 @@ import forestry.core.network.packets.PacketPipetteClick;
|
||||
import forestry.core.network.packets.PacketSocketUpdate;
|
||||
import forestry.core.network.packets.PacketSolderingIronClick;
|
||||
import forestry.core.network.packets.PacketTankLevelUpdate;
|
||||
import forestry.core.network.packets.PacketTileConfiguration;
|
||||
import forestry.core.network.packets.PacketTileStream;
|
||||
|
||||
public class PacketRegistryCore extends PacketRegistry {
|
||||
@@ -47,6 +48,7 @@ public class PacketRegistryCore extends PacketRegistry {
|
||||
registerClientPacket(new PacketFXSignal());
|
||||
registerClientPacket(new PacketTankLevelUpdate());
|
||||
registerClientPacket(new PacketGenomeTrackerSync());
|
||||
registerClientPacket(new PacketTileConfiguration());
|
||||
|
||||
registerServerPacket(new PacketGuiSelectRequest());
|
||||
registerServerPacket(new PacketPipetteClick());
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package forestry.core.network.packets;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
import forestry.core.network.DataInputStreamForestry;
|
||||
import forestry.core.network.DataOutputStreamForestry;
|
||||
import forestry.core.network.IForestryPacketClient;
|
||||
import forestry.core.network.PacketIdClient;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.tiles.IConfigurable;
|
||||
|
||||
/**
|
||||
* Used to sync the tile configuration from Server to Client.
|
||||
*/
|
||||
public class PacketTileConfiguration extends PacketCoordinates implements IForestryPacketClient {
|
||||
|
||||
private TileEntity tileEntity = null;
|
||||
|
||||
public PacketTileConfiguration() {}
|
||||
|
||||
public PacketTileConfiguration(TileEntity tileEntity) {
|
||||
super(tileEntity);
|
||||
this.tileEntity = tileEntity;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeData(DataOutputStreamForestry data) throws IOException {
|
||||
super.writeData(data);
|
||||
if (tileEntity instanceof IConfigurable) {
|
||||
((IConfigurable) tileEntity).writeConfigurationData(data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPacketData(DataInputStreamForestry data, EntityPlayer player) throws IOException {
|
||||
TileEntity tile = getTarget(Proxies.common.getRenderWorld());
|
||||
if (tile instanceof IConfigurable) {
|
||||
((IConfigurable) tile).readConfigurationData(data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketIdClient getPacketId() {
|
||||
return PacketIdClient.TILE_CONFIGURATION;
|
||||
}
|
||||
}
|
||||
@@ -61,6 +61,10 @@ 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,6 +63,11 @@ 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);
|
||||
|
||||
@@ -114,13 +114,18 @@ public abstract class RecipeHandlerBase extends TemplateRecipeHandler implements
|
||||
CachedBaseRecipe crecipe = (CachedBaseRecipe) this.arecipes.get(recipe);
|
||||
if (GuiContainerManager.shouldShowTooltip(guiRecipe)) {
|
||||
Point mouse = GuiDraw.getMousePosition();
|
||||
Point offset = guiRecipe.getRecipePosition(recipe);
|
||||
Point relMouse = new Point(
|
||||
mouse.x - (guiRecipe.width - 176) / 2 - offset.x,
|
||||
mouse.y - (guiRecipe.height - 166) / 2 - offset.y);
|
||||
int recipeIndex = guiRecipe.getRecipeIndices().indexOf(recipe);
|
||||
|
||||
currenttip = this.provideTooltip(guiRecipe, currenttip, crecipe, relMouse);
|
||||
if (recipeIndex >= 0) {
|
||||
Point offset = guiRecipe.getRecipePosition(recipeIndex);
|
||||
Point relMouse = new Point(
|
||||
mouse.x - (guiRecipe.width - 176) / 2 - offset.x,
|
||||
mouse.y - (guiRecipe.height - 166) / 2 - offset.y);
|
||||
|
||||
currenttip = this.provideTooltip(guiRecipe, currenttip, crecipe, relMouse);
|
||||
}
|
||||
}
|
||||
|
||||
return currenttip;
|
||||
}
|
||||
|
||||
@@ -130,12 +135,17 @@ public abstract class RecipeHandlerBase extends TemplateRecipeHandler implements
|
||||
super.handleItemTooltip(guiRecipe, itemStack, currenttip, recipe);
|
||||
CachedBaseRecipe crecipe = (CachedBaseRecipe) this.arecipes.get(recipe);
|
||||
Point mouse = GuiDraw.getMousePosition();
|
||||
Point offset = guiRecipe.getRecipePosition(recipe);
|
||||
Point relMouse = new Point(
|
||||
mouse.x - (guiRecipe.width - 176) / 2 - offset.x,
|
||||
mouse.y - (guiRecipe.height - 166) / 2 - offset.y);
|
||||
int recipeIndex = guiRecipe.getRecipeIndices().indexOf(recipe);
|
||||
|
||||
if (recipeIndex >= 0) {
|
||||
Point offset = guiRecipe.getRecipePosition(recipeIndex);
|
||||
Point relMouse = new Point(
|
||||
mouse.x - (guiRecipe.width - 176) / 2 - offset.x,
|
||||
mouse.y - (guiRecipe.height - 166) / 2 - offset.y);
|
||||
|
||||
currenttip = this.provideItemTooltip(guiRecipe, itemStack, currenttip, crecipe, relMouse);
|
||||
}
|
||||
|
||||
currenttip = this.provideItemTooltip(guiRecipe, itemStack, currenttip, crecipe, relMouse);
|
||||
return currenttip;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,11 +14,15 @@ import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
import forestry.core.proxy.Proxies;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RenderBlock implements ISimpleBlockRenderingHandler {
|
||||
|
||||
// Seems to be set during registration - should be fine to not use a concurrent hashmap
|
||||
public static final HashMap<TileRendererIndex, IBlockRenderer> byBlockRenderer = new HashMap<>();
|
||||
|
||||
@Override
|
||||
|
||||
@@ -14,8 +14,11 @@ import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public abstract class RenderOverlayBlock implements ISimpleBlockRenderingHandler {
|
||||
|
||||
protected static final double OVERLAY_SHIFT = 0.001;
|
||||
|
||||
@@ -51,7 +51,9 @@ public class TextureManager implements ITextureManager {
|
||||
"analyzer/nocturnal", "analyzer/princess", "analyzer/pure_breed", "analyzer/pure_cave",
|
||||
"analyzer/pure_flyer", "analyzer/pure_nocturnal", "analyzer/queen", "particles/swarm_bee",
|
||||
"errors/errored", "errors/unknown", "slots/blocked", "slots/blocked_2", "slots/liquid",
|
||||
"slots/container", "slots/locked", "mail/carrier.player", "mail/carrier.trader" };
|
||||
"slots/container", "slots/locked", "mail/carrier.player", "mail/carrier.trader",
|
||||
"misc/search_ingredients.internal_inventory", "misc/search_ingredients.player_inventory",
|
||||
"misc/search_ingredients.all_inventories" };
|
||||
for (String str : defaultIconNames) {
|
||||
IIcon icon = registerTex(register, str);
|
||||
defaultIcons.put(str, icon);
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package forestry.core.tiles;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import forestry.core.network.DataInputStreamForestry;
|
||||
import forestry.core.network.DataOutputStreamForestry;
|
||||
|
||||
public interface IConfigurable {
|
||||
|
||||
void writeConfigurationData(DataOutputStreamForestry data) throws IOException;
|
||||
|
||||
void readConfigurationData(DataInputStreamForestry data) throws IOException;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package forestry.core.tiles;
|
||||
|
||||
public interface IIngredientsSearchController {
|
||||
|
||||
IngredientsStorage getIngredientsStorage();
|
||||
|
||||
void setIngredientsStorage(IngredientsStorage ingredientsStorage);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package forestry.core.tiles;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
|
||||
import forestry.core.inventory.MergedInventories;
|
||||
|
||||
public enum IngredientsStorage {
|
||||
|
||||
INTERNAL_INVENTORY,
|
||||
PLAYER_INVENTORY,
|
||||
ALL_INVENTORIES;
|
||||
|
||||
public static final IngredientsStorage[] VALUES = values();
|
||||
|
||||
public static IngredientsStorage fromInt(int value) {
|
||||
value = value % VALUES.length;
|
||||
if (value < 0) {
|
||||
value += VALUES.length;
|
||||
}
|
||||
return VALUES[value];
|
||||
}
|
||||
|
||||
public IngredientsStorage next() {
|
||||
return fromInt(ordinal() + 1);
|
||||
}
|
||||
|
||||
public IngredientsStorage previous() {
|
||||
return fromInt(ordinal() - 1);
|
||||
}
|
||||
|
||||
public IInventory getInventory(IInventory internal, EntityPlayer player) {
|
||||
switch (this) {
|
||||
case PLAYER_INVENTORY:
|
||||
return player.inventory;
|
||||
case ALL_INVENTORIES:
|
||||
return new MergedInventories(internal, player.inventory);
|
||||
default:
|
||||
return internal;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -241,16 +241,16 @@ public abstract class BlockUtil {
|
||||
if (bw) try {
|
||||
// noinspection unchecked
|
||||
BW_MetaGenerated_WerkstoffBlocksClass = (Class<? extends Block>) Class
|
||||
.forName("com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_WerkstoffBlocks");
|
||||
BWBlocks = (Block) Class.forName("com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader")
|
||||
.getField("BWBlocks").get(null);
|
||||
.forName("bartworks.system.material.BWMetaGeneratedWerkstoffBlocks");
|
||||
BWBlocks = (Block) Class.forName("bartworks.system.material.WerkstoffLoader").getField("BWBlocks")
|
||||
.get(null);
|
||||
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (gt) try {
|
||||
// noinspection unchecked
|
||||
GTBlockMachines_Class = (Class<? extends Block>) Class.forName("gregtech.common.blocks.GT_Block_Machines");
|
||||
GTBlockMachines = (Block) Class.forName("gregtech.api.GregTech_API").getField("sBlockMachines").get(null);
|
||||
GTBlockMachines_Class = (Class<? extends Block>) Class.forName("gregtech.common.blocks.BlockMachines");
|
||||
GTBlockMachines = (Block) Class.forName("gregtech.api.GregTechAPI").getField("sBlockMachines").get(null);
|
||||
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package forestry.core.utils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public class MathUtil {
|
||||
|
||||
private static final BigDecimal MAX_FLOAT = BigDecimal.valueOf(Float.MAX_VALUE);
|
||||
private static final BigDecimal MIN_FLOAT = BigDecimal.valueOf(-Float.MAX_VALUE);
|
||||
|
||||
private static float clampToFloatRange(BigDecimal result) {
|
||||
if (result.compareTo(MAX_FLOAT) > 0) {
|
||||
return Float.MAX_VALUE;
|
||||
} else if (result.compareTo(MIN_FLOAT) < 0) {
|
||||
return -Float.MAX_VALUE;
|
||||
}
|
||||
return result.floatValue();
|
||||
}
|
||||
|
||||
public static float safeMultiply(float a, float b) {
|
||||
BigDecimal bigA = BigDecimal.valueOf(a);
|
||||
BigDecimal bigB = BigDecimal.valueOf(b);
|
||||
return clampToFloatRange(bigA.multiply(bigB));
|
||||
}
|
||||
|
||||
public static float safeAdd(float a, float b) {
|
||||
BigDecimal bigA = BigDecimal.valueOf(a);
|
||||
BigDecimal bigB = BigDecimal.valueOf(b);
|
||||
return clampToFloatRange(bigA.add(bigB));
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@ import forestry.api.farming.FarmDirection;
|
||||
/**
|
||||
* Represents a position or dimensions.
|
||||
*/
|
||||
public interface IVect {
|
||||
public interface IVect extends Comparable<IVect> {
|
||||
|
||||
int getX();
|
||||
|
||||
@@ -43,4 +43,23 @@ public interface IVect {
|
||||
Vect asImmutable();
|
||||
|
||||
MutableVect asMutable();
|
||||
|
||||
// NOTE: All classes implementing this must implement the same hashCode and equals methods as Vect
|
||||
int hashCode();
|
||||
|
||||
boolean equals(Object obj);
|
||||
|
||||
default int compareTo(IVect other) {
|
||||
int x = this.getX() - other.getX();
|
||||
if (x != 0) {
|
||||
return x;
|
||||
}
|
||||
|
||||
int y = this.getY() - other.getY();
|
||||
if (y != 0) {
|
||||
return y;
|
||||
}
|
||||
|
||||
return this.getZ() - other.getZ();
|
||||
}
|
||||
}
|
||||
@@ -73,9 +73,9 @@ public class Vect implements IVect {
|
||||
}
|
||||
|
||||
public static Vect getRandomPositionInArea(Random random, IVect area) {
|
||||
int x = random.nextInt(area.getX());
|
||||
int y = random.nextInt(area.getY());
|
||||
int z = random.nextInt(area.getZ());
|
||||
int x = random.nextInt(area.getX() + 1);
|
||||
int y = random.nextInt(area.getY() + 1);
|
||||
int z = random.nextInt(area.getZ() + 1);
|
||||
return new Vect(x, y, z);
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ public class TileEnginePeat extends TileEngine implements ISidedInventory {
|
||||
return i;
|
||||
}
|
||||
|
||||
if (waste.getItem() != PluginCore.items.ash) {
|
||||
if (waste.getItem() != PluginCore.items.getAsh().getItem()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -182,7 +182,7 @@ public class TileEnginePeat extends TileEngine implements ISidedInventory {
|
||||
if (wasteSlot >= 0) {
|
||||
IInventoryAdapter inventory = getInternalInventory();
|
||||
if (inventory.getStackInSlot(wasteSlot) == null) {
|
||||
inventory.setInventorySlotContents(wasteSlot, PluginCore.items.ash.getItemStack());
|
||||
inventory.setInventorySlotContents(wasteSlot, PluginCore.items.getAsh());
|
||||
} else {
|
||||
inventory.getStackInSlot(wasteSlot).stackSize++;
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import forestry.core.gui.slots.SlotCraftMatrix;
|
||||
import forestry.core.gui.slots.SlotCrafter;
|
||||
import forestry.core.network.packets.PacketGuiSelectRequest;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.tiles.IngredientsStorage;
|
||||
import forestry.core.utils.ItemStackUtil;
|
||||
import forestry.core.utils.Log;
|
||||
import forestry.factory.inventory.InventoryCraftingForestry;
|
||||
@@ -207,6 +208,15 @@ public class ContainerWorktable extends ContainerTile<TileWorktable> implements
|
||||
sendPacketToCrafters(new PacketWorktableRecipeUpdate(tile));
|
||||
break;
|
||||
}
|
||||
case 200: { // switch ingredients storage
|
||||
tile.setIngredientsStorage(IngredientsStorage.fromInt(secondary));
|
||||
markConfigurationDirty();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public IngredientsStorage getIngredientsStorage() {
|
||||
return tile.getIngredientsStorage();
|
||||
}
|
||||
}
|
||||
@@ -19,9 +19,12 @@ import forestry.core.config.Constants;
|
||||
import forestry.core.gui.GuiForestryTitled;
|
||||
import forestry.core.gui.buttons.GuiBetterButton;
|
||||
import forestry.core.gui.buttons.StandardButtonTextureSets;
|
||||
import forestry.core.gui.ledgers.SearchIngregientsLedger;
|
||||
import forestry.core.network.packets.PacketGuiSelectRequest;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.recipes.RecipeUtil;
|
||||
import forestry.core.tiles.IIngredientsSearchController;
|
||||
import forestry.core.tiles.IngredientsStorage;
|
||||
import forestry.core.utils.InventoryUtil;
|
||||
import forestry.factory.gui.widgets.ClearWorktable;
|
||||
import forestry.factory.gui.widgets.MemorizedRecipeSlot;
|
||||
@@ -30,13 +33,16 @@ import forestry.factory.recipes.MemorizedRecipe;
|
||||
import forestry.factory.recipes.RecipeMemory;
|
||||
import forestry.factory.tiles.TileWorktable;
|
||||
|
||||
public class GuiWorktable extends GuiForestryTitled<ContainerWorktable, TileWorktable> {
|
||||
public class GuiWorktable extends GuiForestryTitled<ContainerWorktable, TileWorktable>
|
||||
implements IIngredientsSearchController {
|
||||
|
||||
private static final int SPACING = 18;
|
||||
private boolean hasRecipeConflict = false;
|
||||
private final EntityPlayer player;
|
||||
|
||||
public GuiWorktable(EntityPlayer player, TileWorktable tile) {
|
||||
super(Constants.TEXTURE_PATH_GUI + "/worktable2.png", new ContainerWorktable(player, tile), tile);
|
||||
this.player = player;
|
||||
|
||||
ySize = 218;
|
||||
|
||||
@@ -60,6 +66,12 @@ public class GuiWorktable extends GuiForestryTitled<ContainerWorktable, TileWork
|
||||
widgetManager.add(new ClearWorktable(widgetManager, 66, 19));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addLedgers() {
|
||||
super.addLedgers();
|
||||
ledgerManager.add(new SearchIngregientsLedger(ledgerManager, this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateScreen() {
|
||||
super.updateScreen();
|
||||
@@ -82,7 +94,7 @@ public class GuiWorktable extends GuiForestryTitled<ContainerWorktable, TileWork
|
||||
.get(54 + InventoryGhostCrafting.SLOT_CRAFTING_RESULT);
|
||||
|
||||
if (func_146978_c(itemSlot.xDisplayPosition, itemSlot.yDisplayPosition, 16, 16, mouseX, mouseY)
|
||||
&& !inventory.canTakeStack(InventoryGhostCrafting.SLOT_CRAFTING_RESULT)) {
|
||||
&& !inventory.canTakeStack(player, InventoryGhostCrafting.SLOT_CRAFTING_RESULT)) {
|
||||
final MemorizedRecipe recipe = inventory.getCurrentRecipe();
|
||||
|
||||
if (recipe != null) {
|
||||
@@ -121,4 +133,14 @@ public class GuiWorktable extends GuiForestryTitled<ContainerWorktable, TileWork
|
||||
int id = 100 + button.id;
|
||||
Proxies.net.sendToServer(new PacketGuiSelectRequest(id, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IngredientsStorage getIngredientsStorage() {
|
||||
return container.getIngredientsStorage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIngredientsStorage(IngredientsStorage ingredientsStorage) {
|
||||
Proxies.net.sendToServer(new PacketGuiSelectRequest(200, ingredientsStorage.ordinal()));
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ public interface ICrafterWorktable {
|
||||
|
||||
ItemStack getResult();
|
||||
|
||||
boolean canTakeStack(int slotIndex);
|
||||
boolean canTakeStack(EntityPlayer player, int slotIndex);
|
||||
|
||||
boolean onCraftingStart(EntityPlayer player);
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@ import forestry.core.inventory.wrappers.InventoryMapper;
|
||||
import forestry.core.network.DataInputStreamForestry;
|
||||
import forestry.core.network.DataOutputStreamForestry;
|
||||
import forestry.core.recipes.RecipeUtil;
|
||||
import forestry.core.tiles.IConfigurable;
|
||||
import forestry.core.tiles.IngredientsStorage;
|
||||
import forestry.core.tiles.TileBase;
|
||||
import forestry.core.utils.InventoryUtil;
|
||||
import forestry.core.utils.ItemStackUtil;
|
||||
@@ -35,13 +37,14 @@ import forestry.factory.inventory.InventoryWorktable;
|
||||
import forestry.factory.recipes.MemorizedRecipe;
|
||||
import forestry.factory.recipes.RecipeMemory;
|
||||
|
||||
public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
public class TileWorktable extends TileBase implements ICrafterWorktable, IConfigurable {
|
||||
|
||||
private final RecipeMemory recipeMemory;
|
||||
private final InventoryAdapterTile<?> craftingDisplay;
|
||||
private MemorizedRecipe currentRecipe;
|
||||
private long savedTick = 0;
|
||||
private long savedSystemTimeExpiration = 0;
|
||||
private IngredientsStorage ingredientsStorage = IngredientsStorage.INTERNAL_INVENTORY;
|
||||
|
||||
public TileWorktable() {
|
||||
super("worktable");
|
||||
@@ -58,6 +61,7 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
|
||||
craftingDisplay.writeToNBT(nbttagcompound);
|
||||
recipeMemory.writeToNBT(nbttagcompound);
|
||||
nbttagcompound.setInteger("IngredientsStorage", ingredientsStorage.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,6 +70,7 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
|
||||
craftingDisplay.readFromNBT(nbttagcompound);
|
||||
recipeMemory.readFromNBT(nbttagcompound);
|
||||
ingredientsStorage = IngredientsStorage.fromInt(nbttagcompound.getInteger("IngredientsStorage"));
|
||||
}
|
||||
|
||||
/* NETWORK */
|
||||
@@ -108,16 +113,20 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
}
|
||||
}
|
||||
|
||||
private IInventory getIngredientsInventory(EntityPlayer player) {
|
||||
return ingredientsStorage.getInventory(this, player);
|
||||
}
|
||||
|
||||
/* ICrafterWorktable */
|
||||
@Override
|
||||
public boolean canTakeStack(int craftingSlotIndex) {
|
||||
public boolean canTakeStack(EntityPlayer player, int craftingSlotIndex) {
|
||||
if (craftingSlotIndex == InventoryGhostCrafting.SLOT_CRAFTING_RESULT) {
|
||||
return canCraftCurrentRecipe();
|
||||
return canCraftCurrentRecipe(player);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean canCraftCurrentRecipe() {
|
||||
private boolean canCraftCurrentRecipe(EntityPlayer player) {
|
||||
if (currentRecipe == null) {
|
||||
return false;
|
||||
}
|
||||
@@ -139,7 +148,7 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
}
|
||||
|
||||
ItemStack[] recipeItems = InventoryUtil.getStacks(currentRecipe.getCraftMatrix());
|
||||
ItemStack[] inventory = InventoryUtil.getStacks(this);
|
||||
ItemStack[] inventory = InventoryUtil.getStacks(getIngredientsInventory(player));
|
||||
InventoryCraftingForestry crafting = RecipeUtil
|
||||
.getCraftRecipe(recipeItems, inventory, worldObj, currentRecipe.getRecipeOutput());
|
||||
|
||||
@@ -152,8 +161,9 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
return false;
|
||||
}
|
||||
|
||||
IInventory ingredientsInventory = getIngredientsInventory(player);
|
||||
ItemStack[] recipeItems = InventoryUtil.getStacks(currentRecipe.getCraftMatrix());
|
||||
ItemStack[] inventory = InventoryUtil.getStacks(this);
|
||||
ItemStack[] inventory = InventoryUtil.getStacks(ingredientsInventory);
|
||||
InventoryCraftingForestry crafting = RecipeUtil
|
||||
.getCraftRecipe(recipeItems, inventory, worldObj, currentRecipe.getRecipeOutput());
|
||||
if (crafting == null) {
|
||||
@@ -163,7 +173,8 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
recipeItems = InventoryUtil.getStacks(crafting);
|
||||
|
||||
// craft recipe should exactly match ingredients here, so no oreDict or tool matching
|
||||
ItemStack[] removed = InventoryUtil.removeSets(this, 1, recipeItems, player, false, false, false);
|
||||
ItemStack[] removed = InventoryUtil
|
||||
.removeSets(ingredientsInventory, 1, recipeItems, player, false, false, false);
|
||||
if (removed == null) {
|
||||
return false;
|
||||
}
|
||||
@@ -175,6 +186,7 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
@Override
|
||||
public void onCraftingComplete(EntityPlayer player) {
|
||||
IInventory craftingInventory = getCraftingDisplay();
|
||||
IInventory ingredientsInventory = getIngredientsInventory(player);
|
||||
for (int i = 0; i < craftingInventory.getSizeInventory(); ++i) {
|
||||
ItemStack itemStack = craftingInventory.getStackInSlot(i);
|
||||
if (itemStack == null) {
|
||||
@@ -202,7 +214,7 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!InventoryUtil.tryAddStack(this, container, true)) {
|
||||
if (!InventoryUtil.tryAddStack(ingredientsInventory, container, true)) {
|
||||
player.dropPlayerItemWithRandomChoice(container, false);
|
||||
}
|
||||
}
|
||||
@@ -287,6 +299,14 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
}
|
||||
}
|
||||
|
||||
public IngredientsStorage getIngredientsStorage() {
|
||||
return ingredientsStorage;
|
||||
}
|
||||
|
||||
public void setIngredientsStorage(IngredientsStorage ingredientsStorage) {
|
||||
this.ingredientsStorage = ingredientsStorage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getGui(EntityPlayer player, int data) {
|
||||
return new GuiWorktable(player, this);
|
||||
@@ -296,4 +316,14 @@ public class TileWorktable extends TileBase implements ICrafterWorktable {
|
||||
public Object getContainer(EntityPlayer player, int data) {
|
||||
return new ContainerWorktable(player, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeConfigurationData(DataOutputStreamForestry data) throws IOException {
|
||||
data.writeEnum(ingredientsStorage, IngredientsStorage.VALUES);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readConfigurationData(DataInputStreamForestry data) throws IOException {
|
||||
ingredientsStorage = data.readEnum(IngredientsStorage.VALUES);
|
||||
}
|
||||
}
|
||||
@@ -42,20 +42,20 @@ public class CropBasicGrowthCraft extends Crop {
|
||||
|
||||
@Override
|
||||
protected Collection<ItemStack> harvestBlock(IVect pos) {
|
||||
ArrayList<ItemStack> harvest = block.getDrops(world, pos.getX(), pos.getZ(), pos.getZ(), meta, 0);
|
||||
ArrayList<ItemStack> harvest = block.getDrops(world, pos.getX(), pos.getY(), pos.getZ(), meta, 0);
|
||||
if (harvest.size() > 1) {
|
||||
harvest.remove(0); // Hops have rope as first drop.
|
||||
}
|
||||
Proxies.common.addBlockDestroyEffects(world, pos.getX(), pos.getZ(), pos.getZ(), block, 0);
|
||||
Proxies.common.addBlockDestroyEffects(world, pos.getX(), pos.getY(), pos.getZ(), block, 0);
|
||||
if (isGrape) {
|
||||
world.setBlockToAir(pos.getX(), pos.getZ(), pos.getZ());
|
||||
world.setBlockToAir(pos.getX(), pos.getY(), pos.getZ());
|
||||
|
||||
} else {
|
||||
world.setBlockMetadataWithNotify(pos.getX(), pos.getZ(), pos.getZ(), 0, Constants.FLAG_BLOCK_SYNCH);
|
||||
world.setBlockMetadataWithNotify(pos.getX(), pos.getY(), pos.getZ(), 0, Constants.FLAG_BLOCK_SYNCH);
|
||||
}
|
||||
|
||||
if (isRice) {
|
||||
world.setBlockMetadataWithNotify(pos.getX(), pos.getZ() - 1, pos.getZ(), 7, Constants.FLAG_BLOCK_SYNCH);
|
||||
world.setBlockMetadataWithNotify(pos.getX(), pos.getY() - 1, pos.getZ(), 7, Constants.FLAG_BLOCK_SYNCH);
|
||||
}
|
||||
|
||||
return harvest;
|
||||
|
||||
@@ -31,8 +31,8 @@ public class CropRubber extends CropBlock {
|
||||
protected Collection<ItemStack> harvestBlock(IVect pos) {
|
||||
Collection<ItemStack> harvested = new ArrayList<>();
|
||||
harvested.add(PluginIC2.resin.copy());
|
||||
Proxies.common.addBlockDestroyEffects(world, pos.getX(), pos.getZ(), pos.getZ(), block, 0);
|
||||
world.setBlock(pos.getX(), pos.getZ(), pos.getZ(), block, meta + 6, Constants.FLAG_BLOCK_SYNCH);
|
||||
Proxies.common.addBlockDestroyEffects(world, pos.getX(), pos.getY(), pos.getZ(), block, 0);
|
||||
world.setBlock(pos.getX(), pos.getY(), pos.getZ(), block, meta + 6, Constants.FLAG_BLOCK_SYNCH);
|
||||
return harvested;
|
||||
}
|
||||
}
|
||||
@@ -176,7 +176,6 @@ public class FarmLogicArboreal extends FarmLogicHomogeneous {
|
||||
for (int x = -1; x < 2; x++) {
|
||||
for (int y = -1; y < 2; y++) {
|
||||
for (int z = -1; z < 2; z++) {
|
||||
// Vect candidate = position.add(x, y, z);
|
||||
mutable.set(position).add(x, y, z);
|
||||
if (mutable.equals(position)) {
|
||||
continue;
|
||||
|
||||
@@ -161,7 +161,7 @@ public class FarmLogicCocoa extends FarmLogic {
|
||||
|
||||
private Collection<ICrop> getHarvestBlocks(Vect position) {
|
||||
|
||||
Set<IVect> seen = new HashSet<>();
|
||||
Set<Vect> seen = new HashSet<>();
|
||||
Deque<ICrop> crops = new ArrayDeque<>();
|
||||
|
||||
// Determine what type we want to harvest.
|
||||
@@ -195,7 +195,7 @@ public class FarmLogicCocoa extends FarmLogic {
|
||||
return crops;
|
||||
}
|
||||
|
||||
private ArrayList<Vect> processHarvestBlock(Deque<ICrop> crops, Set<IVect> seen, Vect start, IVect position) {
|
||||
private ArrayList<Vect> processHarvestBlock(Deque<ICrop> crops, Set<Vect> seen, Vect start, IVect position) {
|
||||
|
||||
World world = getWorld();
|
||||
|
||||
@@ -206,7 +206,6 @@ public class FarmLogicCocoa extends FarmLogic {
|
||||
for (int i = -1; i < 2; i++) {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
for (int k = -1; k < 2; k++) {
|
||||
// Vect candidate = position.add(i, j, k);
|
||||
mutable.set(position).add(i, j, k);
|
||||
if (mutable.equals(position)) {
|
||||
continue;
|
||||
|
||||
@@ -147,7 +147,7 @@ public class FarmLogicOrchard extends FarmLogic {
|
||||
|
||||
private Collection<ICrop> getHarvestBlocks(Vect position) {
|
||||
|
||||
Set<IVect> seen = new HashSet<>();
|
||||
Set<Vect> seen = new HashSet<>();
|
||||
Deque<ICrop> crops = new ArrayDeque<>();
|
||||
|
||||
World world = getWorld();
|
||||
@@ -172,7 +172,7 @@ public class FarmLogicOrchard extends FarmLogic {
|
||||
return crops;
|
||||
}
|
||||
|
||||
private List<Vect> processHarvestBlock(Deque<ICrop> crops, Set<IVect> seen, IVect start, IVect position) {
|
||||
private List<Vect> processHarvestBlock(Deque<ICrop> crops, Set<Vect> seen, IVect start, IVect position) {
|
||||
World world = getWorld();
|
||||
|
||||
List<Vect> candidates = new ArrayList<>();
|
||||
|
||||
@@ -29,7 +29,6 @@ import forestry.api.farming.ICrop;
|
||||
import forestry.api.farming.IFarmHousing;
|
||||
import forestry.core.utils.ItemStackUtil;
|
||||
import forestry.core.utils.Log;
|
||||
import forestry.core.utils.vect.IVect;
|
||||
import forestry.core.utils.vect.MutableVect;
|
||||
import forestry.core.utils.vect.Vect;
|
||||
import forestry.core.utils.vect.VectUtil;
|
||||
@@ -125,7 +124,7 @@ public class FarmLogicRubber extends FarmLogic {
|
||||
|
||||
private Collection<ICrop> getHarvestBlocks(Vect position) {
|
||||
|
||||
Set<IVect> seen = new HashSet<>();
|
||||
Set<Vect> seen = new HashSet<>();
|
||||
Deque<ICrop> crops = new ArrayDeque<>();
|
||||
|
||||
World world = getWorld();
|
||||
@@ -155,15 +154,14 @@ public class FarmLogicRubber extends FarmLogic {
|
||||
return crops;
|
||||
}
|
||||
|
||||
private ArrayList<Vect> processHarvestBlock(Deque<ICrop> crops, Set<IVect> seen, Vect position) {
|
||||
private ArrayList<Vect> processHarvestBlock(Deque<ICrop> crops, Set<Vect> seen, Vect position) {
|
||||
World world = getWorld();
|
||||
|
||||
ArrayList<Vect> candidates = new ArrayList<>();
|
||||
|
||||
// Get additional candidates to return
|
||||
final MutableVect mutable = new MutableVect();
|
||||
final MutableVect mutable = position.asMutable();
|
||||
for (int j = 0; j < 2; j++) {
|
||||
// Vect candidate = new Vect(position.x, position.y + j, position.z);
|
||||
mutable.y = position.y + j;
|
||||
if (mutable.equals(position)) {
|
||||
continue;
|
||||
|
||||
@@ -12,10 +12,13 @@ import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import com.gtnewhorizons.angelica.api.ThreadSafeISBRH;
|
||||
|
||||
import forestry.core.render.RenderOverlayBlock;
|
||||
import forestry.farming.blocks.BlockFarm;
|
||||
import forestry.plugins.PluginFarming;
|
||||
|
||||
@ThreadSafeISBRH(perThread = false)
|
||||
public class RenderFarmBlock extends RenderOverlayBlock {
|
||||
|
||||
@Override
|
||||
@@ -41,78 +44,14 @@ public class RenderFarmBlock extends RenderOverlayBlock {
|
||||
float adjG = 0.5f;
|
||||
float adjB = 0.5f;
|
||||
|
||||
renderBottomFace(
|
||||
world,
|
||||
block,
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
renderer,
|
||||
BlockFarm.getOverlayTextureForBlock(0, metadata),
|
||||
mixedBrightness,
|
||||
adjR,
|
||||
adjG,
|
||||
adjB);
|
||||
renderTopFace(
|
||||
world,
|
||||
block,
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
renderer,
|
||||
BlockFarm.getOverlayTextureForBlock(1, metadata),
|
||||
mixedBrightness,
|
||||
adjR,
|
||||
adjG,
|
||||
adjB);
|
||||
renderEastFace(
|
||||
world,
|
||||
block,
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
renderer,
|
||||
BlockFarm.getOverlayTextureForBlock(2, metadata),
|
||||
mixedBrightness,
|
||||
adjR,
|
||||
adjG,
|
||||
adjB);
|
||||
renderWestFace(
|
||||
world,
|
||||
block,
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
renderer,
|
||||
BlockFarm.getOverlayTextureForBlock(3, metadata),
|
||||
mixedBrightness,
|
||||
adjR,
|
||||
adjG,
|
||||
adjB);
|
||||
renderNorthFace(
|
||||
world,
|
||||
block,
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
renderer,
|
||||
BlockFarm.getOverlayTextureForBlock(4, metadata),
|
||||
mixedBrightness,
|
||||
adjR,
|
||||
adjG,
|
||||
adjB);
|
||||
renderSouthFace(
|
||||
world,
|
||||
block,
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
renderer,
|
||||
BlockFarm.getOverlayTextureForBlock(5, metadata),
|
||||
mixedBrightness,
|
||||
adjR,
|
||||
adjG,
|
||||
adjB);
|
||||
// spotless:off
|
||||
renderBottomFace(world, block, x, y, z, renderer, BlockFarm.getOverlayTextureForBlock(0, metadata), mixedBrightness, adjR, adjG, adjB);
|
||||
renderTopFace(world, block, x, y, z, renderer, BlockFarm.getOverlayTextureForBlock(1, metadata), mixedBrightness, adjR, adjG, adjB);
|
||||
renderEastFace(world, block, x, y, z, renderer, BlockFarm.getOverlayTextureForBlock(2, metadata), mixedBrightness, adjR, adjG, adjB);
|
||||
renderWestFace(world, block, x, y, z, renderer, BlockFarm.getOverlayTextureForBlock(3, metadata), mixedBrightness, adjR, adjG, adjB);
|
||||
renderNorthFace(world, block, x, y, z, renderer, BlockFarm.getOverlayTextureForBlock(4, metadata), mixedBrightness, adjR, adjG, adjB);
|
||||
renderSouthFace(world, block, x, y, z, renderer, BlockFarm.getOverlayTextureForBlock(5, metadata), mixedBrightness, adjR, adjG, adjB);
|
||||
// spotless:on
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -14,6 +14,8 @@ import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.entity.EntityCreature;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -60,6 +62,36 @@ public class Butterfly extends IndividualLiving implements IButterfly {
|
||||
this.genome = genome;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLore(List<String> text) {
|
||||
IAlleleButterflySpecies 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) {
|
||||
IAlleleButterflySpecies 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) {
|
||||
IAlleleButterflySpecies primary = genome.getPrimary();
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.plugins;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.command.ICommand;
|
||||
@@ -132,14 +134,16 @@ public class PluginCore extends ForestryPlugin {
|
||||
|
||||
// forestry items
|
||||
crateRegistry.registerCrate(items.peat, "cratedPeat");
|
||||
crateRegistry.registerCrate(items.apatite, "cratedApatite");
|
||||
crateRegistry.registerCrate(items.fertilizerCompound, "cratedFertilizer");
|
||||
crateRegistry.registerCrate(items.mulch, "cratedMulch");
|
||||
crateRegistry.registerCrate(items.phosphor, "cratedPhosphor");
|
||||
crateRegistry.registerCrate(items.ash, "cratedAsh");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotTin, "cratedTin");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotCopper, "cratedCopper");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotBronze, "cratedBronze");
|
||||
crateRegistry.registerCrateUsingOreDict(items.getAsh(), "cratedAsh");
|
||||
if (!isDreamcraftLoaded) {
|
||||
crateRegistry.registerCrate(items.apatite, "cratedApatite");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotTin, "cratedTin");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotCopper, "cratedCopper");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotBronze, "cratedBronze");
|
||||
}
|
||||
|
||||
// forestry blocks
|
||||
crateRegistry.registerCrate(blocks.soil.get(BlockSoil.SoilType.HUMUS, 1), "cratedHumus");
|
||||
@@ -195,10 +199,15 @@ public class PluginCore extends ForestryPlugin {
|
||||
protected void registerRecipes() {
|
||||
|
||||
/* SMELTING RECIPES */
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.APATITE, 1), items.apatite, 0.5f);
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.COPPER, 1), items.ingotCopper, 0.5f);
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.TIN, 1), items.ingotTin, 0.5f);
|
||||
RecipeUtil.addSmelting(new ItemStack(items.peat), items.ash, 0.0f);
|
||||
if (!isDreamcraftLoaded) {
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.APATITE, 1), items.apatite, 0.5f);
|
||||
RecipeUtil.addSmelting(
|
||||
blocks.resources.get(BlockResourceOre.ResourceType.COPPER, 1),
|
||||
items.ingotCopper,
|
||||
0.5f);
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.TIN, 1), items.ingotTin, 0.5f);
|
||||
}
|
||||
RecipeUtil.addSmelting(new ItemStack(items.peat), items.getAsh(), 0.0f);
|
||||
|
||||
/* BRONZE INGOTS */
|
||||
if (Config.isCraftingBronzeEnabled()) {
|
||||
@@ -382,41 +391,43 @@ public class PluginCore extends ForestryPlugin {
|
||||
new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE));
|
||||
|
||||
// Storage Blocks
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.APATITE),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"gemApatite");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.apatite, 9), "blockApatite");
|
||||
if (!isDreamcraftLoaded) {
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.APATITE),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"gemApatite");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.apatite, 9), "blockApatite");
|
||||
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.COPPER),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotCopper");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotCopper, 9), "blockCopper");
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.COPPER),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotCopper");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotCopper, 9), "blockCopper");
|
||||
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.TIN),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotTin");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotTin, 9), "blockTin");
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.TIN),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotTin");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotTin, 9), "blockTin");
|
||||
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.BRONZE),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotBronze");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotBronze, 9), "blockBronze");
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.BRONZE),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotBronze");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotBronze, 9), "blockBronze");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.plugins;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.ItemStack;
|
||||
@@ -644,18 +646,20 @@ public class PluginFactory extends ForestryPlugin {
|
||||
new Object[] { " # ", " X ", " X ", '#', "ingotBronze", 'X', "stickWood" });
|
||||
|
||||
// Reclamation
|
||||
RecipeManagers.carpenterManager.addRecipe(
|
||||
null,
|
||||
PluginCore.items.ingotBronze.getItemStack(2),
|
||||
"#",
|
||||
'#',
|
||||
PluginCore.items.brokenBronzePickaxe);
|
||||
RecipeManagers.carpenterManager.addRecipe(
|
||||
null,
|
||||
PluginCore.items.ingotBronze.getItemStack(),
|
||||
"#",
|
||||
'#',
|
||||
PluginCore.items.brokenBronzeShovel);
|
||||
if (!isDreamcraftLoaded) {
|
||||
RecipeManagers.carpenterManager.addRecipe(
|
||||
null,
|
||||
PluginCore.items.ingotBronze.getItemStack(2),
|
||||
"#",
|
||||
'#',
|
||||
PluginCore.items.brokenBronzePickaxe);
|
||||
RecipeManagers.carpenterManager.addRecipe(
|
||||
null,
|
||||
PluginCore.items.ingotBronze.getItemStack(),
|
||||
"#",
|
||||
'#',
|
||||
PluginCore.items.brokenBronzeShovel);
|
||||
}
|
||||
|
||||
// Crating and uncrating
|
||||
if (PluginManager.Module.STORAGE.isEnabled()) {
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.plugins;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -130,11 +132,13 @@ public class PluginFluids extends ForestryPlugin {
|
||||
}
|
||||
|
||||
if (RecipeManagers.squeezerManager != null) {
|
||||
RecipeManagers.squeezerManager.addContainerRecipe(
|
||||
10,
|
||||
items.canEmpty.getItemStack(),
|
||||
PluginCore.items.ingotTin.getItemStack(),
|
||||
0.05f);
|
||||
if (!isDreamcraftLoaded) {
|
||||
RecipeManagers.squeezerManager.addContainerRecipe(
|
||||
10,
|
||||
items.canEmpty.getItemStack(),
|
||||
PluginCore.items.ingotTin.getItemStack(),
|
||||
0.05f);
|
||||
}
|
||||
RecipeManagers.squeezerManager.addContainerRecipe(
|
||||
10,
|
||||
items.waxCapsuleEmpty.getItemStack(),
|
||||
|
||||
@@ -60,6 +60,7 @@ public class PluginLepidopterology extends ForestryPlugin {
|
||||
public static int spawnConstraint = 100;
|
||||
public static int entityConstraint = 1000;
|
||||
private static boolean allowPollination = true;
|
||||
public static boolean disableButterflyLeafSpawns = false;
|
||||
|
||||
public static ItemRegistryLepidopterology items;
|
||||
public static BlockRegistryLepidopterology blocks;
|
||||
@@ -112,7 +113,8 @@ public class PluginLepidopterology extends ForestryPlugin {
|
||||
|
||||
blocks.lepidopterology.init();
|
||||
|
||||
TreeManager.treeRoot.registerLeafTickHandler(new ButterflySpawner());
|
||||
if (!PluginLepidopterology.disableButterflyLeafSpawns)
|
||||
TreeManager.treeRoot.registerLeafTickHandler(new ButterflySpawner());
|
||||
|
||||
RecipeSorter.register(
|
||||
"forestry:lepidopterologymating",
|
||||
@@ -127,6 +129,8 @@ public class PluginLepidopterology extends ForestryPlugin {
|
||||
spawnConstraint = config.getIntLocalized("butterfly.entities", "spawn.limit", spawnConstraint, 0, 500);
|
||||
entityConstraint = config.getIntLocalized("butterfly.entities", "maximum", entityConstraint, 0, 5000);
|
||||
allowPollination = config.getBooleanLocalized("butterfly.entities", "pollination", allowPollination);
|
||||
disableButterflyLeafSpawns = config
|
||||
.getBooleanLocalized("butterfly.entities", "disable.leaf.spawns", disableButterflyLeafSpawns);
|
||||
|
||||
config.save();
|
||||
}
|
||||
|
||||
@@ -96,6 +96,7 @@ public class PluginStorage extends ForestryPlugin {
|
||||
private final ArrayList<ItemStack> hunterItems = new ArrayList<>();
|
||||
private final ArrayList<ItemStack> adventurerItems = new ArrayList<>();
|
||||
private final ArrayList<ItemStack> builderItems = new ArrayList<>();
|
||||
private final ArrayList<ItemStack> coinItems = new ArrayList<>();
|
||||
|
||||
public static ItemRegistryStorage items;
|
||||
|
||||
@@ -108,7 +109,7 @@ public class PluginStorage extends ForestryPlugin {
|
||||
|
||||
BackpackManager.backpackInterface = new BackpackInterface();
|
||||
|
||||
BackpackManager.backpackItems = new ArrayList[6];
|
||||
BackpackManager.backpackItems = new ArrayList[7];
|
||||
|
||||
BackpackManager.backpackItems[0] = minerItems;
|
||||
BackpackManager.backpackItems[1] = diggerItems;
|
||||
@@ -116,6 +117,7 @@ public class PluginStorage extends ForestryPlugin {
|
||||
BackpackManager.backpackItems[3] = hunterItems;
|
||||
BackpackManager.backpackItems[4] = adventurerItems;
|
||||
BackpackManager.backpackItems[5] = builderItems;
|
||||
BackpackManager.backpackItems[6] = coinItems;
|
||||
|
||||
BackpackDefinition definition;
|
||||
|
||||
@@ -146,18 +148,22 @@ public class PluginStorage extends ForestryPlugin {
|
||||
|
||||
definition = new BackpackDefinition("builder", new Color(0xdd3a3a).getRGB());
|
||||
BackpackManager.definitions.put(definition.getKey(), definition);
|
||||
|
||||
definition = new BackpackDefinition("coin", new Color(0xffd700).getRGB());
|
||||
BackpackManager.definitions.put(definition.getKey(), definition);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
protected void disabledSetupAPI() {
|
||||
BackpackManager.backpackItems = new ArrayList[6];
|
||||
BackpackManager.backpackItems = new ArrayList[7];
|
||||
BackpackManager.backpackItems[0] = minerItems;
|
||||
BackpackManager.backpackItems[1] = diggerItems;
|
||||
BackpackManager.backpackItems[2] = foresterItems;
|
||||
BackpackManager.backpackItems[3] = hunterItems;
|
||||
BackpackManager.backpackItems[4] = adventurerItems;
|
||||
BackpackManager.backpackItems[5] = builderItems;
|
||||
BackpackManager.backpackItems[6] = coinItems;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -182,6 +188,7 @@ public class PluginStorage extends ForestryPlugin {
|
||||
handleBackpackConfig(config, "hunter");
|
||||
handleBackpackConfig(config, "adventurer");
|
||||
handleBackpackConfig(config, "builder");
|
||||
handleBackpackConfig(config, "coin");
|
||||
|
||||
config.save();
|
||||
|
||||
@@ -219,6 +226,7 @@ public class PluginStorage extends ForestryPlugin {
|
||||
final BackpackDefinition adventurer = (BackpackDefinition) BackpackManager.definitions.get("adventurer");
|
||||
final BackpackDefinition builder = (BackpackDefinition) BackpackManager.definitions.get("builder");
|
||||
final BackpackDefinition hunter = (BackpackDefinition) BackpackManager.definitions.get("hunter");
|
||||
final BackpackDefinition coin = (BackpackDefinition) BackpackManager.definitions.get("coin");
|
||||
|
||||
miner.addValidItems(minerItems);
|
||||
digger.addValidItems(diggerItems);
|
||||
@@ -226,6 +234,7 @@ public class PluginStorage extends ForestryPlugin {
|
||||
hunter.addValidItems(hunterItems);
|
||||
adventurer.addValidItems(adventurerItems);
|
||||
builder.addValidItems(builderItems);
|
||||
coin.addValidItems(coinItems);
|
||||
|
||||
final Pattern minerOreDictPattern = Pattern
|
||||
.compile("(ore|dust|gem|ingot|nugget|crushed|cluster|denseore)[A-Z].*");
|
||||
@@ -440,10 +449,15 @@ public class PluginStorage extends ForestryPlugin {
|
||||
String oreName = OreDictionary.getOreName(oreId);
|
||||
addCrating(crateStack, oreName);
|
||||
}
|
||||
if (oreIds.length > 0 && oreIds[0] == OreDictionary.getOreID("dustAsh")) {
|
||||
addUncrating(crateStack, PluginCore.items.getAsh());
|
||||
} else {
|
||||
addUncrating(crateStack, uncrated);
|
||||
}
|
||||
} else {
|
||||
addCrating(crateStack, uncrated);
|
||||
addUncrating(crateStack, uncrated);
|
||||
}
|
||||
addUncrating(crateStack, uncrated);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -521,6 +535,7 @@ public class PluginStorage extends ForestryPlugin {
|
||||
addBackpackRecipe(items.hunterBackpack, Items.feather);
|
||||
addBackpackRecipe(items.adventurerBackpack, Items.bone);
|
||||
addBackpackRecipe(items.builderBackpack, Items.clay_ball);
|
||||
addBackpackRecipe(items.coinBackpack, "ingotGold");
|
||||
|
||||
// / CARPENTER
|
||||
if (PluginManager.Module.FACTORY.isEnabled()) {
|
||||
@@ -543,6 +558,7 @@ public class PluginStorage extends ForestryPlugin {
|
||||
addT2BackpackRecipe(items.hunterBackpack, items.hunterBackpackT2);
|
||||
addT2BackpackRecipe(items.adventurerBackpack, items.adventurerBackpackT2);
|
||||
addT2BackpackRecipe(items.builderBackpack, items.builderBackpackT2);
|
||||
addT2BackpackRecipe(items.coinBackpack, items.coinBackpackT2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@ public class PluginHarvestCraft extends ForestryPlugin {
|
||||
);
|
||||
|
||||
ImmutableList.Builder<String> genericCropsBuilder = ImmutableList.builder();
|
||||
genericCropsBuilder.add("cotton", "rice", "tea", "coffee", "candleberry");
|
||||
genericCropsBuilder.add("cotton", "rice", "tealeaf", "coffeebean", "candleberry");
|
||||
genericCropsBuilder.addAll(herbs);
|
||||
genericCropsBuilder.addAll(spices);
|
||||
|
||||
@@ -281,7 +281,14 @@ public class PluginHarvestCraft extends ForestryPlugin {
|
||||
}
|
||||
|
||||
for (String cropName : genericCrops) {
|
||||
ItemStack genericCropSeed = GameRegistry.findItemStack(HC, cropName + "seedItem", 1);
|
||||
String seedName = cropName;
|
||||
// Pam's Tea and Coffee have inconsistent Crop/Seed names, unlike other Pam's crops
|
||||
if (seedName.equals("tealeaf")) {
|
||||
seedName = "tea";
|
||||
} else if (seedName.equals("coffeebean")) {
|
||||
seedName = "coffee";
|
||||
}
|
||||
ItemStack genericCropSeed = GameRegistry.findItemStack(HC, seedName + "seedItem", 1);
|
||||
Block genericCropBlock = GameRegistry.findBlock(HC, "pam" + cropName + "Crop");
|
||||
if (genericCropSeed != null) {
|
||||
RecipeManagers.squeezerManager
|
||||
|
||||
@@ -192,14 +192,24 @@ public class BackpackDefinition implements IBackpackDefinition {
|
||||
int[] oreIds = OreDictionary.getOreIDs(itemStack);
|
||||
for (int oreId : oreIds) {
|
||||
if (validOreIds.contains(oreId)) {
|
||||
validItemStacks.add(itemStackStringWild);
|
||||
if (meta != OreDictionary.WILDCARD_VALUE) {
|
||||
String itemStackString = itemStackStringWild + ':' + meta;
|
||||
validItemStacks.add(itemStackString);
|
||||
} else {
|
||||
validItemStacks.add(itemStackStringWild);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
for (Class<?> itemClass : validItemClasses) {
|
||||
if (itemClass.isInstance(item)) {
|
||||
validItemStacks.add(itemStackStringWild);
|
||||
if (meta != OreDictionary.WILDCARD_VALUE) {
|
||||
String itemStackString = itemStackStringWild + ':' + meta;
|
||||
validItemStacks.add(itemStackString);
|
||||
} else {
|
||||
validItemStacks.add(itemStackStringWild);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -208,7 +218,12 @@ public class BackpackDefinition implements IBackpackDefinition {
|
||||
if (block != null) {
|
||||
for (Class<?> blockClass : validBlockClasses) {
|
||||
if (blockClass.isInstance(block)) {
|
||||
validItemStacks.add(itemStackStringWild);
|
||||
if (meta != OreDictionary.WILDCARD_VALUE) {
|
||||
String itemStackString = itemStackStringWild + ':' + meta;
|
||||
validItemStacks.add(itemStackString);
|
||||
} else {
|
||||
validItemStacks.add(itemStackStringWild);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@ public class ItemRegistryStorage extends ItemRegistry {
|
||||
public final Item adventurerBackpackT2;
|
||||
public final Item builderBackpack;
|
||||
public final Item builderBackpackT2;
|
||||
public final Item coinBackpack;
|
||||
public final Item coinBackpackT2;
|
||||
|
||||
public ItemRegistryStorage() {
|
||||
// CRATE
|
||||
@@ -113,5 +115,13 @@ public class ItemRegistryStorage extends ItemRegistry {
|
||||
builderBackpackT2 = registerItem(
|
||||
BackpackManager.backpackInterface.addBackpack(definition, EnumBackpackType.T2),
|
||||
"builderBagT2");
|
||||
|
||||
definition = BackpackManager.definitions.get("coin");
|
||||
coinBackpack = registerItem(
|
||||
BackpackManager.backpackInterface.addBackpack(definition, EnumBackpackType.T1),
|
||||
"coinBag");
|
||||
coinBackpackT2 = registerItem(
|
||||
BackpackManager.backpackInterface.addBackpack(definition, EnumBackpackType.T2),
|
||||
"coinBagT2");
|
||||
}
|
||||
}
|
||||
@@ -335,6 +335,7 @@ for.gui.temperature=Temperatur
|
||||
for.gui.tolerance=Toleranz
|
||||
for.gui.temptol=Temp.Tol
|
||||
for.gui.tooltip.tmi=Drücke die Umschalttaste für mehr Infos.
|
||||
for.gui.tooltip.tml=Drücke die Steuerungstaste für mehr Geschichte.
|
||||
for.gui.triple=Dreifache
|
||||
for.gui.unknown=Unbekannt
|
||||
for.gui.warm=Warm
|
||||
|
||||
@@ -243,6 +243,11 @@ for.gui.noeffect=No effect
|
||||
for.gui.owner=Owner
|
||||
for.gui.page=Page
|
||||
|
||||
for.gui.search_ingredients=Search Items
|
||||
for.gui.search_ingredients.internal_inventory=Internal Inventory
|
||||
for.gui.search_ingredients.player_inventory=Player Inventory
|
||||
for.gui.search_ingredients.all_inventories=All Inventories
|
||||
|
||||
for.gui.pipe.filter.anything=Anything
|
||||
for.gui.pipe.filter.bee=Any Bees
|
||||
for.gui.pipe.filter.cave=Cave-Dwellers
|
||||
@@ -336,6 +341,7 @@ for.gui.temperature=Temperature
|
||||
for.gui.tolerance=Tolerance
|
||||
for.gui.temptol=Temperature Tol.
|
||||
for.gui.tooltip.tmi=Hold shift for details
|
||||
for.gui.tooltip.tml=Hold ctrl for lore
|
||||
for.gui.triple=Triple
|
||||
for.gui.unknown=Unknown genome
|
||||
for.gui.warm=Warm
|
||||
@@ -470,6 +476,9 @@ item.for.adventurerBagT2.name=Adventurer's Woven Backpack
|
||||
item.for.ambrosia.name=Ambrosia
|
||||
item.for.apatite.name=Apatite
|
||||
|
||||
item.for.coinBag.name=Coiner's Backpack
|
||||
item.for.coinBagT2.name=Coiner's Woven Backpack
|
||||
|
||||
item.for.apiaristBag.name=Apiarist's Backpack
|
||||
item.for.apiaristBoots.name=Apiarist's Shoes
|
||||
item.for.apiaristChest.name=Apiarist's Shirt
|
||||
@@ -1684,6 +1693,8 @@ for.config.butterfly.entities.maximum=Butterfly Maximum
|
||||
for.config.butterfly.entities.maximum.comment=New butterflies will stay in item form and will not take flight once this limit is reached.
|
||||
for.config.butterfly.entities.pollination=Butterfly Pollination
|
||||
for.config.butterfly.entities.pollination.comment=Allow butterflies to pollinate leaves.
|
||||
for.config.butterfly.entities.disable.leaf.spawns=Disable Butterfly Leaf Spawns
|
||||
for.config.butterfly.entities.disable.leaf.spawns.comment=Prevent random butterflies from autonomously spawning from Forestry leaves.
|
||||
|
||||
for.config.backpacks.item.stacks.format=Add itemStacks for the %s's backpack here in the format 'modid:name:meta'. For wildcard metadata the format is 'modid:name'.
|
||||
for.config.backpacks.ore.dict.format=Add ore dictionary names for the %s's backpack here in the format 'oreDictName'.
|
||||
|
||||
@@ -244,6 +244,7 @@ gui.higher=Higher
|
||||
gui.highest=Highest
|
||||
gui.fecundated=Mated
|
||||
gui.tooltip.tmi=Hold shift for details
|
||||
gui.tooltip.tml=Hold ctrl for lore
|
||||
gui.worktable.clear=Click to clear Grid
|
||||
gui.escritoire.probe=Examine Specimens
|
||||
hints.beebiomes.tag=Choose your biome!
|
||||
|
||||
@@ -241,6 +241,11 @@ for.gui.noeffect=Нет эффекта
|
||||
for.gui.owner=Владелец
|
||||
for.gui.page=Страница
|
||||
|
||||
for.gui.search_ingredients=Искать предметы
|
||||
for.gui.search_ingredients.internal_inventory=Встроенный инвентарь
|
||||
for.gui.search_ingredients.player_inventory=Инвентарь игрока
|
||||
for.gui.search_ingredients.all_inventories=Все инвентари
|
||||
|
||||
for.gui.pipe.filter.anything=Всё
|
||||
for.gui.pipe.filter.bee=Любые пчелы
|
||||
for.gui.pipe.filter.cave=Пещерные
|
||||
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 469 B |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 446 B |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 456 B |
@@ -45,3 +45,7 @@ ledger.farm.background=2ca22c
|
||||
ledger.farm.header=e1c92f
|
||||
ledger.farm.subheader=aaafb8
|
||||
ledger.farm.text=000000
|
||||
|
||||
ledger.search_ingredients.background=ffffff
|
||||
ledger.search_ingredients.header=587b96
|
||||
ledger.search_ingredients.text=000000
|
||||
Reference in new issue
Block a user