mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2025-02-16 17:44:23 +01:00
Fixed crash when toggling pony rendering of certain mob types
This commit is contained in:
parent
fcbc95e14e
commit
844bced2db
4 changed files with 29 additions and 21 deletions
|
@ -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<EntityType<?>, EntityRendererFactory<?>> getRendererFactories() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -60,13 +60,13 @@ public final class MobRenderers {
|
||||||
pony.switchRenderer(state, EntityType.STRIDER, ParaspriteRenderer::new);
|
pony.switchRenderer(state, EntityType.STRIDER, ParaspriteRenderer::new);
|
||||||
});
|
});
|
||||||
|
|
||||||
private final BiConsumer<Boolean, PonyRenderDispatcher> changer;
|
private final BiConsumer<MobRenderers, PonyRenderDispatcher> changer;
|
||||||
|
|
||||||
public final String name;
|
public final String name;
|
||||||
|
|
||||||
private boolean lastState;
|
private boolean lastState;
|
||||||
|
|
||||||
private MobRenderers(String name, BiConsumer<Boolean, PonyRenderDispatcher> changer) {
|
private MobRenderers(String name, BiConsumer<MobRenderers, PonyRenderDispatcher> changer) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.changer = changer;
|
this.changer = changer;
|
||||||
}
|
}
|
||||||
|
@ -85,16 +85,15 @@ public final class MobRenderers {
|
||||||
return option().get();
|
return option().get();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MobRenderers register(String name, BiConsumer<Boolean, PonyRenderDispatcher> changer) {
|
public static MobRenderers register(String name, BiConsumer<MobRenderers, PonyRenderDispatcher> changer) {
|
||||||
return REGISTRY.computeIfAbsent(name, n -> new MobRenderers(name, changer));
|
return REGISTRY.computeIfAbsent(name, n -> new MobRenderers(name, changer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void apply(PonyRenderDispatcher dispatcher) {
|
void apply(PonyRenderDispatcher dispatcher) {
|
||||||
boolean state = get();
|
boolean state = get();
|
||||||
if (state != lastState) {
|
if (state != lastState) {
|
||||||
MineLittlePony.logger.info(String.format("Ponify %s [%B] -> [%B]", name, lastState, state));
|
|
||||||
lastState = state;
|
lastState = state;
|
||||||
changer.accept(state, dispatcher);
|
changer.accept(this, dispatcher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,15 +1,13 @@
|
||||||
package com.minelittlepony.client.render;
|
package com.minelittlepony.client.render;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Function;
|
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.IPonyModel;
|
||||||
import com.minelittlepony.client.model.entity.race.PlayerModels;
|
import com.minelittlepony.client.model.entity.race.PlayerModels;
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import com.minelittlepony.common.mixin.MixinEntityRenderDispatcher;
|
|
||||||
import com.minelittlepony.mson.api.Mson;
|
import com.minelittlepony.mson.api.Mson;
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
@ -38,8 +36,6 @@ public class PonyRenderDispatcher {
|
||||||
|
|
||||||
private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer();
|
private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer();
|
||||||
|
|
||||||
private final Map<EntityType<?>, EntityRenderer<?>> renderMap = Maps.newHashMap();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers all new player skin types. (currently only pony and slimpony).
|
* Registers all new player skin types. (currently only pony and slimpony).
|
||||||
*/
|
*/
|
||||||
|
@ -71,18 +67,13 @@ public class PonyRenderDispatcher {
|
||||||
* @param factory The replacement value
|
* @param factory The replacement value
|
||||||
* @param <T> The entity type
|
* @param <T> The entity type
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
<T extends Entity, V extends T> void switchRenderer(MobRenderers state, EntityType<V> type, Function<EntityRendererFactory.Context, EntityRenderer<T>> factory) {
|
||||||
<T extends Entity, V extends T> void switchRenderer(boolean state, EntityType<V> type, Function<EntityRendererFactory.Context, EntityRenderer<T>> factory) {
|
Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, ctx -> {
|
||||||
if (state) {
|
if (!state.get()) {
|
||||||
if (!renderMap.containsKey(type)) {
|
return MixinEntityRenderers.getRendererFactories().get(type).create(ctx);
|
||||||
renderMap.put(type, ((MixinEntityRenderDispatcher)MinecraftClient.getInstance().getEntityRenderDispatcher()).getEntityRenderers().get(type));
|
|
||||||
}
|
}
|
||||||
Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, factory);
|
return factory.apply(ctx);
|
||||||
} else {
|
});
|
||||||
if (renderMap.containsKey(type)) {
|
|
||||||
Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, m -> (EntityRenderer<T>)renderMap.get(type));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public LevitatingItemRenderer getMagicRenderer() {
|
public LevitatingItemRenderer getMagicRenderer() {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
"MixinCamera",
|
"MixinCamera",
|
||||||
"MixinDefaultPlayerSkin",
|
"MixinDefaultPlayerSkin",
|
||||||
"MixinEntityRenderDispatcher",
|
"MixinEntityRenderDispatcher",
|
||||||
|
"MixinEntityRenderers",
|
||||||
"MixinSkullBlockEntityRenderer",
|
"MixinSkullBlockEntityRenderer",
|
||||||
"MixinFirstPersonRenderer",
|
"MixinFirstPersonRenderer",
|
||||||
"MixinItemRenderer",
|
"MixinItemRenderer",
|
||||||
|
|
Loading…
Reference in a new issue