minecraft-src/net/minecraft/stats/RecipeBookSettings.java
2025-07-04 02:00:41 +03:00

148 lines
5.1 KiB
Java

package net.minecraft.stats;
import com.google.common.collect.ImmutableMap;
import com.mojang.datafixers.util.Pair;
import java.util.EnumMap;
import java.util.Map;
import java.util.function.UnaryOperator;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.inventory.RecipeBookType;
public final class RecipeBookSettings {
public static final StreamCodec<FriendlyByteBuf, RecipeBookSettings> STREAM_CODEC = StreamCodec.ofMember(RecipeBookSettings::write, RecipeBookSettings::read);
private static final Map<RecipeBookType, Pair<String, String>> 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<RecipeBookType, RecipeBookSettings.TypeSettings> states;
private RecipeBookSettings(Map<RecipeBookType, RecipeBookSettings.TypeSettings> states) {
this.states = states;
}
public RecipeBookSettings() {
this(new EnumMap(RecipeBookType.class));
}
private RecipeBookSettings.TypeSettings getSettings(RecipeBookType recipeBookType) {
return (RecipeBookSettings.TypeSettings)this.states.getOrDefault(recipeBookType, RecipeBookSettings.TypeSettings.DEFAULT);
}
private void updateSettings(RecipeBookType recipeBookType, UnaryOperator<RecipeBookSettings.TypeSettings> unaryOperator) {
this.states.compute(recipeBookType, (recipeBookTypex, typeSettings) -> {
if (typeSettings == null) {
typeSettings = RecipeBookSettings.TypeSettings.DEFAULT;
}
typeSettings = (RecipeBookSettings.TypeSettings)unaryOperator.apply(typeSettings);
if (typeSettings.equals(RecipeBookSettings.TypeSettings.DEFAULT)) {
typeSettings = null;
}
return typeSettings;
});
}
public boolean isOpen(RecipeBookType bookType) {
return this.getSettings(bookType).open;
}
public void setOpen(RecipeBookType bookType, boolean open) {
this.updateSettings(bookType, typeSettings -> typeSettings.setOpen(open));
}
public boolean isFiltering(RecipeBookType bookType) {
return this.getSettings(bookType).filtering;
}
public void setFiltering(RecipeBookType bookType, boolean filtering) {
this.updateSettings(bookType, typeSettings -> typeSettings.setFiltering(filtering));
}
private static RecipeBookSettings read(FriendlyByteBuf buffer) {
Map<RecipeBookType, RecipeBookSettings.TypeSettings> map = new EnumMap(RecipeBookType.class);
for (RecipeBookType recipeBookType : RecipeBookType.values()) {
boolean bl = buffer.readBoolean();
boolean bl2 = buffer.readBoolean();
if (bl || bl2) {
map.put(recipeBookType, new RecipeBookSettings.TypeSettings(bl, bl2));
}
}
return new RecipeBookSettings(map);
}
private void write(FriendlyByteBuf buffer) {
for (RecipeBookType recipeBookType : RecipeBookType.values()) {
RecipeBookSettings.TypeSettings typeSettings = (RecipeBookSettings.TypeSettings)this.states
.getOrDefault(recipeBookType, RecipeBookSettings.TypeSettings.DEFAULT);
buffer.writeBoolean(typeSettings.open);
buffer.writeBoolean(typeSettings.filtering);
}
}
public static RecipeBookSettings read(CompoundTag tag) {
Map<RecipeBookType, RecipeBookSettings.TypeSettings> map = new EnumMap(RecipeBookType.class);
TAG_FIELDS.forEach((recipeBookType, pair) -> {
boolean bl = tag.getBoolean((String)pair.getFirst());
boolean bl2 = tag.getBoolean((String)pair.getSecond());
if (bl || bl2) {
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
.getOrDefault(recipeBookType, RecipeBookSettings.TypeSettings.DEFAULT);
tag.putBoolean((String)pair.getFirst(), typeSettings.open);
tag.putBoolean((String)pair.getSecond(), typeSettings.filtering);
}
);
}
public RecipeBookSettings copy() {
return new RecipeBookSettings(new EnumMap(this.states));
}
public void replaceFrom(RecipeBookSettings other) {
this.states.clear();
this.states.putAll(other.states);
}
public boolean equals(Object object) {
return this == object || object instanceof RecipeBookSettings && this.states.equals(((RecipeBookSettings)object).states);
}
public int hashCode() {
return this.states.hashCode();
}
record TypeSettings(boolean open, boolean filtering) {
public static final RecipeBookSettings.TypeSettings DEFAULT = new RecipeBookSettings.TypeSettings(false, false);
public String toString() {
return "[open=" + this.open + ", filtering=" + this.filtering + "]";
}
public RecipeBookSettings.TypeSettings setOpen(boolean bl) {
return new RecipeBookSettings.TypeSettings(bl, this.filtering);
}
public RecipeBookSettings.TypeSettings setFiltering(boolean bl) {
return new RecipeBookSettings.TypeSettings(this.open, bl);
}
}
}