Refactoring phase 1

This commit is contained in:
Sollace 2019-05-28 01:50:45 +02:00
parent 8442a75495
commit d73736edce
28 changed files with 226 additions and 207 deletions

View file

@ -1,56 +0,0 @@
package com.minelittlepony.client;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonWriter;
import com.minelittlepony.client.settings.ClientPonyConfig;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
class Config extends ClientPonyConfig {
static final Gson gson = new GsonBuilder()
.setPrettyPrinting()
.excludeFieldsWithoutExposeAnnotation()
.create();
private final Path configFile;
Config(Path file) {
configFile = file;
}
@Override
public void save() {
try (JsonWriter writer = new JsonWriter(Files.newBufferedWriter(configFile))) {
writer.setIndent(" ");
gson.toJson(this, Config.class, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
static Config of(Path file) {
Config result = null;
if (Files.exists(file)) {
try (BufferedReader s = Files.newBufferedReader(file)) {
result = gson.fromJson(s, Config.class);
} catch (IOException ignored) {
result = null;
}
}
if (result == null) {
result = new Config(file);
}
result.save();
return result;
}
}

View file

@ -9,7 +9,9 @@ import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.entity.Entity;
import com.minelittlepony.client.settings.ClientPonyConfig;
import com.minelittlepony.hdskins.mixin.MixinEntityRenderDispatcher;
import com.minelittlepony.settings.SensibleJsonConfig;
import java.nio.file.Path;
import java.util.function.Function;
@ -20,7 +22,7 @@ public class FabMod implements ClientModInitializer, IModUtilities {
@Override
public void onInitializeClient() {
mlp.init(Config.of(getConfigDirectory()));
mlp.init(SensibleJsonConfig.of(getConfigDirectory(), ClientPonyConfig::new));
mlp.postInit(MinecraftClient.getInstance());
}
@ -34,10 +36,6 @@ public class FabMod implements ClientModInitializer, IModUtilities {
((MixinEntityRenderDispatcher)mx).getRenderers().put(type, renderer.apply(mx));
}
public float getRenderPartialTicks() {
return MinecraftClient.getInstance().getTickDelta();
}
@Override
public Path getConfigDirectory() {
return FabricLoader.getInstance().getConfigDirectory().toPath();

View file

@ -18,8 +18,6 @@ public interface IModUtilities {
return false;
}
float getRenderPartialTicks();
Path getConfigDirectory();
Path getAssetsDirectory();

View file

@ -89,6 +89,7 @@ public abstract class AbstractPonyModel<T extends LivingEntity> extends ClientPo
motionLerp = MathUtil.clampLimit(zMotion * 30, 1);
}
@Override
public void updateLivingState(T entity, IPony pony) {
isChild = entity.isBaby();
isSneaking = entity.isSneaking();

View file

@ -24,11 +24,15 @@ public class ModelSeapony<T extends LivingEntity> extends ModelUnicorn<T> {
PlaneRenderer centerFin;
PlaneRenderer rightFin;
public ModelSeapony() {
super(false);
public ModelSeapony(boolean smallArms) {
super(smallArms);
textureHeight = 64;
}
public ModelSeapony() {
this(false);
}
@Override
public IEquestrianArmour<?> createArmour() {
return new PonyArmor<>(new Armour(), new Armour());

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.model.races;
import com.google.common.collect.Maps;
import com.minelittlepony.client.model.AbstractPonyModel;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelSeapony;
import com.minelittlepony.client.render.entities.player.RenderPonyPlayer;
import com.minelittlepony.client.render.entities.player.RenderSeaponyPlayer;
@ -10,31 +8,34 @@ import com.minelittlepony.hdskins.VanillaModels;
import com.minelittlepony.model.IModel;
import com.minelittlepony.pony.meta.Race;
import javax.annotation.Nullable;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.entity.LivingEntity;
import java.util.Map;
import java.util.function.Function;
public enum PlayerModels {
/**
* The default non-pony model. This is typically handled my the vanilla renderer.
*/
HUMAN(VanillaModels.DEFAULT, Race.HUMAN, ModelEarthPony::new),
EARTH("earthpony", Race.EARTH, ModelEarthPony::new),
PEGASUS("pegasus", Race.PEGASUS, ModelPegasus::new),
BATPONY("batpony", Race.BATPONY, ModelBatpony::new),
UNICORN("unicorn", Race.UNICORN, ModelUnicorn::new),
ALICORN("alicorn", Race.ALICORN, ModelAlicorn::new),
CHANGELING("changeling", Race.CHANGELING, ModelChangeling::new),
ZEBRA("zebra", Race.ZEBRA, ModelZebra::new),
SEAPONY("seapony", Race.SEAPONY, a -> new ModelSeapony<>()) {
DEFAULT(VanillaModels.DEFAULT, VanillaModels.SLIM, Race.HUMAN, ModelEarthPony::new),
EARTHPONY(Race.EARTH, ModelEarthPony::new),
PEGASUS(Race.PEGASUS, ModelPegasus::new),
BATPONY(Race.BATPONY, ModelBatpony::new),
UNICORN(Race.UNICORN, ModelUnicorn::new),
ALICORN(Race.ALICORN, ModelAlicorn::new),
CHANGELING(Race.CHANGELING, ModelChangeling::new),
ZEBRA(Race.ZEBRA, ModelZebra::new),
SEAPONY(Race.SEAPONY, ModelSeapony::new) {
@Override
public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) {
return new RenderSeaponyPlayer(manager, slimArms, PlayerModels.UNICORN.getModel(slimArms), getModel(slimArms));
}
};
private static Map<Race, PlayerModels> raceModelsMap = Maps.newEnumMap(Race.class);
private static final Map<Race, PlayerModels> raceModelsMap = Maps.newEnumMap(Race.class);
static {
for (PlayerModels i : values()) {
@ -42,48 +43,41 @@ public enum PlayerModels {
}
}
private final ModelResolver resolver;
private final Function<Boolean, IModel> resolver;
private ModelWrapper<?, ?> normal;
private ModelWrapper<?, ?> slim;
private final String normalKey, slimKey;
private final PendingModel normal;
private final PendingModel slim;
private final Race race;
PlayerModels(String key, Race race, ModelResolver resolver) {
this(key, VanillaModels.SLIM + key, race, resolver);
}
PlayerModels(String normalKey, String slimKey, Race race, ModelResolver resolver) {
this.normalKey = normalKey;
this.slimKey = slimKey;
PlayerModels(Race race, Function<Boolean, IModel> resolver) {
normal = new PendingModel(name().toLowerCase());
slim = new PendingModel(VanillaModels.SLIM + normal.key);
this.resolver = resolver;
this.race = race;
}
@SuppressWarnings("unchecked")
public <T extends LivingEntity, M extends IModel> ModelWrapper<T, M> getModel(boolean isSlim) {
PlayerModels(String normalKey, String slimKey, Race race, Function<Boolean, IModel> resolver) {
normal = new PendingModel(normalKey);
slim = new PendingModel(slimKey);
if (isSlim) {
if (slim == null) {
slim = new ModelWrapper<>(resolver.resolve(isSlim));
this.resolver = resolver;
this.race = race;
}
return (ModelWrapper<T, M>)slim;
public PendingModel getPendingModel(boolean isSlim) {
return isSlim ? slim : normal;
}
if (normal == null) {
normal = new ModelWrapper<>(resolver.resolve(isSlim));
public <T extends LivingEntity, M extends IModel> M getModel(boolean isSlim) {
return getPendingModel(isSlim).getModel(isSlim);
}
return (ModelWrapper<T, M>)normal;
}
public String getId(boolean useSlimArms) {
return useSlimArms ? slimKey : normalKey;
public String getId(boolean isSlim) {
return getPendingModel(isSlim).key;
}
public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) {
@ -91,14 +85,26 @@ public enum PlayerModels {
}
public static PlayerModels forRace(Race race) {
return raceModelsMap.getOrDefault(race.getAlias(), HUMAN);
return raceModelsMap.getOrDefault(race.getAlias(), DEFAULT);
}
/**
* FIXME: PMAPI fields are null when the game starts.
*/
@FunctionalInterface
static interface ModelResolver {
AbstractPonyModel<?> resolve(boolean slim);
private final class PendingModel {
@Nullable
private IModel model;
private final String key;
PendingModel(String key) {
this.key = key;
}
@SuppressWarnings("unchecked")
public <T extends LivingEntity, M extends IModel> M getModel(boolean isSlim) {
if (model == null) {
model = resolver.apply(isSlim);
}
return (M)model;
}
}
}

View file

@ -3,7 +3,6 @@ package com.minelittlepony.client.render;
import org.lwjgl.opengl.GL14;
import com.minelittlepony.MineLittlePony;
import com.minelittlepony.client.MineLPClient;
import com.minelittlepony.client.ducks.IRenderItem;
import com.minelittlepony.client.render.tileentities.skull.PonySkullRenderer;
import com.minelittlepony.client.util.render.Color;
@ -20,7 +19,6 @@ import net.minecraft.util.UseAction;
import static com.mojang.blaze3d.platform.GlStateManager.*;
@SuppressWarnings("deprecation") // ItemCameraTransforms is deprecated by forge but we still need it.
public class LevitatingItemRenderer {
public static void enableItemGlowRenderProfile() {
@ -118,7 +116,7 @@ public class LevitatingItemRenderer {
boolean doNormal = entity.getItemUseTime() <= 0 || action == UseAction.NONE;
if (doNormal) { // eating, blocking, and drinking are not transformed. Only held items.
float ticks = MineLPClient.getInstance().getModUtilities().getRenderPartialTicks() - entity.age;
float ticks = MinecraftClient.getInstance().getTickDelta() - entity.age;
float floatAmount = (float)Math.sin(ticks / 9) / 40;
float driftAmount = (float)Math.cos(ticks / 6) / 40;

View file

@ -2,7 +2,6 @@ package com.minelittlepony.client.render;
import com.minelittlepony.MineLittlePony;
import com.minelittlepony.client.PonyRenderManager;
import com.minelittlepony.client.model.AbstractPonyModel;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.transform.PonyPosture;
import com.minelittlepony.model.IPonyModel;
@ -10,7 +9,7 @@ import com.minelittlepony.pony.IPony;
import com.minelittlepony.util.math.MathUtil;
import com.mojang.blaze3d.platform.GlStateManager;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
import net.minecraft.client.render.VisibleRegion;
import net.minecraft.client.render.entity.model.EntityModel;
@ -21,13 +20,13 @@ public class RenderPony<T extends LivingEntity, M extends EntityModel<T> & IPony
public ModelWrapper<T, M> playerModel;
protected AbstractPonyModel<T> ponyModel;
private M ponyModel;
private IPony pony;
private IPonyRender<T, M> renderer;
private final IPonyRender<T, M> renderer;
private FrustrumCheck<T> frustrum = new FrustrumCheck<>(this);
private final FrustrumCheck<T> frustrum = new FrustrumCheck<>(this);
public static void enableModelRenderProfile() {
GlStateManager.enableBlend();
@ -95,54 +94,44 @@ public class RenderPony<T extends LivingEntity, M extends EntityModel<T> & IPony
@SuppressWarnings("unchecked")
public void applyPostureTransform(T player, float yaw, float ticks) {
PonyPosture<?> posture = getPosture(player);
if (posture != null && posture.applies(player)) {
double motionX = player.x - player.prevX;
double motionY = player.onGround ? 0 : player.y - player.prevY;
double motionZ = player.x - player.prevZ;
((PonyPosture<LivingEntity>)posture).transform(ponyModel, player, motionX, motionY, motionZ, yaw, ticks);
}
((PonyPosture<T>)getPosture(player)).apply(player, ponyModel, yaw, ticks, 1);
}
@SuppressWarnings("unchecked")
public void applyPostureRiding(T player, float yaw, float ticks) {
PonyPosture<?> posture = getPosture(player);
if (posture != null && posture.applies(player)) {
double motionX = player.x - player.prevX;
double motionY = player.onGround ? 0 : player.y - player.prevY;
double motionZ = player.z - player.prevZ;
((PonyPosture<LivingEntity>)posture).transform(ponyModel, player, motionX, -motionY, motionZ, yaw, ticks);
}
((PonyPosture<T>)getPosture(player)).apply(player, ponyModel, yaw, ticks, -1);
}
@Nullable
@Nonnull
private PonyPosture<?> getPosture(T entity) {
if (entity.isFallFlying()) {
return PonyPosture.ELYTRA;
}
if (entity.isAlive() && entity.isSleeping()) {
return null;
return PonyPosture.DEFAULT;
}
if (ponyModel.isSwimming()) {
if (getModel().isSwimming()) {
return PonyPosture.SWIMMING;
}
if (ponyModel.isGoingFast()) {
if (getModel().isGoingFast()) {
return PonyPosture.FLIGHT;
}
return PonyPosture.FALLING;
}
@SuppressWarnings("unchecked")
public M getModel() {
return playerModel.getBody();
}
public M setPonyModel(ModelWrapper<T, M> model) {
playerModel = model;
ponyModel = (AbstractPonyModel<T>)playerModel.getBody();
ponyModel = playerModel.getBody();
return (M)ponyModel;
return ponyModel;
}
public void updateModel(T entity) {
@ -156,11 +145,11 @@ public class RenderPony<T extends LivingEntity, M extends EntityModel<T> & IPony
}
public float getShadowScale() {
return ponyModel.getSize().getShadowSize();
return getModel().getSize().getShadowSize();
}
public float getScaleFactor() {
return ponyModel.getSize().getScaleFactor();
return getModel().getSize().getScaleFactor();
}
public double getNamePlateYOffset(T entity, double initial) {

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelEnderStallion;
import com.minelittlepony.client.render.RenderPonyMob;
import com.minelittlepony.client.render.layer.LayerEyeGlow;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.minelittlepony.client.render.layer.LayerHeldPonyItemMagical;
@ -24,10 +22,8 @@ public class RenderEnderStallion extends RenderPonyMob<EndermanEntity, ModelEnde
private final Random rnd = new Random();
private static final ModelWrapper<EndermanEntity, ModelEnderStallion> MODEL_WRAPPER = new ModelWrapper<>(new ModelEnderStallion());
public RenderEnderStallion(EntityRenderDispatcher manager) {
super(manager, MODEL_WRAPPER);
super(manager, new ModelEnderStallion());
}
@Override

View file

@ -3,9 +3,8 @@ package com.minelittlepony.client.render.entities;
import javax.annotation.Nonnull;
import com.minelittlepony.client.mixin.IResizeable;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelGuardianPony;
import com.minelittlepony.client.render.RenderPonyMob.Proxy;
import com.minelittlepony.client.render.entities.RenderPonyMob.Proxy;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.minelittlepony.client.render.layer.LayerHeldPonyItemMagical;
import com.mojang.blaze3d.platform.GlStateManager;
@ -27,7 +26,7 @@ public class RenderPonyGuardian extends GuardianEntityRenderer {
super(manager);
features.clear();
ponyRenderer = new Proxy<GuardianEntity, ModelGuardianPony>(features, manager, new ModelWrapper<>(new ModelGuardianPony())) {
ponyRenderer = new Proxy<GuardianEntity, ModelGuardianPony>(features, manager, new ModelGuardianPony()) {
@Override
public Identifier findTexture(GuardianEntity entity) {
return SEAPONY;

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelIllagerPony;
import com.minelittlepony.client.render.RenderPonyMob;
import com.minelittlepony.client.render.layer.LayerHeldItemIllager;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.mojang.blaze3d.platform.GlStateManager;
@ -23,7 +21,7 @@ public abstract class RenderPonyIllager<T extends IllagerEntity> extends RenderP
public static final Identifier VINDICATOR = new Identifier("minelittlepony", "textures/entity/illager/vindicator_pony.png");
public RenderPonyIllager(EntityRenderDispatcher manager) {
super(manager, new ModelWrapper<>(new ModelIllagerPony<>()));
super(manager, new ModelIllagerPony<>());
}
@Override

View file

@ -1,8 +1,11 @@
package com.minelittlepony.client.render;
package com.minelittlepony.client.render.entities;
import com.minelittlepony.MineLittlePony;
import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.render.DebugBoundingBoxRenderer;
import com.minelittlepony.client.render.IPonyRender;
import com.minelittlepony.client.render.RenderPony;
import com.minelittlepony.client.render.layer.LayerGear;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.minelittlepony.client.render.layer.LayerHeldPonyItemMagical;
@ -31,10 +34,10 @@ public abstract class RenderPonyMob<T extends LivingEntity, M extends EntityMode
protected RenderPony<T, M> renderPony = new RenderPony<T, M>(this);
public RenderPonyMob(EntityRenderDispatcher manager, ModelWrapper<T, M> model) {
super(manager, model.getBody(), 0.5F);
public RenderPonyMob(EntityRenderDispatcher manager, M model) {
super(manager, model, 0.5F);
renderPony.setPonyModel(model);
this.model = renderPony.setPonyModel(new ModelWrapper<>(model));
addLayers();
}
@ -94,11 +97,6 @@ public abstract class RenderPonyMob<T extends LivingEntity, M extends EntityMode
return renderPony.playerModel;
}
@Override
public IPony getEntityPony(T entity) {
return MineLittlePony.getInstance().getManager().getPony(findTexture(entity));
}
@Override
protected void renderLabel(T entity, String name, double x, double y, double z, int maxDistance) {
super.renderLabel(entity, name, x, renderPony.getNamePlateYOffset(entity, y), z, maxDistance);
@ -116,9 +114,14 @@ public abstract class RenderPonyMob<T extends LivingEntity, M extends EntityMode
return renderPony;
}
@Override
public IPony getEntityPony(T entity) {
return MineLittlePony.getInstance().getManager().getPony(findTexture(entity));
}
public abstract static class Caster<T extends LivingEntity, M extends ClientPonyModel<T> & IUnicorn<PonyRenderer>> extends RenderPonyMob<T, M> {
public Caster(EntityRenderDispatcher manager, ModelWrapper<T, M> model) {
public Caster(EntityRenderDispatcher manager, M model) {
super(manager, model);
}
@ -131,7 +134,7 @@ public abstract class RenderPonyMob<T extends LivingEntity, M extends EntityMode
public abstract static class Proxy<T extends LivingEntity, M extends EntityModel<T> & IPonyModel<T>> extends RenderPonyMob<T, M> {
@SuppressWarnings({"rawtypes", "unchecked"})
public Proxy(List exportedLayers, EntityRenderDispatcher manager, ModelWrapper<T, M> model) {
public Proxy(List exportedLayers, EntityRenderDispatcher manager, M model) {
super(manager, model);
exportedLayers.addAll(features);

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelSkeletonPony;
import com.minelittlepony.client.render.RenderPonyMob;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.minelittlepony.client.render.layer.LayerHeldPonyItemMagical;
import com.minelittlepony.client.render.layer.LayerPonyStrayOverlay;
@ -21,7 +19,7 @@ public class RenderPonySkeleton<Skeleton extends AbstractSkeletonEntity> extends
public static final Identifier STRAY = new Identifier("minelittlepony", "textures/entity/skeleton/stray_pony.png");
public RenderPonySkeleton(EntityRenderDispatcher manager) {
super(manager, new ModelWrapper<>(new ModelSkeletonPony<>()));
super(manager, new ModelSkeletonPony<>());
}
@Override

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelVillagerPony;
import com.minelittlepony.client.render.RenderPonyMob;
import com.minelittlepony.util.resources.FormattedTextureSupplier;
import com.minelittlepony.util.resources.ITextureSupplier;
import com.mojang.blaze3d.platform.GlStateManager;
@ -23,7 +21,7 @@ public class RenderPonyVillager extends RenderPonyMob.Caster<VillagerEntity, Mod
private static final ITextureSupplier<VillagerData> PROFESSIONS = new VillagerProfessionTextureCache(FORMATTER, DEFAULT);
public RenderPonyVillager(EntityRenderDispatcher manager) {
super(manager, new ModelWrapper<>(new ModelVillagerPony<>()));
super(manager, new ModelVillagerPony<>());
}
@Override

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelWitchPony;
import com.minelittlepony.client.render.RenderPonyMob;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.mojang.blaze3d.platform.GlStateManager;
@ -18,7 +16,7 @@ public class RenderPonyWitch extends RenderPonyMob<WitchEntity, ModelWitchPony>
private static final Identifier WITCH_TEXTURES = new Identifier("minelittlepony", "textures/entity/witch_pony.png");
public RenderPonyWitch(EntityRenderDispatcher manager) {
super(manager, new ModelWrapper<>(new ModelWitchPony()));
super(manager, new ModelWitchPony());
}
@Override

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelZombiePony;
import com.minelittlepony.client.render.RenderPonyMob;
import com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
@ -19,7 +17,7 @@ public class RenderPonyZombie<Zombie extends ZombieEntity> extends RenderPonyMob
public static final Identifier PIGMAN = new Identifier("minelittlepony", "textures/entity/zombie/zombie_pigman_pony.png");
public RenderPonyZombie(EntityRenderDispatcher manager) {
super(manager, new ModelWrapper<>(new ModelZombiePony<>()));
super(manager, new ModelZombiePony<>());
}
@Override
@ -61,7 +59,7 @@ public class RenderPonyZombie<Zombie extends ZombieEntity> extends RenderPonyMob
public static class Giant extends RenderPonyMob.Caster<GiantEntity, ModelZombiePony<GiantEntity>> {
public Giant(EntityRenderDispatcher manager) {
super(manager, new ModelWrapper<>(new ModelZombiePony<>()));
super(manager, new ModelZombiePony<>());
}
@Override

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelZombieVillagerPony;
import com.minelittlepony.client.render.RenderPonyMob;
import com.minelittlepony.util.resources.FormattedTextureSupplier;
import com.minelittlepony.util.resources.ITextureSupplier;
@ -22,7 +20,7 @@ public class RenderPonyZombieVillager extends RenderPonyMob.Caster<ZombieVillage
private static final ITextureSupplier<VillagerData> PROFESSIONS = new VillagerProfessionTextureCache(FORMATTER, DEFAULT);
public RenderPonyZombieVillager(EntityRenderDispatcher manager) {
super(manager, new ModelWrapper<>(new ModelZombieVillagerPony()));
super(manager, new ModelZombieVillagerPony());
}
@Override

View file

@ -36,10 +36,10 @@ public class RenderPonyPlayer extends PlayerEntityRenderer implements IPonyRende
protected final RenderPony<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> renderPony = new RenderPony<>(this);
public RenderPonyPlayer(EntityRenderDispatcher manager, boolean useSmallArms, ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> model) {
public RenderPonyPlayer(EntityRenderDispatcher manager, boolean useSmallArms, ClientPonyModel<AbstractClientPlayerEntity> model) {
super(manager, useSmallArms);
this.model = renderPony.setPonyModel(model);
this.model = renderPony.setPonyModel(new ModelWrapper<>(model));
addLayers();
}
@ -170,11 +170,6 @@ public class RenderPonyPlayer extends PlayerEntityRenderer implements IPonyRende
return renderPony.playerModel;
}
@Override
public IPony getEntityPony(AbstractClientPlayerEntity player) {
return MineLittlePony.getInstance().getManager().getPony(player);
}
@Override
public RenderPony<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> getInternalRenderer() {
return renderPony;
@ -185,4 +180,9 @@ public class RenderPonyPlayer extends PlayerEntityRenderer implements IPonyRende
return getTexture(entity);
}
@Override
public IPony getEntityPony(AbstractClientPlayerEntity entity) {
return MineLittlePony.getInstance().getManager().getPony(entity);
}
}

View file

@ -11,16 +11,16 @@ import net.minecraft.particle.ParticleTypes;
public class RenderSeaponyPlayer extends RenderPonyPlayer {
protected ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> seapony;
protected ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> normalPony;
protected final ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> seapony;
protected final ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> normalPony;
public RenderSeaponyPlayer(EntityRenderDispatcher manager, boolean useSmallArms,
ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> model,
ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> alternate) {
ClientPonyModel<AbstractClientPlayerEntity> model,
ClientPonyModel<AbstractClientPlayerEntity> alternate) {
super(manager, useSmallArms, model);
seapony = alternate;
normalPony = model;
seapony = new ModelWrapper<>(alternate);
normalPony = new ModelWrapper<>(model);
}
@Override

View file

@ -4,7 +4,7 @@ import com.minelittlepony.hdskins.HDSkins;
import com.minelittlepony.settings.PonyConfig;
import com.minelittlepony.settings.PonyLevel;
public abstract class ClientPonyConfig extends PonyConfig {
public class ClientPonyConfig extends PonyConfig {
@Override
public void setPonyLevel(PonyLevel ponylevel) {

View file

@ -3,9 +3,11 @@ package com.minelittlepony.client.transform;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.model.IModel;
public interface PonyPosture<T extends LivingEntity> {
PonyPosture<LivingEntity> DEFAULT = new PostureStanding();;
PonyPosture<LivingEntity> ELYTRA = new PostureElytra();
PonyPosture<PlayerEntity> FLIGHT = new PostureFlight();
PonyPosture<PlayerEntity> SWIMMING = new PostureSwimming();
@ -15,5 +17,15 @@ public interface PonyPosture<T extends LivingEntity> {
return true;
}
void transform(ClientPonyModel<?> model, T entity, double motionX, double motionY, double motionZ, float yaw, float ticks);
default void apply(T player, IModel model, float yaw, float ticks, int invert) {
if (applies(player)) {
double motionX = player.x - player.prevX;
double motionY = player.onGround ? 0 : player.y - player.prevY;
double motionZ = player.z - player.prevZ;
transform(model, player, motionX, invert * motionY, motionZ, yaw, ticks);
}
}
void transform(IModel model, T entity, double motionX, double motionY, double motionZ, float yaw, float ticks);
}

View file

@ -2,12 +2,12 @@ package com.minelittlepony.client.transform;
import net.minecraft.entity.LivingEntity;
import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.model.IModel;
import com.mojang.blaze3d.platform.GlStateManager;
public class PostureElytra implements PonyPosture<LivingEntity> {
@Override
public void transform(ClientPonyModel<?> model, LivingEntity entity, double motionX, double motionY, double motionZ, float yaw, float ticks) {
public void transform(IModel model, LivingEntity entity, double motionX, double motionY, double motionZ, float yaw, float ticks) {
GlStateManager.rotatef(90, 1, 0, 0);
GlStateManager.translatef(0, entity.isSneaking() ? 0.2F : -1, 0);
}

View file

@ -2,11 +2,11 @@ package com.minelittlepony.client.transform;
import net.minecraft.entity.LivingEntity;
import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.model.IModel;
public class PostureFalling implements PonyPosture<LivingEntity> {
@Override
public void transform(ClientPonyModel<?> model, LivingEntity entity, double motionX, double motionY, double motionZ, float yaw, float ticks) {
public void transform(IModel model, LivingEntity entity, double motionX, double motionY, double motionZ, float yaw, float ticks) {
model.setPitch(0);
}
}

View file

@ -1,6 +1,6 @@
package com.minelittlepony.client.transform;
import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.model.IModel;
import com.minelittlepony.util.transform.MotionCompositor;
import com.mojang.blaze3d.platform.GlStateManager;
@ -14,7 +14,7 @@ public class PostureFlight extends MotionCompositor implements PonyPosture<Playe
}
@Override
public void transform(ClientPonyModel<?> model, PlayerEntity player, double motionX, double motionY, double motionZ, float yaw, float ticks) {
public void transform(IModel model, PlayerEntity player, double motionX, double motionY, double motionZ, float yaw, float ticks) {
model.setPitch((float) calculateIncline(player, motionX, motionY, motionZ));
GlStateManager.rotatef(model.getPitch(), 1, 0, 0);

View file

@ -0,0 +1,16 @@
package com.minelittlepony.client.transform;
import net.minecraft.entity.LivingEntity;
import com.minelittlepony.model.IModel;
public class PostureStanding implements PonyPosture<LivingEntity> {
@Override
public boolean applies(LivingEntity entity) {
return false;
}
@Override
public void transform(IModel model, LivingEntity entity, double motionX, double motionY, double motionZ, float yaw, float ticks) {
}
}

View file

@ -3,6 +3,10 @@ package com.minelittlepony.model;
import net.minecraft.client.model.Cuboid;
import net.minecraft.entity.LivingEntity;
public interface IPonyModel<T extends LivingEntity> extends PonyModelConstants, IModel, ICapitated<Cuboid>, ICompartmented<Cuboid> {
import com.minelittlepony.pony.IPony;
public interface IPonyModel<T extends LivingEntity> extends PonyModelConstants, IModel, ICapitated<Cuboid>, ICompartmented<Cuboid> {
default void updateLivingState(T entity, IPony pony) {
}
}

View file

@ -3,12 +3,11 @@ package com.minelittlepony.settings;
import net.minecraft.util.math.MathHelper;
import com.google.gson.annotations.Expose;
import com.minelittlepony.common.SensibleConfig;
/**
* Storage container for MineLP client settings.
*/
public abstract class PonyConfig extends SensibleConfig {
public abstract class PonyConfig extends SensibleJsonConfig {
@Expose private PonyLevel ponylevel = PonyLevel.PONIES;

View file

@ -0,0 +1,64 @@
package com.minelittlepony.settings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonWriter;
import com.minelittlepony.client.settings.ClientPonyConfig;
import com.minelittlepony.common.SensibleConfig;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.function.Supplier;
public class SensibleJsonConfig extends SensibleConfig {
static final Gson gson = new GsonBuilder()
.setPrettyPrinting()
.excludeFieldsWithoutExposeAnnotation()
.create();
private Path configFile;
@Override
public void save() {
try (JsonWriter writer = new JsonWriter(Files.newBufferedWriter(configFile))) {
writer.setIndent(" ");
gson.toJson(this, ClientPonyConfig.class, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
protected <T extends SensibleJsonConfig> T load(Path file) {
SensibleJsonConfig result = this;
try {
if (Files.exists(file)) {
try (BufferedReader s = Files.newBufferedReader(file)) {
result = gson.fromJson(s, getClass());
} catch (IOException ignored) {
result = null;
}
}
if (result == null) {
result = this;
}
result.configFile = file;
} finally {
result.save();
}
return (T)result;
}
public static <T extends SensibleJsonConfig> T of(Path file, Supplier<T> creator) {
return creator.get().load(file);
}
}