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

View file

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

View file

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

View file

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

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.model.races; package com.minelittlepony.client.model.races;
import com.google.common.collect.Maps; 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.model.entities.ModelSeapony;
import com.minelittlepony.client.render.entities.player.RenderPonyPlayer; import com.minelittlepony.client.render.entities.player.RenderPonyPlayer;
import com.minelittlepony.client.render.entities.player.RenderSeaponyPlayer; 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.model.IModel;
import com.minelittlepony.pony.meta.Race; import com.minelittlepony.pony.meta.Race;
import javax.annotation.Nullable;
import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import java.util.Map; import java.util.Map;
import java.util.function.Function;
public enum PlayerModels { public enum PlayerModels {
/** /**
* The default non-pony model. This is typically handled my the vanilla renderer. * The default non-pony model. This is typically handled my the vanilla renderer.
*/ */
HUMAN(VanillaModels.DEFAULT, Race.HUMAN, ModelEarthPony::new), DEFAULT(VanillaModels.DEFAULT, VanillaModels.SLIM, Race.HUMAN, ModelEarthPony::new),
EARTH("earthpony", Race.EARTH, ModelEarthPony::new), EARTHPONY(Race.EARTH, ModelEarthPony::new),
PEGASUS("pegasus", Race.PEGASUS, ModelPegasus::new), PEGASUS(Race.PEGASUS, ModelPegasus::new),
BATPONY("batpony", Race.BATPONY, ModelBatpony::new), BATPONY(Race.BATPONY, ModelBatpony::new),
UNICORN("unicorn", Race.UNICORN, ModelUnicorn::new), UNICORN(Race.UNICORN, ModelUnicorn::new),
ALICORN("alicorn", Race.ALICORN, ModelAlicorn::new), ALICORN(Race.ALICORN, ModelAlicorn::new),
CHANGELING("changeling", Race.CHANGELING, ModelChangeling::new), CHANGELING(Race.CHANGELING, ModelChangeling::new),
ZEBRA("zebra", Race.ZEBRA, ModelZebra::new), ZEBRA(Race.ZEBRA, ModelZebra::new),
SEAPONY("seapony", Race.SEAPONY, a -> new ModelSeapony<>()) { SEAPONY(Race.SEAPONY, ModelSeapony::new) {
@Override @Override
public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) { public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) {
return new RenderSeaponyPlayer(manager, slimArms, PlayerModels.UNICORN.getModel(slimArms), getModel(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 { static {
for (PlayerModels i : values()) { 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 final PendingModel normal;
private ModelWrapper<?, ?> slim; private final PendingModel slim;
private final String normalKey, slimKey;
private final Race race; private final Race race;
PlayerModels(String key, Race race, ModelResolver resolver) { PlayerModels(Race race, Function<Boolean, IModel> resolver) {
this(key, VanillaModels.SLIM + key, race, resolver); normal = new PendingModel(name().toLowerCase());
} slim = new PendingModel(VanillaModels.SLIM + normal.key);
PlayerModels(String normalKey, String slimKey, Race race, ModelResolver resolver) {
this.normalKey = normalKey;
this.slimKey = slimKey;
this.resolver = resolver; this.resolver = resolver;
this.race = race; this.race = race;
} }
@SuppressWarnings("unchecked") PlayerModels(String normalKey, String slimKey, Race race, Function<Boolean, IModel> resolver) {
public <T extends LivingEntity, M extends IModel> ModelWrapper<T, M> getModel(boolean isSlim) { normal = new PendingModel(normalKey);
slim = new PendingModel(slimKey);
if (isSlim) { this.resolver = resolver;
if (slim == null) {
slim = new ModelWrapper<>(resolver.resolve(isSlim));
}
return (ModelWrapper<T, M>)slim; this.race = race;
}
if (normal == null) {
normal = new ModelWrapper<>(resolver.resolve(isSlim));
}
return (ModelWrapper<T, M>)normal;
} }
public String getId(boolean useSlimArms) { public PendingModel getPendingModel(boolean isSlim) {
return useSlimArms ? slimKey : normalKey; return isSlim ? slim : normal;
}
public <T extends LivingEntity, M extends IModel> M getModel(boolean isSlim) {
return getPendingModel(isSlim).getModel(isSlim);
}
public String getId(boolean isSlim) {
return getPendingModel(isSlim).key;
} }
public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) { public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) {
@ -91,14 +85,26 @@ public enum PlayerModels {
} }
public static PlayerModels forRace(Race race) { public static PlayerModels forRace(Race race) {
return raceModelsMap.getOrDefault(race.getAlias(), HUMAN); return raceModelsMap.getOrDefault(race.getAlias(), DEFAULT);
} }
/** private final class PendingModel {
* FIXME: PMAPI fields are null when the game starts. @Nullable
*/ private IModel model;
@FunctionalInterface
static interface ModelResolver { private final String key;
AbstractPonyModel<?> resolve(boolean slim);
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 org.lwjgl.opengl.GL14;
import com.minelittlepony.MineLittlePony; import com.minelittlepony.MineLittlePony;
import com.minelittlepony.client.MineLPClient;
import com.minelittlepony.client.ducks.IRenderItem; import com.minelittlepony.client.ducks.IRenderItem;
import com.minelittlepony.client.render.tileentities.skull.PonySkullRenderer; import com.minelittlepony.client.render.tileentities.skull.PonySkullRenderer;
import com.minelittlepony.client.util.render.Color; import com.minelittlepony.client.util.render.Color;
@ -20,7 +19,6 @@ import net.minecraft.util.UseAction;
import static com.mojang.blaze3d.platform.GlStateManager.*; import static com.mojang.blaze3d.platform.GlStateManager.*;
@SuppressWarnings("deprecation") // ItemCameraTransforms is deprecated by forge but we still need it.
public class LevitatingItemRenderer { public class LevitatingItemRenderer {
public static void enableItemGlowRenderProfile() { public static void enableItemGlowRenderProfile() {
@ -118,7 +116,7 @@ public class LevitatingItemRenderer {
boolean doNormal = entity.getItemUseTime() <= 0 || action == UseAction.NONE; boolean doNormal = entity.getItemUseTime() <= 0 || action == UseAction.NONE;
if (doNormal) { // eating, blocking, and drinking are not transformed. Only held items. 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 floatAmount = (float)Math.sin(ticks / 9) / 40;
float driftAmount = (float)Math.cos(ticks / 6) / 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.MineLittlePony;
import com.minelittlepony.client.PonyRenderManager; import com.minelittlepony.client.PonyRenderManager;
import com.minelittlepony.client.model.AbstractPonyModel;
import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.transform.PonyPosture; import com.minelittlepony.client.transform.PonyPosture;
import com.minelittlepony.model.IPonyModel; import com.minelittlepony.model.IPonyModel;
@ -10,7 +9,7 @@ import com.minelittlepony.pony.IPony;
import com.minelittlepony.util.math.MathUtil; import com.minelittlepony.util.math.MathUtil;
import com.mojang.blaze3d.platform.GlStateManager; 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.VisibleRegion;
import net.minecraft.client.render.entity.model.EntityModel; 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; public ModelWrapper<T, M> playerModel;
protected AbstractPonyModel<T> ponyModel; private M ponyModel;
private IPony pony; 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() { public static void enableModelRenderProfile() {
GlStateManager.enableBlend(); GlStateManager.enableBlend();
@ -95,54 +94,44 @@ public class RenderPony<T extends LivingEntity, M extends EntityModel<T> & IPony
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void applyPostureTransform(T player, float yaw, float ticks) { public void applyPostureTransform(T player, float yaw, float ticks) {
PonyPosture<?> posture = getPosture(player); ((PonyPosture<T>)getPosture(player)).apply(player, ponyModel, yaw, ticks, 1);
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);
}
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void applyPostureRiding(T player, float yaw, float ticks) { public void applyPostureRiding(T player, float yaw, float ticks) {
PonyPosture<?> posture = getPosture(player); ((PonyPosture<T>)getPosture(player)).apply(player, ponyModel, yaw, ticks, -1);
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);
}
} }
@Nullable @Nonnull
private PonyPosture<?> getPosture(T entity) { private PonyPosture<?> getPosture(T entity) {
if (entity.isFallFlying()) { if (entity.isFallFlying()) {
return PonyPosture.ELYTRA; return PonyPosture.ELYTRA;
} }
if (entity.isAlive() && entity.isSleeping()) { if (entity.isAlive() && entity.isSleeping()) {
return null; return PonyPosture.DEFAULT;
} }
if (ponyModel.isSwimming()) { if (getModel().isSwimming()) {
return PonyPosture.SWIMMING; return PonyPosture.SWIMMING;
} }
if (ponyModel.isGoingFast()) { if (getModel().isGoingFast()) {
return PonyPosture.FLIGHT; return PonyPosture.FLIGHT;
} }
return PonyPosture.FALLING; return PonyPosture.FALLING;
} }
@SuppressWarnings("unchecked") public M getModel() {
return playerModel.getBody();
}
public M setPonyModel(ModelWrapper<T, M> model) { public M setPonyModel(ModelWrapper<T, M> model) {
playerModel = model; playerModel = model;
ponyModel = (AbstractPonyModel<T>)playerModel.getBody(); ponyModel = playerModel.getBody();
return (M)ponyModel; return ponyModel;
} }
public void updateModel(T entity) { public void updateModel(T entity) {
@ -156,11 +145,11 @@ public class RenderPony<T extends LivingEntity, M extends EntityModel<T> & IPony
} }
public float getShadowScale() { public float getShadowScale() {
return ponyModel.getSize().getShadowSize(); return getModel().getSize().getShadowSize();
} }
public float getScaleFactor() { public float getScaleFactor() {
return ponyModel.getSize().getScaleFactor(); return getModel().getSize().getScaleFactor();
} }
public double getNamePlateYOffset(T entity, double initial) { public double getNamePlateYOffset(T entity, double initial) {

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities; package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelEnderStallion; 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.LayerEyeGlow;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem; import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.minelittlepony.client.render.layer.LayerHeldPonyItemMagical; 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 final Random rnd = new Random();
private static final ModelWrapper<EndermanEntity, ModelEnderStallion> MODEL_WRAPPER = new ModelWrapper<>(new ModelEnderStallion());
public RenderEnderStallion(EntityRenderDispatcher manager) { public RenderEnderStallion(EntityRenderDispatcher manager) {
super(manager, MODEL_WRAPPER); super(manager, new ModelEnderStallion());
} }
@Override @Override

View file

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

View file

@ -1,8 +1,6 @@
package com.minelittlepony.client.render.entities; package com.minelittlepony.client.render.entities;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entities.ModelIllagerPony; 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.LayerHeldItemIllager;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem; import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.mojang.blaze3d.platform.GlStateManager; 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 static final Identifier VINDICATOR = new Identifier("minelittlepony", "textures/entity/illager/vindicator_pony.png");
public RenderPonyIllager(EntityRenderDispatcher manager) { public RenderPonyIllager(EntityRenderDispatcher manager) {
super(manager, new ModelWrapper<>(new ModelIllagerPony<>())); super(manager, new ModelIllagerPony<>());
} }
@Override @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.MineLittlePony;
import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.ClientPonyModel;
import com.minelittlepony.client.model.ModelWrapper; 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.LayerGear;
import com.minelittlepony.client.render.layer.LayerHeldPonyItem; import com.minelittlepony.client.render.layer.LayerHeldPonyItem;
import com.minelittlepony.client.render.layer.LayerHeldPonyItemMagical; 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); protected RenderPony<T, M> renderPony = new RenderPony<T, M>(this);
public RenderPonyMob(EntityRenderDispatcher manager, ModelWrapper<T, M> model) { public RenderPonyMob(EntityRenderDispatcher manager, M model) {
super(manager, model.getBody(), 0.5F); super(manager, model, 0.5F);
renderPony.setPonyModel(model); this.model = renderPony.setPonyModel(new ModelWrapper<>(model));
addLayers(); addLayers();
} }
@ -94,11 +97,6 @@ public abstract class RenderPonyMob<T extends LivingEntity, M extends EntityMode
return renderPony.playerModel; return renderPony.playerModel;
} }
@Override
public IPony getEntityPony(T entity) {
return MineLittlePony.getInstance().getManager().getPony(findTexture(entity));
}
@Override @Override
protected void renderLabel(T entity, String name, double x, double y, double z, int maxDistance) { 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); 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; 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 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); 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> { public abstract static class Proxy<T extends LivingEntity, M extends EntityModel<T> & IPonyModel<T>> extends RenderPonyMob<T, M> {
@SuppressWarnings({"rawtypes", "unchecked"}) @SuppressWarnings({"rawtypes", "unchecked"})
public Proxy(List exportedLayers, EntityRenderDispatcher manager, ModelWrapper<T, M> model) { public Proxy(List exportedLayers, EntityRenderDispatcher manager, M model) {
super(manager, model); super(manager, model);
exportedLayers.addAll(features); exportedLayers.addAll(features);

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -4,7 +4,7 @@ import com.minelittlepony.hdskins.HDSkins;
import com.minelittlepony.settings.PonyConfig; import com.minelittlepony.settings.PonyConfig;
import com.minelittlepony.settings.PonyLevel; import com.minelittlepony.settings.PonyLevel;
public abstract class ClientPonyConfig extends PonyConfig { public class ClientPonyConfig extends PonyConfig {
@Override @Override
public void setPonyLevel(PonyLevel ponylevel) { 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.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.model.IModel;
public interface PonyPosture<T extends LivingEntity> { public interface PonyPosture<T extends LivingEntity> {
PonyPosture<LivingEntity> DEFAULT = new PostureStanding();;
PonyPosture<LivingEntity> ELYTRA = new PostureElytra(); PonyPosture<LivingEntity> ELYTRA = new PostureElytra();
PonyPosture<PlayerEntity> FLIGHT = new PostureFlight(); PonyPosture<PlayerEntity> FLIGHT = new PostureFlight();
PonyPosture<PlayerEntity> SWIMMING = new PostureSwimming(); PonyPosture<PlayerEntity> SWIMMING = new PostureSwimming();
@ -15,5 +17,15 @@ public interface PonyPosture<T extends LivingEntity> {
return true; 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 net.minecraft.entity.LivingEntity;
import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.model.IModel;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
public class PostureElytra implements PonyPosture<LivingEntity> { public class PostureElytra implements PonyPosture<LivingEntity> {
@Override @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.rotatef(90, 1, 0, 0);
GlStateManager.translatef(0, entity.isSneaking() ? 0.2F : -1, 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 net.minecraft.entity.LivingEntity;
import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.model.IModel;
public class PostureFalling implements PonyPosture<LivingEntity> { public class PostureFalling implements PonyPosture<LivingEntity> {
@Override @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); model.setPitch(0);
} }
} }

View file

@ -1,6 +1,6 @@
package com.minelittlepony.client.transform; package com.minelittlepony.client.transform;
import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.model.IModel;
import com.minelittlepony.util.transform.MotionCompositor; import com.minelittlepony.util.transform.MotionCompositor;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
@ -14,7 +14,7 @@ public class PostureFlight extends MotionCompositor implements PonyPosture<Playe
} }
@Override @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)); model.setPitch((float) calculateIncline(player, motionX, motionY, motionZ));
GlStateManager.rotatef(model.getPitch(), 1, 0, 0); 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.client.model.Cuboid;
import net.minecraft.entity.LivingEntity; 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 net.minecraft.util.math.MathHelper;
import com.google.gson.annotations.Expose; import com.google.gson.annotations.Expose;
import com.minelittlepony.common.SensibleConfig;
/** /**
* Storage container for MineLP client settings. * Storage container for MineLP client settings.
*/ */
public abstract class PonyConfig extends SensibleConfig { public abstract class PonyConfig extends SensibleJsonConfig {
@Expose private PonyLevel ponylevel = PonyLevel.PONIES; @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);
}
}