Compare commits

...
3 Commits
Author SHA1 Message Date
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
Jason Mitchell 2e20b14e06 Allocation reduction (#62)
* Allocation reduction
2024-02-18 08:30:15 -08:00
40 changed files with 373 additions and 252 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.
+4 -3
View File
@@ -2,9 +2,10 @@
dependencies {
api('curse.maven:cofh-lib-220333:2388748')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.5.3-GTNH:dev')
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.6.1:api')
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.38:api')
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-alpha31:api')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.5.23-GTNH:dev')
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.6.2:api')
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.39:api')
compileOnly('net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev')
compileOnly('curse.maven:craftguide-75557:2459320')
}
+5 -4
View File
@@ -33,7 +33,7 @@ channel = stable
mappingsVersion = 12
# Defines other MCP mappings for dependency deobfuscation.
remoteMappings = https://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/
remoteMappings = https\://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/
# Select a default username for testing your mod. You can always override this per-run by running
# `./gradlew runClient --username=AnotherPlayer`, or configuring this command in your IDE.
@@ -61,6 +61,9 @@ gradleTokenModId =
# [DEPRECATED] Mod name replacement token.
gradleTokenModName =
# [DEPRECATED] Mod Group replacement token.
gradleTokenGroupName =
# [DEPRECATED]
# Multiple source files can be defined here by providing a comma-separated list: Class1.java,Class2.java,Class3.java
# public static final String VERSION = "GRADLETOKEN_VERSION";
@@ -123,7 +126,7 @@ includeWellKnownRepositories = true
usesMavenPublishing = true
# Maven repository to publish the mod to.
# mavenPublishUrl = https://nexus.gtnewhorizons.com/repository/releases/
# mavenPublishUrl = https\://nexus.gtnewhorizons.com/repository/releases/
# Publishing to Modrinth requires you to set the MODRINTH_TOKEN environment variable to your current Modrinth API token.
#
@@ -187,5 +190,3 @@ curseForgeRelations =
# This is meant to be set in $HOME/.gradle/gradle.properties.
# ideaCheckSpotlessOnBuild = true
# Non-GTNH properties
gradleTokenGroupName =
+1 -1
View File
@@ -17,7 +17,7 @@ pluginManagement {
}
plugins {
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.8'
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.15'
}
@@ -115,7 +115,7 @@ public class BeekeepingLogic implements IBeekeepingLogic, IStreamable {
Stack<ItemStack> spawnCopy = new Stack<>();
if (spawn.size() < 128) spawnCopy.addAll(spawn);
else for (byte b = 0; b < 128; ++b) spawnCopy.add(spawn.get(b));
else for (int b = 0; b < 128; ++b) spawnCopy.add(spawn.get(b));
NBTTagList nbttaglist = new NBTTagList();
while (!spawnCopy.isEmpty() && spawnCopy.size() <= 128) {
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
@@ -8,8 +8,9 @@
******************************************************************************/
package forestry.apiculture.multiblock;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Map.Entry;
import java.util.Stack;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
@@ -39,7 +40,7 @@ import forestry.core.utils.ItemStackUtil;
public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory, IActivatable, IAlvearyComponent.Active {
private final InventorySwarmer inventory;
private final Stack<ItemStack> pendingSpawns = new Stack<>();
private final Deque<ItemStack> pendingSpawns = new ArrayDeque<>();
private boolean active;
public TileAlvearySwarmer() {
@@ -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();
@@ -8,10 +8,11 @@
******************************************************************************/
package forestry.core.gui;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Stack;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.entity.player.EntityPlayer;
@@ -208,7 +209,7 @@ public abstract class GuiAlyzer extends GuiForestry<ContainerAlyzer, IInventory>
textLayout.drawLine(StringUtil.localize("gui.alyzer.classification") + ":", 12);
textLayout.newLine();
Stack<IClassification> hierarchy = new Stack<>();
Deque<IClassification> hierarchy = new ArrayDeque<>();
IClassification classification = individual.getGenome().getPrimary().getBranch();
while (classification != null) {
@@ -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;
@@ -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();
@@ -34,5 +34,32 @@ public interface IVect {
IVect add(ChunkCoordinates coordinates);
IVect multiply(int factor);
IVect multiply(float factor);
int[] toArray();
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();
}
}
@@ -22,6 +22,10 @@ public class MutableVect implements IVect {
public int y;
public int z;
public MutableVect() {
this(0, 0, 0);
}
public MutableVect(int x, int y, int z) {
this.x = x;
this.y = y;
@@ -96,7 +100,16 @@ public class MutableVect implements IVect {
return new int[] { x, y, z };
}
@Override
public MutableVect multiply(float factor) {
this.x = Math.round(x * factor);
this.y = Math.round(y * factor);
this.z = Math.round(z * factor);
return this;
}
@Override
public IVect multiply(int factor) {
this.x *= factor;
this.y *= factor;
this.z *= factor;
@@ -140,4 +153,82 @@ public class MutableVect implements IVect {
public int getZ() {
return z;
}
public MutableVect setX(int x) {
this.x = x;
return this;
}
public MutableVect setY(int y) {
this.y = y;
return this;
}
public MutableVect setZ(int z) {
this.z = z;
return this;
}
public MutableVect set(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
return this;
}
public MutableVect set(IVect vect) {
this.x = vect.getX();
this.y = vect.getY();
this.z = vect.getZ();
return this;
}
public MutableVect set(ChunkCoordinates coordinates) {
this.x = coordinates.posX;
this.y = coordinates.posY;
this.z = coordinates.posZ;
return this;
}
public MutableVect set(ForgeDirection direction) {
this.x = direction.offsetX;
this.y = direction.offsetY;
this.z = direction.offsetZ;
return this;
}
public MutableVect set(FarmDirection direction) {
return set(direction.getForgeDirection());
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
result = prime * result + z;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof IVect other) {
return x == other.getX() && y == other.getY() && z == other.getZ();
}
return false;
}
@Override
public Vect asImmutable() {
return new Vect(x, y, z);
}
@Override
public MutableVect asMutable() {
return this;
}
}
@@ -121,10 +121,12 @@ public class Vect implements IVect {
return new int[] { x, y, z };
}
@Override
public Vect multiply(int factor) {
return new Vect(x * factor, y * factor, z * factor);
}
@Override
public Vect multiply(float factor) {
return new Vect(Math.round(x * factor), Math.round(y * factor), Math.round(z * factor));
}
@@ -149,11 +151,10 @@ public class Vect implements IVect {
if (this == obj) {
return true;
}
if (!(obj instanceof Vect)) {
return false;
if ((obj instanceof IVect other)) {
return (x == other.getX()) && (y == other.getY()) && (z == other.getZ());
}
Vect other = (Vect) obj;
return (x == other.x) && (y == other.y) && (z == other.z);
return false;
}
@Override
@@ -170,4 +171,15 @@ public class Vect implements IVect {
public int getZ() {
return z;
}
@Override
public Vect asImmutable() {
return this;
}
@Override
public MutableVect asMutable() {
return new MutableVect(this);
}
}
@@ -16,6 +16,7 @@ import net.minecraft.world.World;
import forestry.api.farming.ICrop;
import forestry.core.config.Constants;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
public abstract class Crop implements ICrop {
@@ -28,21 +29,21 @@ public abstract class Crop implements ICrop {
this.position = position;
}
protected final void setBlock(Vect position, Block block, int meta) {
world.setBlock(position.x, position.y, position.z, block, meta, Constants.FLAG_BLOCK_SYNCH);
protected final void setBlock(IVect position, Block block, int meta) {
world.setBlock(position.getX(), position.getY(), position.getZ(), block, meta, Constants.FLAG_BLOCK_SYNCH);
}
protected final Block getBlock(Vect position) {
return world.getBlock(position.x, position.y, position.z);
protected final Block getBlock(IVect position) {
return world.getBlock(position.getX(), position.getY(), position.getZ());
}
protected final int getBlockMeta(Vect position) {
return world.getBlockMetadata(position.x, position.y, position.z);
protected final int getBlockMeta(IVect position) {
return world.getBlockMetadata(position.getX(), position.getY(), position.getZ());
}
protected abstract boolean isCrop(Vect pos);
protected abstract boolean isCrop(IVect pos);
protected abstract Collection<ItemStack> harvestBlock(Vect pos);
protected abstract Collection<ItemStack> harvestBlock(IVect pos);
@Override
public Collection<ItemStack> harvest() {
@@ -19,6 +19,7 @@ import net.minecraft.world.World;
import forestry.core.config.Constants;
import forestry.core.proxy.Proxies;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
public class CropBasicAgriCraft extends Crop {
@@ -33,21 +34,21 @@ public class CropBasicAgriCraft extends Crop {
}
@Override
protected boolean isCrop(Vect pos) {
protected boolean isCrop(IVect pos) {
return getBlock(pos) == block && getBlockMeta(pos) == meta;
}
@Override
protected Collection<ItemStack> harvestBlock(Vect pos) {
ArrayList<ItemStack> harvest = block.getDrops(world, pos.x, pos.y, pos.z, meta, 0);
protected Collection<ItemStack> harvestBlock(IVect pos) {
ArrayList<ItemStack> harvest = block.getDrops(world, pos.getX(), pos.getY(), pos.getZ(), meta, 0);
if (harvest.size() > 1) {
harvest.remove(1); // AgriCraft returns cropsticks in 0, seeds in 1 in getDrops, removing since harvesting
// doesn't
// return them.
}
harvest.remove(0);
Proxies.common.addBlockDestroyEffects(world, pos.x, pos.y, pos.z, Blocks.melon_block, 0);
world.setBlockMetadataWithNotify(pos.x, pos.y, pos.z, 0, Constants.FLAG_BLOCK_SYNCH);
Proxies.common.addBlockDestroyEffects(world, pos.getX(), pos.getY(), pos.getZ(), Blocks.melon_block, 0);
world.setBlockMetadataWithNotify(pos.getX(), pos.getY(), pos.getZ(), 0, Constants.FLAG_BLOCK_SYNCH);
harvest.removeAll(Collections.singleton(null)); // sanatize nulls that get thru from Agricraft+Harvestcraft
// (sesameseed)
return harvest;
@@ -16,6 +16,7 @@ import net.minecraft.world.World;
import forestry.core.config.Constants;
import forestry.core.proxy.Proxies;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
public class CropBasicFruit extends Crop {
@@ -30,15 +31,15 @@ public class CropBasicFruit extends Crop {
}
@Override
protected boolean isCrop(Vect pos) {
protected boolean isCrop(IVect pos) {
return getBlock(pos) == block && getBlockMeta(pos) == meta;
}
@Override
protected Collection<ItemStack> harvestBlock(Vect pos) {
Collection<ItemStack> harvested = block.getDrops(world, pos.x, pos.y, pos.z, meta, 0);
Proxies.common.addBlockDestroyEffects(world, pos.x, pos.y, pos.z, block, 0);
world.setBlock(pos.x, pos.y, pos.z, block, 0, Constants.FLAG_BLOCK_SYNCH);
protected Collection<ItemStack> harvestBlock(IVect pos) {
Collection<ItemStack> harvested = block.getDrops(world, pos.getX(), pos.getY(), pos.getZ(), meta, 0);
Proxies.common.addBlockDestroyEffects(world, pos.getX(), pos.getY(), pos.getZ(), block, 0);
world.setBlock(pos.getX(), pos.getY(), pos.getZ(), block, 0, Constants.FLAG_BLOCK_SYNCH);
return harvested;
}
@@ -17,6 +17,7 @@ import net.minecraft.world.World;
import forestry.core.config.Constants;
import forestry.core.proxy.Proxies;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
public class CropBasicGrowthCraft extends Crop {
@@ -35,26 +36,26 @@ public class CropBasicGrowthCraft extends Crop {
}
@Override
protected boolean isCrop(Vect pos) {
protected boolean isCrop(IVect pos) {
return getBlock(pos) == block && getBlockMeta(pos) == meta;
}
@Override
protected Collection<ItemStack> harvestBlock(Vect pos) {
ArrayList<ItemStack> harvest = block.getDrops(world, pos.x, pos.y, pos.z, meta, 0);
protected Collection<ItemStack> harvestBlock(IVect pos) {
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.x, pos.y, pos.z, block, 0);
Proxies.common.addBlockDestroyEffects(world, pos.getX(), pos.getY(), pos.getZ(), block, 0);
if (isGrape) {
world.setBlockToAir(pos.x, pos.y, pos.z);
world.setBlockToAir(pos.getX(), pos.getY(), pos.getZ());
} else {
world.setBlockMetadataWithNotify(pos.x, pos.y, pos.z, 0, Constants.FLAG_BLOCK_SYNCH);
world.setBlockMetadataWithNotify(pos.getX(), pos.getY(), pos.getZ(), 0, Constants.FLAG_BLOCK_SYNCH);
}
if (isRice) {
world.setBlockMetadataWithNotify(pos.x, pos.y - 1, pos.z, 7, Constants.FLAG_BLOCK_SYNCH);
world.setBlockMetadataWithNotify(pos.getX(), pos.getY() - 1, pos.getZ(), 7, Constants.FLAG_BLOCK_SYNCH);
}
return harvest;
@@ -6,6 +6,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
import forestry.plugins.compat.PluginIC2;
@@ -19,12 +20,12 @@ public class CropBasicIC2Crop extends Crop {
}
@Override
protected boolean isCrop(Vect pos) {
protected boolean isCrop(IVect pos) {
return PluginIC2.instance.canHarvestCrop(this.tileEntity);
}
@Override
protected Collection<ItemStack> harvestBlock(Vect pos) {
protected Collection<ItemStack> harvestBlock(IVect pos) {
return PluginIC2.instance.getCropDrops(this.tileEntity);
}
}
@@ -15,6 +15,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import forestry.core.proxy.Proxies;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
public class CropBlock extends Crop {
@@ -29,16 +30,16 @@ public class CropBlock extends Crop {
}
@Override
protected boolean isCrop(Vect pos) {
protected boolean isCrop(IVect pos) {
return getBlock(pos) == block && getBlockMeta(pos) == meta;
}
@Override
protected Collection<ItemStack> harvestBlock(Vect pos) {
Collection<ItemStack> harvested = block.getDrops(world, pos.x, pos.y, pos.z, meta, 0);
Proxies.common.addBlockDestroyEffects(world, pos.x, pos.y, pos.z, block, 0);
protected Collection<ItemStack> harvestBlock(IVect pos) {
Collection<ItemStack> harvested = block.getDrops(world, pos.getX(), pos.getY(), pos.getZ(), meta, 0);
Proxies.common.addBlockDestroyEffects(world, pos.getX(), pos.getY(), pos.getZ(), block, 0);
// Block.breakBlock() is called by vanilla itself, removing TEs.
world.setBlockToAir(pos.x, pos.y, pos.z);
world.setBlockToAir(pos.getX(), pos.getY(), pos.getZ());
return harvested;
}
@@ -18,6 +18,7 @@ import net.minecraft.world.World;
import forestry.api.genetics.IFruitBearer;
import forestry.core.network.packets.PacketFXSignal;
import forestry.core.proxy.Proxies;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
public class CropFruit extends Crop {
@@ -27,8 +28,8 @@ public class CropFruit extends Crop {
}
@Override
protected boolean isCrop(Vect pos) {
TileEntity tile = world.getTileEntity(pos.x, pos.y, pos.z);
protected boolean isCrop(IVect pos) {
TileEntity tile = world.getTileEntity(pos.getX(), pos.getY(), pos.getZ());
if (!(tile instanceof IFruitBearer)) {
return false;
}
@@ -44,8 +45,8 @@ public class CropFruit extends Crop {
}
@Override
protected Collection<ItemStack> harvestBlock(Vect pos) {
TileEntity tile = world.getTileEntity(pos.x, pos.y, pos.z);
protected Collection<ItemStack> harvestBlock(IVect pos) {
TileEntity tile = world.getTileEntity(pos.getX(), pos.getY(), pos.getZ());
if (!(tile instanceof IFruitBearer)) {
return new ArrayList<>();
}
@@ -54,10 +55,10 @@ public class CropFruit extends Crop {
PacketFXSignal.VisualFXType.BLOCK_DESTROY,
PacketFXSignal.SoundFXType.LEAF,
world,
pos.x,
pos.y,
pos.z,
world.getBlock(pos.x, pos.y, pos.z),
pos.getX(),
pos.getY(),
pos.getZ(),
world.getBlock(pos.getX(), pos.getY(), pos.getZ()),
0);
return ((IFruitBearer) tile).pickFruit(null);
}
@@ -19,6 +19,7 @@ import net.minecraft.world.World;
import forestry.core.blocks.BlockSoil;
import forestry.core.proxy.Proxies;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
import forestry.plugins.PluginCore;
@@ -29,7 +30,7 @@ public class CropPeat extends Crop {
}
@Override
protected boolean isCrop(Vect pos) {
protected boolean isCrop(IVect pos) {
Block block = getBlock(pos);
if (!(block instanceof BlockSoil)) {
return false;
@@ -41,11 +42,17 @@ public class CropPeat extends Crop {
}
@Override
protected Collection<ItemStack> harvestBlock(Vect pos) {
protected Collection<ItemStack> harvestBlock(IVect pos) {
List<ItemStack> drops = new ArrayList<>();
drops.add(PluginCore.items.peat.getItemStack());
Proxies.common.addBlockDestroyEffects(world, pos.x, pos.y, pos.z, world.getBlock(pos.x, pos.y, pos.z), 0);
Proxies.common.addBlockDestroyEffects(
world,
pos.getX(),
pos.getY(),
pos.getZ(),
world.getBlock(pos.getX(), pos.getY(), pos.getZ()),
0);
setBlock(pos, Blocks.dirt, 0);
return drops;
}
@@ -17,6 +17,7 @@ import net.minecraft.world.World;
import forestry.core.config.Constants;
import forestry.core.proxy.Proxies;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.Vect;
import forestry.plugins.compat.PluginIC2;
@@ -27,11 +28,11 @@ public class CropRubber extends CropBlock {
}
@Override
protected Collection<ItemStack> harvestBlock(Vect pos) {
protected Collection<ItemStack> harvestBlock(IVect pos) {
Collection<ItemStack> harvested = new ArrayList<>();
harvested.add(PluginIC2.resin.copy());
Proxies.common.addBlockDestroyEffects(world, pos.x, pos.y, pos.z, block, 0);
world.setBlock(pos.x, pos.y, pos.z, 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;
}
}
@@ -27,6 +27,7 @@ import forestry.core.config.Constants;
import forestry.core.entities.EntitySelector;
import forestry.core.render.SpriteSheet;
import forestry.core.utils.EntityUtil;
import forestry.core.utils.vect.MutableVect;
import forestry.core.utils.vect.Vect;
public abstract class FarmLogic implements IFarmLogic {
@@ -64,8 +65,10 @@ public abstract class FarmLogic implements IFarmLogic {
&& world.getBlockMetadata(position.x, position.y, position.z) == 0;
}
protected final MutableVect mutableVect = new MutableVect();
protected final Vect translateWithOffset(int x, int y, int z, FarmDirection farmDirection, int step) {
return new Vect(farmDirection.getForgeDirection()).multiply(step).add(x, y, z);
return new Vect(mutableVect.set(farmDirection.getForgeDirection()).multiply(step).add(x, y, z));
}
protected final void setBlock(Vect position, Block block, int meta) {
@@ -8,13 +8,14 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
@@ -32,6 +33,7 @@ import forestry.api.farming.IFarmHousing;
import forestry.api.farming.IFarmable;
import forestry.core.blocks.BlockSoil;
import forestry.core.render.SpriteSheet;
import forestry.core.utils.vect.MutableVect;
import forestry.core.utils.vect.Vect;
import forestry.core.utils.vect.VectUtil;
import forestry.plugins.PluginCore;
@@ -128,7 +130,7 @@ public class FarmLogicArboreal extends FarmLogicHomogeneous {
World world = getWorld();
Set<Vect> seen = new HashSet<>();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
// Determine what type we want to harvest.
IFarmable germling = null;
@@ -162,7 +164,7 @@ public class FarmLogicArboreal extends FarmLogicHomogeneous {
return crops;
}
private ArrayList<Vect> processHarvestBlock(IFarmable germling, Stack<ICrop> crops, Set<Vect> seen, Vect start,
private ArrayList<Vect> processHarvestBlock(IFarmable germling, Deque<ICrop> crops, Set<Vect> seen, Vect start,
Vect position) {
World world = getWorld();
@@ -170,30 +172,32 @@ public class FarmLogicArboreal extends FarmLogicHomogeneous {
ArrayList<Vect> candidates = new ArrayList<>();
// Get additional candidates to return
MutableVect mutable = new MutableVect();
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);
if (candidate.equals(position)) {
mutable.set(position).add(x, y, z);
if (mutable.equals(position)) {
continue;
}
if (Math.abs(candidate.x - start.x) > BRANCH_RANGE) {
if (Math.abs(mutable.x - start.x) > BRANCH_RANGE) {
continue;
}
if (Math.abs(candidate.z - start.z) > BRANCH_RANGE) {
if (Math.abs(mutable.z - start.z) > BRANCH_RANGE) {
continue;
}
// See whether the given position has already been processed
if (seen.contains(candidate)) {
if (seen.contains(mutable)) {
continue;
}
ICrop crop = germling.getCropAt(world, candidate.x, candidate.y, candidate.z);
ICrop crop = germling.getCropAt(world, mutable.x, mutable.y, mutable.z);
if (crop != null) {
Vect immutable = mutable.asImmutable();
crops.push(crop);
candidates.add(candidate);
seen.add(candidate);
candidates.add(immutable);
seen.add(immutable);
}
}
}
@@ -8,12 +8,13 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLog;
@@ -29,6 +30,7 @@ import forestry.api.farming.FarmDirection;
import forestry.api.farming.ICrop;
import forestry.api.farming.IFarmHousing;
import forestry.api.farming.IFarmable;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.MutableVect;
import forestry.core.utils.vect.Vect;
import forestry.core.utils.vect.VectUtil;
@@ -160,7 +162,7 @@ public class FarmLogicCocoa extends FarmLogic {
private Collection<ICrop> getHarvestBlocks(Vect position) {
Set<Vect> seen = new HashSet<>();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
// Determine what type we want to harvest.
Block block = VectUtil.getBlock(getWorld(), position);
@@ -193,40 +195,43 @@ public class FarmLogicCocoa extends FarmLogic {
return crops;
}
private ArrayList<Vect> processHarvestBlock(Stack<ICrop> crops, Set<Vect> seen, Vect start, Vect position) {
private ArrayList<Vect> processHarvestBlock(Deque<ICrop> crops, Set<Vect> seen, Vect start, IVect position) {
World world = getWorld();
ArrayList<Vect> candidates = new ArrayList<>();
// Get additional candidates to return
MutableVect mutable = new MutableVect();
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);
if (candidate.equals(position)) {
mutable.set(position).add(i, j, k);
if (mutable.equals(position)) {
continue;
}
if (Math.abs(candidate.x - start.x) > 5) {
if (Math.abs(mutable.x - start.x) > 5) {
continue;
}
if (Math.abs(candidate.z - start.z) > 5) {
if (Math.abs(mutable.z - start.z) > 5) {
continue;
}
// See whether the given position has already been processed
if (seen.contains(candidate)) {
if (seen.contains(mutable)) {
continue;
}
ICrop crop = cocoa.getCropAt(world, candidate.x, candidate.y, candidate.z);
ICrop crop = cocoa.getCropAt(world, mutable.x, mutable.y, mutable.z);
if (crop != null) {
Vect immutable = mutable.asImmutable();
crops.push(crop);
candidates.add(candidate);
seen.add(candidate);
} else if (VectUtil.isWoodBlock(world, candidate)) {
candidates.add(candidate);
seen.add(candidate);
candidates.add(immutable);
seen.add(immutable);
} else if (VectUtil.isWoodBlock(world, mutable)) {
Vect immutable = mutable.asImmutable();
candidates.add(immutable);
seen.add(immutable);
}
}
}
@@ -8,8 +8,9 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Stack;
import java.util.Deque;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
@@ -111,7 +112,7 @@ public abstract class FarmLogicCrops extends FarmLogicWatered {
public Collection<ICrop> harvest(int x, int y, int z, FarmDirection direction, int extent) {
World world = getWorld();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
for (int i = 0; i < extent; i++) {
Vect position = translateWithOffset(x, y + 1, z, direction, i);
for (IFarmable seed : seeds) {
@@ -8,8 +8,9 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Stack;
import java.util.Deque;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
@@ -68,7 +69,7 @@ public class FarmLogicEnder extends FarmLogicHomogeneous {
public Collection<ICrop> harvest(int x, int y, int z, FarmDirection direction, int extent) {
World world = getWorld();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
for (int i = 0; i < extent; i++) {
Vect position = translateWithOffset(x, y + 1, z, direction, i);
for (IFarmable farmable : germlings) {
@@ -8,8 +8,9 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Stack;
import java.util.Deque;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
@@ -85,7 +86,7 @@ public class FarmLogicGourd extends FarmLogic {
public Collection<ICrop> harvest(int x, int y, int z, FarmDirection direction, int extent) {
World world = getWorld();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
for (int i = 0; i < extent; i++) {
Vect position = translateWithOffset(x, y + 1, z, direction, i);
for (IFarmable seed : seeds) {
@@ -8,8 +8,9 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Stack;
import java.util.Deque;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
@@ -68,7 +69,7 @@ public class FarmLogicInfernal extends FarmLogicHomogeneous {
public Collection<ICrop> harvest(int x, int y, int z, FarmDirection direction, int extent) {
World world = getWorld();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
for (int i = 0; i < extent; i++) {
Vect position = translateWithOffset(x, y + 1, z, direction, i);
for (IFarmable farmable : germlings) {
@@ -8,13 +8,14 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Stack;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
@@ -35,6 +36,8 @@ import forestry.api.farming.IFarmHousing;
import forestry.api.farming.IFarmable;
import forestry.api.farming.IFarmableBasic;
import forestry.api.genetics.IFruitBearer;
import forestry.core.utils.vect.IVect;
import forestry.core.utils.vect.MutableVect;
import forestry.core.utils.vect.Vect;
import forestry.core.utils.vect.VectUtil;
import forestry.plugins.PluginCore;
@@ -145,7 +148,7 @@ public class FarmLogicOrchard extends FarmLogic {
private Collection<ICrop> getHarvestBlocks(Vect position) {
Set<Vect> seen = new HashSet<>();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
World world = getWorld();
@@ -158,8 +161,8 @@ public class FarmLogicOrchard extends FarmLogic {
List<Vect> candidates = processHarvestBlock(crops, seen, position, position);
List<Vect> temp = new ArrayList<>();
while (!candidates.isEmpty() && crops.size() < 20) {
for (Vect candidate : candidates) {
temp.addAll(processHarvestBlock(crops, seen, position, candidate));
for (int i = 0; i < candidates.size(); i++) {
temp.addAll(processHarvestBlock(crops, seen, position, candidates.get(i)));
}
candidates.clear();
candidates.addAll(temp);
@@ -169,39 +172,41 @@ public class FarmLogicOrchard extends FarmLogic {
return crops;
}
private List<Vect> processHarvestBlock(Stack<ICrop> crops, Set<Vect> seen, Vect start, Vect position) {
private List<Vect> processHarvestBlock(Deque<ICrop> crops, Set<Vect> seen, IVect start, IVect position) {
World world = getWorld();
List<Vect> candidates = new ArrayList<>();
final MutableVect mutable = new MutableVect();
// Get additional candidates to return
for (int i = -2; i < 3; i++) {
for (int j = 0; j < 2; j++) {
for (int k = -1; k < 2; k++) {
Vect candidate = position.add(i, j, k);
if (Math.abs(candidate.x - start.x) > 5) {
mutable.set(position).add(i, j, k);
if (Math.abs(mutable.getX() - start.getX()) > 5) {
continue;
}
if (Math.abs(candidate.z - start.z) > 5) {
if (Math.abs(mutable.getZ() - start.getZ()) > 5) {
continue;
}
// See whether the given position has already been processed
if (seen.contains(candidate)) {
if (seen.contains(mutable)) {
continue;
}
if (VectUtil.isAirBlock(world, candidate)) {
if (VectUtil.isAirBlock(world, mutable)) {
continue;
}
if (VectUtil.isWoodBlock(world, candidate)
|| isBlockTraversable(world, candidate, traversalBlocks)) {
candidates.add(candidate);
seen.add(candidate);
} else if (isFruitBearer(world, candidate)) {
candidates.add(candidate);
seen.add(candidate);
if (VectUtil.isWoodBlock(world, mutable) || isBlockTraversable(world, mutable, traversalBlocks)) {
final Vect immutable = new Vect(mutable);
candidates.add(immutable);
seen.add(immutable);
} else if (isFruitBearer(world, mutable)) {
final Vect immutable = new Vect(mutable);
candidates.add(immutable);
seen.add(immutable);
ICrop crop = getCrop(world, candidate);
ICrop crop = getCrop(world, immutable);
if (crop != null) {
crops.push(crop);
}
@@ -213,20 +218,20 @@ public class FarmLogicOrchard extends FarmLogic {
return candidates;
}
private boolean isFruitBearer(World world, Vect position) {
private boolean isFruitBearer(World world, IVect position) {
TileEntity tile = world.getTileEntity(position.x, position.y, position.z);
TileEntity tile = world.getTileEntity(position.getX(), position.getY(), position.getZ());
if (tile instanceof IFruitBearer) {
return true;
}
Block block = precalcBlockType ? world.getBlock(position.x, position.y, position.z) : null;
int meta = precalcBlockMeta ? world.getBlockMetadata(position.x, position.y, position.z) : -1;
Block block = precalcBlockType ? world.getBlock(position.getX(), position.getY(), position.getZ()) : null;
int meta = precalcBlockMeta ? world.getBlockMetadata(position.getX(), position.getY(), position.getZ()) : -1;
for (IFarmable farmable : farmables) {
if (farmable instanceof IFarmableBasic) {
if (((IFarmableBasic) farmable).isSapling(block, meta)) return true;
} else if (farmable.isSaplingAt(world, position.x, position.y, position.z)) {
} else if (farmable.isSaplingAt(world, position.getX(), position.getY(), position.getZ())) {
return true;
}
}
@@ -234,29 +239,28 @@ public class FarmLogicOrchard extends FarmLogic {
return false;
}
private static boolean isBlockTraversable(World world, Vect position, ImmutableList<Block> traversalBlocks) {
private static boolean isBlockTraversable(World world, IVect position, ImmutableList<Block> traversalBlocks) {
Block candidate = VectUtil.getBlock(world, position);
for (Block block : traversalBlocks) {
if (block == (candidate)) {
for (int i = 0; i < traversalBlocks.size(); i++) {
if (candidate == traversalBlocks.get(i)) {
return true;
}
}
return false;
}
private ICrop getCrop(World world, Vect position) {
private ICrop getCrop(World world, IVect position) {
TileEntity tile = world.getTileEntity(position.x, position.y, position.z);
TileEntity tile = world.getTileEntity(position.getX(), position.getY(), position.getZ());
if (tile instanceof IFruitBearer) {
IFruitBearer fruitBearer = (IFruitBearer) tile;
if (tile instanceof IFruitBearer fruitBearer) {
if (fruitBearer.hasFruit() && fruitBearer.getRipeness() >= 0.9f) {
return new CropFruit(world, position);
return new CropFruit(world, position.asImmutable());
}
} else {
for (IFarmable seed : farmables) {
ICrop crop = seed.getCropAt(world, position.x, position.y, position.z);
ICrop crop = seed.getCropAt(world, position.getX(), position.getY(), position.getZ());
if (crop != null) {
return crop;
}
@@ -8,8 +8,9 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Stack;
import java.util.Deque;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
@@ -77,7 +78,7 @@ public class FarmLogicPeat extends FarmLogicWatered {
public Collection<ICrop> harvest(int x, int y, int z, FarmDirection direction, int extent) {
World world = getWorld();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
for (int i = 0; i < extent; i++) {
Vect position = translateWithOffset(x, y, z, direction, i);
ItemStack occupant = VectUtil.getAsItemStack(world, position);
@@ -8,8 +8,9 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Stack;
import java.util.Deque;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
@@ -99,7 +100,7 @@ public class FarmLogicReeds extends FarmLogic {
public Collection<ICrop> harvest(int x, int y, int z, FarmDirection direction, int extent) {
World world = getWorld();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
for (int i = 0; i < extent; i++) {
Vect position = translateWithOffset(x, y + 1, z, direction, i);
for (IFarmable seed : germlings) {
@@ -8,12 +8,13 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
import net.minecraft.block.Block;
import net.minecraft.init.Items;
@@ -28,6 +29,7 @@ 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.MutableVect;
import forestry.core.utils.vect.Vect;
import forestry.core.utils.vect.VectUtil;
import forestry.plugins.compat.PluginIC2;
@@ -123,7 +125,7 @@ public class FarmLogicRubber extends FarmLogic {
private Collection<ICrop> getHarvestBlocks(Vect position) {
Set<Vect> seen = new HashSet<>();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
World world = getWorld();
@@ -152,31 +154,33 @@ public class FarmLogicRubber extends FarmLogic {
return crops;
}
private ArrayList<Vect> processHarvestBlock(Stack<ICrop> crops, Set<Vect> 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 = position.asMutable();
for (int j = 0; j < 2; j++) {
Vect candidate = new Vect(position.x, position.y + j, position.z);
if (candidate.equals(position)) {
mutable.y = position.y + j;
if (mutable.equals(position)) {
continue;
}
// See whether the given position has already been processed
if (seen.contains(candidate)) {
if (seen.contains(mutable)) {
continue;
}
Block block = VectUtil.getBlock(world, candidate);
Block block = VectUtil.getBlock(world, mutable);
if (ItemStackUtil.equals(block, PluginIC2.rubberwood)) {
int meta = VectUtil.getBlockMeta(world, candidate);
final Vect immutable = new Vect(mutable);
int meta = VectUtil.getBlockMeta(world, immutable);
if (meta >= 2 && meta <= 5) {
crops.push(new CropRubber(world, block, meta, candidate));
crops.push(new CropRubber(world, block, meta, immutable));
}
candidates.add(candidate);
seen.add(candidate);
candidates.add(immutable);
seen.add(immutable);
}
}
@@ -8,8 +8,9 @@
******************************************************************************/
package forestry.farming.logic;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Stack;
import java.util.Deque;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
@@ -99,7 +100,7 @@ public class FarmLogicSucculent extends FarmLogic {
public Collection<ICrop> harvest(int x, int y, int z, FarmDirection direction, int extent) {
World world = getWorld();
Stack<ICrop> crops = new Stack<>();
Deque<ICrop> crops = new ArrayDeque<>();
for (int i = 0; i < extent; i++) {
Vect position = translateWithOffset(x, y + 1, z, direction, i);
for (IFarmable seed : germlings) {
@@ -9,16 +9,17 @@
package forestry.farming.multiblock;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
@@ -110,8 +111,8 @@ public class FarmController extends RectangularMultiblockControllerBase
private int allowedExtent = 0;
private IFarmLogic harvestProvider; // The farm logic which supplied the pending crops.
private final Stack<ICrop> pendingCrops = new Stack<>();
private final Stack<ItemStack> pendingProduce = new Stack<>();
private final Deque<ICrop> pendingCrops = new ArrayDeque<>();
private final Deque<ItemStack> pendingProduce = new ArrayDeque<>();
private Stage stage = Stage.CULTIVATE;
@@ -8,7 +8,7 @@
******************************************************************************/
package forestry.farming.multiblock;
import java.util.Stack;
import java.util.Deque;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
@@ -208,7 +208,7 @@ public class InventoryFarm extends InventoryAdapterRestricted implements IFarmIn
produce.stackSize -= InventoryUtil.addStack(productInventory, produce, true);
}
public void stowHarvest(Iterable<ItemStack> harvested, Stack<ItemStack> pendingProduce) {
public void stowHarvest(Iterable<ItemStack> harvested, Deque<ItemStack> pendingProduce) {
for (ItemStack harvest : harvested) {
if (harvest == null) {
continue;
@@ -232,7 +232,7 @@ public class InventoryFarm extends InventoryAdapterRestricted implements IFarmIn
}
}
public boolean tryAddPendingProduce(Stack<ItemStack> pendingProduce) {
public boolean tryAddPendingProduce(Deque<ItemStack> pendingProduce) {
IInventory productInventory = getProductInventory();
ItemStack next = pendingProduce.peek();
@@ -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