From 844bced2db8ca187a4fb6e778d86404c7b12e233 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 9 Aug 2021 16:01:56 +0200 Subject: [PATCH] Fixed crash when toggling pony rendering of certain mob types --- .../client/mixin/MixinEntityRenderers.java | 17 ++++++++++++++ .../client/render/MobRenderers.java | 9 ++++---- .../client/render/PonyRenderDispatcher.java | 23 ++++++------------- src/main/resources/minelp.mixin.json | 1 + 4 files changed, 29 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/minelittlepony/client/mixin/MixinEntityRenderers.java diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinEntityRenderers.java b/src/main/java/com/minelittlepony/client/mixin/MixinEntityRenderers.java new file mode 100644 index 00000000..a6399125 --- /dev/null +++ b/src/main/java/com/minelittlepony/client/mixin/MixinEntityRenderers.java @@ -0,0 +1,17 @@ +package com.minelittlepony.client.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import java.util.Map; + +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.EntityRenderers; +import net.minecraft.entity.EntityType; + +@Mixin(EntityRenderers.class) +public interface MixinEntityRenderers { + @Accessor + public static Map, EntityRendererFactory> getRendererFactories() { + return null; + } +} diff --git a/src/main/java/com/minelittlepony/client/render/MobRenderers.java b/src/main/java/com/minelittlepony/client/render/MobRenderers.java index fb5a77cd..fcbcec6a 100644 --- a/src/main/java/com/minelittlepony/client/render/MobRenderers.java +++ b/src/main/java/com/minelittlepony/client/render/MobRenderers.java @@ -60,13 +60,13 @@ public final class MobRenderers { pony.switchRenderer(state, EntityType.STRIDER, ParaspriteRenderer::new); }); - private final BiConsumer changer; + private final BiConsumer changer; public final String name; private boolean lastState; - private MobRenderers(String name, BiConsumer changer) { + private MobRenderers(String name, BiConsumer changer) { this.name = name; this.changer = changer; } @@ -85,16 +85,15 @@ public final class MobRenderers { return option().get(); } - public static MobRenderers register(String name, BiConsumer changer) { + public static MobRenderers register(String name, BiConsumer changer) { return REGISTRY.computeIfAbsent(name, n -> new MobRenderers(name, changer)); } void apply(PonyRenderDispatcher dispatcher) { boolean state = get(); if (state != lastState) { - MineLittlePony.logger.info(String.format("Ponify %s [%B] -> [%B]", name, lastState, state)); lastState = state; - changer.accept(state, dispatcher); + changer.accept(this, dispatcher); } } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java b/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java index 878dee15..e80d8839 100644 --- a/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java +++ b/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java @@ -1,15 +1,13 @@ package com.minelittlepony.client.render; -import java.util.Map; import java.util.function.Function; -import com.google.common.collect.Maps; +import com.minelittlepony.client.mixin.MixinEntityRenderers; import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.entity.race.PlayerModels; import org.jetbrains.annotations.Nullable; -import com.minelittlepony.common.mixin.MixinEntityRenderDispatcher; import com.minelittlepony.mson.api.Mson; import net.minecraft.client.MinecraftClient; @@ -38,8 +36,6 @@ public class PonyRenderDispatcher { private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer(); - private final Map, EntityRenderer> renderMap = Maps.newHashMap(); - /** * Registers all new player skin types. (currently only pony and slimpony). */ @@ -71,18 +67,13 @@ public class PonyRenderDispatcher { * @param factory The replacement value * @param The entity type */ - @SuppressWarnings("unchecked") - void switchRenderer(boolean state, EntityType type, Function> factory) { - if (state) { - if (!renderMap.containsKey(type)) { - renderMap.put(type, ((MixinEntityRenderDispatcher)MinecraftClient.getInstance().getEntityRenderDispatcher()).getEntityRenderers().get(type)); + void switchRenderer(MobRenderers state, EntityType type, Function> factory) { + Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, ctx -> { + if (!state.get()) { + return MixinEntityRenderers.getRendererFactories().get(type).create(ctx); } - Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, factory); - } else { - if (renderMap.containsKey(type)) { - Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, m -> (EntityRenderer)renderMap.get(type)); - } - } + return factory.apply(ctx); + }); } public LevitatingItemRenderer getMagicRenderer() { diff --git a/src/main/resources/minelp.mixin.json b/src/main/resources/minelp.mixin.json index fadfeb16..aefe9d16 100644 --- a/src/main/resources/minelp.mixin.json +++ b/src/main/resources/minelp.mixin.json @@ -9,6 +9,7 @@ "MixinCamera", "MixinDefaultPlayerSkin", "MixinEntityRenderDispatcher", + "MixinEntityRenderers", "MixinSkullBlockEntityRenderer", "MixinFirstPersonRenderer", "MixinItemRenderer",