2019-03-23 20:49:34 +01:00
|
|
|
package com.minelittlepony.client;
|
2018-04-25 21:29:49 +02:00
|
|
|
|
|
|
|
import java.util.Map;
|
2019-05-27 17:59:15 +02:00
|
|
|
import java.util.function.Function;
|
2018-04-25 21:29:49 +02:00
|
|
|
|
|
|
|
import com.google.common.collect.Maps;
|
2019-06-24 11:25:39 +02:00
|
|
|
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;
|
2018-04-25 21:29:49 +02:00
|
|
|
|
2018-09-19 19:43:23 +02:00
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
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;
|
|
|
|
import net.minecraft.client.render.entity.LivingEntityRenderer;
|
|
|
|
import net.minecraft.client.render.entity.model.EntityModel;
|
2018-04-25 21:29:49 +02:00
|
|
|
import net.minecraft.entity.Entity;
|
2019-05-27 17:59:15 +02:00
|
|
|
import net.minecraft.entity.LivingEntity;
|
2018-04-25 21:29:49 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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.
|
2018-04-25 21:29:49 +02:00
|
|
|
*/
|
|
|
|
public class PonyRenderManager {
|
2018-04-27 13:49:33 +02:00
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2018-05-26 23:37:50 +02:00
|
|
|
private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer();
|
|
|
|
|
|
|
|
|
2019-05-27 17:59:15 +02:00
|
|
|
private final Map<Class<? extends Entity>, EntityRenderer<?>> renderMap = Maps.newHashMap();
|
2018-04-27 13:49:33 +02:00
|
|
|
|
2018-04-25 21:29:49 +02:00
|
|
|
/**
|
|
|
|
* Registers all new player skin types. (currently only pony and slimpony).
|
|
|
|
*/
|
2019-05-27 17:59:15 +02:00
|
|
|
public void initialiseRenderers(EntityRenderDispatcher manager) {
|
2018-06-22 01:46:10 +02:00
|
|
|
PlayerModels[] models = PlayerModels.values();
|
|
|
|
|
|
|
|
for (int i = 1; i < models.length; i++) {
|
|
|
|
registerPlayerSkin(manager, models[i]);
|
2018-05-11 20:20:10 +02:00
|
|
|
}
|
2019-05-27 17:59:15 +02:00
|
|
|
|
|
|
|
MobRenderers.registry.forEach(i -> i.apply(this));
|
2018-04-28 16:39:32 +02:00
|
|
|
}
|
|
|
|
|
2019-05-27 17:59:15 +02:00
|
|
|
private void registerPlayerSkin(EntityRenderDispatcher manager, PlayerModels playerModel) {
|
2018-05-01 12:40:18 +02:00
|
|
|
addPlayerSkin(manager, false, playerModel);
|
|
|
|
addPlayerSkin(manager, true, playerModel);
|
2018-04-30 09:00:15 +02:00
|
|
|
}
|
|
|
|
|
2019-05-27 17:59:15 +02:00
|
|
|
private void addPlayerSkin(EntityRenderDispatcher manager, boolean slimArms, PlayerModels playerModel) {
|
2018-06-29 18:36:03 +02:00
|
|
|
RenderPonyPlayer renderer = playerModel.createRenderer(manager, slimArms);
|
2018-05-01 12:40:18 +02:00
|
|
|
|
2019-06-02 19:20:00 +02:00
|
|
|
MineLPClient.getInstance().getModUtilities().addRenderer(playerModel.getId(slimArms), renderer);
|
2018-04-25 21:29:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2018-05-15 16:26:52 +02: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)
|
2018-04-25 21:29:49 +02:00
|
|
|
* @param type The type to replace
|
2019-07-01 04:54:43 +02:00
|
|
|
* @param factory The replacement value
|
2018-04-25 21:29:49 +02:00
|
|
|
* @param <T> The entity type
|
|
|
|
*/
|
2019-07-01 10:59:55 +02:00
|
|
|
@SuppressWarnings({"unchecked"})
|
|
|
|
public <T extends Entity, V extends T> void switchRenderer(boolean state, Class<V> type, Function<EntityRenderDispatcher, EntityRenderer<T>> factory) {
|
2018-05-15 16:26:52 +02:00
|
|
|
if (state) {
|
|
|
|
if (!renderMap.containsKey(type)) {
|
2019-05-27 17:59:15 +02:00
|
|
|
renderMap.put(type, MinecraftClient.getInstance().getEntityRenderManager().getRenderer(type));
|
2018-05-15 16:26:52 +02:00
|
|
|
}
|
2019-07-01 10:59:55 +02:00
|
|
|
MineLPClient.getInstance().getModUtilities().addRenderer((Class<T>)type, factory);
|
2018-05-15 16:26:52 +02:00
|
|
|
} else {
|
|
|
|
if (renderMap.containsKey(type)) {
|
2019-07-01 10:59:55 +02:00
|
|
|
MineLPClient.getInstance().getModUtilities().addRenderer(type, m -> (EntityRenderer<V>)renderMap.get(type));
|
2018-05-15 16:26:52 +02:00
|
|
|
}
|
2018-04-25 21:29:49 +02:00
|
|
|
}
|
|
|
|
}
|
2018-05-26 23:37:50 +02:00
|
|
|
|
|
|
|
public LevitatingItemRenderer getMagicRenderer() {
|
|
|
|
return magicRenderer;
|
|
|
|
}
|
2018-09-19 19:43:23 +02:00
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
@Nullable
|
2019-05-27 17:59:15 +02:00
|
|
|
public <T extends LivingEntity, M extends EntityModel<T> & IPonyModel<T>, R extends LivingEntityRenderer<T, M> & IPonyRender<T, M>> R getPonyRenderer(@Nullable Entity entity) {
|
|
|
|
if (entity == null || !(entity instanceof LivingEntity)) {
|
2018-09-19 23:22:59 +02:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2019-05-27 17:59:15 +02:00
|
|
|
EntityRenderer<Entity> renderer = MinecraftClient.getInstance().getEntityRenderManager().getRenderer(entity);
|
2018-09-19 19:43:23 +02:00
|
|
|
|
2019-05-27 17:59:15 +02:00
|
|
|
if (renderer instanceof IPonyRender) {
|
2018-09-19 19:43:23 +02:00
|
|
|
return (R)(Object)renderer;
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
2018-04-25 21:29:49 +02:00
|
|
|
}
|