StructuralCraftingWindow class

Пакет: com.hypixel.hytale.builtin.crafting.window

Файл: com/hypixel/hytale/builtin/crafting/window/StructuralCraftingWindow.java

extends: CraftingWindow

implements: ItemContainerWindow

Поля (56)

МодификаторыТипИмя
final int MAX_OPTIONS
break
break
break
break
break
break
return
return
ItemStack var1
int var10
int var10
var10
var10
String var11
CraftingRecipe var12
MaterialQuantity var13
List var13
String var14
short var14
Item var15
JsonArray var15
int var16
ItemStack var17
String var17
int var2
var2
ObjectList var2
List var2
boolean var3
CombinedItemContainer var3
CombinedItemContainer var3
StructuralCraftingBench var3
ObjectList var3
boolean var4
CraftingManager var4
ItemStack var4
List var4
int var4
int var4
ObjectList var5
int var5
BlockGroup var5
CraftingManager var5
CraftingRecipe var5
int var6
int var6
var6
int var6
CraftingRecipe var6
StructuralCraftingBench var7
int var7
List var7
String var8
CraftingRecipe var8
Item var9

Методы (34)

МодификаторыВозвратСигнатура
private void changeBlockTypevoid changeBlockType(@Nonnull Ref<EntityStore> var1, boolean var2, @Nonnull Store<EntityStore> var3)
for for(String var9 : var5.categories)
for for(String var10 : var6.categories)
abstract for for(int var7 = 0; var7 < var5.size()
abstract for for(var4 = 0; var4 < var2.size()
abstract for for(int var7 = var2.size()
abstract for for(int ix = 0; ix < this.optionsContainer.getCapacity()
abstract for for(int var5 = var2.size()
static int getSortingPriorityint getSortingPriority(@Nonnull StructuralCraftingBench var0, @Nonnull CraftingRecipe var1)
static boolean hasHeaderCategoryboolean hasHeaderCategory(@Nonnull StructuralCraftingBench var0, @Nonnull CraftingRecipe var1)
if if(var1 != FilterActionType.ADD)
if if(var3 != var4)
if if(var4 != null)
if if(var16 != this.selectedSlot)
if if(var17 != null)
if if(var11 == null)
if if(var12 == null)
if if(var14 != null)
if if(var15 != null)
if if(var4 != null)
if if(var5 != null)
if if(var6 != -1)
if if(var2)
if if(var9 != null)
if if(this.inventoryRegistration != null)
if if(var2 != null)
if if(var17 != null)
if if(var1 == null)
private boolean isValidInputboolean isValidInput(FilterActionType var1, ItemContainer var2, short var3, ItemStack var4)
static void sortRecipesvoid sortRecipes(@Nonnull ObjectList<CraftingRecipe> var0, @Nonnull StructuralCraftingBench var1)
abstract sortRecipes sortRecipes(var2, var3)
abstract super super(WindowType.StructuralCrafting, var1, var2, var3, var4, var5, var6)
switch switch(var3)
private void updateRecipesvoid updateRecipes()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.crafting.window;

class="kw">import com.google.gson.JsonArray;
class="kw">import com.hypixel.hytale.builtin.crafting.CraftingPlugin;
class="kw">import com.hypixel.hytale.builtin.crafting.component.BenchBlock;
class="kw">import com.hypixel.hytale.builtin.crafting.component.CraftingManager;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.event.EventRegistration;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.protocol.BenchRequirement;
class="kw">import com.hypixel.hytale.protocol.ItemSoundEvent;
class="kw">import com.hypixel.hytale.protocol.packets.window.ChangeBlockAction;
class="kw">import com.hypixel.hytale.protocol.packets.window.CraftRecipeAction;
class="kw">import com.hypixel.hytale.protocol.packets.window.SelectSlotAction;
class="kw">import com.hypixel.hytale.protocol.packets.window.WindowAction;
class="kw">import com.hypixel.hytale.protocol.packets.window.WindowType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.bench.StructuralCraftingBench;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.BlockGroup;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.CraftingRecipe;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.windows.ItemContainerWindow;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.MaterialQuantity;
class="kw">import com.hypixel.hytale.server.core.inventory.container.CombinedItemContainer;
class="kw">import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
class="kw">import com.hypixel.hytale.server.core.inventory.container.SimpleItemContainer;
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.universe.world.SoundUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectList;
class="kw">import java.util.List;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class StructuralCraftingWindow class="kw">extends CraftingWindow class="kw">implements ItemContainerWindow {
   class="kw">private class="kw">static class="kw">final int MAX_OPTIONS = 64;
   @Nonnull
   class="kw">private class="kw">final SimpleItemContainer inputContainer;
   @Nonnull
   class="kw">private class="kw">final SimpleItemContainer optionsContainer;
   @Nonnull
   class="kw">private class="kw">final CombinedItemContainer combinedItemContainer;
   @Nonnull
   class="kw">private class="kw">final Int2ObjectMap<String> optionSlotToRecipeMap = new Int2ObjectOpenHashMap();
   class="kw">private int selectedSlot;
   @Nullable
   class="kw">private EventRegistration inventoryRegistration;

   class="kw">public StructuralCraftingWindow(int var1, int var2, int var3, int var4, @Nonnull BlockType var5, @Nonnull BenchBlock var6) {
      super(WindowType.StructuralCrafting, var1, var2, var3, var4, var5, var6);
      this.inputContainer = new SimpleItemContainer((short)1);
      this.inputContainer.registerChangeEvent(var1x -> this.updateRecipes());
      this.inputContainer.setSlotFilter(FilterActionType.ADD, (short)0, this::isValidInput);
      this.optionsContainer = new SimpleItemContainer((short)64);
      this.optionsContainer.setGlobalFilter(FilterType.DENY_ALL);
      this.combinedItemContainer = new CombinedItemContainer(this.inputContainer, this.optionsContainer);
      this.windowData.addProperty("selected", this.selectedSlot);
      StructuralCraftingBench var7 = (StructuralCraftingBench)this.bench;
      this.windowData.addProperty("allowBlockGroupCycling", var7.shouldAllowBlockGroupCycling());
      this.windowData.addProperty("alwaysShowInventoryHints", var7.shouldAlwaysShowInventoryHints());
   }

   class="kw">private boolean isValidInput(FilterActionType var1, ItemContainer var2, short var3, ItemStack var4) {
      if (var1 != FilterActionType.ADD) {
         class="kw">return true;
      }

      ObjectList var5 = this.getMatchingRecipes(var4);
      class="kw">return var5 != null && !var5.isEmpty();
   }

   class="kw">private class="kw">static void sortRecipes(@Nonnull ObjectList<CraftingRecipe> var0, @Nonnull StructuralCraftingBench var1) {
      var0.sort((var1x, var2) -> {
         boolean var3 = hasHeaderCategory(var1, var1x);
         boolean var4 = hasHeaderCategory(var1, var2);
         if (var3 != var4) {
            class="kw">return var3 ? -1 : 1;
         }

         int var5 = getSortingPriority(var1, var1x);
         int var6 = getSortingPriority(var1, var2);
         int var7 = Integer.compare(var5, var6);
         class="kw">return var7 != 0 ? var7 : var1x.getId().compareTo(var2.getId());
      });
   }

   class="kw">private class="kw">static boolean hasHeaderCategory(@Nonnull StructuralCraftingBench var0, @Nonnull CraftingRecipe var1) {
      for (BenchRequirement var5 : var1.getBenchRequirement()) {
         if (var5.type == var0.getType() && var5.id.equals(var0.getId()) && var5.categories != null) {
            for (String var9 : var5.categories) {
               if (var0.isHeaderCategory(var9)) {
                  class="kw">return true;
               }
            }
         }
      }

      class="kw">return false;
   }

   class="kw">private class="kw">static int getSortingPriority(@Nonnull StructuralCraftingBench var0, @Nonnull CraftingRecipe var1) {
      int var2 = Integer.MAX_VALUE;

      for (BenchRequirement var6 : var1.getBenchRequirement()) {
         if (var6.type == var0.getType() && var6.id.equals(var0.getId()) && var6.categories != null) {
            for (String var10 : var6.categories) {
               var2 = Math.min(var2, var0.getCategoryIndex(var10));
            }
            break;
         }
      }

      class="kw">return var2;
   }

   @Override
   class="kw">public void handleAction(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull WindowAction var3) {
      CraftingManager var4 = var2.getComponent(var1, CraftingManager.getComponentType());
      if (var4 != null) {
         class="kw">switch (var3) {
            case SelectSlotAction var7:
               int var16 = MathUtil.clamp(var7.slot, 0, this.optionsContainer.getCapacity() - 1);
               if (var16 != this.selectedSlot) {
                  this.selectedSlot = var16;
                  this.windowData.addProperty("selected", this.selectedSlot);
                  this.invalidate();
               }
               break;
            case CraftRecipeAction var8:
               ItemStack var17 = this.optionsContainer.getItemStack((short)this.selectedSlot);
               if (var17 != null) {
                  int var10 = var8.quantity;
                  String var11 = (String)this.optionSlotToRecipeMap.get(this.selectedSlot);
                  if (var11 == null) {
                     class="kw">return;
                  }

                  CraftingRecipe var12 = CraftingRecipe.getAssetMap().getAsset(var11);
                  if (var12 == null) {
                     class="kw">return;
                  }

                  MaterialQuantity var13 = var12.getPrimaryOutput();
                  String var14 = var13 != null ? var13.getItemId() : null;
                  if (var14 != null) {
                     Item var15 = Item.getAssetMap().getAsset(var14);
                     if (var15 != null) {
                        SoundUtil.playItemSoundEvent(var1, var2, var15, ItemSoundEvent.Drop);
                     }
                  }

                  if (var4.queueCraft(var1, var2, this, 0, var12, var10, this.inputContainer, CraftingManager.InputRemovalType.ORDERED)) {
                     this.updateQueueSize(var4.getRemainingQueueSize());
                  }

                  this.invalidate();
               }
               break;
            case ChangeBlockAction var9:
               if (((StructuralCraftingBench)this.bench).shouldAllowBlockGroupCycling()) {
                  this.changeBlockType(var1, var9.down, var2);
               }
               break;
            class="kw">default:
         }
      }
   }

   class="kw">private void changeBlockType(@Nonnull Ref<EntityStore> var1, boolean var2, @Nonnull Store<EntityStore> var3) {
      ItemStack var4 = this.inputContainer.getItemStack((short)0);
      if (var4 != null) {
         BlockGroup var5 = BlockGroup.findItemGroup(var4.getItem());
         if (var5 != null) {
            int var6 = -1;

            for (int var7 = 0; var7 < var5.size(); var7++) {
               if (var5.get(var7).equals(var4.getItem().getId())) {
                  var6 = var7;
                  break;
               }
            }

            if (var6 != -1) {
               int var10;
               if (var2) {
                  var10 = (var6 - 1 + var5.size()) % var5.size();
               } else {
                  var10 = (var6 + 1) % var5.size();
               }

               String var8 = var5.get(var10);
               Item var9 = Item.getAssetMap().getAsset(var8);
               if (var9 != null) {
                  this.inputContainer.replaceItemStackInSlot((short)0, var4, new ItemStack(var8, var4.getQuantity()));
                  SoundUtil.playItemSoundEvent(var1, var3, var9, ItemSoundEvent.Drop);
               }
            }
         }
      }
   }

   @Nonnull
   @Override
   class="kw">public ItemContainer getItemContainer() {
      class="kw">return this.combinedItemContainer;
   }

   @Override
   class="kw">public boolean onOpen0(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      super.onOpen0(var1, var2);
      CombinedItemContainer var3 = InventoryComponent.getCombined(var2, var1, InventoryComponent.HOTBAR_FIRST);
      this.inventoryRegistration = var3.registerChangeEvent(var2x -> {
         this.windowData.add("inventoryHints", CraftingManager.generateInventoryHints(CraftingPlugin.getBenchRecipes(this.bench), 0, var3));
         this.invalidate();
      });
      this.windowData.add("inventoryHints", CraftingManager.generateInventoryHints(CraftingPlugin.getBenchRecipes(this.bench), 0, var3));
      class="kw">return true;
   }

   @Override
   class="kw">public void onClose0(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      super.onClose0(var1, var2);
      CombinedItemContainer var3 = InventoryComponent.getCombined(var2, var1, InventoryComponent.HOTBAR_FIRST);
      List var4 = this.inputContainer.dropAllItemStacks();
      SimpleItemContainer.addOrDropItemStacks(var2, var1, var3, var4);
      CraftingManager var5 = var2.getComponent(var1, CraftingManager.getComponentType());
      assert var5 != null;
      var5.cancelAllCrafting(var1, var2);
      if (this.inventoryRegistration != null) {
         this.inventoryRegistration.unregister();
         this.inventoryRegistration = null;
      }
   }

   class="kw">private void updateRecipes() {
      this.invalidate();
      this.optionsContainer.clear();
      this.optionSlotToRecipeMap.clear();
      ItemStack var1 = this.inputContainer.getItemStack((short)0);
      ObjectList var2 = this.getMatchingRecipes(var1);
      if (var2 != null) {
         StructuralCraftingBench var3 = (StructuralCraftingBench)this.bench;
         sortRecipes(var2, var3);

         int var4;
         for (var4 = 0; var4 < var2.size(); var4++) {
            CraftingRecipe var5 = (CraftingRecipe)var2.get(var4);
            if (!hasHeaderCategory(var3, var5)) {
               break;
            }
         }

         this.windowData.addProperty("dividerIndex", var4);
         this.optionsContainer.clear();
         short var14 = 0;
         int var6 = 0;

         for (int var7 = var2.size(); var6 < var7; var6++) {
            CraftingRecipe var8 = (CraftingRecipe)var2.get(var6);

            for (BenchRequirement var12 : var8.getBenchRequirement()) {
               if (var12.type == this.bench.getType() && var12.id.equals(this.bench.getId())) {
                  List var13 = CraftingManager.getOutputItemStacks(var8);
                  this.optionsContainer.setItemStackForSlot(var14, var13.getFirst(), false);
                  this.optionSlotToRecipeMap.put(var14, var8.getId());
                  var14++;
               }
            }
         }

         JsonArray var15 = new JsonArray();

         for (int ix = 0; ix < this.optionsContainer.getCapacity(); ix++) {
            String var17 = (String)this.optionSlotToRecipeMap.get(ix);
            if (var17 != null) {
               var15.add(var17);
            }
         }

         this.windowData.add("optionSlotRecipes", var15);
      }
   }

   @Nullable
   class="kw">private ObjectList<CraftingRecipe> getMatchingRecipes(@Nullable ItemStack var1) {
      if (var1 == null) {
         class="kw">return null;
      }

      List var2 = CraftingPlugin.getBenchRecipes(this.bench.getType(), this.bench.getId());
      if (var2.isEmpty()) {
         class="kw">return null;
      }

      ObjectList var3 = new ObjectArrayList();
      int var4 = 0;

      for (int var5 = var2.size(); var4 < var5; var4++) {
         CraftingRecipe var6 = var2.get(var4);
         List var7 = CraftingManager.getInputMaterials(var6);
         if (var7.size() == 1 && CraftingManager.matches(var7.getFirst(), var1)) {
            var3.add(var6);
         }
      }

      class="kw">return var3.isEmpty() ? null : var3;
   }
}