Skip to content

Commit

Permalink
Fix #3225 Server error when deleting items in multiplayer
Browse files Browse the repository at this point in the history
  • Loading branch information
mezz committed Jan 29, 2024
1 parent 7f67924 commit 0218099
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 65 deletions.
Expand Up @@ -4,11 +4,12 @@
import mezz.jei.common.config.file.ConfigCategoryBuilder;
import mezz.jei.common.config.file.ConfigSchemaBuilder;
import mezz.jei.common.config.file.ConfigValue;
import mezz.jei.common.config.file.serializers.ChatFormattingSerializer;
import mezz.jei.common.platform.IPlatformItemStackHelper;
import mezz.jei.common.config.file.serializers.ChatFormattingSerializer;import mezz.jei.common.platform.IPlatformItemStackHelper;
import mezz.jei.common.platform.Services;
import mezz.jei.core.util.function.CachedSupplierTransformer;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
Expand Down Expand Up @@ -67,7 +68,9 @@ public final boolean isModNameFormatOverrideActive() {

private String detectModNameTooltipFormatting() {
IPlatformItemStackHelper itemStackHelper = Services.PLATFORM.getItemStackHelper();
List<Component> tooltip = itemStackHelper.getTestTooltip(new ItemStack(Items.APPLE));
Minecraft minecraft = Minecraft.getInstance();
LocalPlayer player = minecraft.player;
List<Component> tooltip = itemStackHelper.getTestTooltip(player, new ItemStack(Items.APPLE));
if (tooltip.size() <= 1) {
return "";
}
Expand Down
@@ -1,6 +1,7 @@
package mezz.jei.common.platform;

import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;
Expand All @@ -18,5 +19,5 @@ public interface IPlatformItemStackHelper {

Collection<CreativeModeTab> getCreativeTabs(ItemStack itemStack);

List<Component> getTestTooltip(ItemStack itemStack);
List<Component> getTestTooltip(@Nullable Player player, ItemStack itemStack);
}
28 changes: 28 additions & 0 deletions Core/src/main/java/mezz/jei/core/util/function/CachedFunction.java
@@ -0,0 +1,28 @@
package mezz.jei.core.util.function;

import org.jetbrains.annotations.Nullable;

import java.util.function.Function;

public class CachedFunction<T, R> implements Function<T, R> {
private final Function<T, R> function;
@Nullable
private T previousValue;
@Nullable
private R cachedResult;

public CachedFunction(Function<T, R> function) {
this.function = function;
}

@Override
public R apply(T currentValue) {
if (currentValue.equals(previousValue)) {
assert cachedResult != null;
return cachedResult;
}
cachedResult = function.apply(currentValue);
previousValue = currentValue;
return cachedResult;
}
}
@@ -1,31 +1,20 @@
package mezz.jei.core.util.function;

import org.jetbrains.annotations.Nullable;

import java.util.function.Function;
import java.util.function.Supplier;

public class CachedSupplierTransformer<T, R> implements Supplier<R> {
private final Supplier<T> supplier;
private final Function<T, R> transformer;
@Nullable
private T previousValue;
@Nullable
private R cachedResult;
private final CachedFunction<T, R> cachedFunction;

public CachedSupplierTransformer(Supplier<T> supplier, Function<T, R> transformer) {
public CachedSupplierTransformer(Supplier<T> supplier, Function<T, R> function) {
this.supplier = supplier;
this.transformer = transformer;
this.cachedFunction = new CachedFunction<>(function);
}

@Override
public R get() {
T currentValue = supplier.get();
if (cachedResult != null && currentValue.equals(previousValue)) {
return cachedResult;
}
cachedResult = transformer.apply(currentValue);
previousValue = currentValue;
return cachedResult;
return cachedFunction.apply(currentValue);
}
}
23 changes: 23 additions & 0 deletions Core/src/main/java/mezz/jei/core/util/function/LazySupplier.java
@@ -0,0 +1,23 @@
package mezz.jei.core.util.function;

import org.jetbrains.annotations.Nullable;

import java.util.function.Supplier;

public class LazySupplier<T> implements Supplier<T> {
private final Supplier<T> supplier;
@Nullable
private T cachedResult;

public LazySupplier(Supplier<T> supplier) {
this.supplier = supplier;
}

@Override
public T get() {
if (cachedResult == null) {
cachedResult = supplier.get();
}
return cachedResult;
}
}
@@ -1,9 +1,8 @@
package mezz.jei.fabric.platform;

import mezz.jei.common.platform.IPlatformItemStackHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
Expand Down Expand Up @@ -47,10 +46,8 @@ public Collection<CreativeModeTab> getCreativeTabs(ItemStack itemStack) {
}

@Override
public List<Component> getTestTooltip(ItemStack itemStack) {
public List<Component> getTestTooltip(@Nullable Player player, ItemStack itemStack) {
try {
Minecraft minecraft = Minecraft.getInstance();
LocalPlayer player = minecraft.player;
return itemStack.getTooltipLines(player, TooltipFlag.Default.NORMAL);
} catch (LinkageError | RuntimeException e) {
LOGGER.error("Error while Testing for mod name formatting", e);
Expand Down
39 changes: 21 additions & 18 deletions Fabric/src/main/java/mezz/jei/fabric/platform/PlatformHelper.java
Expand Up @@ -3,19 +3,22 @@
import mezz.jei.common.platform.IPlatformFluidHelperInternal;
import mezz.jei.common.platform.IPlatformHelper;
import mezz.jei.common.platform.IPlatformRegistry;
import mezz.jei.core.util.function.LazySupplier;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;

import java.util.function.Supplier;

public class PlatformHelper implements IPlatformHelper {
private final ItemStackHelper itemStackHelper = new ItemStackHelper();
private final FluidHelper fluidHelper = new FluidHelper();
private final RenderHelper renderHelper = new RenderHelper();
private final RecipeHelper recipeHelper = new RecipeHelper();
private final ConfigHelper configHelper = new ConfigHelper();
private final InputHelper inputHelper = new InputHelper();
private final ScreenHelper screenHelper = new ScreenHelper();
private final IngredientHelper ingredientHelper = new IngredientHelper();
private final ModHelper modHelper = new ModHelper();
private final Supplier<ItemStackHelper> itemStackHelper = new LazySupplier<>(ItemStackHelper::new);
private final Supplier<FluidHelper> fluidHelper = new LazySupplier<>(FluidHelper::new);
private final Supplier<RenderHelper> renderHelper = new LazySupplier<>(RenderHelper::new);
private final Supplier<RecipeHelper> recipeHelper = new LazySupplier<>(RecipeHelper::new);
private final Supplier<ConfigHelper> configHelper = new LazySupplier<>(ConfigHelper::new);
private final Supplier<InputHelper> inputHelper = new LazySupplier<>(InputHelper::new);
private final Supplier<ScreenHelper> screenHelper = new LazySupplier<>(ScreenHelper::new);
private final Supplier<IngredientHelper> ingredientHelper = new LazySupplier<>(IngredientHelper::new);
private final Supplier<ModHelper> modHelper = new LazySupplier<>(ModHelper::new);

@Override
public <T> IPlatformRegistry<T> getRegistry(ResourceKey<? extends Registry<T>> key) {
Expand All @@ -24,46 +27,46 @@ public <T> IPlatformRegistry<T> getRegistry(ResourceKey<? extends Registry<T>> k

@Override
public ItemStackHelper getItemStackHelper() {
return itemStackHelper;
return itemStackHelper.get();
}

@Override
public IPlatformFluidHelperInternal<?> getFluidHelper() {
return fluidHelper;
return fluidHelper.get();
}

@Override
public RenderHelper getRenderHelper() {
return renderHelper;
return renderHelper.get();
}

@Override
public RecipeHelper getRecipeHelper() {
return recipeHelper;
return recipeHelper.get();
}

@Override
public ConfigHelper getConfigHelper() {
return configHelper;
return configHelper.get();
}

@Override
public InputHelper getInputHelper() {
return inputHelper;
return inputHelper.get();
}

@Override
public ScreenHelper getScreenHelper() {
return screenHelper;
return screenHelper.get();
}

@Override
public IngredientHelper getIngredientHelper() {
return ingredientHelper;
return ingredientHelper.get();
}

@Override
public ModHelper getModHelper() {
return modHelper;
return modHelper.get();
}
}
Expand Up @@ -2,10 +2,9 @@

import mezz.jei.common.platform.IPlatformItemStackHelper;
import mezz.jei.common.util.ErrorUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
Expand Down Expand Up @@ -55,10 +54,8 @@ public Collection<CreativeModeTab> getCreativeTabs(ItemStack itemStack) {
}

@Override
public List<Component> getTestTooltip(ItemStack itemStack) {
public List<Component> getTestTooltip(@Nullable Player player, ItemStack itemStack) {
try {
Minecraft minecraft = Minecraft.getInstance();
LocalPlayer player = minecraft.player;
List<Component> tooltip = new ArrayList<>();
tooltip.add(new TextComponent("JEI Tooltip Testing for mod name formatting"));
ItemTooltipEvent tooltipEvent = ForgeEventFactory.onItemTooltip(itemStack, player, tooltip, TooltipFlag.Default.NORMAL);
Expand Down
39 changes: 21 additions & 18 deletions Forge/src/main/java/mezz/jei/forge/platform/PlatformHelper.java
Expand Up @@ -3,19 +3,22 @@
import mezz.jei.common.platform.IPlatformFluidHelperInternal;
import mezz.jei.common.platform.IPlatformHelper;
import mezz.jei.common.platform.IPlatformRegistry;
import mezz.jei.core.util.function.LazySupplier;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;

import java.util.function.Supplier;

public class PlatformHelper implements IPlatformHelper {
private final ItemStackHelper itemStackHelper = new ItemStackHelper();
private final FluidHelper fluidHelper = new FluidHelper();
private final RenderHelper renderHelper = new RenderHelper();
private final RecipeHelper recipeHelper = new RecipeHelper();
private final ConfigHelper configHelper = new ConfigHelper();
private final InputHelper inputHelper = new InputHelper();
private final ScreenHelper screenHelper = new ScreenHelper();
private final IngredientHelper ingredientHelper = new IngredientHelper();
private final ModHelper modHelper = new ModHelper();
private final Supplier<ItemStackHelper> itemStackHelper = new LazySupplier<>(ItemStackHelper::new);
private final Supplier<FluidHelper> fluidHelper = new LazySupplier<>(FluidHelper::new);
private final Supplier<RenderHelper> renderHelper = new LazySupplier<>(RenderHelper::new);
private final Supplier<RecipeHelper> recipeHelper = new LazySupplier<>(RecipeHelper::new);
private final Supplier<ConfigHelper> configHelper = new LazySupplier<>(ConfigHelper::new);
private final Supplier<InputHelper> inputHelper = new LazySupplier<>(InputHelper::new);
private final Supplier<ScreenHelper> screenHelper = new LazySupplier<>(ScreenHelper::new);
private final Supplier<IngredientHelper> ingredientHelper = new LazySupplier<>(IngredientHelper::new);
private final Supplier<ModHelper> modHelper = new LazySupplier<>(ModHelper::new);

@Override
public <T> IPlatformRegistry<T> getRegistry(ResourceKey<? extends Registry<T>> key) {
Expand All @@ -24,46 +27,46 @@ public <T> IPlatformRegistry<T> getRegistry(ResourceKey<? extends Registry<T>> k

@Override
public ItemStackHelper getItemStackHelper() {
return itemStackHelper;
return itemStackHelper.get();
}

@Override
public IPlatformFluidHelperInternal<?> getFluidHelper() {
return fluidHelper;
return fluidHelper.get();
}

@Override
public RenderHelper getRenderHelper() {
return renderHelper;
return renderHelper.get();
}

@Override
public RecipeHelper getRecipeHelper() {
return recipeHelper;
return recipeHelper.get();
}

@Override
public ConfigHelper getConfigHelper() {
return configHelper;
return configHelper.get();
}

@Override
public InputHelper getInputHelper() {
return inputHelper;
return inputHelper.get();
}

@Override
public ScreenHelper getScreenHelper() {
return screenHelper;
return screenHelper.get();
}

@Override
public IngredientHelper getIngredientHelper() {
return ingredientHelper;
return ingredientHelper.get();
}

@Override
public ModHelper getModHelper() {
return modHelper;
return modHelper.get();
}
}

0 comments on commit 0218099

Please sign in to comment.