Code/net/minecraft/world/inventory/MerchantContainer.java

145 lines
4.4 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.inventory;
import javax.annotation.Nullable;
import net.minecraft.core.NonNullList;
import net.minecraft.world.Container;
import net.minecraft.world.ContainerHelper;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.trading.Merchant;
import net.minecraft.world.item.trading.MerchantOffer;
import net.minecraft.world.item.trading.MerchantOffers;
public class MerchantContainer implements Container {
private final Merchant merchant;
private final NonNullList<ItemStack> itemStacks = NonNullList.withSize(3, ItemStack.EMPTY);
@Nullable
private MerchantOffer activeOffer;
private int selectionHint;
private int futureXp;
public MerchantContainer(Merchant p_40003_) {
this.merchant = p_40003_;
}
@Override
public int getContainerSize() {
return this.itemStacks.size();
}
@Override
public boolean isEmpty() {
for (ItemStack itemstack : this.itemStacks) {
if (!itemstack.isEmpty()) {
return false;
}
}
return true;
}
@Override
public ItemStack getItem(int p_40008_) {
return this.itemStacks.get(p_40008_);
}
@Override
public ItemStack removeItem(int p_40010_, int p_40011_) {
ItemStack itemstack = this.itemStacks.get(p_40010_);
if (p_40010_ == 2 && !itemstack.isEmpty()) {
return ContainerHelper.removeItem(this.itemStacks, p_40010_, itemstack.getCount());
} else {
ItemStack itemstack1 = ContainerHelper.removeItem(this.itemStacks, p_40010_, p_40011_);
if (!itemstack1.isEmpty() && this.isPaymentSlot(p_40010_)) {
this.updateSellItem();
}
return itemstack1;
}
}
private boolean isPaymentSlot(int p_40023_) {
return p_40023_ == 0 || p_40023_ == 1;
}
@Override
public ItemStack removeItemNoUpdate(int p_40018_) {
return ContainerHelper.takeItem(this.itemStacks, p_40018_);
}
@Override
public void setItem(int p_40013_, ItemStack p_40014_) {
this.itemStacks.set(p_40013_, p_40014_);
p_40014_.limitSize(this.getMaxStackSize(p_40014_));
if (this.isPaymentSlot(p_40013_)) {
this.updateSellItem();
}
}
@Override
public boolean stillValid(Player p_40016_) {
return this.merchant.getTradingPlayer() == p_40016_;
}
@Override
public void setChanged() {
this.updateSellItem();
}
public void updateSellItem() {
this.activeOffer = null;
ItemStack itemstack;
ItemStack itemstack1;
if (this.itemStacks.get(0).isEmpty()) {
itemstack = this.itemStacks.get(1);
itemstack1 = ItemStack.EMPTY;
} else {
itemstack = this.itemStacks.get(0);
itemstack1 = this.itemStacks.get(1);
}
if (itemstack.isEmpty()) {
this.setItem(2, ItemStack.EMPTY);
this.futureXp = 0;
} else {
MerchantOffers merchantoffers = this.merchant.getOffers();
if (!merchantoffers.isEmpty()) {
MerchantOffer merchantoffer = merchantoffers.getRecipeFor(itemstack, itemstack1, this.selectionHint);
if (merchantoffer == null || merchantoffer.isOutOfStock()) {
this.activeOffer = merchantoffer;
merchantoffer = merchantoffers.getRecipeFor(itemstack1, itemstack, this.selectionHint);
}
if (merchantoffer != null && !merchantoffer.isOutOfStock()) {
this.activeOffer = merchantoffer;
this.setItem(2, merchantoffer.assemble());
this.futureXp = merchantoffer.getXp();
} else {
this.setItem(2, ItemStack.EMPTY);
this.futureXp = 0;
}
}
this.merchant.notifyTradeUpdated(this.getItem(2));
}
}
@Nullable
public MerchantOffer getActiveOffer() {
return this.activeOffer;
}
public void setSelectionHint(int p_40021_) {
this.selectionHint = p_40021_;
this.updateSellItem();
}
@Override
public void clearContent() {
this.itemStacks.clear();
}
public int getFutureXp() {
return this.futureXp;
}
}