Skip to content

Commit 87dbfb3

Browse files
committed
A lot of fixes and improvements
- Fixed rendering totems in Rendering Category - Fixed saving Rendering Category values for both hands - Optimized tag menu dolls - Reworked BlockBenchModelManager again - Other many fixes
1 parent 0320e72 commit 87dbfb3

File tree

13 files changed

+175
-107
lines changed

13 files changed

+175
-107
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ base.lombok_version = 1.18.42
2929

3030
# Multi-Versions Properties
3131
# Verified version: 1.20.1 1.21 1.21.1 1.21.2 1.21.3 1.21.4 1.21.5 1.21.6 1.21.7 1.21.8
32-
multi_versions = 1.21.9
32+
multi_versions = 1.21.4 1.21.9 1.21.10
3333

3434
# Build Dependencies
3535
build.yarn = [VERSIONED]

src/main/java/net/lopymine/mtd/config/rendering/RenderingConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class RenderingConfig {
1414

1515
public static final Codec<RenderingConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
1616
option("right_hand", HandRenderingConfig.getNewInstance(), HandRenderingConfig.CODEC, RenderingConfig::getRightHandConfig),
17-
option("left_hand", HandRenderingConfig.getNewInstance(), HandRenderingConfig.CODEC, RenderingConfig::getRightHandConfig)
17+
option("left_hand", HandRenderingConfig.getNewInstance(), HandRenderingConfig.CODEC, RenderingConfig::getLeftHandConfig)
1818
).apply(instance, RenderingConfig::new));
1919

2020
private HandRenderingConfig rightHandConfig;

src/main/java/net/lopymine/mtd/gui/widget/TotemDollModelPreviewWidget.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.lopymine.mtd.gui.widget;
22

