Compare commits

...
27 Commits
Author SHA1 Message Date
Firewooddoge 4b310d407f Fix other-language block names showing as unlocalized .name keys (#132) 2026-10-25 10:55:33 +01:00
Worive f2e85073d3 Fix alveary inventory drops on chunk unload (#134) 2026-10-03 12:46:01 -05:00
ABKQPO 0bd9a7978a Expose mutation resource condition values (#135) 2026-09-15 21:06:15 +02:00
boubou19 e47fc90433 reduce allocations of arrays to once per call (#133) 2026-08-25 19:19:42 -04:00
boubou19 452064ef1d More enum .values() caching (#131) 2026-08-14 01:10:34 +02:00
boubou19 59c8c36520 Cache enum .values() (#130) 2026-08-10 20:56:48 +02:00
Ryan Nasers ea1c4edae4 Fixes the display of blocks in NEI for the double slab blocks (#129) 2026-08-10 08:22:57 +07:00
Firewooddoge 4c46626cdb Fix Japanese block names showing as unlocalized .name keys (#128) 2026-08-08 14:30:36 +07:00
Alex VermetteandAlex Vermette d6fa8d8b74 fix: implement stacked block slab (#127)
Co-authored-by: Alex Vermette <vermz@hotmail.ca>
2026-07-27 13:20:40 -04:00
UltraProdigy 704861b666 Delete Forestry CONTRIBUTING.md (#126) 2026-07-04 19:02:06 +00:00
Algent db25dcce48 Dupe Fix - Make bag logic more lag resistant (#121) 2026-07-04 18:57:41 +00:00
FourIsTheNumber 4b364a93db Use extended interface (#125) 2026-07-01 18:27:50 -04:00
Yannick Marcotte-Gourde a217884480 Fix Worktable NEI fill regression (#124) 2026-06-28 15:19:53 -04:00
tiffit 90f7c36a1e Add NEI overlays for the carpenter and fabricator (#123) 2026-06-19 21:58:09 +02:00
FourIsTheNumber 974e44f5cd Add API method for protection amount on IArmorApiarist (#122) 2026-06-15 01:19:34 -04:00
Ed Rakhmankulov bbb374cd5e added ability to open backpacks enabled by NoHotbarNeeded (#105) 2026-05-24 14:59:08 +02:00
Eldrinn-Elantey 3470c6c7d1 Add OreDictionary entry for fertile tree pollen (#120) 2026-05-09 14:26:25 +02:00
Alexdoru b1377d5642 return the correct butterfly when rendering (#119) 2026-05-01 17:36:27 +02:00
Yoshy b50910496e Fix crash when rendering creative tab (#118) 2026-05-01 00:39:25 -04:00
AlexdoruandUltraProdigy cc4b16e2a5 fix crash if block is null in TileWood#getPickBlock (#114)
Co-authored-by: UltraProdigy <187078471+UltraProdigy@users.noreply.github.com>
2026-04-28 22:19:46 +00:00
Faltsolph 3b63133790 change an integer to a float in a division to avoid possible rounding error in apiary comb production formula (#117) 2026-04-28 21:29:29 +00:00
Alexdoruandboubou19 6d8d7110e1 Fix world client leaks in butterfly and analyzer renderer (#116)
Co-authored-by: boubou19 <miisterunknown@gmail.com>
2026-04-27 23:43:29 +02:00
Martin Robertz 98fa57844e update 2026-04-27 12:42:21 +02:00
Ranzu adbb300523 Added color localization for the missing items inside the worktable gui (#115) 2026-04-25 16:16:40 +02:00
Alexdoru 839882b783 Fix WorldClient memory leak in butterfly renderer (#113) 2026-04-09 21:49:41 +02:00
Martin Robertz 2635d036aa update+gradle+deps+bs 2026-04-03 16:23:52 +02:00
Guillaume Mercier cf8f2f54c5 Add fertilizer registry (#112) 2026-04-01 20:02:06 +02:00
78 changed files with 784 additions and 351 deletions

No files matched your search

-29
View File
@@ -1,29 +0,0 @@
How to submit a bug report to Forestry
====================================
Please make sure the bug has not already been reported by [searching the issues](https://github.com/ForestryMC/ForestryMC/issues?q=is%3Aissue).
If you can, see if the bug still happens with the latest unstable build.
[The latest unstable builds are available here](http://jenkins.ic2.player.to/job/Forestry_Dev/)
For crashes, you must post a link to the full crash report.
[gist.github.com](gist.github.com) or [pastebin.com](www.pastebin.com) are good places to upload them.
Full crash reports are located in [the minecraft data folder](http://hopper.minecraft.net/help/finding-minecraft-data-folder/), in "crash-reports".
Thank you for reporting bugs!
How to contribute to Forestry
====================================
### Contributor License Agreement
Before pull requests can be accepted, the contributor needs to sign a contributor license agreement. (Essentially giving a license for using his code and/or media and for re-licensing it, for details read the agreement linked below.)
### How do I sign?
To keep the hassle for everyone involved to a minimum, Forestry uses CLAHub to manage the agreements. To get started, <a href="https://www.clahub.com/agreements/ForestryMC/ForestryMC">sign the Contributor License Agreement</a>.
### Why is this needed?
Without CLAs it at some point becomes essentially impossible to change the license of a project which accepts contributions from third parties. Without an explicit agreement every contributor would still own the copyright to his code. So as long as it (or parts of it) remain in the code base, he would have to agree to every license change. If enough time has passed, there may be dozens, perhaps even hundreds of contributors involved and it will be very hard to track down each and every one of them and get them to agree on a new license.
This would make it impossible to change the license to a more permissive one at a later date, so the code would be locked into CC BY-NC-ND 3.0 until it passes into the public domain about a hundred years from now. This situation is to be avoided and that’s why you are being bothered with this CLA.
+5 -4
View File
@@ -1,12 +1,13 @@
// Add your dependencies here
dependencies {
api("com.github.GTNewHorizons:GTNHLib:0.9.41:dev")
api("com.github.GTNewHorizons:GTNHLib:0.9.54:dev")
api('curse.maven:cofh-lib-220333:2388748')
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-beta68a:api')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.8.70-GTNH:dev')
compileOnlyApi('com.github.GTNewHorizons:Angelica:2.1.19:api')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.8.107-GTNH:dev')
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.7.1:api')
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.55:api')
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.57:api')
compileOnly('net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev')
compileOnly('curse.maven:craftguide-75557:2459320')
devOnlyNonPublishable('net.xonich.mc:NoHotbarNeeded:0.0.3:dev')
}
+10 -10
View File
@@ -1,12 +1,12 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/93aeea858331bd6bb00ba94759830234/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/93aeea858331bd6bb00ba94759830234/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/3426ffcaa54c3f62406beb1f1ab8b179/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/f636c800fdb3f9ae33f019dfa048ba72/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/93aeea858331bd6bb00ba94759830234/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/3cd7045fca9a72cd9bc7d14a385e594c/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/0ef34dd9312b12d61ba1b8e66126d140/redirect
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/c2dd35c9d0aaf0ba6ad0791320f99dfc/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/e5810bd7fd1f8a586644409d395a7e55/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/7b3c4877c0749019e6805bb61e421497/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/8e1d9ee5d0f13e442218f6884a306da1/redirect
toolchainVersion=25
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-9.3.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Vendored
+1 -1
View File
@@ -57,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
+1
View File
@@ -1,4 +1,5 @@
// Add any additional repositiroes for your dependencies here
repositories {
mavenLocal()
}
+1 -1
View File
@@ -17,7 +17,7 @@ pluginManagement {
}
plugins {
id 'com.gtnewhorizons.gtnhsettingsconvention' version '2.0.20'
id 'com.gtnewhorizons.gtnhsettingsconvention' version '2.0.24'
}
@@ -0,0 +1,20 @@
package forestry.api.apiculture;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
public interface IArmorApiaristMulti extends IArmorApiarist {
/**
* Called to determine how many pieces an armor "counts for". For instance, if this returns 4, the single piece will
* act as full protection.
*
* @param entity Entity being attacked
* @param armor Armor item
* @param cause Optional cause of attack, such as a bee effect identifier
* @return Amount of effective protected slots
*/
default int getProtectionCount(EntityLivingBase entity, ItemStack armor, String cause) {
return 1;
}
}
@@ -0,0 +1,40 @@
package forestry.api.multiblock;
import java.util.Collection;
import net.minecraft.item.ItemStack;
public interface IFarmFertilizerRegistry {
/**
* Gets a list of all fertilizer stacks in the registry.
*
* @return The current fertilizer registry.
*/
Collection<ItemStack> getFertilizers();
/**
* Adds a new fertilizer to the registry.
*
* @apiNote The stack size doesn't matter it always consumes 1.
* @apiNote You can use OreDictionary.WILDCARD_VALUE to specific that any meta of the item will be ok.
*
* @param itemstack The item to add to the registry.
*/
void addFertilizer(ItemStack itemstack);
/**
* Removes a fertilizer from the fretilizer registry.
*
* @param itemstack The item to remove from the registry.
*/
void removeFertilizer(ItemStack itemstack);
/**
* Checks if an item is a usable multi-farm fertilizer.
*
* @param itemstack - The stack to check with.
* @return True if the item is a fertilizer item.
*/
boolean isFertilizer(ItemStack itemstack);
}
@@ -8,4 +8,6 @@ package forestry.api.multiblock;
public class MultiblockManager {
public static IMultiblockLogicFactory logicFactory;
public static IFarmFertilizerRegistry farmFertilizerRegistry;
}
@@ -15,26 +15,20 @@ import net.minecraft.item.ItemStack;
import forestry.api.apiculture.IArmorApiarist;
import forestry.api.apiculture.IArmorApiaristHelper;
import forestry.api.apiculture.IArmorApiaristMulti;
public class ArmorApiaristHelper implements IArmorApiaristHelper {
@Override
public boolean isArmorApiarist(ItemStack stack, EntityLivingBase entity, String cause, boolean doProtect) {
if (stack == null) {
return false;
}
Item item = stack.getItem();
if (!(item instanceof IArmorApiarist)) {
return false;
}
if (stack == null || !(stack.getItem() instanceof IArmorApiarist armor)) return false;
IArmorApiarist armorApiarist = (IArmorApiarist) item;
try {
return armorApiarist.protectEntity(entity, stack, cause, doProtect);
return armor.protectEntity(entity, stack, cause, doProtect);
} catch (Throwable ignored) { // protectEntity is new to the API and may not be implemented by the armor
if (entity instanceof EntityPlayer) {
return armorApiarist.protectPlayer((EntityPlayer) entity, stack, cause, doProtect);
return armor.protectPlayer((EntityPlayer) entity, stack, cause, doProtect);
} else {
return true; // fallback on assuming IArmorApiarist will protect the entity
}
@@ -48,11 +42,13 @@ public class ArmorApiaristHelper implements IArmorApiaristHelper {
for (int i = 1; i <= 4; i++) {
ItemStack armorItem = entity.getEquipmentInSlot(i);
if (isArmorApiarist(armorItem, entity, cause, doProtect)) {
count++;
Item item = armorItem.getItem();
if (item instanceof IArmorApiaristMulti am) count += am.getProtectionCount(entity, armorItem, cause);
else count++;
}
}
return count;
return Math.min(count, 4);
}
@Override
@@ -573,7 +573,7 @@ public class Bee extends IndividualLiving implements IBee {
}
// / Secondary Products
for (Map.Entry<ItemStack, Float> entry : secondary.getProductChances().entrySet()) {
if (housing.getWorld().rand.nextFloat() < getFinalChance(entry.getValue() / 2, speed, prodModifier, 1f)) {
if (housing.getWorld().rand.nextFloat() < getFinalChance(entry.getValue() / 2f, speed, prodModifier, 1f)) {
products.add(entry.getKey().copy());
}
}
@@ -15,6 +15,7 @@ import forestry.api.core.Tabs;
import forestry.apiculture.gui.GuiBeealyzer;
import forestry.apiculture.inventory.ItemInventoryBeealyzer;
import forestry.core.gui.ContainerAlyzer;
import forestry.core.inventory.ItemLocation;
import forestry.core.items.ItemWithGui;
public class ItemBeealyzer extends ItemWithGui {
@@ -24,13 +25,13 @@ public class ItemBeealyzer extends ItemWithGui {
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
ItemInventoryBeealyzer inventory = new ItemInventoryBeealyzer(player, heldItem);
return new GuiBeealyzer(player, inventory);
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
ItemInventoryBeealyzer inventory = new ItemInventoryBeealyzer(player, heldItem);
return new ContainerAlyzer(inventory, player);
}
@@ -29,6 +29,7 @@ import forestry.apiculture.gui.ContainerHabitatLocator;
import forestry.apiculture.gui.GuiHabitatLocator;
import forestry.apiculture.inventory.ItemInventoryHabitatLocator;
import forestry.apiculture.render.TextureHabitatLocator;
import forestry.core.inventory.ItemLocation;
import forestry.core.items.ItemWithGui;
import forestry.core.utils.StringUtil;
@@ -81,12 +82,12 @@ public class ItemHabitatLocator extends ItemWithGui {
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new GuiHabitatLocator(player, new ItemInventoryHabitatLocator(player, heldItem));
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new ContainerHabitatLocator(player, new ItemInventoryHabitatLocator(player, heldItem));
}
}
@@ -15,6 +15,7 @@ import forestry.api.core.Tabs;
import forestry.apiculture.gui.ContainerImprinter;
import forestry.apiculture.gui.GuiImprinter;
import forestry.apiculture.inventory.ItemInventoryImprinter;
import forestry.core.inventory.ItemLocation;
import forestry.core.items.ItemWithGui;
public class ItemImprinter extends ItemWithGui {
@@ -24,12 +25,12 @@ public class ItemImprinter extends ItemWithGui {
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new GuiImprinter(player.inventory, new ItemInventoryImprinter(player, heldItem));
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new ContainerImprinter(player.inventory, new ItemInventoryImprinter(player, heldItem));
}
}
@@ -111,6 +111,14 @@ public class AlvearyController extends RectangularMultiblockControllerBase
this.readFromNBT(data);
}
@Override
public void detachBlock(IMultiblockComponent part, boolean chunkUnloading) {
if (!chunkUnloading) {
inventory.dumpInventoryIntoWorld(this.worldObj, part.getCoordinates());
}
super.detachBlock(part, chunkUnloading);
}
@Override
protected void onBlockAdded(IMultiblockComponent newPart) {
if (newPart instanceof IAlvearyComponent) {
@@ -159,8 +167,6 @@ public class AlvearyController extends RectangularMultiblockControllerBase
activeComponents.remove(oldPart);
}
}
inventory.dumpInventoryIntoWorld(this.worldObj, oldPart.getCoordinates());
}
@Override
@@ -16,8 +16,8 @@ import net.minecraft.block.material.Material;
import net.minecraft.client.particle.EffectRenderer;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
@@ -72,7 +72,7 @@ public class BlockSlab extends net.minecraft.block.BlockSlab implements IWoodTyp
@SideOnly(Side.CLIENT)
@Override
public IIcon getIcon(int side, int meta) {
return IconProviderWood.getPlankIcon(EnumWoodType.LARCH);
return IconProviderWood.getPlankIcon(EnumWoodType.VALUES[meta]);
}
@Override
@@ -84,7 +84,8 @@ public class BlockSlab extends net.minecraft.block.BlockSlab implements IWoodTyp
@Override
protected ItemStack createStackedBlock(int meta) {
return new ItemStack(Blocks.wooden_slab, 2, meta & 7);
Item item = Item.getItemFromBlock(this);
return item != null ? new ItemStack(item, 2, 0) : null;
}
@Override
@@ -107,6 +108,18 @@ public class BlockSlab extends net.minecraft.block.BlockSlab implements IWoodTyp
return new TileWood();
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) {
// Special case for double slabs placed by building mods (e.g., MatterManipulator)
if (stack == null) return;
int damage = stack.getItemDamage();
if (damage < 0 || damage >= EnumWoodType.VALUES.length) return;
TileWood tile = TileWood.getWoodTile(world, x, y, z);
if (tile != null) {
tile.setWoodType(EnumWoodType.VALUES[damage]);
}
}
/* PROPERTIES */
@Override
public final ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
@@ -26,6 +26,7 @@ public class ItemRegistryArboriculture extends ItemRegistry {
OreDictionary.registerOre("treeSapling", sapling.getWildcard());
pollenFertile = registerItem(new ItemGermlingGE(EnumGermlingType.POLLEN), "pollenFertile");
OreDictionary.registerOre("itemPollenFertile", pollenFertile.getWildcard());
treealyzer = registerItem(new ItemTreealyzer(), "treealyzer");
grafter = registerItem(new ItemGrafter(4), "grafter");
grafterProven = registerItem(new ItemGrafter(149), "grafterProven");
@@ -15,6 +15,7 @@ import forestry.api.core.Tabs;
import forestry.arboriculture.gui.GuiTreealyzer;
import forestry.arboriculture.inventory.ItemInventoryTreealyzer;
import forestry.core.gui.ContainerAlyzer;
import forestry.core.inventory.ItemLocation;
import forestry.core.items.ItemWithGui;
public class ItemTreealyzer extends ItemWithGui {
@@ -24,12 +25,12 @@ public class ItemTreealyzer extends ItemWithGui {
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new GuiTreealyzer(player, new ItemInventoryTreealyzer(player, heldItem));
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new ContainerAlyzer(new ItemInventoryTreealyzer(player, heldItem), player);
}
}
@@ -95,8 +95,7 @@ public class TileWood extends TileEntity implements IStreamable {
EnumWoodType woodType = wood.getWoodType();
int amount = 1;
if (block instanceof BlockSlab) {
BlockSlab blockSlab = (BlockSlab) block;
if (block instanceof BlockSlab blockSlab) {
if (blockSlab.isDoubleSlab()) {
amount = 2;
block = PluginArboriculture.blocks.slabs;
@@ -104,6 +103,7 @@ public class TileWood extends TileEntity implements IStreamable {
}
ItemStack itemStack = new ItemStack(block, amount);
if (itemStack.getItem() == null) return null;
ItemBlockWood.saveToItemStack(woodType, itemStack);
return itemStack;
}
@@ -202,7 +202,8 @@ public abstract class Genome implements IGenome {
private static IChromosome[] getChromosomes(NBTTagCompound genomeNBT, ISpeciesRoot speciesRoot) {
NBTTagList chromosomesNBT = genomeNBT.getTagList("Chromosomes", 10);
IChromosome[] chromosomes = new IChromosome[speciesRoot.getDefaultTemplate().length];
IAllele[] defaultTemplate = speciesRoot.getDefaultTemplate();
IChromosome[] chromosomes = new IChromosome[defaultTemplate.length];
for (int i = 0; i < chromosomesNBT.tagCount(); i++) {
NBTTagCompound chromosomeNBT = chromosomesNBT.getCompoundTagAt(i);
@@ -213,7 +214,7 @@ public abstract class Genome implements IGenome {
chromosomes[chromosomeOrdinal] = chromosome;
if (Config.clearInvalidChromosomes) {
IAllele template = speciesRoot.getDefaultTemplate()[chromosomeOrdinal];
IAllele template = defaultTemplate[chromosomeOrdinal];
Class<? extends IAllele> chromosomeClass = speciesRoot.getKaryotype()[chromosomeOrdinal]
.getAlleleClass();
if (chromosome.overrideInvalidAlleles(template, chromosomeClass)) {
@@ -32,6 +32,10 @@ public class MutationConditionRequiresResource implements IMutationCondition {
blockRequired = new ItemStack(block, 1, meta);
}
public ItemStack getBlockRequired() {
return blockRequired.copy();
}
@Override
public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
IGenome genome1, IClimateProvider climate) {
@@ -39,6 +39,10 @@ public class MutationConditionRequiresResourceOreDict implements IMutationCondit
}
}
public int getOreDictId() {
return oreDictId;
}
@Override
public float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0,
IGenome genome1, IClimateProvider climate) {
@@ -36,8 +36,7 @@ public abstract class ContainerForestry extends Container {
// Player inventory
for (int row = 0; row < 3; row++) {
for (int column = 0; column < 9; column++) {
addSlotToContainer(
new Slot(playerInventory, column + row * 9 + 9, xInv + column * 18, yInv + row * 18));
addNormalSlot(playerInventory, column + row * 9 + 9, xInv + column * 18, yInv + row * 18);
}
}
// Player hotbar
@@ -46,6 +45,10 @@ public abstract class ContainerForestry extends Container {
}
}
protected void addNormalSlot(InventoryPlayer playerInventory, int slot, int x, int y) {
addSlotToContainer(new Slot(playerInventory, slot, x, y));
}
protected void addHotbarSlot(InventoryPlayer playerInventory, int slot, int x, int y) {
addSlotToContainer(new Slot(playerInventory, slot, x, y));
}
@@ -26,6 +26,17 @@ public abstract class ContainerItemInventory<I extends ItemInventory> extends Co
addPlayerInventory(playerInventory, xInv, yInv);
}
@Override
protected void addNormalSlot(InventoryPlayer playerInventory, int slot, int x, int y) {
ItemStack stackInSlot = playerInventory.getStackInSlot(slot);
if (inventory.isParentItemInventory(stackInSlot)) {
addSlotToContainer(new SlotLocked(playerInventory, slot, x, y));
} else {
addSlotToContainer(new Slot(playerInventory, slot, x, y));
}
}
@Override
protected void addHotbarSlot(InventoryPlayer playerInventory, int slot, int x, int y) {
ItemStack stackInSlot = playerInventory.getStackInSlot(slot);
+82 -40
View File
@@ -8,6 +8,10 @@
******************************************************************************/
package forestry.core.gui;
import static forestry.core.inventory.ItemLocation.Type.PLAYER_INVENTORY;
import javax.annotation.Nullable;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
@@ -18,6 +22,7 @@ import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;
import forestry.api.core.ForestryAPI;
import forestry.core.inventory.ItemLocation;
public class GuiHandler implements IGuiHandler {
@@ -39,6 +44,20 @@ public class GuiHandler implements IGuiHandler {
entityplayer.openGui(ForestryAPI.instance, guiData, entityplayer.worldObj, 0, 0, 0);
}
/**
* Opens gui for item placed in player's inventory.
*
* @param entityPlayer Player.
* @param guiHandler GUI handler for item.
* @param data Data for item.
* @param invSlotIdx Index or slot in player inventory should be in range [0, 40).
*/
public static void openGui(EntityPlayer entityPlayer, IGuiHandlerItem guiHandler, short data, int invSlotIdx) {
assert invSlotIdx >= 0 && invSlotIdx < 40 : "Incorrect inventory index is used: " + invSlotIdx;
int guiData = encodeGuiData(guiHandler, data, invSlotIdx);
entityPlayer.openGui(ForestryAPI.instance, guiData, entityPlayer.worldObj, 0, 0, 0);
}
public static void openGui(EntityPlayer entityplayer, IGuiHandlerTile guiHandler) {
openGui(entityplayer, guiHandler, (short) 0);
}
@@ -56,8 +75,32 @@ public class GuiHandler implements IGuiHandler {
}
private static int encodeGuiData(IGuiHandlerForestry guiHandler, short data) {
return encodeGuiData(guiHandler, data, -1);
}
/**
* Encodes data required for GUI handler to function properly. Because of minecraft implementation we are limited to
* 32 bits.
*
* @param guiHandler GUI handler.
* @param data High bits which were encoded by GUI handler.
* @param invSlotIdx Slot index in the player's inventory should be in range [0,40).
* @return Encoded data.
*/
private static int encodeGuiData(IGuiHandlerForestry guiHandler, short data, int invSlotIdx) {
// inventory slot idx will be encoded in third byte
// player inventory has 40 slots which means that we need 6 bits to encode all values.
// first 2 bits are reserved for type currently values 0(heldItem) and 1(item inventory) have meaning,
// 2 and 3 are reserved for possible extension.
if (invSlotIdx < -1 || invSlotIdx >= 40) {
throw new IllegalArgumentException("Inventory slot index should be in range [-1, 40)");
}
int invData = invSlotIdx == -1 ? 0 : (0x40 | invSlotIdx);
GuiId guiId = GuiIdRegistry.getGuiIdForGuiHandler(guiHandler);
return data << 16 | guiId.getId();
return data << 16 | invData << 8 | guiId.getId();
}
private static GuiId decodeGuiID(int guiData) {
@@ -69,8 +112,24 @@ public class GuiHandler implements IGuiHandler {
return (short) (guiId >> 16);
}
private static int decodeInvSlotIdx(int guiData) {
boolean invEncoded = (0x00_00_40_00 & guiData) != 0;
return invEncoded ? (guiData & 0x00_00_3F_00) >> 8 : -1;
}
@Override
public Object getClientGuiElement(int guiData, EntityPlayer player, World world, int x, int y, int z) {
return getGuiElement(false, guiData, player, world, x, y, z);
}
@Override
public Object getServerGuiElement(int guiData, EntityPlayer player, World world, int x, int y, int z) {
return getGuiElement(true, guiData, player, world, x, y, z);
}
private @Nullable Object getGuiElement(boolean isServerSide, int guiData, EntityPlayer player, World world, int x,
int y, int z) {
GuiId guiId = decodeGuiID(guiData);
if (guiId == null) {
return null;
@@ -79,11 +138,25 @@ public class GuiHandler implements IGuiHandler {
switch (guiId.getGuiType()) {
case Item: {
ItemStack heldItem = player.getCurrentEquippedItem();
int slotIdx = decodeInvSlotIdx(guiData);
ItemStack heldItem;
ItemLocation loc;
if (slotIdx == -1) {
heldItem = player.getCurrentEquippedItem();
loc = ItemLocation.HELD_BY_PLAYER;
} else {
heldItem = player.inventory.getStackInSlot(slotIdx);
loc = new ItemLocation(PLAYER_INVENTORY, slotIdx);
}
if (heldItem != null) {
Item item = heldItem.getItem();
if (guiId.getGuiHandlerClass().isInstance(item)) {
return ((IGuiHandlerItem) item).getGui(player, heldItem, data);
if (isServerSide) {
return ((IGuiHandlerItem) item).getContainer(player, heldItem, data, loc);
}
return ((IGuiHandlerItem) item).getGui(player, heldItem, data, loc);
}
}
break;
@@ -91,6 +164,9 @@ public class GuiHandler implements IGuiHandler {
case Tile: {
TileEntity tileEntity = world.getTileEntity(x, y, z);
if (guiId.getGuiHandlerClass().isInstance(tileEntity)) {
if (isServerSide) {
return ((IGuiHandlerTile) tileEntity).getContainer(player, data);
}
return ((IGuiHandlerTile) tileEntity).getGui(player, data);
}
break;
@@ -98,6 +174,9 @@ public class GuiHandler implements IGuiHandler {
case Entity: {
Entity entity = world.getEntityByID(x);
if (guiId.getGuiHandlerClass().isInstance(entity)) {
if (isServerSide) {
return ((IGuiHandlerEntity) entity).getContainer(player, data);
}
return ((IGuiHandlerEntity) entity).getGui(player, data);
}
break;
@@ -105,41 +184,4 @@ public class GuiHandler implements IGuiHandler {
}
return null;
}
@Override
public Object getServerGuiElement(int guiData, EntityPlayer player, World world, int x, int y, int z) {
GuiId guiId = decodeGuiID(guiData);
if (guiId == null) {
return null;
}
short data = decodeGuiData(guiData);
switch (guiId.getGuiType()) {
case Item: {
ItemStack heldItem = player.getCurrentEquippedItem();
if (heldItem != null) {
Item item = heldItem.getItem();
if (guiId.getGuiHandlerClass().isInstance(item)) {
return ((IGuiHandlerItem) item).getContainer(player, heldItem, data);
}
}
break;
}
case Tile: {
TileEntity tileEntity = world.getTileEntity(x, y, z);
if (guiId.getGuiHandlerClass().isInstance(tileEntity)) {
return ((IGuiHandlerTile) tileEntity).getContainer(player, data);
}
break;
}
case Entity: {
Entity entity = world.getEntityByID(x);
if (guiId.getGuiHandlerClass().isInstance(entity)) {
return ((IGuiHandlerEntity) entity).getContainer(player, data);
}
break;
}
}
return null;
}
}
@@ -119,6 +119,13 @@ public class GuiIdRegistry {
classMap.put(tileGuiHandlerClass, guiId);
idMap.put(guiId.getId(), guiId);
}
if (idMap.size() > 256) {
// see {@link GuiHandler.encodeGuiData(forestry.core.gui.IGuiHandlerForestry, short, int)}
throw new IllegalStateException(
"Current implementation can't have more than different 256 GUI handlers "
+ "because its id is coded by 8 bits");
}
}
public static GuiId getGuiIdForGuiHandler(IGuiHandlerForestry guiHandler) {
@@ -11,9 +11,11 @@ package forestry.core.gui;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import forestry.core.inventory.ItemLocation;
public interface IGuiHandlerItem extends IGuiHandlerForestry {
Object getGui(EntityPlayer player, ItemStack heldItem, int data);
Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc);
Object getContainer(EntityPlayer player, ItemStack heldItem, int data);
Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc);
}
@@ -28,11 +28,17 @@ public abstract class ItemInventory implements IInventory, IFilterSlotDelegate {
private final EntityPlayer player;
private final ItemStack parent;
private final ItemStack[] inventoryStacks;
private final ItemLocation location;
public ItemInventory(EntityPlayer player, int size, ItemStack parent) {
this(player, size, parent, ItemLocation.UNKNOWN);
}
public ItemInventory(EntityPlayer player, int size, ItemStack parent, ItemLocation loc) {
this.player = player;
this.parent = parent;
this.inventoryStacks = new ItemStack[size];
this.location = loc;
setUID(); // Set a uid to identify the itemstack on SMP
@@ -79,20 +85,31 @@ public abstract class ItemInventory implements IInventory, IFilterSlotDelegate {
}
public boolean isParentItemEquipped() {
return isSameItemInventory(player.getCurrentEquippedItem(), parent);
return switch (location.type()) {
case HELD_BY_PLAYER, UNKNOWN -> isSameItemInventory(player.getCurrentEquippedItem(), parent);
case PLAYER_INVENTORY -> isSameItemInventory(player.inventory.getStackInSlot(location.slotIdx()), parent);
};
}
public EntityPlayer getPlayer() {
return player;
}
public ItemLocation getLocation() {
return location;
}
public boolean isParentItemInventory(ItemStack itemStack) {
ItemStack parent = getParent();
return isSameItemInventory(parent, itemStack);
}
protected ItemStack getParent() {
ItemStack equipped = player.getCurrentEquippedItem();
ItemStack equipped = switch (location.type()) {
case HELD_BY_PLAYER, UNKNOWN -> player.getCurrentEquippedItem();
case PLAYER_INVENTORY -> player.inventory.getStackInSlot(location.slotIdx());
};
if (isSameItemInventory(equipped, parent)) {
return equipped;
}
@@ -0,0 +1,32 @@
package forestry.core.inventory;
/**
* Location of items in inventory.
*/
public class ItemLocation {
public enum Type {
UNKNOWN,
HELD_BY_PLAYER,
PLAYER_INVENTORY
}
public static final ItemLocation UNKNOWN = new ItemLocation(Type.UNKNOWN, -1);
public static final ItemLocation HELD_BY_PLAYER = new ItemLocation(Type.HELD_BY_PLAYER, -1);
private final Type type;
private final int slotIdx;
public ItemLocation(Type type, int slotIdx) {
this.type = type;
this.slotIdx = slotIdx;
}
public Type type() {
return type;
}
public int slotIdx() {
return slotIdx;
}
}
@@ -15,16 +15,17 @@ import forestry.core.circuits.ContainerSolderingIron;
import forestry.core.circuits.GuiSolderingIron;
import forestry.core.circuits.ISolderingIron;
import forestry.core.inventory.ItemInventorySolderingIron;
import forestry.core.inventory.ItemLocation;
public class ItemSolderingIron extends ItemWithGui implements ISolderingIron {
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new GuiSolderingIron(player, new ItemInventorySolderingIron(player, heldItem));
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new ContainerSolderingIron(player, new ItemInventorySolderingIron(player, heldItem));
}
}
@@ -33,7 +33,7 @@ public abstract class ItemWithGui extends ItemForestry implements IGuiHandlerIte
}
protected void openGui(EntityPlayer entityplayer) {
GuiHandler.openGui(entityplayer, this);
GuiHandler.openGui(entityplayer, this, (short) 0, entityplayer.inventory.currentItem);
}
@Override
@@ -28,7 +28,7 @@ public enum PacketIdServer implements IPacketId {
BEE_LOGIC_ACTIVE_ENTITY_REQUEST,
// Factory
WORKTABLE_NEI_SELECT,
NEI_SELECT,
// Mail
LETTER_INFO_REQUEST,
@@ -23,7 +23,7 @@ import codechicken.nei.api.IOverlayHandler;
import codechicken.nei.api.IStackPositioner;
import codechicken.nei.recipe.IRecipeHandler;
import forestry.core.proxy.Proxies;
import forestry.factory.network.packets.PacketWorktableNEISelect;
import forestry.factory.network.packets.PacketNEISelect;
/**
* @author bdew
@@ -40,9 +40,25 @@ public class CustomOverlayHandler implements IOverlayHandler {
this.forceShift = forceShift;
}
@Override
public boolean requireShiftForOverlayRecipe() {
return false;
}
@Override
public void overlayRecipe(GuiContainer cont, IRecipeHandler recipe, int recipeIndex, boolean shift) {
List<PositionedStack> ingr = recipe.getIngredientStacks(recipeIndex);
int offsetX = 25;
int offsetY = 6;
int gridSpacing = 18;
List<PositionedStack> ingr;
if (recipe instanceof IGridRecipeHandler gridHandler) {
offsetX = gridHandler.getGridStartX();
offsetY = gridHandler.getGridStartY();
gridSpacing = gridHandler.getGridSpacing();
ingr = gridHandler.getGridStacks(recipeIndex);
} else {
ingr = recipe.getIngredientStacks(recipeIndex);
}
if (shift || forceShift) {
NBTTagList stacksnbt = new NBTTagList();
@@ -50,8 +66,8 @@ public class CustomOverlayHandler implements IOverlayHandler {
for (PositionedStack pstack : ingr) {
if (pstack != null) {
// This is back-asswards but i don't see a better way :(
int x = (pstack.relx - 25) / 18;
int y = (pstack.rely - 6) / 18;
int x = (pstack.relx - offsetX) / gridSpacing;
int y = (pstack.rely - offsetY) / gridSpacing;
ItemStack stack = pstack.item;
NBTTagCompound stacknbt = stack.writeToNBT(new NBTTagCompound());
@@ -68,7 +84,7 @@ public class CustomOverlayHandler implements IOverlayHandler {
NBTTagCompound data = new NBTTagCompound();
data.setTag("stacks", stacksnbt);
Proxies.net.sendToServer(new PacketWorktableNEISelect(data));
Proxies.net.sendToServer(new PacketNEISelect(data));
} else {
IStackPositioner positioner = new OffsetPositioner(xOffs, yOffs);
LayoutManager.overlayRenderer = new DefaultOverlayRenderer(ingr, positioner);
@@ -0,0 +1,17 @@
package forestry.core.recipes.nei;
import java.util.List;
import codechicken.nei.PositionedStack;
public interface IGridRecipeHandler {
int getGridStartX();
int getGridStartY();
int getGridSpacing();
List<PositionedStack> getGridStacks(int recipeIndex);
}
@@ -19,6 +19,8 @@ import forestry.api.arboriculture.TreeManager;
import forestry.api.lepidopterology.ButterflyManager;
import forestry.api.lepidopterology.EnumFlutterType;
import forestry.core.utils.Log;
import forestry.factory.gui.GuiCarpenter;
import forestry.factory.gui.GuiFabricator;
import forestry.factory.gui.GuiWorktable;
import forestry.factory.recipes.nei.NEIHandlerBottler;
import forestry.factory.recipes.nei.NEIHandlerCarpenter;
@@ -46,6 +48,8 @@ public class NEIIntegrationConfig implements IConfigureNEI {
CustomOverlayHandler handler = new CustomOverlayHandler(-14, 14, true);
API.registerGuiOverlayHandler(GuiWorktable.class, handler, "crafting");
API.registerGuiOverlayHandler(GuiCarpenter.class, handler, "forestry.carpenter");
API.registerGuiOverlayHandler(GuiFabricator.class, handler, "forestry.fabricator");
API.addSubset(
"Forestry.Bees.Princesses",
@@ -23,18 +23,19 @@ import net.minecraft.nbt.NBTTagList;
*/
public class SetRecipeCommandHandler {
private final Class<? extends Container> containerClass;
private final Class<? extends Container>[] containerClasses;
private final Class<? extends Slot> slotClass;
public SetRecipeCommandHandler(Class<? extends Container> containerClass, Class<? extends Slot> slotClass) {
this.containerClass = containerClass;
public SetRecipeCommandHandler(Class<? extends Container>[] containerClasses, Class<? extends Slot> slotClass) {
this.containerClasses = containerClasses;
this.slotClass = slotClass;
}
public void handle(NBTTagCompound data, EntityPlayerMP player) {
NBTTagList stacks = data.getTagList("stacks", 10);
Container cont = player.openContainer;
if (!containerClass.isInstance(cont)) {
if (!isContainerClassCorrect(cont)) {
return;
}
@@ -43,17 +44,20 @@ public class SetRecipeCommandHandler {
NBTTagCompound itemdata = stacks.getCompoundTagAt(i);
stmap.put(itemdata.getInteger("slot"), ItemStack.loadItemStackFromNBT(itemdata));
}
for (Object slotobj : cont.inventorySlots) {
if (!slotClass.isInstance(slotobj)) {
for (Slot slot : cont.inventorySlots) {
if (!slotClass.isInstance(slot)) {
continue;
}
Slot slot = (Slot) slotobj;
if (stmap.containsKey(slot.getSlotIndex())) {
slot.putStack(stmap.get(slot.getSlotIndex()));
} else {
slot.putStack(null);
}
slot.putStack(stmap.getOrDefault(slot.getSlotIndex(), null));
}
}
private boolean isContainerClassCorrect(Container cont) {
for (Class<? extends Container> containerClass : containerClasses) {
if (containerClass.isInstance(cont)) {
return true;
}
}
return false;
}
}
@@ -60,8 +60,6 @@ public class RenderAnalyzer extends TileEntitySpecialRenderer implements IBlockR
private void render(ItemStack itemstack, World world, ForgeDirection orientation, double x, double y, double z) {
dummyEntityItem.worldObj = world;
model.render(orientation, (float) x, (float) y, (float) z);
if (itemstack == null) {
return;
@@ -72,13 +70,18 @@ public class RenderAnalyzer extends TileEntitySpecialRenderer implements IBlockR
GL11.glTranslatef((float) x, (float) y, (float) z);
GL11.glTranslatef(0.5f, 0.2f, 0.5f);
GL11.glScalef(renderScale, renderScale, renderScale);
dummyEntityItem.setEntityItemStack(itemstack);
if (world.getTotalWorldTime() != lastTick) {
lastTick = world.getTotalWorldTime();
dummyEntityItem.onUpdate();
try {
dummyEntityItem.worldObj = world;
dummyEntityItem.setEntityItemStack(itemstack);
if (world.getTotalWorldTime() != lastTick) {
lastTick = world.getTotalWorldTime();
dummyEntityItem.onUpdate();
}
customRenderItem.doRender(dummyEntityItem, 0, 0, 0, 0, 0);
} finally {
dummyEntityItem.worldObj = null;
}
customRenderItem.doRender(dummyEntityItem, 0, 0, 0, 0, 0);
GL11.glPopMatrix();
}
}
@@ -22,8 +22,6 @@ import forestry.core.tiles.TileMill;
public class RenderMill extends TileEntitySpecialRenderer implements IBlockRenderer {
private final ModelBase model = new ModelBase() {};
private enum Textures {
PEDESTAL,
EXTENSION,
@@ -41,6 +39,7 @@ public class RenderMill extends TileEntitySpecialRenderer implements IBlockRende
private final ModelRenderer blade2;
public RenderMill() {
ModelBase model = new ModelBase() {};
pedestal = new ModelRenderer(model, 0, 0);
pedestal.addBox(-8F, -8F, -8F, 16, 1, 16);
pedestal.rotationPointX = 8;
@@ -118,7 +118,7 @@ public class GuiWorktable extends GuiForestryTitled<ContainerWorktable, TileWork
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glTranslatef(0, 0, 150);
drawRect(left, top, left + 16, top + 16, 0x88ff0000);
drawRect(left, top, left + 16, top + 16, 0x88000000 | getFontColor().get("gui.worktable.missing"));
GL11.glTranslatef(0, 0, -150);
GL11.glEnable(GL11.GL_LIGHTING);
}
@@ -9,15 +9,15 @@
package forestry.factory.network;
import forestry.core.network.PacketRegistry;
import forestry.factory.network.packets.PacketNEISelect;
import forestry.factory.network.packets.PacketWorktableMemoryUpdate;
import forestry.factory.network.packets.PacketWorktableNEISelect;
import forestry.factory.network.packets.PacketWorktableRecipeUpdate;
public class PacketRegistryFactory extends PacketRegistry {
@Override
public void registerPackets() {
registerServerPacket(new PacketWorktableNEISelect());
registerServerPacket(new PacketNEISelect());
registerClientPacket(new PacketWorktableMemoryUpdate());
registerClientPacket(new PacketWorktableRecipeUpdate());
@@ -19,27 +19,29 @@ import forestry.core.network.IForestryPacketServer;
import forestry.core.network.PacketIdServer;
import forestry.core.network.packets.PacketNBT;
import forestry.core.recipes.nei.SetRecipeCommandHandler;
import forestry.factory.gui.ContainerCarpenter;
import forestry.factory.gui.ContainerFabricator;
import forestry.factory.gui.ContainerWorktable;
public class PacketWorktableNEISelect extends PacketNBT implements IForestryPacketServer {
public class PacketNEISelect extends PacketNBT implements IForestryPacketServer {
private static final SetRecipeCommandHandler worktableNEISelectHandler = new SetRecipeCommandHandler(
ContainerWorktable.class,
private static final SetRecipeCommandHandler neiSelectHandler = new SetRecipeCommandHandler(
new Class[] { ContainerWorktable.class, ContainerCarpenter.class, ContainerFabricator.class },
SlotCraftMatrix.class);
public PacketWorktableNEISelect() {}
public PacketNEISelect() {}
public PacketWorktableNEISelect(NBTTagCompound nbttagcompound) {
public PacketNEISelect(NBTTagCompound nbttagcompound) {
super(nbttagcompound);
}
@Override
public void onPacketData(DataInputStreamForestry data, EntityPlayerMP player) throws IOException {
worktableNEISelectHandler.handle(getTagCompound(), player);
neiSelectHandler.handle(getTagCompound(), player);
}
@Override
public PacketIdServer getPacketId() {
return PacketIdServer.WORKTABLE_NEI_SELECT;
return PacketIdServer.NEI_SELECT;
}
}
@@ -11,6 +11,7 @@ package forestry.factory.recipes.nei;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.minecraft.client.gui.inventory.GuiContainer;
@@ -24,13 +25,14 @@ import codechicken.nei.api.API;
import forestry.api.recipes.ICarpenterRecipe;
import forestry.api.recipes.IDescriptiveRecipe;
import forestry.api.recipes.RecipeManagers;
import forestry.core.recipes.nei.IGridRecipeHandler;
import forestry.core.recipes.nei.NEIUtils;
import forestry.core.recipes.nei.PositionedFluidTank;
import forestry.core.recipes.nei.RecipeHandlerBase;
import forestry.core.utils.StringUtil;
import forestry.factory.gui.GuiCarpenter;
public class NEIHandlerCarpenter extends RecipeHandlerBase {
public class NEIHandlerCarpenter extends RecipeHandlerBase implements IGridRecipeHandler {
private static Class<? extends GuiContainer> guiClass;
@@ -40,11 +42,35 @@ public class NEIHandlerCarpenter extends RecipeHandlerBase {
API.setGuiOffset(guiClass, 5, 14);
}
@Override
public int getGridStartX() {
return 5;
}
@Override
public int getGridStartY() {
return 6;
}
@Override
public int getGridSpacing() {
return 18;
}
@Override
public List<PositionedStack> getGridStacks(int recipeIndex) {
if (arecipes.get(recipeIndex) instanceof CachedCarpenterRecipe recipe) {
return recipe.inputs.subList(0, recipe.ingredientCount);
}
return Collections.emptyList();
}
public class CachedCarpenterRecipe extends CachedBaseRecipe {
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedFluidTank tank;
public PositionedStack output;
public int ingredientCount;
public CachedCarpenterRecipe(ICarpenterRecipe recipe, boolean genPerms) {
IDescriptiveRecipe irecipe = recipe.getCraftingGridRecipe();
@@ -78,6 +104,7 @@ public class NEIHandlerCarpenter extends RecipeHandlerBase {
}
public void setIngredients(int width, int height, Object[] items) {
ingredientCount = 0;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
Object item = items[y * width + x];
@@ -89,9 +116,14 @@ public class NEIHandlerCarpenter extends RecipeHandlerBase {
continue;
}
PositionedStack stack = new PositionedStack(item, 5 + x * 18, 6 + y * 18, false);
PositionedStack stack = new PositionedStack(
item,
getGridStartX() + x * getGridSpacing(),
getGridStartY() + y * getGridSpacing(),
false);
stack.setMaxSize(1);
this.inputs.add(stack);
ingredientCount++;
}
}
}
@@ -11,6 +11,7 @@ package forestry.factory.recipes.nei;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -27,6 +28,7 @@ import codechicken.nei.recipe.GuiRecipe;
import forestry.api.recipes.IFabricatorRecipe;
import forestry.api.recipes.IFabricatorSmeltingRecipe;
import forestry.api.recipes.RecipeManagers;
import forestry.core.recipes.nei.IGridRecipeHandler;
import forestry.core.recipes.nei.NEIUtils;
import forestry.core.recipes.nei.PositionedFluidTank;
import forestry.core.recipes.nei.RecipeHandlerBase;
@@ -34,7 +36,30 @@ import forestry.core.utils.StringUtil;
import forestry.factory.gui.GuiFabricator;
import forestry.factory.recipes.FabricatorSmeltingRecipeManager;
public class NEIHandlerFabricator extends RecipeHandlerBase {
public class NEIHandlerFabricator extends RecipeHandlerBase implements IGridRecipeHandler {
@Override
public int getGridStartX() {
return 62;
}
@Override
public int getGridStartY() {
return 6;
}
@Override
public int getGridSpacing() {
return 18;
}
@Override
public List<PositionedStack> getGridStacks(int recipeIndex) {
if (arecipes.get(recipeIndex) instanceof CachedFabricatorRecipe recipe) {
return recipe.inputs.subList(0, recipe.ingredientCount);
}
return Collections.emptyList();
}
public class CachedFabricatorRecipe extends CachedBaseRecipe {
@@ -42,6 +67,7 @@ public class NEIHandlerFabricator extends RecipeHandlerBase {
public PositionedFluidTank tank;
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public int ingredientCount;
public CachedFabricatorRecipe(IFabricatorRecipe recipe, boolean genPerms) {
if (recipe.getLiquid() != null) {
@@ -78,6 +104,7 @@ public class NEIHandlerFabricator extends RecipeHandlerBase {
}
public void setIngredients(int width, int height, Object[] items) {
ingredientCount = 0;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
Object item = items[y * width + x];
@@ -89,9 +116,14 @@ public class NEIHandlerFabricator extends RecipeHandlerBase {
continue;
}
PositionedStack stack = new PositionedStack(item, 62 + x * 18, 6 + y * 18, false);
PositionedStack stack = new PositionedStack(
item,
getGridStartX() + x * getGridSpacing(),
getGridStartY() + y * getGridSpacing(),
false);
stack.setMaxSize(1);
this.inputs.add(stack);
ingredientCount++;
}
}
}
@@ -0,0 +1,50 @@
package forestry.farming.multiblock;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.minecraft.item.ItemStack;
import forestry.api.multiblock.IFarmFertilizerRegistry;
import forestry.core.utils.ItemStackUtil;
public class FarmFertilizerRegistry implements IFarmFertilizerRegistry {
// the current list isn't big enough to require a hash map, and is faster as a list.
private final List<ItemStack> fertilizers = new ArrayList<>(5);
@Override
public Collection<ItemStack> getFertilizers() {
return fertilizers;
}
@Override
public void addFertilizer(ItemStack itemstack) {
// maybe throw warn? but could also be nice to leave as no warn for easier/cleaner optional mod dependencies
if (itemstack == null || itemstack.getItem() == null || itemstack.stackSize <= 0) return;
fertilizers.add(itemstack);
}
@Override
public void removeFertilizer(ItemStack itemstack) {
// maybe throw warn? but could also be nice to leave as no warn for easier/cleaner optional mod dependencies
if (itemstack == null || itemstack.getItem() == null) return;
fertilizers.removeIf(fert -> {
// in stack first so it wild card can be used for a wild-card clear.
return ItemStackUtil.isIdenticalItem(itemstack, fert);
});
}
@Override
public boolean isFertilizer(ItemStack itemstack) {
if (itemstack == null) return false;
for (ItemStack fert : this.fertilizers) {
// fert first to allow for wild card checks
if (ItemStackUtil.isIdenticalItem(fert, itemstack)) {
return true;
}
}
return false;
}
}
@@ -12,7 +12,6 @@ import java.util.Deque;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.fluids.Fluid;
@@ -21,6 +20,7 @@ import forestry.api.farming.FarmDirection;
import forestry.api.farming.IFarmInventory;
import forestry.api.farming.IFarmLogic;
import forestry.api.farming.IFarmable;
import forestry.api.multiblock.MultiblockManager;
import forestry.core.fluids.FluidHelper;
import forestry.core.fluids.TankManager;
import forestry.core.inventory.InventoryAdapterRestricted;
@@ -28,9 +28,6 @@ import forestry.core.inventory.wrappers.InventoryMapper;
import forestry.core.utils.InventoryUtil;
import forestry.core.utils.PlayerUtil;
import forestry.core.utils.SlotUtil;
import forestry.plugins.PluginCore;
import forestry.plugins.PluginManager;
import ic2.api.item.IC2Items;
public class InventoryFarm extends InventoryAdapterRestricted implements IFarmInventory {
@@ -134,18 +131,8 @@ public class InventoryFarm extends InventoryAdapterRestricted implements IFarmIn
@Override
public boolean acceptsAsFertilizer(ItemStack itemstack) {
if (itemstack == null) {
return false;
}
Item item = itemstack.getItem();
if (PluginManager.Module.INDUSTRIALCRAFT.isEnabled()) {
Item ic2fert = IC2Items.getItem("fertilizer").getItem();
if (ic2fert == item) {
return true;
}
}
return PluginCore.items.fertilizerCompound == item;
// check if it's a fertilizer
return MultiblockManager.farmFertilizerRegistry.isFertilizer(itemstack);
}
@Override
@@ -11,6 +11,7 @@ package forestry.food.items;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import forestry.core.inventory.ItemLocation;
import forestry.core.items.ItemWithGui;
import forestry.food.gui.ContainerInfuser;
import forestry.food.gui.GuiInfuser;
@@ -19,12 +20,12 @@ import forestry.food.inventory.ItemInventoryInfuser;
public class ItemInfuser extends ItemWithGui {
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new GuiInfuser(player.inventory, new ItemInventoryInfuser(player, heldItem));
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new ContainerInfuser(player.inventory, new ItemInventoryInfuser(player, heldItem));
}
}
@@ -307,8 +307,7 @@ public class EntityButterfly extends EntityCreature implements IEntityButterfly
size = genome.getSize();
setSize(size, 0.4f);
species = genome.getPrimary();
if (!worldObj.isRemote) {
if (worldObj != null && !worldObj.isRemote) {
dataWatcher.updateObject(DATAWATCHER_ID_SIZE, (int) (size * 100));
dataWatcher.updateObject(DATAWATCHER_ID_SPECIES, species.getUID());
} else {
@@ -13,6 +13,7 @@ import net.minecraft.item.ItemStack;
import forestry.api.core.Tabs;
import forestry.core.gui.ContainerAlyzer;
import forestry.core.inventory.ItemLocation;
import forestry.core.items.ItemWithGui;
import forestry.lepidopterology.gui.GuiFlutterlyzer;
import forestry.lepidopterology.inventory.ItemInventoryFlutterlyzer;
@@ -24,12 +25,12 @@ public class ItemFlutterlyzer extends ItemWithGui {
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new GuiFlutterlyzer(player, new ItemInventoryFlutterlyzer(player, heldItem));
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new ContainerAlyzer(new ItemInventoryFlutterlyzer(player, heldItem), player);
}
}
@@ -25,13 +25,8 @@ import forestry.lepidopterology.entities.EntityButterfly;
public class RenderButterflyItem implements IItemRenderer {
private final ModelButterfly model;
private EntityButterfly entity;
public RenderButterflyItem() {
model = new ModelButterfly();
}
private static float getWingYaw(IButterfly butterfly) {
float wingYaw = 1f;
@@ -72,18 +67,12 @@ public class RenderButterflyItem implements IItemRenderer {
private IButterfly initButterfly(ItemStack item) {
IButterfly butterfly = ButterflyManager.butterflyRoot.getMember(item);
if (butterfly == null) {
butterfly = ButterflyManager.butterflyRoot
.templateAsIndividual(ButterflyManager.butterflyRoot.getDefaultTemplate());
}
if (entity == null) {
entity = new EntityButterfly(Proxies.common.getRenderWorld(), butterfly, 0, 0, 0);
entity = new EntityButterfly(null, butterfly, 0, 0, 0);
} else {
entity.setIndividual(butterfly);
}
return butterfly;
return entity.getButterfly();
}
private void renderButterflyItem(IButterfly butterfly, float translateX, float translateY, float translateZ) {
@@ -111,7 +100,12 @@ public class RenderButterflyItem implements IItemRenderer {
entity.rotationPitch = 0;
entity.rotationYawHead = entity.rotationYaw;
RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0f);
try {
entity.setWorld(Proxies.common.getRenderWorld());
RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0f);
} finally {
entity.setWorld(null);
}
} else {
GL11.glTranslatef(translateX, translateY, translateZ);
@@ -119,14 +113,19 @@ public class RenderButterflyItem implements IItemRenderer {
GL11.glScalef(-2.0f, 2.0f, 2.0f);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(-((float) Math.atan((double) (pitch / 40.0F))) * 20.0F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(-((float) Math.atan(pitch / 40.0F)) * 20.0F, 1.0F, 0.0F, 0.0F);
entity.renderYawOffset = (float) Math.atan((double) (yaw / 40.0F)) * 20.0F;
entity.rotationYaw = (float) Math.atan((double) (yaw / 40.0F)) * 40.0F;
entity.rotationPitch = -((float) Math.atan((double) (pitch / 40.0F))) * 20.0F;
entity.renderYawOffset = (float) Math.atan(yaw / 40.0F) * 20.0F;
entity.rotationYaw = (float) Math.atan(yaw / 40.0F) * 40.0F;
entity.rotationPitch = -((float) Math.atan(pitch / 40.0F)) * 20.0F;
entity.rotationYawHead = entity.rotationYaw;
RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, getWingYaw(butterfly));
try {
entity.setWorld(Proxies.common.getRenderWorld());
RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, getWingYaw(butterfly));
} finally {
entity.setWorld(null);
}
}
GL11.glPopMatrix();
@@ -160,8 +159,12 @@ public class RenderButterflyItem implements IItemRenderer {
entity.rotationPitch = 0;
entity.rotationYawHead = entity.rotationYaw;
RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, getWingYaw(butterfly));
try {
entity.setWorld(Proxies.common.getRenderWorld());
RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, getWingYaw(butterfly));
} finally {
entity.setWorld(null);
}
GL11.glPopMatrix();
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
@@ -173,39 +176,27 @@ public class RenderButterflyItem implements IItemRenderer {
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
switch (type) {
case ENTITY:
case EQUIPPED:
case EQUIPPED_FIRST_PERSON:
case INVENTORY:
return true;
default:
return false;
}
return switch (type) {
case ENTITY, EQUIPPED, EQUIPPED_FIRST_PERSON, INVENTORY -> true;
default -> false;
};
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
switch (helper) {
case ENTITY_BOBBING:
case ENTITY_ROTATION:
return false;
default:
return true;
}
return switch (helper) {
case ENTITY_BOBBING, ENTITY_ROTATION -> false;
default -> true;
};
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
switch (type) {
case ENTITY:
renderButterflyItem(initButterfly(item), 0f, -0.5f, 0f);
break;
case EQUIPPED:
renderButterflyItem(initButterfly(item), 0.5f, -0.9f, 1.0f);
break;
case EQUIPPED_FIRST_PERSON:
case EQUIPPED, EQUIPPED_FIRST_PERSON:
renderButterflyItem(initButterfly(item), 0.5f, -0.9f, 1.0f);
break;
case INVENTORY:
@@ -25,16 +25,22 @@ import forestry.plugins.PluginMail;
public class LetterProperties {
private enum State {
FRESH,
STAMPED,
OPENED,
EMPTIED
EMPTIED;
public static final State[] VALUES = values();
}
private enum Size {
EMPTY,
SMALL,
BIG
BIG;
public static final Size[] VALUES = values();
}
public static ItemStack createStampedLetterStack(ILetter letter) {
@@ -98,8 +104,8 @@ public class LetterProperties {
@SuppressWarnings("unchecked")
public static void getSubItems(Item item, CreativeTabs tab, @SuppressWarnings("rawtypes") List list) {
for (State state : State.values()) {
for (Size size : Size.values()) {
for (State state : State.VALUES) {
for (Size size : Size.VALUES) {
int meta = encodeMeta(state, size);
ItemStack letter = new ItemStack(item, 1, meta);
list.add(letter);
@@ -117,7 +123,7 @@ public class LetterProperties {
private static State getState(int meta) {
int ordinal = meta & 0x0f;
State[] values = State.values();
State[] values = State.VALUES;
if (ordinal >= values.length) {
ordinal = 0;
}
@@ -126,7 +132,7 @@ public class LetterProperties {
private static Size getSize(int meta) {
int ordinal = meta >> 4;
Size[] values = Size.values();
Size[] values = Size.VALUES;
if (ordinal >= values.length) {
ordinal = 0;
}
@@ -11,6 +11,7 @@ package forestry.mail.items;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import forestry.core.inventory.ItemLocation;
import forestry.core.items.ItemWithGui;
import forestry.mail.gui.ContainerCatalogue;
import forestry.mail.gui.GuiCatalogue;
@@ -18,12 +19,12 @@ import forestry.mail.gui.GuiCatalogue;
public class ItemCatalogue extends ItemWithGui {
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new GuiCatalogue(player);
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new ContainerCatalogue(player);
}
}
@@ -23,6 +23,7 @@ import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import forestry.api.mail.ILetter;
import forestry.core.inventory.ItemLocation;
import forestry.core.items.ItemWithGui;
import forestry.core.utils.StringUtil;
import forestry.mail.Letter;
@@ -87,12 +88,12 @@ public class ItemLetter extends ItemWithGui {
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new GuiLetter(player, new ItemInventoryLetter(player, heldItem));
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
return new ContainerLetter(player, new ItemInventoryLetter(player, heldItem));
}
}
@@ -55,6 +55,7 @@ import forestry.core.recipes.RecipeUtil;
import forestry.core.tiles.MachineDefinition;
import forestry.core.utils.ClimateUtil;
import forestry.core.utils.ForestryModEnvWarningCallable;
import forestry.farming.multiblock.FarmFertilizerRegistry;
@Plugin(
pluginID = "Core",
@@ -85,6 +86,7 @@ public class PluginCore extends ForestryPlugin {
AlleleHelper.instance = new AlleleHelper();
MultiblockManager.logicFactory = new MultiblockLogicFactory();
MultiblockManager.farmFertilizerRegistry = new FarmFertilizerRegistry();
}
@Override
@@ -20,6 +20,7 @@ import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.oredict.OreDictionary;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage;
@@ -30,6 +31,7 @@ import forestry.api.circuits.CircuitSocketType;
import forestry.api.circuits.ICircuitLayout;
import forestry.api.farming.Farmables;
import forestry.api.farming.IFarmable;
import forestry.api.multiblock.MultiblockManager;
import forestry.core.circuits.Circuit;
import forestry.core.circuits.CircuitLayout;
import forestry.core.config.Constants;
@@ -402,5 +404,8 @@ public class PluginFarming extends ForestryPlugin {
layoutManual,
PluginCore.items.tubes.get(EnumElectronTube.LAPIS, 1),
Circuit.farmCocoaManual);
MultiblockManager.farmFertilizerRegistry
.addFertilizer(new ItemStack(PluginCore.items.fertilizerCompound, 1, OreDictionary.WILDCARD_VALUE));
}
}
@@ -32,6 +32,7 @@ import forestry.api.core.ForestryAPI;
import forestry.api.farming.Farmables;
import forestry.api.fuels.EngineBronzeFuel;
import forestry.api.fuels.FuelManager;
import forestry.api.multiblock.MultiblockManager;
import forestry.api.recipes.RecipeManagers;
import forestry.api.storage.BackpackManager;
import forestry.api.storage.IBackpackDefinition;
@@ -94,6 +95,7 @@ public class PluginIC2 extends ForestryPlugin {
private static ItemStack silver;
private static ItemStack brass;
private static ItemStack uuMatter;
private static ItemStack fertilizer;
public static ItemStack resin;
public static ItemStack rubberwood;
@@ -162,11 +164,13 @@ public class PluginIC2 extends ForestryPlugin {
brass = IC2Items.getItem("bronzeIngot");
uran238 = IC2Items.getItem("Uran238");
fertilizer = IC2Items.getItem("fertilizer");
Circuit.farmRubberManual = new CircuitFarmLogic("manualRubber", FarmLogicRubber.class);
ICircuitLayout layoutEngineTin = new CircuitLayout("engine.tin", CircuitSocketType.ELECTRIC_ENGINE);
ChipsetManager.circuitRegistry.registerLayout(layoutEngineTin);
}
@Override
@@ -378,6 +382,10 @@ public class PluginIC2 extends ForestryPlugin {
'V',
Blocks.piston);
}
if (PluginManager.Module.FARMING.isEnabled() && fertilizer != null) {
MultiblockManager.farmFertilizerRegistry.addFertilizer(fertilizer);
}
}
/**
@@ -13,6 +13,7 @@ import net.minecraft.item.ItemStack;
import forestry.core.gui.ContainerItemInventory;
import forestry.core.gui.slots.SlotFilteredInventory;
import forestry.core.inventory.ItemLocation;
import forestry.storage.inventory.ItemInventoryBackpack;
public class ContainerBackpack extends ContainerItemInventory<ItemInventoryBackpack> {
@@ -39,9 +40,9 @@ public class ContainerBackpack extends ContainerItemInventory<ItemInventoryBackp
}
}
public ContainerBackpack(EntityPlayer player, Size size, ItemStack parent) {
public ContainerBackpack(EntityPlayer player, Size size, ItemStack parent, ItemLocation loc) {
super(
new ItemInventoryBackpack(player, size.getSize(), parent),
new ItemInventoryBackpack(player, size.getSize(), parent, loc),
player.inventory,
8,
11 + size.startY + size.rows * 18);
@@ -6,6 +6,7 @@ import net.minecraft.item.ItemStack;
import forestry.api.storage.IBackpackDefinition;
import forestry.core.inventory.ItemInventory;
import forestry.core.inventory.ItemLocation;
import forestry.storage.items.ItemBackpack;
public class ItemInventoryBackpack extends ItemInventory {
@@ -13,7 +14,11 @@ public class ItemInventoryBackpack extends ItemInventory {
private final IBackpackDefinition backpackDefinition;
public ItemInventoryBackpack(EntityPlayer player, int size, ItemStack parent) {
super(player, size, parent);
this(player, size, parent, ItemLocation.UNKNOWN);
}
public ItemInventoryBackpack(EntityPlayer player, int size, ItemStack parent, ItemLocation location) {
super(player, size, parent, location);
if (parent == null) {
throw new IllegalArgumentException("Parent cannot be null.");
@@ -13,6 +13,7 @@ import net.minecraft.item.ItemStack;
import forestry.core.gui.GuiHandler;
import forestry.core.gui.IPagedInventory;
import forestry.core.inventory.ItemLocation;
import forestry.storage.items.ItemBackpackNaturalist;
public class ItemInventoryBackpackPaged extends ItemInventoryBackpack implements IPagedInventory {
@@ -20,13 +21,18 @@ public class ItemInventoryBackpackPaged extends ItemInventoryBackpack implements
private final ItemBackpackNaturalist backpackNaturalist;
public ItemInventoryBackpackPaged(EntityPlayer player, int size, ItemStack itemstack,
ItemBackpackNaturalist backpackNaturalist) {
super(player, size, itemstack);
ItemBackpackNaturalist backpackNaturalist, ItemLocation loc) {
super(player, size, itemstack, loc);
this.backpackNaturalist = backpackNaturalist;
}
@Override
public void flipPage(EntityPlayer player, short page) {
GuiHandler.openGui(player, backpackNaturalist, page);
ItemLocation loc = getLocation();
if (loc.type() == ItemLocation.Type.PLAYER_INVENTORY) {
GuiHandler.openGui(player, backpackNaturalist, page, loc.slotIdx());
} else {
GuiHandler.openGui(player, backpackNaturalist, page);
}
}
}
@@ -13,6 +13,7 @@ import java.util.Locale;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
@@ -20,7 +21,9 @@ import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import net.xonich.mc.nohotbarneeded.api.ActivatableFromInventoryServerSide;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.common.eventhandler.Event;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@@ -31,6 +34,7 @@ import forestry.core.config.Config;
import forestry.core.config.Constants;
import forestry.core.gui.GuiHandler;
import forestry.core.inventory.ItemInventory;
import forestry.core.inventory.ItemLocation;
import forestry.core.inventory.wrappers.IInvSlot;
import forestry.core.inventory.wrappers.InventoryIterator;
import forestry.core.items.ItemWithGui;
@@ -44,7 +48,10 @@ import forestry.storage.gui.GuiBackpack;
import forestry.storage.gui.GuiBackpackT2;
import forestry.storage.inventory.ItemInventoryBackpack;
public class ItemBackpack extends ItemWithGui {
@Optional.Interface(
iface = "net.xonich.mc.nohotbarneeded.api.ActivatableFromInventoryServerSide",
modid = "nohotbarneeded")
public class ItemBackpack extends ItemWithGui implements ActivatableFromInventoryServerSide {
private final IBackpackDefinition definition;
private final EnumBackpackType type;
@@ -65,7 +72,7 @@ public class ItemBackpack extends ItemWithGui {
@Override
protected void openGui(EntityPlayer entityplayer) {
GuiHandler.openGui(entityplayer, this, (short) type.ordinal());
GuiHandler.openGui(entityplayer, this, (short) type.ordinal(), entityplayer.inventory.currentItem);
}
@Override
@@ -318,32 +325,32 @@ public class ItemBackpack extends ItemWithGui {
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
if (data > EnumBackpackType.values().length) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
if (data >= EnumBackpackType.values().length) {
return null;
}
EnumBackpackType type = EnumBackpackType.values()[data];
switch (type) {
case T1:
return new GuiBackpack(new ContainerBackpack(player, ContainerBackpack.Size.DEFAULT, heldItem));
return new GuiBackpack(new ContainerBackpack(player, ContainerBackpack.Size.DEFAULT, heldItem, loc));
case T2:
return new GuiBackpackT2(new ContainerBackpack(player, ContainerBackpack.Size.T2, heldItem));
return new GuiBackpackT2(new ContainerBackpack(player, ContainerBackpack.Size.T2, heldItem, loc));
default:
return null;
}
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data) {
if (data > EnumBackpackType.values().length) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int data, ItemLocation loc) {
if (data >= EnumBackpackType.values().length) {
return null;
}
EnumBackpackType type = EnumBackpackType.values()[data];
switch (type) {
case T1:
return new ContainerBackpack(player, ContainerBackpack.Size.DEFAULT, heldItem);
return new ContainerBackpack(player, ContainerBackpack.Size.DEFAULT, heldItem, loc);
case T2:
return new ContainerBackpack(player, ContainerBackpack.Size.T2, heldItem);
return new ContainerBackpack(player, ContainerBackpack.Size.T2, heldItem, loc);
default:
return null;
}
@@ -361,4 +368,10 @@ public class ItemBackpack extends ItemWithGui {
public boolean showDurabilityBar(final ItemStack stack) {
return Config.showBackpackDurability && ItemInventory.getOccupiedSlotCount(stack) > 0;
}
@Override
@Optional.Method(modid = "nohotbarneeded")
public void activateFromInventory(EntityPlayerMP player, int slotIdx) {
GuiHandler.openGui(player, this, (short) type.ordinal(), slotIdx);
}
}
@@ -9,14 +9,17 @@
package forestry.storage.items;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Optional;
import forestry.api.genetics.ISpeciesRoot;
import forestry.api.storage.EnumBackpackType;
import forestry.api.storage.IBackpackDefinition;
import forestry.core.config.Constants;
import forestry.core.gui.GuiHandler;
import forestry.core.gui.GuiNaturalistInventory;
import forestry.core.inventory.ItemLocation;
import forestry.storage.gui.ContainerNaturalistBackpack;
import forestry.storage.inventory.ItemInventoryBackpackPaged;
@@ -31,27 +34,35 @@ public class ItemBackpackNaturalist extends ItemBackpack {
@Override
protected void openGui(EntityPlayer entityplayer) {
GuiHandler.openGui(entityplayer, this);
GuiHandler.openGui(entityplayer, this, (short) 0, entityplayer.inventory.currentItem);
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int page) {
public Object getGui(EntityPlayer player, ItemStack heldItem, int page, ItemLocation loc) {
ItemInventoryBackpackPaged inventory = new ItemInventoryBackpackPaged(
player,
Constants.SLOTS_BACKPACK_APIARIST,
heldItem,
this);
this,
loc);
ContainerNaturalistBackpack container = new ContainerNaturalistBackpack(player, inventory, page);
return new GuiNaturalistInventory(speciesRoot, player, container, inventory, page, 5);
}
@Override
public Object getContainer(EntityPlayer player, ItemStack heldItem, int page) {
public Object getContainer(EntityPlayer player, ItemStack heldItem, int page, ItemLocation loc) {
ItemInventoryBackpackPaged inventory = new ItemInventoryBackpackPaged(
player,
Constants.SLOTS_BACKPACK_APIARIST,
heldItem,
this);
this,
loc);
return new ContainerNaturalistBackpack(player, inventory, page);
}
@Override
@Optional.Method(modid = "nohotbarneeded")
public void activateFromInventory(EntityPlayerMP player, int slotIdx) {
GuiHandler.openGui(player, this, /* page */(short) 0, slotIdx);
}
}
@@ -10,6 +10,7 @@ gui.screen=ffffff
gui.table.header=ababab
gui.table.row=ababab
gui.book=000000
gui.worktable.missing=ff0000
gui.beealyzer.binomial=14d50b
gui.beealyzer.recessive=3687ec
@@ -708,9 +708,11 @@ tile.candle.dyed.stump=Unlit Dyed Candle
tile.candle.lit=Lit Candle
tile.candle.dyed.lit=Lit Dyed Candle
tile.stump.0=Candle Stump
tile.for.apiculture.0=Apiary
tile.for.apiculture.1=Apiarist's Chest
tile.for.apiculture.2=Bee House
tile.for.apiculture.name=Apiary
tile.for.apiculture.0.name=Apiary
tile.for.apicultureChest.name=Apiarist's Chest
tile.for.apicultureChest.0.name=Apiarist's Chest
tile.for.apiculture.2.name=Bee House
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -759,7 +761,7 @@ tile.log=Wood
tile.planks=Wood Planks
tile.slab=Wood Slab
tile.fences=Fence
tile.for.stairs=Stairs
tile.for.stairs.name=Stairs
wood.0=Larch
wood.1=Teak
wood.2=Acacia
@@ -784,7 +786,8 @@ wood.20=Pine
wood.21=Plum
wood.22=Maple
wood.23=Citrus
tile.for.arboriculture.0=Arborist's Chest
tile.for.arboriculture.name=Arborist's Chest
tile.for.arboriculture.0.name=Arborist's Chest
####################
# FARMING
@@ -857,7 +860,8 @@ item.butterfly=Butterfly
item.moth=Moth
item.flutterlyzer=Flutterlyzer
storage.backpack.lepidopterist=Lepidopterist's Backpack
tile.for.lepidopterology.0=Lepidopterist's Chest
tile.for.lepidopterology.name=Lepidopterist's Chest
tile.for.lepidopterology.0.name=Lepidopterist's Chest
####################
# MAIL
@@ -685,9 +685,11 @@ tile.alveary.6=Estabilizador de Enjambre
tile.alveary.7=Tamiz para Enjambre
tile.candle.0=Vela
tile.stump.0=Tocуn de Vela
tile.for.apiculture.0=Apiario
tile.for.apiculture.1=Cofre de Apicultor
tile.for.apiculture.2=Casa de Abejas
tile.for.apiculture.name=Apiario
tile.for.apiculture.0.name=Apiario
tile.for.apicultureChest.name=Cofre de Apicultor
tile.for.apicultureChest.0.name=Cofre de Apicultor
tile.for.apiculture.2.name=Casa de Abejas
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -736,7 +738,7 @@ tile.log=Madera
tile.planks=Tablones de Madera
tile.slab=Losa de Madera
tile.fences=Cerca
tile.for.stairs=Escaleras
tile.for.stairs.name=Escaleras
wood.0=Alerce
wood.1=Teca
wood.2=Acacia
@@ -761,7 +763,8 @@ wood.20=Pino
wood.21=Ciruela
wood.22=Arce
wood.23=Citrus
tile.for.arboriculture.0=Cofre de Arborista
tile.for.arboriculture.name=Cofre de Arborista
tile.for.arboriculture.0.name=Cofre de Arborista
####################
# FARMING
@@ -834,7 +837,8 @@ item.butterfly=Mariposa
item.moth=Polilla
item.flutterlyzer=Mariposanalizador
storage.backpack.lepidopterist=Mochila de Lepidopterуlogo
tile.for.lepidopterology.0=Cofre de Lepidopterуlogo
tile.for.lepidopterology.name=Cofre de Lepidopterуlogo
tile.for.lepidopterology.0.name=Cofre de Lepidopterуlogo
####################
# MAIL
@@ -692,9 +692,11 @@ tile.alveary.6=Estabilizador de Enjambre
tile.alveary.7=Tamiz para Enjambre
tile.candle.0=Vela
tile.stump.0=Tocуn de Vela
tile.for.apiculture.0=Apiario
tile.for.apiculture.1=Cofre de Apicultor
tile.for.apiculture.2=Casa de Abejas
tile.for.apiculture.name=Apiario
tile.for.apiculture.0.name=Apiario
tile.for.apicultureChest.name=Cofre de Apicultor
tile.for.apicultureChest.0.name=Cofre de Apicultor
tile.for.apiculture.2.name=Casa de Abejas
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -743,7 +745,7 @@ tile.log=Madera
tile.planks=Tablones de Madera
tile.slab=Losa de Madera
tile.fences=Cerca
tile.for.stairs=Escaleras
tile.for.stairs.name=Escaleras
wood.0=Alerce
wood.1=Teca
wood.2=Acacia
@@ -768,7 +770,8 @@ wood.20=Pino
wood.21=Ciruela
wood.22=Arce
wood.23=Citrus
tile.for.arboriculture.0=Cofre de Arborista
tile.for.arboriculture.name=Cofre de Arborista
tile.for.arboriculture.0.name=Cofre de Arborista
####################
# FARMING
@@ -841,7 +844,8 @@ item.butterfly=Mariposa
item.moth=Polilla
item.flutterlyzer=Mariposanalizador
storage.backpack.lepidopterist=Mochila de Lepidopterуlogo
tile.for.lepidopterology.0=Cofre de Lepidopterуlogo
tile.for.lepidopterology.name=Cofre de Lepidopterуlogo
tile.for.lepidopterology.0.name=Cofre de Lepidopterуlogo
####################
# MAIL
@@ -685,9 +685,11 @@ tile.alveary.6=Estabilizador de Enjambre
tile.alveary.7=Tamiz para Enjambre
tile.candle.0=Vela
tile.stump.0=Tocуn de Vela
tile.for.apiculture.0=Apiario
tile.for.apiculture.1=Cofre de Apicultor
tile.for.apiculture.2=Casa de Abejas
tile.for.apiculture.name=Apiario
tile.for.apiculture.0.name=Apiario
tile.for.apicultureChest.name=Cofre de Apicultor
tile.for.apicultureChest.0.name=Cofre de Apicultor
tile.for.apiculture.2.name=Casa de Abejas
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -736,7 +738,7 @@ tile.log=Madera
tile.planks=Tablones de Madera
tile.slab=Losa de Madera
tile.fences=Cerca
tile.for.stairs=Escaleras
tile.for.stairs.name=Escaleras
wood.0=Alerce
wood.1=Teca
wood.2=Acacia
@@ -761,7 +763,8 @@ wood.20=Pino
wood.21=Ciruela
wood.22=Arce
wood.23=Citrus
tile.for.arboriculture.0=Cofre de Arborista
tile.for.arboriculture.name=Cofre de Arborista
tile.for.arboriculture.0.name=Cofre de Arborista
####################
# FARMING
@@ -834,7 +837,8 @@ item.butterfly=Mariposa
item.moth=Polilla
item.flutterlyzer=Mariposanalizador
storage.backpack.lepidopterist=Mochila de Lepidopterуlogo
tile.for.lepidopterology.0=Cofre de Lepidopterуlogo
tile.for.lepidopterology.name=Cofre de Lepidopterуlogo
tile.for.lepidopterology.0.name=Cofre de Lepidopterуlogo
####################
# MAIL
@@ -685,9 +685,11 @@ tile.alveary.6=Estabilizador de Enjambre
tile.alveary.7=Tamiz para Enjambre
tile.candle.0=Vela
tile.stump.0=Tocуn de Vela
tile.for.apiculture.0=Apiario
tile.for.apiculture.1=Cofre de Apicultor
tile.for.apiculture.2=Casa de Abejas
tile.for.apiculture.name=Apiario
tile.for.apiculture.0.name=Apiario
tile.for.apicultureChest.name=Cofre de Apicultor
tile.for.apicultureChest.0.name=Cofre de Apicultor
tile.for.apiculture.2.name=Casa de Abejas
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -736,7 +738,7 @@ tile.log=Madera
tile.planks=Tablones de Madera
tile.slab=Losa de Madera
tile.fences=Cerca
tile.for.stairs=Escaleras
tile.for.stairs.name=Escaleras
wood.0=Alerce
wood.1=Teca
wood.2=Acacia
@@ -761,7 +763,8 @@ wood.20=Pino
wood.21=Ciruela
wood.22=Arce
wood.23=Citrus
tile.for.arboriculture.0=Cofre de Arborista
tile.for.arboriculture.name=Cofre de Arborista
tile.for.arboriculture.0.name=Cofre de Arborista
####################
# FARMING
@@ -834,7 +837,8 @@ item.butterfly=Mariposa
item.moth=Polilla
item.flutterlyzer=Mariposanalizador
storage.backpack.lepidopterist=Mochila de Lepidopterуlogo
tile.for.lepidopterology.0=Cofre de Lepidopterуlogo
tile.for.lepidopterology.name=Cofre de Lepidopterуlogo
tile.for.lepidopterology.0.name=Cofre de Lepidopterуlogo
####################
# MAIL
@@ -685,9 +685,11 @@ tile.alveary.6=Estabilizador de Enjambre
tile.alveary.7=Tamiz para Enjambre
tile.candle.0=Vela
tile.stump.0=Tocуn de Vela
tile.for.apiculture.0=Apiario
tile.for.apiculture.1=Cofre de Apicultor
tile.for.apiculture.2=Casa de Abejas
tile.for.apiculture.name=Apiario
tile.for.apiculture.0.name=Apiario
tile.for.apicultureChest.name=Cofre de Apicultor
tile.for.apicultureChest.0.name=Cofre de Apicultor
tile.for.apiculture.2.name=Casa de Abejas
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -736,7 +738,7 @@ tile.log=Madera
tile.planks=Tablones de Madera
tile.slab=Losa de Madera
tile.fences=Cerca
tile.for.stairs=Escaleras
tile.for.stairs.name=Escaleras
wood.0=Alerce
wood.1=Teca
wood.2=Acacia
@@ -761,7 +763,8 @@ wood.20=Pino
wood.21=Ciruela
wood.22=Arce
wood.23=Citrus
tile.for.arboriculture.0=Cofre de Arborista
tile.for.arboriculture.name=Cofre de Arborista
tile.for.arboriculture.0.name=Cofre de Arborista
####################
# FARMING
@@ -834,7 +837,8 @@ item.butterfly=Mariposa
item.moth=Polilla
item.flutterlyzer=Mariposanalizador
storage.backpack.lepidopterist=Mochila de Lepidopterуlogo
tile.for.lepidopterology.0=Cofre de Lepidopterуlogo
tile.for.lepidopterology.name=Cofre de Lepidopterуlogo
tile.for.lepidopterology.0.name=Cofre de Lepidopterуlogo
####################
# MAIL
@@ -699,9 +699,11 @@ tile.candle.dyed.stump=Unlit Dyed Candle
tile.candle.lit=Lit Candle
tile.candle.dyed.lit=Lit Dyed Candle
tile.stump.0=Candle Stump
tile.for.apiculture.0=Apiary
tile.for.apiculture.1=Apiarist's Chest
tile.for.apiculture.2=Bee House
tile.for.apiculture.name=Apiary
tile.for.apiculture.0.name=Apiary
tile.for.apicultureChest.name=Apiarist's Chest
tile.for.apicultureChest.0.name=Apiarist's Chest
tile.for.apiculture.2.name=Bee House
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -750,7 +752,7 @@ tile.log=Wood
tile.planks=Wood Planks
tile.slab=Wood Slab
tile.fences=Fence
tile.for.stairs=Stairs
tile.for.stairs.name=Stairs
wood.0=Larch
wood.1=Teak
wood.2=Acacia
@@ -775,7 +777,8 @@ wood.20=Pine
wood.21=Plum
wood.22=Maple
wood.23=Citrus
tile.for.arboriculture.0=Arborist's Chest
tile.for.arboriculture.name=Arborist's Chest
tile.for.arboriculture.0.name=Arborist's Chest
####################
# FARMING
@@ -848,7 +851,8 @@ item.butterfly=Butterfly
item.moth=Moth
item.flutterlyzer=Flutterlyzer
storage.backpack.lepidopterist=Lepidopterist's Backpack
tile.for.lepidopterology.0=Lepidopterist's Chest
tile.for.lepidopterology.name=Lepidopterist's Chest
tile.for.lepidopterology.0.name=Lepidopterist's Chest
####################
# MAIL
@@ -614,9 +614,11 @@ tile.candle.dyed.stump=Unlit Dyed Candle
tile.candle.lit=Lit Candle
tile.candle.dyed.lit=Lit Dyed Candle
tile.stump.0=Candle Stump
tile.for.apiculture.0=Apiary
tile.for.apiculture.1=Apiarist's Chest
tile.for.apiculture.2=Bee House
tile.for.apiculture.name=Apiary
tile.for.apiculture.0.name=Apiary
tile.for.apicultureChest.name=Apiarist's Chest
tile.for.apicultureChest.0.name=Apiarist's Chest
tile.for.apiculture.2.name=Bee House
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -665,7 +667,7 @@ tile.log=Wood
tile.planks=Wood Planks
tile.slab=Wood Slab
tile.fences=Fence
tile.for.stairs=Stairs
tile.for.stairs.name=Stairs
wood.0=Larch
wood.1=Teak
wood.2=Acacia
@@ -690,7 +692,8 @@ wood.20=Pine
wood.21=Plum
wood.22=Maple
wood.23=Citrus
tile.for.arboriculture.0=Arborist's Chest
tile.for.arboriculture.name=Arborist's Chest
tile.for.arboriculture.0.name=Arborist's Chest
####################
# FARMING
@@ -763,7 +766,8 @@ item.butterfly=Butterfly
item.moth=Moth
item.flutterlyzer=Flutterlyzer
storage.backpack.lepidopterist=Lepidopterist's Backpack
tile.for.lepidopterology.0=Lepidopterist's Chest
tile.for.lepidopterology.name=Lepidopterist's Chest
tile.for.lepidopterology.0.name=Lepidopterist's Chest
####################
# MAIL
@@ -690,9 +690,11 @@ tile.candle.dyed.stump=Unlit Dyed Candle
tile.candle.lit=Lit Candle
tile.candle.dyed.lit=Lit Dyed Candle
tile.stump.0=Candle Stump
tile.for.apiculture.0=Apiary
tile.for.apiculture.1=Apiarist's Chest
tile.for.apiculture.2=Bee House
tile.for.apiculture.name=Apiary
tile.for.apiculture.0.name=Apiary
tile.for.apicultureChest.name=Apiarist's Chest
tile.for.apicultureChest.0.name=Apiarist's Chest
tile.for.apiculture.2.name=Bee House
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -741,7 +743,7 @@ tile.log=Wood
tile.planks=Wood Planks
tile.slab=Wood Slab
tile.fences=Fence
tile.for.stairs=Stairs
tile.for.stairs.name=Stairs
wood.0=Larch
wood.1=Teak
wood.2=Acacia
@@ -766,7 +768,8 @@ wood.20=Pine
wood.21=Plum
wood.22=Maple
wood.23=Citrus
tile.for.arboriculture.0=Arborist's Chest
tile.for.arboriculture.name=Arborist's Chest
tile.for.arboriculture.0.name=Arborist's Chest
####################
# FARMING
@@ -839,7 +842,8 @@ item.butterfly=Butterfly
item.moth=Moth
item.flutterlyzer=Flutterlyzer
storage.backpack.lepidopterist=Lepidopterist's Backpack
tile.for.lepidopterology.0=Lepidopterist's Chest
tile.for.lepidopterology.name=Lepidopterist's Chest
tile.for.lepidopterology.0.name=Lepidopterist's Chest
####################
# MAIL
@@ -489,10 +489,10 @@ tile.for.log1=Legna
tile.for.log2=Legna
tile.for.log3=Legna
tile.for.log4=Legna
tile.for.planks=Assi di legno
tile.for.planks.name=Assi di legno
tile.for.slabs1=Lastra di legno
tile.for.slabs2=Lastra di legno
tile.for.fences=Staccionata
tile.for.fences.name=Staccionata
tile.harvester.0=Taglialegna
tile.harvester.1=Combinatore
tile.harvester.2=Raccogli-albero della gomma
@@ -741,7 +741,7 @@ tile.log=Wood
tile.planks=Wood Planks
tile.slab=Wood Slab
tile.fences=Fence
tile.for.stairs=Stairs
tile.for.stairs.name=Stairs
wood.0=Larch
wood.1=Teak
wood.2=Acacia
@@ -766,7 +766,8 @@ wood.20=Pine
wood.21=Plum
wood.22=Maple
wood.23=Citrus
tile.for.arboriculture.0=Arborist's Chest
tile.for.arboriculture.name=Arborist's Chest
tile.for.arboriculture.0.name=Arborist's Chest
####################
# FARMING
@@ -836,7 +837,8 @@ item.butterfly=Butterfly
item.moth=Moth
item.flutterlyzer=Flutterlyzer
storage.backpack.lepidopterist=Lepidopterist's Backpack
tile.for.lepidopterology.0=Lepidopterist's Chest
tile.for.lepidopterology.name=Lepidopterist's Chest
tile.for.lepidopterology.0.name=Lepidopterist's Chest
####################
# MAIL
@@ -501,10 +501,10 @@ tile.for.log1=原木
tile.for.log2=原木
tile.for.log3=原木
tile.for.log4=原木
tile.for.planks=木材
tile.for.planks.name=木材
tile.for.slabs1=木材ハーフブロック
tile.for.slabs2=木材ハーフブロック
tile.for.fences=フェンス
tile.for.fences.name=フェンス
tile.harvester.0=伐採機
tile.harvester.1=収穫機
tile.harvester.2=ゴムの木収穫機
@@ -757,9 +757,11 @@ tile.candle.dyed.stump=Unlit Dyed Candle
tile.candle.lit=Lit Candle
tile.candle.dyed.lit=Lit Dyed Candle
tile.stump.0=Candle Stump
tile.for.apiculture.0=Apiary
tile.for.apiculture.1=Apiarist's Chest
tile.for.apiculture.2=Bee House
tile.for.apiculture.name=養蜂箱
tile.for.apiculture.0.name=養蜂箱
tile.for.apicultureChest.name=養蜂家のチェスト
tile.for.apicultureChest.0.name=養蜂家のチェスト
tile.for.apiculture.2.name=ビーハウス
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -808,7 +810,7 @@ tile.log=Wood
tile.planks=Wood Planks
tile.slab=Wood Slab
tile.fences=Fence
tile.for.stairs=Stairs
tile.for.stairs.name=階段
wood.0=Larch
wood.1=Teak
wood.2=Acacia
@@ -833,7 +835,8 @@ wood.20=Pine
wood.21=Plum
wood.22=Maple
wood.23=Citrus
tile.for.arboriculture.0=Arborist's Chest
tile.for.arboriculture.name=樹医のチェスト
tile.for.arboriculture.0.name=樹医のチェスト
####################
# FARMING
@@ -906,7 +909,8 @@ item.butterfly=Butterfly
item.moth=Moth
item.flutterlyzer=Flutterlyzer
storage.backpack.lepidopterist=Lepidopterist's Backpack
tile.for.lepidopterology.0=Lepidopterist's Chest
tile.for.lepidopterology.name=鱗翅類学者のチェスト
tile.for.lepidopterology.0.name=鱗翅類学者のチェスト
####################
# MAIL
@@ -709,9 +709,11 @@ tile.candle.dyed.stump=Unlit Dyed Candle
tile.candle.lit=Lit Candle
tile.candle.dyed.lit=Lit Dyed Candle
tile.stump.0=Candle Stump
tile.for.apiculture.0=Apiary
tile.for.apiculture.1=Apiarist's Chest
tile.for.apiculture.2=Bee House
tile.for.apiculture.name=Apiary
tile.for.apiculture.0.name=Apiary
tile.for.apicultureChest.name=Apiarist's Chest
tile.for.apicultureChest.0.name=Apiarist's Chest
tile.for.apiculture.2.name=Bee House
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -760,7 +762,7 @@ tile.log=Hout
tile.planks=houten planken
tile.slab=houten plaat
tile.fences=houten hek
tile.for.stairs=houten treden
tile.for.stairs.name=houten treden
wood.0=Lariks
wood.1=Teak
wood.2=Acacia
@@ -857,7 +859,8 @@ item.butterfly=Butterfly
item.moth=Moth
item.flutterlyzer=Flutterlyzer
storage.backpack.lepidopterist=Lepidopterist's Backpack
tile.for.lepidopterology.0=Lepidopterist's Chest
tile.for.lepidopterology.name=Lepidopterist's Chest
tile.for.lepidopterology.0.name=Lepidopterist's Chest
####################
# MAIL
@@ -710,9 +710,11 @@ tile.candle.dyed.stump=Unlit Dyed Candle
tile.candle.lit=Lit Candle
tile.candle.dyed.lit=Lit Dyed Candle
tile.stump.0=Candle Stump
tile.for.apiculture.0=Apiary
tile.for.apiculture.1=Apiarist's Chest
tile.for.apiculture.2=Bee House
tile.for.apiculture.name=Apiary
tile.for.apiculture.0.name=Apiary
tile.for.apicultureChest.name=Apiarist's Chest
tile.for.apicultureChest.0.name=Apiarist's Chest
tile.for.apiculture.2.name=Bee House
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -761,7 +763,7 @@ tile.log=Wood
tile.planks=Wood Planks
tile.slab=Wood Slab
tile.fences=Fence
tile.for.stairs=Stairs
tile.for.stairs.name=Stairs
wood.0=Larch
wood.1=Teak
wood.2=Acacia
@@ -786,7 +788,8 @@ wood.20=Pine
wood.21=Plum
wood.22=Maple
wood.23=Citrus
tile.for.arboriculture.0=Arborist's Chest
tile.for.arboriculture.name=Arborist's Chest
tile.for.arboriculture.0.name=Arborist's Chest
####################
# FARMING
@@ -859,7 +862,8 @@ item.butterfly=Butterfly
item.moth=Moth
item.flutterlyzer=Flutterlyzer
storage.backpack.lepidopterist=Lepidopterist's Backpack
tile.for.lepidopterology.0=Lepidopterist's Chest
tile.for.lepidopterology.name=Lepidopterist's Chest
tile.for.lepidopterology.0.name=Lepidopterist's Chest
####################
# MAIL
@@ -695,9 +695,11 @@ tile.alveary.6=Stabilizator Wielkiego Ula
tile.alveary.7=Sito Wielkiego Ula
tile.candle.0=świeca
tile.stump.0=Postawa świecy
tile.for.apiculture.0=Ul
tile.for.apiculture.1=Skrzynia pszczelarza
tile.for.apiculture.2=Dom pszczół
tile.for.apiculture.name=Ul
tile.for.apiculture.0.name=Ul
tile.for.apicultureChest.name=Skrzynia pszczelarza
tile.for.apicultureChest.0.name=Skrzynia pszczelarza
tile.for.apiculture.2.name=Dom pszczół
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -746,7 +748,7 @@ tile.log=Drewno
tile.planks=Drewniane Deski
tile.slab=Drewniana Półpłytka
tile.fences=Płotek
tile.for.stairs=Schody
tile.for.stairs.name=Schody
wood.0=Modrzew
wood.1=Tek
wood.2=Akacja
@@ -771,7 +773,8 @@ wood.20=Sosna
wood.21=Śliwka
wood.22=Klon
wood.23=Cytrus
tile.for.arboriculture.0=Skrzynia Drzewiarza
tile.for.arboriculture.name=Skrzynia Drzewiarza
tile.for.arboriculture.0.name=Skrzynia Drzewiarza
####################
# FARMING
@@ -844,7 +847,8 @@ item.butterfly=Motyl
item.moth=Ćma
item.flutterlyzer=Motyloanalizer
storage.backpack.lepidopterist=Plecak Entomolog'a
tile.for.lepidopterology.0=Skrzynia Entomolog'a
tile.for.lepidopterology.name=Skrzynia Entomolog'a
tile.for.lepidopterology.0.name=Skrzynia Entomolog'a
####################
# MAIL
@@ -679,9 +679,11 @@ tile.alveary.6=Estabilizador de Colmeia
tile.alveary.7=Peneira para Colmeia
tile.candle.0=Vela
tile.stump.0=Cepo de Vela
tile.for.apiculture.0=Apiбrio
tile.for.apiculture.1=Baъ de Apicultor
tile.for.apiculture.2=Ninho para Abelhas
tile.for.apiculture.name=Apiбrio
tile.for.apiculture.0.name=Apiбrio
tile.for.apicultureChest.name=Baъ de Apicultor
tile.for.apicultureChest.0.name=Baъ de Apicultor
tile.for.apiculture.2.name=Ninho para Abelhas
item.for.beeQueenGE.name=Unknown Queen
####################
@@ -730,7 +732,7 @@ tile.log=Wood
tile.planks=Tбbuas de Madeira
tile.slab=Degrau de Madeira
tile.fences=Cerca
tile.for.stairs=Escadas
tile.for.stairs.name=Escadas
wood.0=Lariзo
wood.1=Teca
wood.2=Acбcia
@@ -827,7 +829,8 @@ item.butterfly=Borboleta
item.moth=Mariposa
item.flutterlyzer=Borboletizador
storage.backpack.lepidopterist=Mala de Lepidopterologista
tile.for.lepidopterology.0=Baъ de Lepidopterologista
tile.for.lepidopterology.name=Baъ de Lepidopterologista
tile.for.lepidopterology.0.name=Baъ de Lepidopterologista
####################
# MAIL