tcr/java/src/game/inventory/ContainerEnchantment.java

425 lines
14 KiB
Java
Raw Normal View History

2025-03-11 00:23:54 +01:00
package game.inventory;
import java.util.List;
import game.enchantment.EnchantmentHelper;
import game.enchantment.RngEnchantment;
import game.entity.npc.EntityNPC;
import game.init.Blocks;
import game.init.Items;
import game.item.ItemStack;
import game.rng.Random;
import game.world.BlockPos;
import game.world.World;
public class ContainerEnchantment extends Container
{
/** SlotEnchantmentTable object with ItemStack to be enchanted */
public IInventory tableInventory;
/** current world (for bookshelf counting) */
private World worldPointer;
private BlockPos position;
private Random rand;
public int xpSeed;
/** 3-member array storing the enchantment levels of each slot */
public int[] enchantLevels;
public int[] enchantmentIds;
public ContainerEnchantment(InventoryPlayer playerInv, World worldIn)
{
this(playerInv, worldIn, BlockPos.ORIGIN);
}
public ContainerEnchantment(InventoryPlayer playerInv, World worldIn, BlockPos pos)
{
this.tableInventory = new InventoryBasic("Enchant", true, 1)
{
public int getInventoryStackLimit()
{
return ItemStack.MAX_SIZE;
}
public void markDirty()
{
super.markDirty();
ContainerEnchantment.this.onCraftMatrixChanged(this);
}
};
this.rand = new Random();
this.enchantLevels = new int[3];
this.enchantmentIds = new int[] { -1, -1, -1};
this.worldPointer = worldIn;
this.position = pos;
this.xpSeed = playerInv.player.getXPSeed();
this.addSlotToContainer(new Slot(this.tableInventory, 0, 25, 47)
{
public boolean isItemValid(ItemStack stack)
{
return true;
}
public int getSlotStackLimit()
{
return 1;
}
});
// this.addSlotToContainer(new Slot(this.tableInventory, 1, 35, 47)
// {
// public boolean isItemValid(ItemStack stack)
// {
// return stack.getItem() == Items.dye && EnumDyeColor.byDyeDamage(stack.getMetadata()) == EnumDyeColor.BLUE;
// }
// });
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 9; ++j)
{
this.addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
for (int k = 0; k < 9; ++k)
{
this.addSlotToContainer(new Slot(playerInv, k, 8 + k * 18, 142));
}
}
public void onCraftGuiOpened(ICrafting listener)
{
super.onCraftGuiOpened(listener);
listener.sendProgressBarUpdate(this, 0, this.enchantLevels[0]);
listener.sendProgressBarUpdate(this, 1, this.enchantLevels[1]);
listener.sendProgressBarUpdate(this, 2, this.enchantLevels[2]);
listener.sendProgressBarUpdate(this, 3, this.xpSeed & -16);
listener.sendProgressBarUpdate(this, 4, this.enchantmentIds[0]);
listener.sendProgressBarUpdate(this, 5, this.enchantmentIds[1]);
listener.sendProgressBarUpdate(this, 6, this.enchantmentIds[2]);
}
/**
* Looks for changes made in the container, sends them to every listener.
*/
public void detectAndSendChanges()
{
super.detectAndSendChanges();
for (int i = 0; i < this.crafters.size(); ++i)
{
ICrafting icrafting = (ICrafting)this.crafters.get(i);
icrafting.sendProgressBarUpdate(this, 0, this.enchantLevels[0]);
icrafting.sendProgressBarUpdate(this, 1, this.enchantLevels[1]);
icrafting.sendProgressBarUpdate(this, 2, this.enchantLevels[2]);
icrafting.sendProgressBarUpdate(this, 3, this.xpSeed & -16);
icrafting.sendProgressBarUpdate(this, 4, this.enchantmentIds[0]);
icrafting.sendProgressBarUpdate(this, 5, this.enchantmentIds[1]);
icrafting.sendProgressBarUpdate(this, 6, this.enchantmentIds[2]);
}
}
public void updateProgressBar(int id, int data)
{
if (id >= 0 && id <= 2)
{
this.enchantLevels[id] = data;
}
else if (id == 3)
{
this.xpSeed = data;
}
else if (id >= 4 && id <= 6)
{
this.enchantmentIds[id - 4] = data;
}
else
{
super.updateProgressBar(id, data);
}
}
/**
* Callback for when the crafting matrix is changed.
*/
public void onCraftMatrixChanged(IInventory inventoryIn)
{
if (inventoryIn == this.tableInventory)
{
ItemStack itemstack = inventoryIn.getStackInSlot(0);
if (itemstack != null && itemstack.isItemEnchantable())
{
if (!this.worldPointer.client)
{
int l = 0;
for (int j = -1; j <= 1; ++j)
{
for (int k = -1; k <= 1; ++k)
{
if ((j != 0 || k != 0) && this.worldPointer.isAirBlock(this.position.add(k, 0, j)) && this.worldPointer.isAirBlock(this.position.add(k, 1, j)))
{
if (this.worldPointer.getState(this.position.add(k * 2, 0, j * 2)).getBlock() == Blocks.bookshelf)
{
++l;
}
if (this.worldPointer.getState(this.position.add(k * 2, 1, j * 2)).getBlock() == Blocks.bookshelf)
{
++l;
}
if (k != 0 && j != 0)
{
if (this.worldPointer.getState(this.position.add(k * 2, 0, j)).getBlock() == Blocks.bookshelf)
{
++l;
}
if (this.worldPointer.getState(this.position.add(k * 2, 1, j)).getBlock() == Blocks.bookshelf)
{
++l;
}
if (this.worldPointer.getState(this.position.add(k, 0, j * 2)).getBlock() == Blocks.bookshelf)
{
++l;
}
if (this.worldPointer.getState(this.position.add(k, 1, j * 2)).getBlock() == Blocks.bookshelf)
{
++l;
}
}
}
}
}
this.rand.setSeed((long)this.xpSeed);
for (int i1 = 0; i1 < 3; ++i1)
{
this.enchantLevels[i1] = EnchantmentHelper.calcItemStackEnchantability(this.rand, i1, l, itemstack);
this.enchantmentIds[i1] = -1;
if (this.enchantLevels[i1] < i1 + 1)
{
this.enchantLevels[i1] = 0;
}
}
for (int j1 = 0; j1 < 3; ++j1)
{
if (this.enchantLevels[j1] > 0)
{
2025-03-20 00:29:25 +01:00
List<RngEnchantment> list = this.getRandomEnchantments(itemstack, j1, this.enchantLevels[j1]);
2025-03-11 00:23:54 +01:00
if (list != null && !list.isEmpty())
{
RngEnchantment enchantmentdata = (RngEnchantment)list.get(this.rand.zrange(list.size()));
this.enchantmentIds[j1] = enchantmentdata.enchantmentobj.effectId | enchantmentdata.enchantmentLevel << 8;
}
}
}
this.detectAndSendChanges();
}
}
else
{
for (int i = 0; i < 3; ++i)
{
this.enchantLevels[i] = 0;
this.enchantmentIds[i] = -1;
}
}
}
}
/**
* Handles the given Button-click on the server, currently only used by enchanting. Name is for legacy.
*/
public boolean enchantItem(EntityNPC playerIn, int id)
{
ItemStack itemstack = this.tableInventory.getStackInSlot(0);
// ItemStack itemstack1 = this.tableInventory.getStackInSlot(1);
int i = id + 1;
// if ((itemstack1 == null || itemstack1.stackSize < i) && !playerIn.capabilities.isCreativeMode)
// {
// return false;
// }
// else
if (this.enchantLevels[id] > 0 && itemstack != null && /* ( */ playerIn.experienceLevel >= i && playerIn.experienceLevel >= this.enchantLevels[id]) // || playerIn.creative))
{
if (!this.worldPointer.client)
{
2025-03-20 00:29:25 +01:00
List<RngEnchantment> list = this.getRandomEnchantments(itemstack, id, this.enchantLevels[id]);
2025-03-11 00:23:54 +01:00
boolean flag = itemstack.getItem() == Items.book;
if (list != null)
{
playerIn.removeExperienceLevel(i);
if (flag)
{
itemstack.setItem(Items.enchanted_book);
}
for (int j = 0; j < list.size(); ++j)
{
RngEnchantment enchantmentdata = (RngEnchantment)list.get(j);
if (flag)
{
Items.enchanted_book.addEnchantment(itemstack, enchantmentdata);
}
else
{
itemstack.addEnchantment(enchantmentdata.enchantmentobj, enchantmentdata.enchantmentLevel);
}
}
// if (!playerIn.capabilities.isCreativeMode)
// {
// itemstack1.stackSize -= i;
//
// if (itemstack1.stackSize <= 0)
// {
// this.tableInventory.setInventorySlotContents(1, (ItemStack)null);
// }
// }
// playerIn.triggerAchievement(StatRegistry.enchantedStat);
this.tableInventory.markDirty();
this.xpSeed = playerIn.getXPSeed();
this.onCraftMatrixChanged(this.tableInventory);
}
}
return true;
}
else
{
return false;
}
}
2025-03-20 00:29:25 +01:00
private List<RngEnchantment> getRandomEnchantments(ItemStack stack, int id, int level)
2025-03-11 00:23:54 +01:00
{
2025-03-20 00:29:25 +01:00
this.rand.setSeed((long)(this.xpSeed + id));
List<RngEnchantment> list = EnchantmentHelper.buildEnchantmentList(this.rand, stack, level);
2025-03-11 00:23:54 +01:00
if (stack.getItem() == Items.book && list != null && list.size() > 1)
{
list.remove(this.rand.zrange(list.size()));
}
return list;
}
// public int getLapisAmount()
// {
// ItemStack itemstack = this.tableInventory.getStackInSlot(1);
// return itemstack == null ? 0 : itemstack.stackSize;
// }
/**
* Called when the container is closed.
*/
public void onContainerClosed(EntityNPC playerIn)
{
super.onContainerClosed(playerIn);
if (!this.worldPointer.client)
{
for (int i = 0; i < this.tableInventory.getSizeInventory(); ++i)
{
ItemStack itemstack = this.tableInventory.removeStackFromSlot(i);
if (itemstack != null)
{
playerIn.dropPlayerItemWithRandomChoice(itemstack, false);
}
}
}
}
public boolean canInteractWith(EntityNPC playerIn)
{
return this.worldPointer.getState(this.position).getBlock() != Blocks.enchanting_table ? false : playerIn.getDistanceSq((double)this.position.getX() + 0.5D, (double)this.position.getY() + 0.5D, (double)this.position.getZ() + 0.5D) <= 64.0D;
}
/**
* Take a stack from the specified inventory slot.
*/
public ItemStack transferStackInSlot(EntityNPC playerIn, int index)
{
ItemStack itemstack = null;
Slot slot = (Slot)this.inventorySlots.get(index);
if (slot != null && slot.getHasStack())
{
ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy();
if (index == 0)
{
if (!this.mergeItemStack(itemstack1, 1, 37, true))
{
return null;
}
}
// else if (index == 1)
// {
// if (!this.mergeItemStack(itemstack1, 2, 38, true))
// {
// return null;
// }
// }
// else if (itemstack1.getItem() == Items.dye && EnumDyeColor.byDyeDamage(itemstack1.getMetadata()) == EnumDyeColor.BLUE)
// {
// if (!this.mergeItemStack(itemstack1, 1, 2, true))
// {
// return null;
// }
// }
else
{
if (((Slot)this.inventorySlots.get(0)).getHasStack() || !((Slot)this.inventorySlots.get(0)).isItemValid(itemstack1))
{
return null;
}
if (itemstack1.hasTagCompound() && itemstack1.stackSize == 1)
{
((Slot)this.inventorySlots.get(0)).putStack(itemstack1.copy());
itemstack1.stackSize = 0;
}
else if (itemstack1.stackSize >= 1)
{
((Slot)this.inventorySlots.get(0)).putStack(new ItemStack(itemstack1.getItem(), 1, itemstack1.getMetadata()));
--itemstack1.stackSize;
}
}
if (itemstack1.stackSize == 0)
{
slot.putStack((ItemStack)null);
}
else
{
slot.onSlotChanged();
}
if (itemstack1.stackSize == itemstack.stackSize)
{
return null;
}
slot.onPickupFromSlot(playerIn, itemstack1);
}
return itemstack;
}
}