Skip to content

Commit 2d13dd7

Browse files
Version 1.3.8.3
1 parent a066d52 commit 2d13dd7

File tree

22 files changed

+570
-111
lines changed

22 files changed

+570
-111
lines changed

build.gradle.kts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,11 @@ dependencies {
8787
}
8888
if (platform.mcVersion >= 12105 && (platform.isFabric || platform.isNeoForge)) {
8989
repositories.modrinth()
90-
modCompileOnly("maven.modrinth:iris:1.8.11+1.21.5-${platform.loaderStr}")
90+
if (platform.mcVersion >= 12106) {
91+
modCompileOnly("maven.modrinth:iris:1.9.0+1.21.6-${platform.loaderStr}")
92+
} else {
93+
modCompileOnly("maven.modrinth:iris:1.8.11+1.21.5-${platform.loaderStr}")
94+
}
9195
}
9296

9397
testImplementation(kotlin("test"))

changelog/release-1.3.8.3.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
Title: Bug Patch
2+
Summary: Minor bug fixes
3+
4+
## Cosmetics & Emotes
5+
- Improved transitions when starting and cancelling emotes
6+
7+
## Bug Fixes
8+
- Fixed error in chat when closing the emote wheel in Fabric 1.21.6
9+
10+
## Compatibility
11+
- Fixed Essential not appearing on the title screen with FancyMenu installed on Minecraft 1.20.6 & 1.21
12+
- Fixed a crash with the Iris mod in 1.21.6

