Skip to content

Commit

Permalink
Fix #1751
Browse files Browse the repository at this point in the history
  • Loading branch information
shedaniel committed Nov 10, 2024
1 parent 2f2be7e commit 7343b3c
Show file tree
Hide file tree
Showing 13 changed files with 330 additions and 76 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@

package me.shedaniel.rei.plugin.client.categories.crafting.filler;

import me.shedaniel.rei.api.client.registry.entry.EntryRegistry;
import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import me.shedaniel.rei.api.common.util.EntryStacks;
import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCustomShapelessDisplay;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.DyeItem;
Expand All @@ -43,7 +44,11 @@ public class ArmorDyeRecipeFiller implements CraftingRecipeFiller<ArmorDyeRecipe
@Override
public Collection<Display> apply(RecipeHolder<ArmorDyeRecipe> recipe) {
List<Display> displays = new ArrayList<>();
List<EntryStack<?>> toDye = EntryRegistry.getInstance().getEntryStacks().filter(entry -> entry.getValueType() == ItemStack.class && entry.<ItemStack>castValue().is(ItemTags.DYEABLE)).toList();
List<EntryStack<?>> toDye = BuiltInRegistries.ITEM.stream()
.filter(item -> item.builtInRegistryHolder().is(ItemTags.DYEABLE))
.map(EntryStacks::of)
.<EntryStack<?>>map(EntryStack::cast)
.toList();
DyeColor[] colors = DyeColor.values();

for (EntryStack<?> armor : toDye) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,7 @@
package me.shedaniel.rei.plugin.client.categories.crafting.filler;

import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCustomDisplay;
import net.minecraft.ChatFormatting;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.Items;
import me.shedaniel.rei.plugin.common.displays.crafting.MapExtendingCraftingDisplay;
import net.minecraft.world.item.crafting.MapExtendingRecipe;
import net.minecraft.world.item.crafting.RecipeHolder;

Expand All @@ -46,19 +39,7 @@ public Collection<Display> apply(RecipeHolder<MapExtendingRecipe> recipe) {
List<Display> displays = new ArrayList<>();

for (int i = 0; i < 4; i++) {
EntryIngredient[] inputs = new EntryIngredient[9];
for (int j = 0; j < 9; j++) {
if (j == 4) {
inputs[j] = mapWith("X", i, 1);
} else {
inputs[j] = EntryIngredients.of(Items.PAPER);
}
}

displays.add(new DefaultCustomDisplay(
List.of(inputs),
List.of(mapWith("X", i + 1, 1)),
Optional.of(recipe.id().location())));
displays.add(new MapExtendingCraftingDisplay(i, Optional.of(recipe.id().location())));
}

return displays;
Expand All @@ -68,21 +49,4 @@ public Collection<Display> apply(RecipeHolder<MapExtendingRecipe> recipe) {
public Class<MapExtendingRecipe> getRecipeClass() {
return MapExtendingRecipe.class;
}

public static EntryIngredient mapWith(String mapId, int scale, int count) {
EntryIngredient stacks = EntryIngredients.of(Items.FILLED_MAP, count);
String unknown = I18n.get("filled_map.unknown");
for (EntryStack<?> stack : stacks) {
stack.tooltipProcessor(($, tooltip) -> {
tooltip.entries().removeIf(entry -> entry.isText() && entry.getAsText().getString().equals(unknown));
return tooltip;
});
stack.tooltip(
Component.translatable("filled_map.id", mapId).withStyle(ChatFormatting.GRAY),
Component.translatable("filled_map.scale", (1 << scale)).withStyle(ChatFormatting.GRAY),
Component.translatable("filled_map.level", scale, 4).withStyle(ChatFormatting.GRAY)
);
}
return stacks;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,16 @@

package me.shedaniel.rei.plugin.client.categories.crafting.filler;

import me.shedaniel.rei.api.client.registry.entry.EntryRegistry;
import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.api.common.display.basic.BasicDisplay;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import me.shedaniel.rei.api.common.util.EntryStacks;
import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCustomDisplay;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
Expand All @@ -46,21 +49,24 @@ public Collection<Display> apply(RecipeHolder<TippedArrowRecipe> recipe) {
Set<ResourceLocation> registeredPotions = new HashSet<>();
List<Display> displays = new ArrayList<>();

EntryRegistry.getInstance().getEntryStacks().filter(entry -> entry.getValueType() == ItemStack.class && entry.<ItemStack>castValue().getItem() == Items.LINGERING_POTION).forEach(entry -> {
ItemStack itemStack = (ItemStack) entry.getValue();
PotionContents potion = itemStack.get(DataComponents.POTION_CONTENTS);
if (potion.potion().isPresent() && potion.potion().get().unwrapKey().isPresent() && registeredPotions.add(potion.potion().get().unwrapKey().get().location())) {
List<EntryIngredient> input = new ArrayList<>();
for (int i = 0; i < 4; i++)
input.add(arrowStack);
input.add(EntryIngredients.of(itemStack));
for (int i = 0; i < 4; i++)
input.add(arrowStack);
ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8);
outputStack.set(DataComponents.POTION_CONTENTS, potion);
displays.add(new DefaultCustomDisplay(input, List.of(EntryIngredients.of(outputStack)), Optional.of(recipe.id().location())));
}
});
RegistryAccess registryAccess = BasicDisplay.registryAccess();
BasicDisplay.registryAccess().lookup(Registries.POTION).stream()
.flatMap(Registry::listElements)
.map(reference -> PotionContents.createItemStack(Items.LINGERING_POTION, reference))
.forEach(itemStack -> {
PotionContents potion = itemStack.get(DataComponents.POTION_CONTENTS);
if (potion.potion().isPresent() && potion.potion().get().unwrapKey().isPresent() && registeredPotions.add(potion.potion().get().unwrapKey().get().location())) {
List<EntryIngredient> input = new ArrayList<>();
for (int i = 0; i < 4; i++)
input.add(arrowStack);
input.add(EntryIngredients.of(itemStack));
for (int i = 0; i < 4; i++)
input.add(arrowStack);
ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8);
outputStack.set(DataComponents.POTION_CONTENTS, potion);
displays.add(new DefaultCustomDisplay(input, List.of(EntryIngredients.of(outputStack)), Optional.of(recipe.id().location())));
}
});

return displays;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ public void registerDisplaySerializer(DisplaySerializerRegistry registry) {
registry.register(id("default/crafting/custom"), DefaultCustomDisplay.SERIALIZER);
registry.register(id("default/crafting/custom_shaped"), DefaultCustomShapedDisplay.SERIALIZER);
registry.register(id("default/crafting/custom_shapeless"), DefaultCustomShapelessDisplay.SERIALIZER);
registry.register(id("extension/crafting/map_extending"), MapExtendingCraftingDisplay.SERIALIZER);
registry.register(id("default/smelting"), DefaultSmeltingDisplay.SERIALIZER);
registry.register(id("default/smoking"), DefaultSmokingDisplay.SERIALIZER);
registry.register(id("default/blasting"), DefaultBlastingDisplay.SERIALIZER);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import me.shedaniel.rei.plugin.common.BuiltinPlugin;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.codec.ByteBufCodecs;
Expand Down Expand Up @@ -108,6 +110,7 @@ public OptionalInt getCost() {

@ApiStatus.Experimental
@ApiStatus.Internal
@Environment(EnvType.CLIENT)
public static Optional<Pair<ItemStack, Integer>> calculateOutput(ItemStack left, ItemStack right) {
try {
if (Minecraft.getInstance().player == null) return Optional.empty();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/*
* This file is licensed under the MIT License, part of Roughly Enough Items.
* Copyright (c) 2018, 2019, 2020, 2021, 2022, 2023 shedaniel
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package me.shedaniel.rei.plugin.common.displays.crafting;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import dev.architectury.platform.Platform;
import dev.architectury.utils.Env;
import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.api.common.display.DisplaySerializer;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.util.EntryIngredients;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.ChatFormatting;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Items;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Optional;

public class MapExtendingCraftingDisplay extends DefaultCraftingDisplay {
public static final DisplaySerializer<MapExtendingCraftingDisplay> SERIALIZER = DisplaySerializer.of(
RecordCodecBuilder.mapCodec(instance -> instance.group(
Codec.INT.fieldOf("i").forGetter(d -> d.i),
ResourceLocation.CODEC.optionalFieldOf("location").forGetter(MapExtendingCraftingDisplay::getDisplayLocation)
).apply(instance, MapExtendingCraftingDisplay::new)),
StreamCodec.composite(
ByteBufCodecs.INT,
d -> d.i,
ByteBufCodecs.optional(ResourceLocation.STREAM_CODEC),
MapExtendingCraftingDisplay::getDisplayLocation,
MapExtendingCraftingDisplay::new
));

private final int i;

public MapExtendingCraftingDisplay(int i, Optional<ResourceLocation> id) {
super(getInputs(i), List.of(mapWith("X", i + 1, 1)), id);
this.i = i;
}

private static List<EntryIngredient> getInputs(int i) {
EntryIngredient[] inputs = new EntryIngredient[9];
for (int j = 0; j < 9; j++) {
if (j == 4) {
inputs[j] = mapWith("X", i, 1);
} else {
inputs[j] = EntryIngredients.of(Items.PAPER);
}
}
return List.of(inputs);
}

@Override
@Nullable
public DisplaySerializer<? extends Display> getSerializer() {
return SERIALIZER;
}

public static EntryIngredient mapWith(String mapId, int scale, int count) {
if (Platform.getEnvironment() == Env.CLIENT) {
return mapWithClient(mapId, scale, count);
} else {
return EntryIngredients.of(Items.FILLED_MAP, count);
}
}

@Environment(EnvType.CLIENT)
public static EntryIngredient mapWithClient(String mapId, int scale, int count) {
EntryIngredient stacks = EntryIngredients.of(Items.FILLED_MAP, count);
String unknown = I18n.get("filled_map.unknown");
for (EntryStack<?> stack : stacks) {
stack.tooltipProcessor(($, tooltip) -> {
tooltip.entries().removeIf(entry -> entry.isText() && entry.getAsText().getString().equals(unknown));
return tooltip;
});
stack.tooltip(
Component.translatable("filled_map.id", mapId).withStyle(ChatFormatting.GRAY),
Component.translatable("filled_map.scale", (1 << scale)).withStyle(ChatFormatting.GRAY),
Component.translatable("filled_map.level", scale, 4).withStyle(ChatFormatting.GRAY)
);
}
return stacks;
}

@Override
public boolean isShapeless() {
return false;
}

@Override
public int getWidth() {
return 3;
}

@Override
public int getHeight() {
return 3;
}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
org.gradle.jvmargs=-Xmx6G
base_version=17.0
unstable=false
supported_version=1.21.2
supported_version=1.21.2/3
minecraft_version=1.21.2
platforms=fabric,neoforge
forge_version=49.1.10
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@
package me.shedaniel.rei;

import com.google.common.collect.ImmutableList;
import dev.architectury.event.events.common.LifecycleEvent;
import dev.architectury.platform.Mod;
import dev.architectury.platform.Platform;
import dev.architectury.registry.ReloadListenerRegistry;
import dev.architectury.utils.Env;
import dev.architectury.utils.EnvExecutor;
import dev.architectury.utils.GameInstance;
import me.shedaniel.rei.api.common.entry.type.EntryType;
import me.shedaniel.rei.api.common.plugins.REICommonPlugin;
import me.shedaniel.rei.impl.Internals;
Expand Down Expand Up @@ -147,9 +149,12 @@ public void onInitialize() {
RoughlyEnoughItemsNetwork.onInitialize();

if (Platform.getEnvironment() == Env.SERVER) {
MutableLong lastReload = new MutableLong(-1);
LifecycleEvent.SERVER_STARTED.register(server -> {
ReloadManagerImpl.reloadPlugins(null, ReloadInterruptionContext.ofNever());
});
ReloadListenerRegistry.register(PackType.SERVER_DATA, (preparationBarrier, resourceManager, executor, executor2) -> {
return preparationBarrier.wait(Unit.INSTANCE).thenRunAsync(() -> {
if (GameInstance.getServer() == null) return;
ReloadManagerImpl.reloadPlugins(null, ReloadInterruptionContext.ofNever());
}, executor2);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import me.shedaniel.rei.impl.client.REIRuntimeImpl;
import me.shedaniel.rei.impl.client.gui.craftable.CraftableFilter;
import me.shedaniel.rei.impl.client.gui.dragging.CurrentDraggingStack;
import me.shedaniel.rei.impl.client.gui.hints.ImportantWarningsWidget;
import me.shedaniel.rei.impl.client.gui.modules.MenuAccess;
import me.shedaniel.rei.impl.client.gui.modules.MenuHolder;
import me.shedaniel.rei.impl.client.gui.widget.*;
Expand Down Expand Up @@ -187,6 +188,8 @@ public void init() {
this.widgets.add(draggingStack);
this.widgets.add(InternalWidgets.wrapLateRenderable(hintsWidget));
this.hintsWidget.init();

this.widgets.add(InternalWidgets.wrapLateRenderable(new ImportantWarningsWidget()));
}

private Rectangle getSearchFieldArea() {
Expand Down
Loading

0 comments on commit 7343b3c

Please sign in to comment.