Compare commits

..
14 Commits
Author SHA1 Message Date
Martin Robertz aa03d733a3 Merge remote-tracking branch 'CoffeeInjected/worktable-improvements' into dev 2024-05-26 15:41:41 +02:00
Socolio 8726d0ffab Add ingredients search setting to the worktable 2024-05-26 14:22:36 +03:00
Martin Robertz a0435886ab update 2024-05-26 12:52:39 +02:00
Ethryan 2ab8613bec Adding a Coin Bag for all those coins. (#71) 2024-05-26 12:48:21 +02:00
Martin Robertz 9d31dedd35 update 2024-05-04 11:43:39 +02:00
slprime 2dd539c3df NEI incorrect tooltip with search 2024-05-04 11:38:09 +02:00
Martin Robertz fd2ac7d172 update 2024-04-16 22:22:28 +02:00
NotAPenguin 466110d461 Fix wrong length check (#68) 2024-04-15 17:47:49 +01:00
Martin Robertz ecf0d7165c update 2024-03-27 09:49:21 +01:00
DrParadox7 dde3514dce Add Butterfly Leaf Spawn Config (#67)
Added `butterfly.entities.disable.leaf.spawns` config to Lepidopterology.cfg.

When set to _True_, it will stop any butterfly from spontaneously spawning from Forestry's leaves [_False_ by default].

Pregnant butterflies remain unaffected for fans of the hobby.
2024-03-26 18:14:34 -07:00
Martin Robertz 0f24a4e043 update 2024-03-04 20:29:49 +01:00
leumasme 3ed2ecfdd0 Fix multifarm not harvesting coffee and tea
Also fixes fermenter recipes for these crops
2024-03-04 16:50:39 +01:00
Martin Robertz be548b06cc update 2024-03-03 09:42:06 +01:00
Jason Mitchell 7db0dc7767 Thread safe (#64)
* update readme and bs

* Thread safe
2024-03-02 21:43:31 +01:00
42 changed files with 537 additions and 153 deletions

No files matched your search

+2 -12
View File
@@ -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.
+2 -1
View File
@@ -2,7 +2,8 @@
dependencies {
api('curse.maven:cofh-lib-220333:2388748')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.5.18-GTNH:dev')
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-alpha51:api')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.6.0-GTNH:dev')
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.6.2:api')
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.39:api')
compileOnly('net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev')
+1 -1
View File
@@ -117,7 +117,7 @@ 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 the GTNH maven, CurseMaven, Modrinth, and some more well-known 1.7.10 repositories.
includeWellKnownRepositories = true
# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven.
Binary file not shown.
+1 -1
View File
@@ -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.7-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
+1 -1
View File
@@ -17,7 +17,7 @@ pluginManagement {
}
plugins {
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.14'
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.22'
}
@@ -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;
}
@@ -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();
@@ -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();
@@ -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
@@ -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);
}
}
@@ -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;
}
}
@@ -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;
}
}
}
@@ -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);
}
}
@@ -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
@@ -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].*");
@@ -521,6 +530,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 +553,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
@@ -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");
}
}
@@ -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
@@ -470,6 +475,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 +1692,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'.
@@ -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=Пещерные
Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

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