33
import lombok.*;
4+
import net.lopymine.mtd.utils.DrawUtils;
45
import net.minecraft.client.MinecraftClient;
56
import net.minecraft.client.font.TextRenderer;
67
import net.minecraft.client.gui.*;
@@ -25,7 +26,7 @@ public class TotemDollModelPreviewWidget extends ClickableWidget {
2526
private final TotemDollData data;
2627

2728
private boolean loading;
28-
private boolean failedLoading;
29+
private int failedLoadingStatusCode = 0;
2930

3031
public TotemDollModelPreviewWidget(int x, int y, float size) {
3132
super(x, y, (int) size, (int) size, Text.of(""));
@@ -47,22 +48,24 @@ public TotemDollModelPreviewWidget(int x, int y, float size) {
4748
protected void renderLoadingText(DrawContext context) {
4849
int halfOfSize = (int) this.size / 2;
4950
TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
50-
context.drawCenteredTextWithShadow(textRenderer, this.getLoadingText(Util.getMeasuringTimeMs()), this.getX() + halfOfSize, this.getY() + halfOfSize - (textRenderer.fontHeight / 2), -1);
51+
//context.fill(this.getX(), this.getY(), this.getX() + 1, this.getY() + 1, -1);
52+
DrawUtils.drawCenteredText(context, this.getX(), this.getY() + halfOfSize - (textRenderer.fontHeight / 2), (int) this.size, this.getLoadingText(Util.getMeasuringTimeMs()));
5153
}
5254

5355
protected void renderPreview(DrawContext context) {
54-
TotemDollRenderer.renderPreview(context, this.getX(), this.getY(), (int) this.getSize(), (int) this.getSize(), this.getSize(), this.getData().refreshAndApplyRenderProperties());
56+
TotemDollRenderer.renderPreview(context, this.getX(), this.getY(), (int) this.getSize(), (int) this.getSize(), this.getSize() / 1.5F, this.getData().refreshAndApplyRenderProperties());
5557
}
5658

5759
public void updateModel(Identifier id) {
5860
this.loading = true;
61+
this.failedLoadingStatusCode = 0;
5962
BlockBenchModelManager.getModelAsyncAsResponse(id, (response) -> {
60-
if (!response.isEmpty()) {
61-
MModel value = response.value();
62-
this.loading = false;
63+
MModel value = response.value();
64+
if (value != null) {
6365
this.updateModel(value);
66+
this.loading = false;
6467
} else {
65-
this.failedLoading = true;
68+
this.failedLoadingStatusCode = response.statusCode();
6669
}
6770
});
6871
}
@@ -72,8 +75,12 @@ public void updateModel(MModel model) {
7275
}
7376

7477
private Text getLoadingText(long tick) {
75-
if (this.failedLoading) {
76-
return MyTotemDoll.text("text.loading.failed");
78+
if (this.failedLoadingStatusCode == 100) {
79+
return MyTotemDoll.text("text.loading.failed.to_load");
80+
} else if (this.failedLoadingStatusCode == 102){
81+
return MyTotemDoll.text("text.loading.failed.unsupported_format");
82+
} else if (this.failedLoadingStatusCode > 101 && this.failedLoadingStatusCode < 104){
83+
return MyTotemDoll.text("text.loading.failed.wrong_metadata");
7784
}
7885

7986
int i = (int) (tick / 300L % 4L);

src/main/java/net/lopymine/mtd/gui/widget/tag/CustomModelTagButtonWidget.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.lopymine.mtd.gui.widget.tag;
22

33
import lombok.*;
4+
import net.lopymine.mtd.doll.data.*;
5+
import net.lopymine.mtd.model.base.MModel;
46
import net.lopymine.mtd.utils.ScreenUtils;
57
import net.minecraft.client.MinecraftClient;
68
import net.minecraft.client.gui.DrawContext;
@@ -13,7 +15,6 @@
1315

1416
import net.lopymine.mtd.client.MyTotemDollClient;
1517
import net.lopymine.mtd.config.MyTotemDollConfig;
16-
import net.lopymine.mtd.doll.data.TotemDollData;
1718
import net.lopymine.mtd.doll.manager.StandardTotemDollManager;
1819
import net.lopymine.mtd.doll.renderer.TotemDollRenderer;
1920
import net.lopymine.mtd.gui.tooltip.preview.TotemDollPreviewTooltipData;
@@ -41,15 +42,17 @@ public CustomModelTagButtonWidget(Tag tag, int x, int y, TagPressAction pressAct
4142
}
4243

4344
public void updateData(TotemDollData data) {
44-
if (this.model == null || this.data == data || data == null) {
45+
if (data == null) {
4546
return;
4647
}
47-
this.data = data.copy();
48-
this.data.setStandardMModel(this.model);
48+
this.data.getRenderProperties().copyFrom(data.getRenderProperties());
4949
}
5050

5151
@Override
5252
public void /*? if >=1.21 {*/renderWidget/*?} else {*//*renderButton*//*?}*/(DrawContext context, int mouseX, int mouseY, float delta) {
53+
if (this.model != null) {
54+
this.data.setFrameMModel(this.model);
55+
}
5356
super./*? if >=1.21 {*/renderWidget/*?} else {*//*renderButton*//*?}*/(context, mouseX, mouseY, delta);
5457
if (!this.tooltipDataActive) {
5558
this.tooltipData = null;
@@ -60,7 +63,7 @@ public void updateData(TotemDollData data) {
6063
@Override
6164
protected void renderIcon(DrawContext context, int x, int y) {
6265
context.enableScissor(this.getX() + 1, this.getY() + 1, this.getX() + this.getWidth() - 1, this.getY() + this.getHeight() - 1);
63-
TotemDollRenderer.renderPreview(context, x, y, this.getWidth(), this.getHeight(), Math.min(this.getWidth(), this.getHeight()), this.getData().refreshAndApplyRenderProperties());
66+
TotemDollRenderer.renderPreview(context, x, y, this.getWidth(), this.getHeight(), Math.min(this.getWidth(), this.getHeight()), this.getData());
6467
context.disableScissor();
6568
}
6669

src/main/java/net/lopymine/mtd/mixin/AnvilScreenMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private void setupTagMenu(CallbackInfo ci) {
6868

6969
ItemStack stackOne = this.handler.getSlot(0).getStack();
7070
ItemStack stackTwo = this.handler.getSlot(2).getStack();
71-
boolean bl = MyTotemDollClient.canProcess(stackOne);
71+
boolean bl = MyTotemDollClient.canProcess(stackOne) && !stackOne.isEmpty();
7272

7373
//
7474

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,107 @@
11
package net.lopymine.mtd.mixin.yacl.category;
22

33
import com.llamalad7.mixinextras.injector.wrapoperation.*;
4+
import com.llamalad7.mixinextras.sugar.Share;
5+
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
46
import dev.isxander.yacl3.gui.YACLScreen;
57
import java.util.function.*;
8+
import net.lopymine.mtd.client.MyTotemDollClient;
69
import net.minecraft.client.MinecraftClient;
710
import net.minecraft.client.gui.screen.Screen;
811
import net.minecraft.client.network.*;
9-
import net.minecraft.client.render.VertexConsumerProvider;
1012
import net.minecraft.client.render.command.OrderedRenderCommandQueue;
1113
import net.minecraft.client.render.item.HeldItemRenderer;
12-
import net.minecraft.client.util.math.MatrixStack;
13-
1414

15-
import net.minecraft.entity.LivingEntity;
15+
import net.minecraft.client.render.item.HeldItemRenderer.HandRenderType;
16+
import net.minecraft.client.util.math.MatrixStack;
1617
import net.minecraft.item.*;
17-
import net.minecraft.util.*;
18+
import net.minecraft.util.Hand;
1819
import org.spongepowered.asm.mixin.*;
19-
import org.spongepowered.asm.mixin.injection.At;
2020
import net.lopymine.mtd.yacl.YACLConfigurationScreen;
2121
import net.lopymine.mtd.yacl.custom.category.rendering.RenderingCategoryTab;
2222

2323
//? if >=1.20.5 {
2424
import net.minecraft.component.DataComponentTypes;
25+
import org.spongepowered.asm.mixin.injection.*;
26+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2527
//?}
2628

2729
@Mixin(HeldItemRenderer.class)
2830
public class HeldItemRendererMixin {
2931

30-
//? if >=1.21.9 {
31-
@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderItem(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemDisplayContext;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;I)V"), method = "renderFirstPersonItem")
32-
private void renderDollPreview(HeldItemRenderer instance, LivingEntity livingEntity, ItemStack stack, ItemDisplayContext itemDisplayContext, MatrixStack matrixStack, OrderedRenderCommandQueue queue, int i, Operation<Void> original) {
33-
Consumer<ItemStack> draw = (item) -> original.call(instance, livingEntity, stack, itemDisplayContext, matrixStack, queue, i);
34-
renderDoll(stack, draw);
35-
}
36-
//?} else {
37-
/*@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderFirstPersonItem(Lnet/minecraft/client/network/AbstractClientPlayerEntity;FFLnet/minecraft/util/Hand;FLnet/minecraft/item/ItemStack;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V"), method = "renderItem(FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/network/ClientPlayerEntity;I)V")
38-
private void renderDollPreview(HeldItemRenderer instance, AbstractClientPlayerEntity player, float tickDelta, float pitch, Hand hand, float swingProgress, ItemStack item, float equipProgress, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, Operation<Void> original) {
39-
renderDoll(instance, player, tickDelta, pitch, hand, swingProgress, item, equipProgress, matrices, vertexConsumers, light, original);
40-
}
41-
*///?}
42-
43-
@Unique
44-
private static void renderDoll(ItemStack original, Consumer<ItemStack> draw) {
32+
@Inject(
33+
at = @At("HEAD"),
34+
method = "renderItem(FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/network/ClientPlayerEntity;I)V"
35+
)
36+
private void createBoolean(CallbackInfo ci, @Share("mtd_bl") LocalBooleanRef ref) {
4537
MinecraftClient client = MinecraftClient.getInstance();
4638
Screen currentScreen = client.currentScreen;
4739

40+
ref.set(false);
4841
if (YACLConfigurationScreen.notOpen(currentScreen)) {
49-
draw.accept(original);
5042
return;
5143
}
5244
if (!(currentScreen instanceof YACLScreen yaclScreen)) {
53-
draw.accept(original);
5445
return;
5546
}
5647
if (!(yaclScreen.tabManager.getCurrentTab() instanceof RenderingCategoryTab)) {
57-
draw.accept(original);
5848
return;
5949
}
50+
ClientPlayerEntity player = MinecraftClient.getInstance().player;
51+
if (player == null) {
52+
return;
53+
}
54+
ref.set(true);
55+
}
56+
57+
@WrapOperation(
58+
at = @At(
59+
value = "FIELD",
60+
target = "Lnet/minecraft/client/render/item/HeldItemRenderer$HandRenderType;renderMainHand:Z"
61+
),
62+
method = "renderItem(FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/network/ClientPlayerEntity;I)V"
63+
)
64+
private boolean swapRenderValue1(HandRenderType instance, Operation<Boolean> original, @Share("mtd_bl") LocalBooleanRef ref) {
65+
if (ref.get()) {
66+
return true;
67+
}
68+
return original.call(instance);
69+
}
6070

71+
@WrapOperation(
72+
at = @At(
73+
value = "FIELD",
74+
target = "Lnet/minecraft/client/render/item/HeldItemRenderer$HandRenderType;renderOffHand:Z"
75+
),
76+
method = "renderItem(FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/network/ClientPlayerEntity;I)V"
77+
)
78+
private boolean swapRenderValue2(HandRenderType instance, Operation<Boolean> original, @Share("mtd_bl") LocalBooleanRef ref) {
79+
if (ref.get()) {
80+
return true;
81+
}
82+
return original.call(instance);
83+
}
84+
85+
@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderFirstPersonItem(Lnet/minecraft/client/network/AbstractClientPlayerEntity;FFLnet/minecraft/util/Hand;FLnet/minecraft/item/ItemStack;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;I)V"), method = "renderItem(FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/network/ClientPlayerEntity;I)V")
86+
private void swapRenderingStack(HeldItemRenderer instance, AbstractClientPlayerEntity playerEntity, float a, float b, Hand hand, float c, ItemStack stack, float d, MatrixStack matrixStack, OrderedRenderCommandQueue queue, int i, Operation<Void> original, @Share("mtd_bl") LocalBooleanRef ref) {
87+
Consumer<ItemStack> consumer = (itemStack) -> original.call(instance, playerEntity, a, b, hand, c, itemStack, d, matrixStack, queue, i);
88+
if (ref.get()) {
89+
renderDoll(stack, consumer);
90+
} else {
91+
consumer.accept(stack);
92+
}
93+
}
94+
95+
@Unique
96+
private static void renderDoll(ItemStack original, Consumer<ItemStack> draw) {
6197
ClientPlayerEntity player = MinecraftClient.getInstance().player;
6298
if (player == null) {
6399
draw.accept(original);
64100
return;
65101
}
66-
67-
if (original.isEmpty() || !original.isOf(Items.TOTEM_OF_UNDYING)) {
102+
if (original.isEmpty() || !MyTotemDollClient.canProcess(original)) {
68103
ItemStack totem = Items.TOTEM_OF_UNDYING.getDefaultStack();
69104

70-
71105
//? if >=1.20.5 {
72106
totem.set(DataComponentTypes.CUSTOM_NAME, player.getName());
73107
//?} else {
@@ -77,7 +111,6 @@ private static void renderDoll(ItemStack original, Consumer<ItemStack> draw) {
77111
draw.accept(totem);
78112
return;
79113
}
80-
81114
draw.accept(original);
82115
}
83116
}

0 commit comments

Comments
 (0)