Compare commits

...
11 Commits
39 changed files with 455 additions and 177 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.
+2 -1
View File
@@ -4,9 +4,10 @@ dependencies {
api("com.github.GTNewHorizons:GTNHLib:0.9.54:dev")
api('curse.maven:cofh-lib-220333:2388748')
compileOnlyApi('com.github.GTNewHorizons:Angelica:2.1.19:api')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.8.93-GTNH:dev')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.8.107-GTNH:dev')
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.7.1:api')
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.57:api')
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')
}
+1
View File
@@ -1,4 +1,5 @@
// Add any additional repositiroes for your dependencies here
repositories {
mavenLocal()
}
@@ -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;
}
}
@@ -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
@@ -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));
}
}
@@ -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) {
@@ -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);
}
}
@@ -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;
}
}
@@ -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++;
}
}
}
@@ -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));
}
}
@@ -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,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));
}
}
@@ -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);
}
}
@@ -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