ItemStackItemContainer class

Пакет: com.hypixel.hytale.server.core.inventory.container

Файл: com/hypixel/hytale/server/core/inventory/container/ItemStackItemContainer.java

extends: ItemContainer

Поля (28)

МодификаторыТипИмя
ItemStack var1
ItemStack[] var1
ItemStack var2
ItemStack var2
ItemStack var3
BsonDocument var3
ItemStack var3
ItemStack var3
ItemStackItemContainer var3
Int2ObjectConcurrentHashMap var4
ItemStack var4
Short var4
ItemStackItemContainer var4
ItemStackItemContainer var4
int var4
SlotFilter var5
BsonDocument var5
ItemStack[] var5
var5
BsonDocument var5
var5
BsonDocument var5
var5
BsonDocument var6
BsonDocument var6
var6
BsonDocument var6
var6

Методы (34)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Capacity must be > 0")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Item stack is empty!")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Item stack container is empty")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Item stack in parent container changed!")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Item stack container is empty!")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Item stack already has a container!")
abstract throw new UnsupportedOperationExceptionthrow new UnsupportedOperationException("Item stack containers don't support clone")
for for(short var1 = 0; var1 < this.items.length; var1++)
abstract for for(short var5 = 0; var5 < var3.getCapacity()
public short getItemStackSlotshort getItemStackSlot()
public ItemStack getOriginalItemStackItemStack getOriginalItemStack()
public ItemContainer getParentContainerItemContainer getParentContainer()
if if(var3 != null)
if if(this.items == null)
if if(this.items == null)
if if(this.items == null)
if if(this.items == null)
if if(var4 == null)
if if(var6 == null)
if if(var3 == null)
if if(var4 != null && var4 > 0)
if if(var5 == null)
if if(var2 <= 0)
if if(var5 == null)
if if(var6 == null)
if if(var2 <= 0)
if if(var5 == null)
if if(var6 == null)
if if(var3 == null)
if if(var4 != Integer.MIN_VALUE)
public boolean isItemStackValidboolean isItemStackValid()
private boolean testFilterboolean testFilter(FilterActionType var1, short var2, ItemStack var3)
static void writeToItemStackvoid writeToItemStack(@Nonnull ItemContainer var0, short var1, ItemStack var2, ItemStack[] var3)
abstract writeToItemStack writeToItemStack(this.parentContainer, this.itemStackSlot, this.originalItemStack, this.items)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.inventory.container;

class="kw">import com.hypixel.fastutil.ints.Int2ObjectConcurrentHashMap;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.EmptyExtraInfo;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemStackContainerConfig;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.container.filter.FilterActionType;
class="kw">import com.hypixel.hytale.server.core.inventory.container.filter.FilterType;
class="kw">import com.hypixel.hytale.server.core.inventory.container.filter.SlotFilter;
class="kw">import com.hypixel.hytale.server.core.inventory.container.filter.TagFilter;
class="kw">import com.hypixel.hytale.server.core.inventory.transaction.ClearTransaction;
class="kw">import java.util.Map;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.locks.ReadWriteLock;
class="kw">import java.util.concurrent.locks.ReentrantReadWriteLock;
class="kw">import java.util.function.Function;
class="kw">import java.util.function.Supplier;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonDocument;

class="kw">public class ItemStackItemContainer class="kw">extends ItemContainer {
   @Nonnull
   class="kw">public class="kw">static class="kw">final KeyedCodec<BsonDocument> CONTAINER_CODEC = new KeyedCodec<>("Container", Codec.BSON_DOCUMENT);
   @Nonnull
   class="kw">public class="kw">static class="kw">final KeyedCodec<Short> CAPACITY_CODEC = new KeyedCodec<>("Capacity", Codec.SHORT);
   @Nonnull
   class="kw">public class="kw">static class="kw">final KeyedCodec<ItemStack[]> ITEMS_CODEC = new KeyedCodec<>("Items", new ArrayCodec<>(ItemStack.CODEC, ItemStack[]::new));
   class="kw">protected class="kw">final ReadWriteLock lock = new ReentrantReadWriteLock();
   class="kw">protected class="kw">final ItemContainer parentContainer;
   class="kw">protected class="kw">final short itemStackSlot;
   class="kw">protected class="kw">final ItemStack originalItemStack;
   class="kw">protected class="kw">final short capacity;
   class="kw">protected ItemStack[] items;
   class="kw">private class="kw">final Map<FilterActionType, Int2ObjectConcurrentHashMap<SlotFilter>> slotFilters = new ConcurrentHashMap<>();
   @Nonnull
   class="kw">private FilterType globalFilter = FilterType.ALLOW_ALL;

   class="kw">private ItemStackItemContainer(ItemContainer var1, short var2, ItemStack var3, short var4, ItemStack[] var5) {
      this.parentContainer = var1;
      this.itemStackSlot = var2;
      this.originalItemStack = var3;
      this.capacity = var4;
      this.items = var5;
   }

   class="kw">public ItemContainer getParentContainer() {
      class="kw">return this.parentContainer;
   }

   class="kw">public short getItemStackSlot() {
      class="kw">return this.itemStackSlot;
   }

   class="kw">public ItemStack getOriginalItemStack() {
      class="kw">return this.originalItemStack;
   }

   class="kw">public boolean isItemStackValid() {
      ItemStack var1 = this.parentContainer.getItemStack(this.itemStackSlot);
      class="kw">return ItemStack.isEmpty(var1) ? false : ItemStack.isSameItemType(var1, this.originalItemStack);
   }

   @Override
   class="kw">public short getCapacity() {
      class="kw">return this.capacity;
   }

   @Override
   class="kw">public void setGlobalFilter(@Nonnull FilterType var1) {
      this.globalFilter = var1;
   }

   @Override
   class="kw">public void setSlotFilter(FilterActionType var1, short var2, @Nullable SlotFilter var3) {
      validateSlotIndex(var2, this.getCapacity());
      if (var3 != null) {
         this.slotFilters.computeIfAbsent(var1, var0 -> new Int2ObjectConcurrentHashMap<>()).put(var2, var3);
      } else {
         this.slotFilters.computeIfPresent(var1, (var1x, var2x) -> {
            var2x.remove(var2);
            class="kw">return var2x.isEmpty() ? null : var2x;
         });
      }
   }

   @Override
   class="kw">public ItemContainer clone() {
      throw new UnsupportedOperationException("Item stack containers don't support clone");
   }

   @Override
   class="kw">protected <V> V readAction(@Nonnull Supplier<V> var1) {
      this.lock.readLock().lock();

      try {
         class="kw">return var1.get();
      } class="kw">finally {
         this.lock.readLock().unlock();
      }
   }

   @Override
   class="kw">protected <X, V> V readAction(@Nonnull Function<X, V> var1, X var2) {
      this.lock.readLock().lock();

      try {
         class="kw">return var1.apply(var2);
      } class="kw">finally {
         this.lock.readLock().unlock();
      }
   }

   @Override
   class="kw">protected <V> V writeAction(@Nonnull Supplier<V> var1) {
      this.lock.writeLock().lock();

      try {
         class="kw">return var1.get();
      } class="kw">finally {
         this.lock.writeLock().unlock();
      }
   }

   @Override
   class="kw">protected <X, V> V writeAction(@Nonnull Function<X, V> var1, X var2) {
      this.lock.writeLock().lock();

      try {
         class="kw">return var1.apply(var2);
      } class="kw">finally {
         this.lock.writeLock().unlock();
      }
   }

   @Override
   class="kw">protected void lockForRead() {
      this.lock.readLock().lock();
   }

   @Override
   class="kw">protected void unlockForRead() {
      this.lock.readLock().unlock();
   }

   @Override
   class="kw">protected void lockForWrite() {
      this.lock.writeLock().lock();
   }

   @Override
   class="kw">protected void unlockForWrite() {
      this.lock.writeLock().unlock();
   }

   @Override
   class="kw">public boolean isEmpty() {
      this.lock.readLock().lock();

      try {
         if (this.items == null) {
            class="kw">return true;
         }

         for (short var1 = 0; var1 < this.items.length; var1++) {
            if (!ItemStack.isEmpty(this.items[var1])) {
               class="kw">return false;
            }
         }

         class="kw">return true;
      } class="kw">finally {
         this.lock.readLock().unlock();
      }
   }

   @Nonnull
   @Override
   class="kw">protected ClearTransaction internal_clear() {
      if (this.items == null) {
         class="kw">return new ClearTransaction(true, (short)0, ItemStack.EMPTY_ARRAY);
      }

      ItemStack[] var1 = this.items;
      this.items = new ItemStack[var1.length];
      writeToItemStack(this.parentContainer, this.itemStackSlot, this.originalItemStack, this.items);
      class="kw">return new ClearTransaction(true, (short)0, var1);
   }

   @Nullable
   @Override
   class="kw">protected ItemStack internal_getSlot(short var1) {
      class="kw">return this.items != null ? this.items[var1] : null;
   }

   @Nullable
   @Override
   class="kw">protected ItemStack internal_setSlot(short var1, ItemStack var2) {
      if (this.items == null) {
         class="kw">return null;
      }

      if (ItemStack.isEmpty(var2)) {
         class="kw">return this.internal_removeSlot(var1);
      }

      ItemStack var3 = this.items[var1];
      this.items[var1] = var2;
      writeToItemStack(this.parentContainer, this.itemStackSlot, this.originalItemStack, this.items);
      class="kw">return var3;
   }

   @Nullable
   @Override
   class="kw">protected ItemStack internal_removeSlot(short var1) {
      if (this.items == null) {
         class="kw">return null;
      }

      ItemStack var2 = this.items[var1];
      this.items[var1] = null;
      writeToItemStack(this.parentContainer, this.itemStackSlot, this.originalItemStack, this.items);
      class="kw">return var2;
   }

   @Override
   class="kw">protected boolean cantAddToSlot(short var1, ItemStack var2, ItemStack var3) {
      class="kw">return !this.globalFilter.allowInput() ? true : this.testFilter(FilterActionType.ADD, var1, var2);
   }

   @Override
   class="kw">protected boolean cantRemoveFromSlot(short var1) {
      class="kw">return !this.globalFilter.allowOutput() ? true : this.testFilter(FilterActionType.REMOVE, var1, null);
   }

   @Override
   class="kw">protected boolean cantDropFromSlot(short var1) {
      class="kw">return this.testFilter(FilterActionType.DROP, var1, null);
   }

   @Override
   class="kw">protected boolean cantMoveToSlot(ItemContainer var1, short var2) {
      class="kw">return var1 == this.parentContainer && var2 == this.itemStackSlot;
   }

   class="kw">private boolean testFilter(FilterActionType var1, short var2, ItemStack var3) {
      Int2ObjectConcurrentHashMap var4 = this.slotFilters.get(var1);
      if (var4 == null) {
         class="kw">return false;
      }

      SlotFilter var5 = var4.get(var2);
      class="kw">return var5 == null ? false : !var5.test(var1, this, var2, var3);
   }

   @Nullable
   @Override
   class="kw">public ItemStack getItemStack(short var1) {
      validateSlotIndex(var1, this.getCapacity());
      this.lock.readLock().lock();

      try {
         class="kw">return this.internal_getSlot(var1);
      } class="kw">finally {
         this.lock.readLock().unlock();
      }
   }

   class="kw">public class="kw">static void writeToItemStack(@Nonnull ItemContainer var0, short var1, ItemStack var2, ItemStack[] var3) {
      if (ItemStack.isEmpty(var2)) {
         throw new IllegalStateException("Item stack container is empty");
      }

      ItemStack var4 = var0.getItemStack(var1);
      if (!ItemStack.isSameItemType(var4, var2)) {
         throw new IllegalStateException("Item stack in parent container changed!");
      }

      BsonDocument var5 = var4.getMetadata();
      BsonDocument var6 = CONTAINER_CODEC.getOrNull(var5, EmptyExtraInfo.EMPTY);
      if (var6 == null) {
         throw new IllegalStateException("Item stack container is empty!");
      }

      ITEMS_CODEC.put(var6, var3, EmptyExtraInfo.EMPTY);
      var0.setItemStackForSlot(var1, var4.withMetadata(var5));
   }

   @Nullable
   class="kw">public class="kw">static ItemStackItemContainer getContainer(@Nonnull ItemContainer var0, short var1) {
      ItemStack var2 = var0.getItemStack(var1);
      if (ItemStack.isEmpty(var2)) {
         class="kw">return null;
      }

      BsonDocument var3 = var2.getFromMetadataOrNull(CONTAINER_CODEC);
      if (var3 == null) {
         class="kw">return null;
      }

      Short var4 = CAPACITY_CODEC.getOrNull(var3, EmptyExtraInfo.EMPTY);
      if (var4 != null && var4 > 0) {
         ItemStack[] var5 = ITEMS_CODEC.getOrNull(var3, EmptyExtraInfo.EMPTY);
         if (var5 == null) {
            var5 = new ItemStack[var4];
         }

         class="kw">return new ItemStackItemContainer(var0, var1, var2, var4, var5);
      } else {
         class="kw">return null;
      }
   }

   @Nonnull
   class="kw">public class="kw">static ItemStackItemContainer makeContainerWithCapacity(@Nonnull ItemContainer var0, short var1, short var2) {
      if (var2 <= 0) {
         throw new IllegalArgumentException("Capacity must be > 0");
      }

      ItemStack var3 = var0.getItemStack(var1);
      if (ItemStack.isEmpty(var3)) {
         throw new IllegalArgumentException("Item stack is empty!");
      }

      ItemStackItemContainer var4 = getContainer(var0, var1);
      if (var4 != null && var4.getCapacity() != 0) {
         throw new IllegalStateException("Item stack already has a container!");
      }

      BsonDocument var5 = var3.getMetadata();
      if (var5 == null) {
         var5 = new BsonDocument();
      }

      BsonDocument var6 = CONTAINER_CODEC.getOrNull(var5, EmptyExtraInfo.EMPTY);
      if (var6 == null) {
         var6 = new BsonDocument();
         CONTAINER_CODEC.put(var5, var6, EmptyExtraInfo.EMPTY);
      }

      CAPACITY_CODEC.put(var6, var2, EmptyExtraInfo.EMPTY);
      var0.setItemStackForSlot(var1, var3.withMetadata(var5));
      class="kw">return new ItemStackItemContainer(var0, var1, var3, var2, new ItemStack[var2]);
   }

   @Nullable
   class="kw">public class="kw">static ItemStackItemContainer ensureContainer(@Nonnull ItemContainer var0, short var1, short var2) {
      if (var2 <= 0) {
         throw new IllegalArgumentException("Capacity must be > 0");
      }

      ItemStack var3 = var0.getItemStack(var1);
      if (ItemStack.isEmpty(var3)) {
         class="kw">return null;
      }

      ItemStackItemContainer var4 = getContainer(var0, var1);
      if (var4 != null && var4.getCapacity() != 0) {
         class="kw">return var4;
      }

      BsonDocument var5 = var3.getMetadata();
      if (var5 == null) {
         var5 = new BsonDocument();
      }

      BsonDocument var6 = CONTAINER_CODEC.getOrNull(var5, EmptyExtraInfo.EMPTY);
      if (var6 == null) {
         var6 = new BsonDocument();
         CONTAINER_CODEC.put(var5, var6, EmptyExtraInfo.EMPTY);
      }

      CAPACITY_CODEC.put(var6, var2, EmptyExtraInfo.EMPTY);
      var0.setItemStackForSlot(var1, var3.withMetadata(var5));
      class="kw">return new ItemStackItemContainer(var0, var1, var3, var2, new ItemStack[var2]);
   }

   @Nullable
   class="kw">public class="kw">static ItemStackItemContainer ensureConfiguredContainer(@Nonnull ItemContainer var0, short var1, @Nonnull ItemStackContainerConfig var2) {
      ItemStackItemContainer var3 = ensureContainer(var0, var1, var2.getCapacity());
      if (var3 == null) {
         class="kw">return null;
      }

      var3.setGlobalFilter(var2.getGlobalFilter());
      int var4 = var2.getTagIndex();
      if (var4 != Integer.MIN_VALUE) {
         for (short var5 = 0; var5 < var3.getCapacity(); var5++) {
            var3.setSlotFilter(FilterActionType.ADD, var5, new TagFilter(var4));
         }
      }

      class="kw">return var3;
   }
}