MineLittlePony/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java

102 lines
3.5 KiB
Java
Raw Normal View History

2019-11-30 12:12:46 +01:00
package com.minelittlepony.client.render;
import java.util.function.Function;
import com.minelittlepony.api.pony.meta.Race;
import com.minelittlepony.client.mixin.MixinEntityRenderers;
import com.minelittlepony.client.model.IPonyModel;
import com.minelittlepony.client.model.ModelType;
2021-06-10 19:32:21 +02:00
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.mson.api.Mson;
2019-11-23 18:28:42 +01:00
2019-05-27 17:59:15 +02:00
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
2020-11-26 14:41:15 +01:00
import net.minecraft.client.render.entity.EntityRendererFactory;
2019-05-27 17:59:15 +02:00
import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.entity.Entity;
2019-11-23 18:28:42 +01:00
import net.minecraft.entity.EntityType;
2019-05-27 17:59:15 +02:00
import net.minecraft.entity.LivingEntity;
/**
* Render manager responsible for replacing and restoring entity renderers when the client settings change.
2018-06-03 22:18:42 +02:00
* Old values are persisted internally.
*/
2019-11-30 12:12:46 +01:00
public class PonyRenderDispatcher {
2019-11-30 12:12:46 +01:00
private static final PonyRenderDispatcher INSTANCE = new PonyRenderDispatcher();
2019-03-23 19:17:46 +01:00
/**
* Gets the static pony render manager responsible for all entity renderers.
*/
2019-11-30 12:12:46 +01:00
public static PonyRenderDispatcher getInstance() {
return INSTANCE;
2019-03-23 19:17:46 +01:00
}
private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer();
/**
* Registers all new player skin types. (currently only pony and slimpony).
*/
2019-11-30 12:12:46 +01:00
public void initialise(EntityRenderDispatcher manager) {
Race.REGISTRY.forEach(r -> {
if (!r.isHuman()) {
registerPlayerSkin(manager, r);
}
});
2019-11-30 12:12:46 +01:00
MobRenderers.REGISTRY.values().forEach(i -> i.apply(this));
}
private void registerPlayerSkin(EntityRenderDispatcher manager, Race race) {
addPlayerSkin(manager, false, race);
addPlayerSkin(manager, true, race);
}
private void addPlayerSkin(EntityRenderDispatcher manager, boolean slimArms, Race race) {
2019-11-27 12:42:19 +01:00
Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer(
race.getModelId(slimArms),
ModelType.getPlayerModel(race).getRendererFactory(slimArms)
2019-11-27 12:42:19 +01:00
);
}
/**
*
* Replaces an entity renderer depending on whether we want ponies or not.
*
* @param state True if we want ponies (the original will be stored)
* @param type The type to replace
* @param factory The replacement value
* @param <T> The entity type
*/
<T extends Entity, V extends T> void switchRenderer(MobRenderers state, EntityType<V> type, Function<EntityRendererFactory.Context, EntityRenderer<T>> factory) {
Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, ctx -> {
if (!state.get()) {
return MixinEntityRenderers.getRendererFactories().get(type).create(ctx);
}
return factory.apply(ctx);
});
}
public LevitatingItemRenderer getMagicRenderer() {
return magicRenderer;
}
@SuppressWarnings("unchecked")
@Nullable
2019-11-29 16:26:19 +01:00
public <T extends LivingEntity, M extends EntityModel<T> & IPonyModel<T>> IPonyRenderContext<T, M> getPonyRenderer(@Nullable T entity) {
if (entity == null) {
return null;
}
2020-08-16 23:48:26 +02:00
EntityRenderer<?> renderer = MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(entity);
2019-11-29 16:26:19 +01:00
if (renderer instanceof IPonyRenderContext) {
return (IPonyRenderContext<T, M>) renderer;
}
return null;
}
}