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;
}
}