elementa/build.gradle.kts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ tasks.create<SyncToExternalRepoTask>("syncCommitsToElementa") {
2525
replacements.set(listOf(
2626
"elementa/statev2" to "unstable/statev2",
2727
"elementa/layoutdsl" to "unstable/layoutdsl",
28-
"gg/essential/gui/elementa" to "gg/essential/elementa",
29-
"gg.essential.gui.elementa" to "gg.essential.elementa",
30-
"gg/essential/gui" to "gg/essential/elementa",
31-
"gg.essential.gui" to "gg.essential.elementa",
28+
"gg/essential/gui/elementa" to "gg/essential/elementa/unstable",
29+
"gg.essential.gui.elementa" to "gg.essential.elementa.unstable",
30+
"gg/essential/gui" to "gg/essential/elementa/unstable",
31+
"gg.essential.gui" to "gg.essential.elementa.unstable",
3232
// remove accessed via reflection annotation
3333
" @AccessedViaReflection(\"DelegatingStateBase\")" to "",
3434
"import gg.essential.config.AccessedViaReflection" to ""

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ minecraftVersion=11202
1010
# TODO remove once upgrading to Loom 1.10
1111
# fabric-api 1.21.5 was built with Loom 1.10, seems to work well enough in dev with our current 1.7 though
1212
loom.ignoreDependencyLoomVersionValidation=true
13-
version=1.3.8.2
13+
version=1.3.8.3

src/main/java/gg/essential/cosmetics/PlayerWearableManager.java

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ private void updateCosmetics(AbstractClientPlayer player) {
9292
// FIXME should use State effect instead of checking every tick
9393
Map<CosmeticSlot, EquippedCosmetic> newCosmetics = cosmeticsSource.getUntracked();
9494
Map<CosmeticSlot, EquippedCosmetic> oldCosmetics = oldState.getCosmetics();
95-
Set<EnumPart> newArmour = getArmourFromPlayer(player);
96-
Set<EnumPart> oldArmour = oldState.getArmor();
95+
ArmorSlots newArmour = getArmourFromPlayer(player);
96+
ArmorSlots oldArmour = oldState.getArmor();
9797

9898
if (Objects.equals(newCosmetics, oldCosmetics) && Objects.equals(newSkinType, oldSkinType) && Objects.equals(oldArmour, newArmour)) {
9999
return;
@@ -186,29 +186,18 @@ private void updateCosmetics(AbstractClientPlayer player) {
186186
}
187187
}
188188

189-
private Set<EnumPart> getArmourFromPlayer(AbstractClientPlayer player) {
190-
191-
Set<EnumPart> equippedSlots = new HashSet<>();
192-
189+
private ArmorSlots getArmourFromPlayer(AbstractClientPlayer player) {
193190
int armorSetting = ArmorRenderingUtil.getCosmeticArmorSetting(player);
194191
if (armorSetting > 0) {
195-
return equippedSlots;
192+
return new ArmorSlots((byte) 0);
196193
}
197194

198-
if (!canRenderCosmetic(player, 0) || !canRenderCosmetic(player, 1)) {
199-
equippedSlots.add(EnumPart.LEFT_LEG);
200-
equippedSlots.add(EnumPart.RIGHT_LEG);
201-
}
202-
if (!canRenderCosmetic(player, 2)) {
203-
equippedSlots.add(EnumPart.LEFT_ARM);
204-
equippedSlots.add(EnumPart.RIGHT_ARM);
205-
equippedSlots.add(EnumPart.BODY);
206-
}
207-
if (!canRenderCosmetic(player, 3)) {
208-
equippedSlots.add(EnumPart.HEAD);
209-
}
210-
211-
return equippedSlots;
195+
return new ArmorSlots(
196+
!canRenderCosmetic(player, 0),
197+
!canRenderCosmetic(player, 1),
198+
!canRenderCosmetic(player, 2),
199+
!canRenderCosmetic(player, 3)
200+
);
212201
}
213202

214203
private boolean canRenderCosmetic(AbstractClientPlayer player, int slot) {

src/main/java/gg/essential/mixins/Plugin.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.util.ArrayList;
3939
import java.util.List;
4040
import java.util.Set;
41+
import java.util.function.Predicate;
4142

4243
//#if FABRIC
4344
//$$ import java.lang.management.ManagementFactory;
@@ -175,6 +176,26 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
175176
}
176177
}
177178

179+
//#if MC>=12006 && MC<12102
180+
//$$ // mixin is already dummy targeted outside this range
181+
//$$ if (mixinClassName.endsWith("Mixin_FancyMainMenu_3_2_1_GuiDrawScreenEvent")) {
182+
//$$ // underlying issue was fixed in FancyMenu v3.4.0, but we still need to apply this mixin for 1.20.6 and 1.21, as they do not have v3.4.0+
183+
//$$ // this is a check just in case v3.4.0 ever gets backported to 1.20.6 or 1.21, so we don't apply this mixin in that case.
184+
//$$ // there were no classes removed in 3.4.0 that could be used to detect the affected version so lets check the mixin directly
185+
//$$ return testClass("de.keksuccino.fancymenu.mixin.mixins.common.client.MixinTitleScreen",
186+
//$$ clazz -> {
187+
//$$ for (MethodNode method : clazz.methods) {
188+
//$$ if (method.name.equals("wrap_super_render_in_render_FancyMenu")) {
189+
//$$ // this is the mixin that cancels the super.render call in TitleScreen, which is the cause of the issue
190+
//$$ return true;
191+
//$$ }
192+
//$$ }
193+
//$$ return false;
194+
//$$ }
195+
//$$ );
196+
//$$ }
197+
//#endif
198+
178199
// Due to changes in FancyMenu, we need a different Mixin for v2.14.10 and above. This version can be identified
179200
// by the ScreenBackgroundRenderedEvent class.
180201
if (mixinClassName.endsWith("Mixin_FancyMainMenu_GuiDrawScreenEvent_Pre") && hasClass("de.keksuccino.fancymenu.events.ScreenBackgroundRenderedEvent")) {
@@ -274,13 +295,17 @@ private static void registerGlobalTransformers(List<MixinTransformerWrapper.Tran
274295
}
275296

276297
static boolean hasClass(String name) {
298+
return testClass(name, cls -> true);
299+
}
300+
301+
static boolean testClass(String className, Predicate<ClassNode> test) {
277302
try {
278-
MixinService.getService().getBytecodeProvider().getClassNode(name);
279-
return true;
303+
ClassNode classNode = MixinService.getService().getBytecodeProvider().getClassNode(className);
304+
return test.test(classNode);
280305
} catch (ClassNotFoundException e) {
281306
return false;
282307
} catch (Exception e) {
283-
e.printStackTrace();
308+
logger.error("Exception when testing class {}: ", className, e);
284309
return false;
285310
}
286311
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright (c) 2024 ModCore Inc. All rights reserved.
3+
*
4+
* This code is part of ModCore Inc.'s Essential Mod repository and is protected
5+
* under copyright registration # TX0009138511. For the full license, see:
6+
* https://github.com/EssentialGG/Essential/blob/main/LICENSE
7+
*
8+
* You may not use, copy, reproduce, modify, sell, license, distribute,
9+
* commercialize, or otherwise exploit, or create derivative works based
10+
* upon, this file or any other in this repository, all of which is reserved by Essential.
11+
*/
12+
package gg.essential.mixins.transformers.compatibility.fancymenu;
13+
14+
import gg.essential.mixins.DummyTarget;
15+
import org.spongepowered.asm.mixin.Mixin;
16+
17+
// 1.20.6 to 1.21 bug fix for fancy menu issue that was fixed on their end in their 1.21.1+ versions only
18+
@Mixin(DummyTarget.class)
19+
public class Mixin_FancyMainMenu_3_2_1_GuiDrawScreenEvent {
20+
}

src/main/kotlin/gg/essential/gui/emotes/EmoteWheel.kt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ class EmoteWheel : WindowScreen(
126126
}
127127
}.toListState()
128128

129+
private var equipping = false
130+
129131
init {
130132
// Allow the player to move while the emote wheel is open
131133
//#if MC>=12000
@@ -173,20 +175,6 @@ class EmoteWheel : WindowScreen(
173175
}.apply { shouldIgnore = { it.isPassThrough() } }
174176
}
175177

176-
var equipping = false
177-
// Check for keybind release to equip the emote and close the wheel
178-
window.addUpdateFunc { _, _ ->
179-
if (!equipping && !keybind.keyBinding.isKeyDown) {
180-
window.focusedComponent?.let { focused ->
181-
if (focused is EmoteWheelEntry && canEmote(UPlayer.getPlayer()!!)) {
182-
focused.emoteModel?.getUntracked()?.let { equipEmote(it) }
183-
}
184-
}
185-
displayScreen(null)
186-
equipping = true
187-
}
188-
}
189-
190178
window.onKeyType { _, keyCode ->
191179
if (MinecraftUtils.isDevelopment() || System.getProperty("elementa.debug", "false") == "true") {
192180
if (keyCode == UKeyboard.KEY_F3) {
@@ -206,6 +194,20 @@ class EmoteWheel : WindowScreen(
206194
}
207195
}
208196

197+
override fun onTick() {
198+
super.onTick()
199+
// Check for keybind release to equip the emote and close the wheel
200+
if (!equipping && !keybind.keyBinding.isKeyDown) {
201+
window.focusedComponent?.let { focused ->
202+
if (focused is EmoteWheelEntry && canEmote(UPlayer.getPlayer()!!)) {
203+
focused.emoteModel?.getUntracked()?.let { equipEmote(it) }
204+
}
205+
}
206+
displayScreen(null)
207+
equipping = true
208+
}
209+
}
210+
209211
// Adapted from OverlayManagerImpl#isPassThrough
210212
private fun UIComponent.isPassThrough(): Boolean {
211213
return when (this) {

src/main/kotlin/gg/essential/model/backend/minecraft/MinecraftRenderBackend.kt

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,17 @@ object MinecraftRenderBackend : RenderBackend {
242242
//$$ ) {
243243
//$$ override fun draw(buffer: BuiltBuffer) = drawImpl(getPipeline(), buffer)
244244
//#if MC>=12106
245+
//$$ // re: https://github.com/IrisShaders/Iris/blob/052faeb4c4382cc4d186ced14ec7a160615801e3/common/src/main/java/net/irisshaders/iris/mixin/MixinRenderType2.java#L14
246+
//$$ // iris applies an interface to [RenderLayer] (linked above), but this "super impl" only
247+
//$$ // throws errors, its true functionality is in [RenderLayer.MultiPhase], and we need to implement
248+
//$$ // it as well ourselves for these wrapper classes, or redirect to inner where required
249+
//$$ fun `iris$getRenderTarget`(): Framebuffer? {
250+
//$$ return inner.javaClass.getMethod("iris\$getRenderTarget").invoke(inner) as Framebuffer?
251+
//$$ }
252+
//$$ fun `iris$getPipeline`(): RenderPipeline? {
253+
//$$ return getPipeline()
254+
//$$ }
255+
//$$
245256
//$$ private fun getPipeline(): RenderPipeline =
246257
//#else
247258
//$$ override fun getTarget(): Framebuffer = inner.target
@@ -303,7 +314,15 @@ object MinecraftRenderBackend : RenderBackend {
303314
//$$ { inner.endDrawing() },
304315
//$$ ) {
305316
//$$ override fun draw(buffer: BuiltBuffer) = drawImpl(entityTranslucentCullPipeline, buffer)
306-
//#if MC<12106
317+
//#if MC>=12106
318+
//$$ // see [ParticleLayer] above
319+
//$$ fun `iris$getRenderTarget`(): Framebuffer? {
320+
//$$ return inner.javaClass.getMethod("iris\$getRenderTarget").invoke(inner) as Framebuffer?
321+
//$$ }
322+
//$$ fun `iris$getPipeline`(): RenderPipeline? {
323+
//$$ return entityTranslucentCullPipeline
324+
//$$ }
325+
//#else
307326
//$$ override fun getTarget(): Framebuffer = inner.target
308327
//$$ override fun getPipeline(): RenderPipeline = entityTranslucentCullPipeline
309328
//#endif
@@ -411,7 +430,15 @@ object MinecraftRenderBackend : RenderBackend {
411430
//$$ inner.draw(buffer)
412431
//$$ VIEW_OFFSET_Z_LAYERING.endDrawing()
413432
//$$ }
414-
//#if MC<12106
433+
//#if MC>=12106
434+
//$$ // see [ParticleLayer] above
435+
//$$ fun `iris$getRenderTarget`(): Framebuffer? {
436+
//$$ return inner.javaClass.getMethod("iris\$getRenderTarget").invoke(inner) as Framebuffer?
437+
//$$ }
438+
//$$ fun `iris$getPipeline`(): RenderPipeline? {
439+
//$$ return inner.javaClass.getMethod("iris\$getPipeline").invoke(inner) as RenderPipeline?
440+
//$$ }
441+
//#else
415442
//$$ override fun getTarget(): Framebuffer = inner.target
416443
//$$ override fun getPipeline(): RenderPipeline = inner.pipeline
417444
//#endif
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0a59fb020d
1+
194bf65221

0 commit comments

Comments
 (0)