Files
Applied-Energistics-2/src/main/java/appeng/container/slot/AppEngSlot.java
T
2022-11-20 19:32:36 +05:00

268 lines
7.1 KiB
Java

/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.container.slot;
import appeng.container.AEBaseContainer;
import appeng.util.helpers.ItemHandlerUtil;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryBasic;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull;
public class AppEngSlot extends Slot {
private static final IInventory emptyInventory = new InventoryBasic("[Null]", true, 0);
private final IItemHandler itemHandler;
private final int index;
private final int defX;
private final int defY;
private boolean isDraggable = true;
private boolean isPlayerSide = false;
private AEBaseContainer myContainer = null;
private int IIcon = -1;
private hasCalculatedValidness isValid;
private boolean isDisplay = false;
private boolean returnAsSingleStack;
public AppEngSlot(final IItemHandler inv, final int idx, final int x, final int y) {
super(emptyInventory, idx, x, y);
this.itemHandler = inv;
this.index = idx;
this.defX = x;
this.defY = y;
this.setIsValid(hasCalculatedValidness.NotAvailable);
}
public Slot setNotDraggable() {
this.setDraggable(false);
return this;
}
public Slot setPlayerSide() {
this.isPlayerSide = true;
return this;
}
public String getTooltip() {
return null;
}
public void clearStack() {
ItemHandlerUtil.setStackInSlot(this.itemHandler, this.index, ItemStack.EMPTY);
}
@Override
public boolean isItemValid(@Nonnull final ItemStack par1ItemStack) {
if (this.isSlotEnabled()) {
return this.itemHandler.isItemValid(this.index, par1ItemStack);
}
return false;
}
@Override
@Nonnull
public ItemStack getStack() {
if (!this.isSlotEnabled()) {
return ItemStack.EMPTY;
}
if (this.itemHandler.getSlots() <= this.getSlotIndex()) {
return ItemStack.EMPTY;
}
if (this.isDisplay()) {
this.setDisplay(false);
if (this.returnAsSingleStack()) {
setReturnAsSingleStack(false);
ItemStack ret = this.getDisplayStack().copy();
ret.setCount(1);
return ret;
}
return this.getDisplayStack();
}
return this.itemHandler.getStackInSlot(this.index);
}
private boolean returnAsSingleStack() {
return this.returnAsSingleStack;
}
public void setReturnAsSingleStack(boolean returnAsSingleStack) {
this.returnAsSingleStack = returnAsSingleStack;
}
@Override
public void putStack(final ItemStack stack) {
if (this.isSlotEnabled()) {
ItemHandlerUtil.setStackInSlot(this.itemHandler, this.index, stack);
if (this.getContainer() != null) {
this.getContainer().onSlotChange(this);
}
}
}
public IItemHandler getItemHandler() {
return this.itemHandler;
}
@Override
public void onSlotChanged() {
this.setIsValid(hasCalculatedValidness.NotAvailable);
if (this.isSlotEnabled() && this.itemHandler != null) {
ItemHandlerUtil.setStackInSlot(this.itemHandler, this.index, this.getStack().copy());
if (this.getContainer() != null) {
this.getContainer().onSlotChange(this);
}
}
super.onSlotChanged();
}
@Override
public int getSlotStackLimit() {
return this.itemHandler.getSlotLimit(this.index);
}
@Override
public int getItemStackLimit(@Nonnull ItemStack stack) {
return Math.min(this.getSlotStackLimit(), stack.getMaxStackSize());
}
@Override
public boolean canTakeStack(final EntityPlayer par1EntityPlayer) {
if (this.isSlotEnabled()) {
return !this.itemHandler.extractItem(this.index, Integer.MAX_VALUE, true).isEmpty();
}
return false;
}
@Override
@Nonnull
public ItemStack decrStackSize(int amount) {
return this.itemHandler.extractItem(this.index, amount, false);
}
@Override
public boolean isSameInventory(Slot other) {
return other instanceof AppEngSlot && ((AppEngSlot) other).itemHandler == this.itemHandler;
}
@Override
@SideOnly(Side.CLIENT)
public boolean isEnabled() {
return this.isSlotEnabled();
}
public boolean isSlotEnabled() {
return true;
}
public ItemStack getDisplayStack() {
return this.itemHandler.getStackInSlot(this.index);
}
public float getOpacityOfIcon() {
return 0.4f;
}
public boolean renderIconWithItem() {
return false;
}
public int getIcon() {
return this.getIIcon();
}
public boolean isPlayerSide() {
return this.isPlayerSide;
}
public boolean shouldDisplay() {
return this.isSlotEnabled();
}
public int getX() {
return this.defX;
}
public int getY() {
return this.defY;
}
private int getIIcon() {
return this.IIcon;
}
public void setIIcon(final int iIcon) {
this.IIcon = iIcon;
}
private boolean isDisplay() {
return this.isDisplay;
}
public void setDisplay(final boolean isDisplay) {
this.isDisplay = isDisplay;
}
public boolean isDraggable() {
return this.isDraggable;
}
private void setDraggable(final boolean isDraggable) {
this.isDraggable = isDraggable;
}
void setPlayerSide(final boolean isPlayerSide) {
this.isPlayerSide = isPlayerSide;
}
public hasCalculatedValidness getIsValid() {
return this.isValid;
}
public void setIsValid(final hasCalculatedValidness isValid) {
this.isValid = isValid;
}
protected AEBaseContainer getContainer() {
return this.myContainer;
}
public void setContainer(final AEBaseContainer myContainer) {
this.myContainer = myContainer;
}
public enum hasCalculatedValidness {
NotAvailable, Valid, Invalid
}
}