diff options
| author | shedaniel <daniel@shedaniel.me> | 2023-06-08 14:54:28 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2023-06-08 14:54:28 +0800 |
| commit | a5c727c6f21d8c6dcedd51b0f66f209027580375 (patch) | |
| tree | 8ad839e55cfc2209c71a8c70492609092c63610e /forge/src/main/java | |
| parent | e0031d020f0a1d76cd971b45dffa8b6864b2c5d8 (diff) | |
| download | RoughlyEnoughItems-a5c727c6f21d8c6dcedd51b0f66f209027580375.tar.gz RoughlyEnoughItems-a5c727c6f21d8c6dcedd51b0f66f209027580375.tar.bz2 RoughlyEnoughItems-a5c727c6f21d8c6dcedd51b0f66f209027580375.zip | |
Update to 1.20 and support Forge
Diffstat (limited to 'forge/src/main/java')
4 files changed, 88 insertions, 10 deletions
diff --git a/forge/src/main/java/me/shedaniel/rei/impl/client/CodepointMapWrapper.java b/forge/src/main/java/me/shedaniel/rei/impl/client/CodepointMapWrapper.java new file mode 100644 index 000000000..2362d48da --- /dev/null +++ b/forge/src/main/java/me/shedaniel/rei/impl/client/CodepointMapWrapper.java @@ -0,0 +1,69 @@ +package me.shedaniel.rei.impl.client; + +import it.unimi.dsi.fastutil.ints.IntSet; +import net.minecraft.client.gui.font.CodepointMap; +import org.jetbrains.annotations.Nullable; + +import java.util.function.IntFunction; + +public class CodepointMapWrapper<T> extends CodepointMap<T> { + private final CodepointMap<T> delegate; + protected transient IntSet keys; + + public CodepointMapWrapper(CodepointMap<T> delegate) { + super(delegate.blockConstructor, i -> delegate.blockMap); + this.empty = delegate.empty; + this.blockMap = delegate.blockMap; + this.delegate = delegate; + } + + @Override + public void clear() { + synchronized (this) { + delegate.clear(); + } + } + + @Nullable + @Override + public T put(int i, T object) { + synchronized (this) { + return delegate.put(i, object); + } + } + + @Nullable + @Override + public T get(int i) { + synchronized (this) { + return delegate.get(i); + } + } + + @Override + public T computeIfAbsent(int i, IntFunction<T> intFunction) { + synchronized (this) { + return delegate.computeIfAbsent(i, intFunction); + } + } + + @Nullable + @Override + public T remove(int i) { + synchronized (this) { + return delegate.remove(i); + } + } + + @Override + public void forEach(Output<T> arg) { + synchronized (this) { + delegate.forEach(arg); + } + } + + @Override + public IntSet keySet() { + return delegate.keySet(); + } +} diff --git a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplForge.java b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplForge.java index e6f299510..e8937ca26 100644 --- a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplForge.java +++ b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplForge.java @@ -23,12 +23,14 @@ package me.shedaniel.rei.impl.client.gui.forge; -import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.gui.screens.inventory.tooltip.DefaultTooltipPositioner; @@ -39,6 +41,7 @@ import net.minecraftforge.client.ForgeHooksClient; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class ScreenOverlayImplForge extends ScreenOverlayImpl { @Override @@ -47,7 +50,7 @@ public class ScreenOverlayImplForge extends ScreenOverlayImpl { EntryStack<?> stack = tooltip.getContextStack(); ItemStack itemStack = stack.getType() == VanillaEntryTypes.ITEM ? stack.castValue() : ItemStack.EMPTY; List<Component> texts = CollectionUtils.filterAndMap(tooltip.entries(), Tooltip.Entry::isText, Tooltip.Entry::getAsText); - List<ClientTooltipComponent> components = ForgeHooksClient.gatherTooltipComponents(itemStack, texts, mouseX, screen.width, screen.height, null, screen.getMinecraft().font); + List<ClientTooltipComponent> components = ForgeHooksClient.gatherTooltipComponents(itemStack, texts, Optional.empty(), mouseX, screen.width, screen.height, screen.getMinecraft().font); components = new ArrayList<>(components); for (Tooltip.Entry entry : tooltip.entries()) { if (!entry.isText()) { @@ -61,9 +64,13 @@ public class ScreenOverlayImplForge extends ScreenOverlayImpl { components.add(1, ClientTooltipComponent.create(component)); } } - screen.tooltipStack = itemStack; - screen.renderTooltipInternal(matrices, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE); - screen.tooltipStack = ItemStack.EMPTY; + Font font = Minecraft.getInstance().font; + if (!itemStack.isEmpty()) { + font = ForgeHooksClient.getTooltipFont(itemStack, font); + } + graphics.tooltipStack = itemStack; + graphics.renderTooltipInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE); + graphics.tooltipStack = ItemStack.EMPTY; graphics.pose().popPose(); } } diff --git a/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinEffectRenderingInventoryScreen.java b/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinEffectRenderingInventoryScreen.java index b3f1b9d58..db426f893 100644 --- a/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinEffectRenderingInventoryScreen.java +++ b/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinEffectRenderingInventoryScreen.java @@ -56,7 +56,7 @@ public abstract class MixinEffectRenderingInventoryScreen extends AbstractContai @ModifyVariable(method = "renderEffects", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/gui/screens/inventory/EffectRenderingInventoryScreen;renderBackgrounds(Lcom/mojang/blaze3d/vertex/PoseStack;IILjava/lang/Iterable;Z)V", + target = "Lnet/minecraft/client/gui/screens/inventory/EffectRenderingInventoryScreen;renderBackgrounds(Lnet/minecraft/client/gui/GuiGraphics;IILjava/lang/Iterable;Z)V", ordinal = 0), ordinal = 0) // 1st bool public boolean modifyBl(boolean bl) { diff --git a/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinFontSet.java b/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinFontSet.java index 9dee7c9fb..4d0adc4fd 100644 --- a/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinFontSet.java +++ b/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinFontSet.java @@ -27,6 +27,8 @@ import com.mojang.blaze3d.font.GlyphInfo; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.rei.impl.client.CodepointMapWrapper; +import net.minecraft.client.gui.font.CodepointMap; import net.minecraft.client.gui.font.FontSet; import net.minecraft.client.gui.font.FontTexture; import net.minecraft.client.gui.font.glyphs.BakedGlyph; @@ -45,15 +47,15 @@ import java.util.List; @Mixin(FontSet.class) public class MixinFontSet { - @Shadow @Mutable @Final private Int2ObjectMap<BakedGlyph> glyphs; - @Shadow @Mutable @Final private Int2ObjectMap<GlyphInfo> glyphInfos; + @Shadow @Mutable @Final private CodepointMap<BakedGlyph> glyphs; + @Shadow @Mutable @Final private CodepointMap<?> glyphInfos; @Shadow @Mutable @Final private Int2ObjectMap<IntList> glyphsByWidth; @Shadow @Mutable @Final private List<FontTexture> textures; @Inject(method = "<init>", at = @At("RETURN")) private void init(TextureManager textureManager, ResourceLocation id, CallbackInfo ci) { - this.glyphs = Int2ObjectMaps.synchronize(this.glyphs); - this.glyphInfos = Int2ObjectMaps.synchronize(this.glyphInfos); + this.glyphs = new CodepointMapWrapper<>(this.glyphs); + this.glyphInfos = new CodepointMapWrapper<>(this.glyphInfos); this.glyphsByWidth = Int2ObjectMaps.synchronize(this.glyphsByWidth); this.textures = Collections.synchronizedList(this.textures); } |
