package net.minecraft.stats; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.mojang.datafixers.util.Pair; import java.util.Map; import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.inventory.RecipeBookType; public final class RecipeBookSettings { private static final Map> TAG_FIELDS = ImmutableMap.of( RecipeBookType.CRAFTING, Pair.of("isGuiOpen", "isFilteringCraftable"), RecipeBookType.FURNACE, Pair.of("isFurnaceGuiOpen", "isFurnaceFilteringCraftable"), RecipeBookType.BLAST_FURNACE, Pair.of("isBlastingFurnaceGuiOpen", "isBlastingFurnaceFilteringCraftable"), RecipeBookType.SMOKER, Pair.of("isSmokerGuiOpen", "isSmokerFilteringCraftable") ); private final Map states; private RecipeBookSettings(Map states) { this.states = states; } public RecipeBookSettings() { this(Util.make(Maps.newEnumMap(RecipeBookType.class), enumMap -> { for (RecipeBookType recipeBookType : RecipeBookType.values()) { enumMap.put(recipeBookType, new RecipeBookSettings.TypeSettings(false, false)); } })); } public boolean isOpen(RecipeBookType bookType) { return ((RecipeBookSettings.TypeSettings)this.states.get(bookType)).open; } public void setOpen(RecipeBookType bookType, boolean open) { ((RecipeBookSettings.TypeSettings)this.states.get(bookType)).open = open; } public boolean isFiltering(RecipeBookType bookType) { return ((RecipeBookSettings.TypeSettings)this.states.get(bookType)).filtering; } public void setFiltering(RecipeBookType bookType, boolean filtering) { ((RecipeBookSettings.TypeSettings)this.states.get(bookType)).filtering = filtering; } public static RecipeBookSettings read(FriendlyByteBuf buffer) { Map map = Maps.newEnumMap(RecipeBookType.class); for (RecipeBookType recipeBookType : RecipeBookType.values()) { boolean bl = buffer.readBoolean(); boolean bl2 = buffer.readBoolean(); map.put(recipeBookType, new RecipeBookSettings.TypeSettings(bl, bl2)); } return new RecipeBookSettings(map); } public void write(FriendlyByteBuf buffer) { for (RecipeBookType recipeBookType : RecipeBookType.values()) { RecipeBookSettings.TypeSettings typeSettings = (RecipeBookSettings.TypeSettings)this.states.get(recipeBookType); if (typeSettings == null) { buffer.writeBoolean(false); buffer.writeBoolean(false); } else { buffer.writeBoolean(typeSettings.open); buffer.writeBoolean(typeSettings.filtering); } } } public static RecipeBookSettings read(CompoundTag tag) { Map map = Maps.newEnumMap(RecipeBookType.class); TAG_FIELDS.forEach((recipeBookType, pair) -> { boolean bl = tag.getBoolean((String)pair.getFirst()); boolean bl2 = tag.getBoolean((String)pair.getSecond()); map.put(recipeBookType, new RecipeBookSettings.TypeSettings(bl, bl2)); }); return new RecipeBookSettings(map); } public void write(CompoundTag tag) { TAG_FIELDS.forEach((recipeBookType, pair) -> { RecipeBookSettings.TypeSettings typeSettings = (RecipeBookSettings.TypeSettings)this.states.get(recipeBookType); tag.putBoolean((String)pair.getFirst(), typeSettings.open); tag.putBoolean((String)pair.getSecond(), typeSettings.filtering); }); } public RecipeBookSettings copy() { Map map = Maps.newEnumMap(RecipeBookType.class); for (RecipeBookType recipeBookType : RecipeBookType.values()) { RecipeBookSettings.TypeSettings typeSettings = (RecipeBookSettings.TypeSettings)this.states.get(recipeBookType); map.put(recipeBookType, typeSettings.copy()); } return new RecipeBookSettings(map); } public void replaceFrom(RecipeBookSettings other) { this.states.clear(); for (RecipeBookType recipeBookType : RecipeBookType.values()) { RecipeBookSettings.TypeSettings typeSettings = (RecipeBookSettings.TypeSettings)other.states.get(recipeBookType); this.states.put(recipeBookType, typeSettings.copy()); } } public boolean equals(Object object) { return this == object || object instanceof RecipeBookSettings && this.states.equals(((RecipeBookSettings)object).states); } public int hashCode() { return this.states.hashCode(); } static final class TypeSettings { boolean open; boolean filtering; public TypeSettings(boolean open, boolean filtering) { this.open = open; this.filtering = filtering; } public RecipeBookSettings.TypeSettings copy() { return new RecipeBookSettings.TypeSettings(this.open, this.filtering); } public boolean equals(Object object) { if (this == object) { return true; } else { return !(object instanceof RecipeBookSettings.TypeSettings typeSettings) ? false : this.open == typeSettings.open && this.filtering == typeSettings.filtering; } } public int hashCode() { int i = this.open ? 1 : 0; return 31 * i + (this.filtering ? 1 : 0); } public String toString() { return "[open=" + this.open + ", filtering=" + this.filtering + "]"; } } }