MineLittlePony/src/main/java/com/minelittlepony/client/PonyRenderManager.java

115 lines
4.2 KiB
Java
Raw Normal View History

2019-03-23 20:49:34 +01:00
package com.minelittlepony.client;
import java.util.Map;
import com.google.common.collect.Maps;
import com.minelittlepony.client.model.IPonyModel;
2019-03-23 20:49:34 +01:00
import com.minelittlepony.client.model.races.PlayerModels;
import com.minelittlepony.client.render.LevitatingItemRenderer;
2019-05-27 17:59:15 +02:00
import com.minelittlepony.client.render.IPonyRender;
2019-03-23 20:49:34 +01:00
import com.minelittlepony.client.render.entities.MobRenderers;
import com.minelittlepony.client.render.entities.player.RenderPonyPlayer;
import javax.annotation.Nullable;
2019-07-03 01:57:45 +02:00
import com.minelittlepony.common.mixin.MixinEntityRenderDispatcher;
2019-11-23 18:28:42 +01:00
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
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;
2019-07-03 01:57:45 +02:00
import net.minecraft.client.render.entity.PlayerEntityRenderer;
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.
*/
public class PonyRenderManager {
2019-03-23 19:17:46 +01:00
private static final PonyRenderManager renderManager = new PonyRenderManager();
/**
* Gets the static pony render manager responsible for all entity renderers.
*/
public static PonyRenderManager getInstance() {
return renderManager;
}
private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer();
2019-05-27 17:59:15 +02:00
private final Map<Class<? extends Entity>, EntityRenderer<?>> renderMap = Maps.newHashMap();
/**
* Registers all new player skin types. (currently only pony and slimpony).
*/
2019-05-27 17:59:15 +02:00
public void initialiseRenderers(EntityRenderDispatcher manager) {
PlayerModels.registry.forEach(i -> registerPlayerSkin(manager, i));
2019-05-27 17:59:15 +02:00
MobRenderers.registry.forEach(i -> i.apply(this));
}
2019-05-27 17:59:15 +02:00
private void registerPlayerSkin(EntityRenderDispatcher manager, PlayerModels playerModel) {
2019-07-16 13:38:46 +02:00
if (playerModel != PlayerModels.DEFAULT) {
addPlayerSkin(manager, false, playerModel);
addPlayerSkin(manager, true, playerModel);
}
}
2019-05-27 17:59:15 +02:00
private void addPlayerSkin(EntityRenderDispatcher manager, boolean slimArms, PlayerModels playerModel) {
RenderPonyPlayer renderer = playerModel.createRenderer(manager, slimArms);
2019-07-03 01:57:45 +02:00
addPlayerRenderer(playerModel.getId(slimArms), renderer);
}
private static void addPlayerRenderer(String modelType, PlayerEntityRenderer renderer) {
EntityRenderDispatcher mx = MinecraftClient.getInstance().getEntityRenderManager();
((MixinEntityRenderDispatcher)mx).getPlayerRenderers().put(modelType, renderer);
}
/**
*
* 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
*/
2019-11-23 18:28:42 +01:00
public <T extends Entity, V extends T> void switchRenderer(boolean state, EntityType<V> type, EntityRendererRegistry.Factory factory) {
if (state) {
if (!renderMap.containsKey(type)) {
2019-05-27 17:59:15 +02:00
renderMap.put(type, MinecraftClient.getInstance().getEntityRenderManager().getRenderer(type));
}
2019-07-03 01:57:45 +02:00
EntityRendererRegistry.INSTANCE.register(type, factory);
} else {
if (renderMap.containsKey(type)) {
2019-07-03 01:57:45 +02:00
EntityRendererRegistry.INSTANCE.register(type, (m, c) -> renderMap.get(type));
}
}
}
public LevitatingItemRenderer getMagicRenderer() {
return magicRenderer;
}
@SuppressWarnings("unchecked")
@Nullable
public <T extends LivingEntity, M extends EntityModel<T> & IPonyModel<T>> IPonyRender<T, M> getPonyRenderer(@Nullable T entity) {
if (entity == null) {
return null;
}
2019-11-23 18:28:42 +01:00
EntityRenderer<T> renderer = (EntityRenderer<T>)MinecraftClient.getInstance().getEntityRenderManager().getRenderer(entity);
2019-05-27 17:59:15 +02:00
if (renderer instanceof IPonyRender) {
return (IPonyRender<T, M>) renderer;
}
return null;
}
}