mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2025-02-13 08:14:23 +01:00
It's ALIVE!
This commit is contained in:
parent
ed7f922403
commit
145d8f41a3
29 changed files with 492 additions and 175 deletions
|
@ -5,10 +5,10 @@ import java.util.function.Function;
|
|||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.minelittlepony.client.model.IPonyModel;
|
||||
import com.minelittlepony.client.model.PlayerModelKey;
|
||||
import com.minelittlepony.client.model.entity.race.PlayerModels;
|
||||
import com.minelittlepony.client.render.LevitatingItemRenderer;
|
||||
import com.minelittlepony.client.render.entity.MobRenderers;
|
||||
import com.minelittlepony.client.render.entity.RenderPonyPlayer;
|
||||
import com.minelittlepony.client.render.IPonyRender;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -16,11 +16,9 @@ import javax.annotation.Nullable;
|
|||
import com.minelittlepony.common.mixin.MixinEntityRenderDispatcher;
|
||||
import com.minelittlepony.mson.api.Mson;
|
||||
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
|
||||
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.PlayerEntityRenderer;
|
||||
import net.minecraft.client.render.entity.model.EntityModel;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityType;
|
||||
|
@ -62,14 +60,11 @@ public class PonyRenderManager {
|
|||
}
|
||||
|
||||
private void addPlayerSkin(EntityRenderDispatcher manager, boolean slimArms, PlayerModels playerModel) {
|
||||
RenderPonyPlayer renderer = playerModel.createRenderer(manager, slimArms);
|
||||
|
||||
addPlayerRenderer(playerModel.getId(slimArms), renderer);
|
||||
}
|
||||
PlayerModelKey<?, ?>.Key key = playerModel.getModelKey().getKey(slimArms);
|
||||
String id = playerModel.getId(slimArms);
|
||||
|
||||
private static void addPlayerRenderer(String modelType, PlayerEntityRenderer renderer) {
|
||||
EntityRenderDispatcher mx = MinecraftClient.getInstance().getEntityRenderManager();
|
||||
((MixinEntityRenderDispatcher)mx).getPlayerRenderers().put(modelType, renderer);
|
||||
Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer(id, key.getFactory());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -95,20 +90,6 @@ public class PonyRenderManager {
|
|||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public <T extends Entity, V extends T> void switchRenderer(boolean state, EntityType<V> type, EntityRendererRegistry.Factory factory) {
|
||||
if (state) {
|
||||
if (!renderMap.containsKey(type)) {
|
||||
renderMap.put(type, ((MixinEntityRenderDispatcher)MinecraftClient.getInstance().getEntityRenderManager()).getEntityRenderers().get(type));
|
||||
}
|
||||
EntityRendererRegistry.INSTANCE.register(type, factory);
|
||||
} else {
|
||||
if (renderMap.containsKey(type)) {
|
||||
EntityRendererRegistry.INSTANCE.register(type, (m, c) -> renderMap.get(type));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public LevitatingItemRenderer getMagicRenderer() {
|
||||
return magicRenderer;
|
||||
}
|
||||
|
|
|
@ -2,8 +2,8 @@ package com.minelittlepony.client.hdskins;
|
|||
|
||||
import com.minelittlepony.client.MineLittlePony;
|
||||
import com.minelittlepony.client.model.ClientPonyModel;
|
||||
import com.minelittlepony.client.model.ModelType;
|
||||
import com.minelittlepony.client.model.ModelWrapper;
|
||||
import com.minelittlepony.client.model.entity.race.PlayerModels;
|
||||
import com.minelittlepony.client.render.IPonyRender;
|
||||
import com.minelittlepony.client.render.RenderPony;
|
||||
import com.minelittlepony.client.render.entity.feature.LayerGear;
|
||||
|
@ -12,10 +12,10 @@ import com.minelittlepony.client.render.entity.feature.LayerPonyArmor;
|
|||
import com.minelittlepony.client.render.entity.feature.LayerPonyElytra;
|
||||
import com.minelittlepony.hdskins.dummy.DummyPlayerRenderer;
|
||||
import com.minelittlepony.hdskins.profile.SkinType;
|
||||
import com.minelittlepony.mson.api.ModelKey;
|
||||
import com.minelittlepony.pony.IPony;
|
||||
import com.minelittlepony.pony.meta.Race;
|
||||
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
|
||||
import net.minecraft.client.render.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.render.entity.feature.FeatureRenderer;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
|
@ -28,18 +28,18 @@ class DummyPonyRenderer extends DummyPlayerRenderer<DummyPony, ClientPonyModel<D
|
|||
|
||||
protected final RenderPony<DummyPony, ClientPonyModel<DummyPony>> renderPony = new RenderPony<>(this);
|
||||
|
||||
public DummyPonyRenderer(EntityRenderDispatcher manager, EntityRendererRegistry.Context context) {
|
||||
super(manager, context);
|
||||
@SuppressWarnings("unchecked")
|
||||
public DummyPonyRenderer(EntityRenderDispatcher manager) {
|
||||
super(manager, null);
|
||||
addFeature(new LayerGear<>(this));
|
||||
|
||||
renderPony.setPonyModel((ModelKey<ClientPonyModel<DummyPony>>)(Object)ModelType.EARTH_PONY.getKey(false));
|
||||
renderPony.setSkipBlend();
|
||||
}
|
||||
|
||||
private ModelWrapper<DummyPony, ClientPonyModel<DummyPony>> playerModel;
|
||||
|
||||
@Override
|
||||
public ModelWrapper<DummyPony, ClientPonyModel<DummyPony>> getModelWrapper() {
|
||||
return playerModel;
|
||||
return renderPony.playerModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -78,12 +78,11 @@ class DummyPonyRenderer extends DummyPlayerRenderer<DummyPony, ClientPonyModel<D
|
|||
|
||||
boolean canWet = playermodel.wet && (loc == playermodel.getTextures().getBlankSkin(SkinType.SKIN) || race == Race.SEAPONY);
|
||||
|
||||
playerModel = canWet ? PlayerModels.SEAPONY.getWrappedModel(slim) : PlayerModels.forRace(thePony.getRace(true)).getWrappedModel(slim);
|
||||
playerModel.apply(thePony.getMetadata());
|
||||
|
||||
renderPony.setPonyModel(playerModel);
|
||||
@SuppressWarnings("unchecked")
|
||||
ModelKey<? extends ClientPonyModel<DummyPony>> key = (ModelKey<? extends ClientPonyModel<DummyPony>>)(canWet ? ModelType.SEA_PONY.getKey(slim) : ModelType.getPlayerModel(thePony.getRace(true)).getKey(slim));
|
||||
|
||||
return playerModel.getBody();
|
||||
return renderPony.setPonyModel(key).apply(thePony.getMetadata()).getBody();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -5,8 +5,8 @@ import com.minelittlepony.client.SkinsProxy;
|
|||
import com.minelittlepony.common.event.ClientReadyCallback;
|
||||
import com.minelittlepony.hdskins.SkinCacheClearCallback;
|
||||
import com.minelittlepony.hdskins.dummy.DummyPlayer;
|
||||
import com.minelittlepony.mson.api.Mson;
|
||||
|
||||
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
|
||||
import com.minelittlepony.client.pony.PonyManager;
|
||||
|
@ -23,7 +23,7 @@ class MineLPHDSkins {
|
|||
ClientReadyCallback.EVENT.register(this::postInit);
|
||||
|
||||
// Preview on the select skin gui
|
||||
EntityRendererRegistry.INSTANCE.register(DummyPlayer.TYPE, DummyPonyRenderer::new);
|
||||
Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(DummyPlayer.TYPE, DummyPonyRenderer::new);
|
||||
}
|
||||
|
||||
private void postInit(MinecraftClient minecraft) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.minelittlepony.client.model;
|
||||
|
||||
import net.minecraft.client.model.Model;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.mob.VexEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
|
@ -16,17 +17,28 @@ import com.minelittlepony.client.model.entity.ModelZombiePony;
|
|||
import com.minelittlepony.client.model.entity.ModelZombieVillagerPony;
|
||||
import com.minelittlepony.client.model.entity.race.ModelAlicorn;
|
||||
import com.minelittlepony.client.model.entity.race.ModelChangeling;
|
||||
import com.minelittlepony.client.model.entity.race.ModelEarthPony;
|
||||
import com.minelittlepony.client.model.entity.race.ModelPegasus;
|
||||
import com.minelittlepony.client.model.entity.race.ModelUnicorn;
|
||||
import com.minelittlepony.client.model.entity.race.ModelZebra;
|
||||
import com.minelittlepony.client.render.entity.RenderPonyPlayer;
|
||||
import com.minelittlepony.client.render.entity.RenderSeaponyPlayer;
|
||||
import com.minelittlepony.mson.api.ModelKey;
|
||||
import com.minelittlepony.mson.api.Mson;
|
||||
import com.minelittlepony.mson.api.MsonModel;
|
||||
import com.minelittlepony.pony.meta.Race;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public final class ModelType {
|
||||
|
||||
private static final Map<Race, PlayerModelKey<?, ?>> PLAYER_MODELS = new HashMap<>();
|
||||
|
||||
public static final ModelKey<ModelVillagerPony<?>> VILLAGER = register("villager", ModelVillagerPony::new);
|
||||
public static final ModelKey<ModelWitchPony> WITCH = register("witch", ModelWitchPony::new);
|
||||
public static final ModelKey<ModelZombiePony<?>> ZOMBIE = register("zombie", ModelZombiePony::new);
|
||||
|
@ -38,20 +50,39 @@ public final class ModelType {
|
|||
public static final ModelKey<ModelEnderStallion> ENDERMAN = register("enderman", ModelEnderStallion::new);
|
||||
public static final ModelKey<ModelBreezie<VexEntity>> BREEZIE = register("breezie", ModelBreezie::new);
|
||||
|
||||
public static final PlayerModelKey<ModelAlicorn<?>> ALICORN = registerPlayer("alicorn", ModelAlicorn::new);
|
||||
public static final PlayerModelKey<ModelUnicorn<?>> UNICORN = registerPlayer("unicorn", ModelUnicorn::new);
|
||||
public static final PlayerModelKey<ModelPegasus<?>> PEGASUS = registerPlayer("pegasus", ModelPegasus::new);
|
||||
public static final PlayerModelKey<ModelPegasus<?>> BAT_PONY = registerPlayer("batpony", ModelPegasus::new);
|
||||
public static final PlayerModelKey<ModelChangeling<?>> CHANGELING = registerPlayer("changeling", ModelChangeling::new);
|
||||
public static final PlayerModelKey<ModelZebra<?>> ZEBRA = registerPlayer("zebra", ModelZebra::new);
|
||||
public static final PlayerModelKey<?, ModelAlicorn<?>> ALICORN = registerPlayer("alicorn", Race.ALICORN, ModelAlicorn::new);
|
||||
public static final PlayerModelKey<?, ModelUnicorn<?>> UNICORN = registerPlayer("unicorn", Race.UNICORN, ModelUnicorn::new);
|
||||
public static final PlayerModelKey<?, ModelUnicorn<?>> KIRIN = registerPlayer("kirin", Race.KIRIN, ModelUnicorn::new);
|
||||
public static final PlayerModelKey<?, ModelPegasus<?>> PEGASUS = registerPlayer("pegasus", Race.PEGASUS, ModelPegasus::new);
|
||||
public static final PlayerModelKey<?, ModelPegasus<?>> GRYPHON = registerPlayer("gryphon", Race.GRYPHON, ModelPegasus::new);
|
||||
public static final PlayerModelKey<?, ModelPegasus<?>> HIPPOGRIFF = registerPlayer("hippogriff", Race.HIPPOGRIFF, ModelPegasus::new);
|
||||
public static final PlayerModelKey<?, ModelEarthPony<?>> EARTH_PONY = registerPlayer("earth_pony", Race.EARTH, ModelEarthPony::new);
|
||||
public static final PlayerModelKey<?, ModelEarthPony<?>> SEA_PONY = registerPlayer("sea_pony", Race.SEAPONY, ModelEarthPony::new, RenderSeaponyPlayer::new);
|
||||
public static final PlayerModelKey<?, ModelPegasus<?>> BAT_PONY = registerPlayer("bat_pony", Race.BATPONY, ModelPegasus::new);
|
||||
public static final PlayerModelKey<?, ModelChangeling<?>> CHANGELING = registerPlayer("changeling", Race.CHANGELING, ModelChangeling::new);
|
||||
public static final PlayerModelKey<?, ModelChangeling<?>> CHANGEDLING = registerPlayer("reformed_changeling", Race.CHANGEDLING, ModelChangeling::new);
|
||||
public static final PlayerModelKey<?, ModelZebra<?>> ZEBRA = registerPlayer("zebra", Race.ZEBRA, ModelZebra::new);
|
||||
|
||||
static <T extends Model & MsonModel> PlayerModelKey<T> registerPlayer(String name, Function<Boolean, T> constructor) {
|
||||
return new PlayerModelKey<>(new Identifier("minelittlepony", "races/" + name), constructor);
|
||||
static <E extends LivingEntity, T extends Model & MsonModel> PlayerModelKey<E, T> registerPlayer(String name, Race race, Function<Boolean, T> constructor) {
|
||||
return registerPlayer(name, race, constructor, RenderPonyPlayer::new);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static <E extends LivingEntity, T extends Model & MsonModel> PlayerModelKey<E, T> registerPlayer(String name, Race race, Function<Boolean, T> constructor, PlayerModelKey.RendererFactory rendererFactory) {
|
||||
return (PlayerModelKey<E, T>)PLAYER_MODELS.computeIfAbsent(race, r -> {
|
||||
return new PlayerModelKey<>(new Identifier("minelittlepony", "races/" + name), constructor, rendererFactory);
|
||||
});
|
||||
}
|
||||
|
||||
static <T extends Model & MsonModel> ModelKey<T> register(String name, Supplier<T> constructor) {
|
||||
return Mson.getInstance().registerModel(new Identifier("minelittlepony", name), constructor);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Nullable
|
||||
public static <E extends LivingEntity, T extends Model & MsonModel> PlayerModelKey<E, T> getPlayerModel(Race race) {
|
||||
return (PlayerModelKey<E, T>)PLAYER_MODELS.get(race);
|
||||
}
|
||||
|
||||
public static void bootstrap() {};
|
||||
}
|
||||
|
|
|
@ -39,8 +39,9 @@ public class ModelWrapper<T extends LivingEntity, M extends IModel> implements I
|
|||
}
|
||||
|
||||
@Override
|
||||
public void apply(IPonyData meta) {
|
||||
public ModelWrapper<T, M> apply(IPonyData meta) {
|
||||
body.apply(meta);
|
||||
armor.apply(meta);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
package com.minelittlepony.client.model;
|
||||
|
||||
import net.minecraft.client.model.Model;
|
||||
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
||||
import net.minecraft.client.render.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.render.entity.PlayerEntityRenderer;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
import com.minelittlepony.mson.api.ModelKey;
|
||||
|
@ -9,29 +13,32 @@ import com.minelittlepony.mson.api.MsonModel;
|
|||
|
||||
import java.util.function.Function;
|
||||
|
||||
public class PlayerModelKey<T extends Model & MsonModel> {
|
||||
public class PlayerModelKey<T extends LivingEntity, M extends Model & MsonModel> {
|
||||
|
||||
private final ModelKey<T> key;
|
||||
private final ModelKey<M> key;
|
||||
|
||||
private boolean slim;
|
||||
|
||||
public final ModelKey<T> steveKey;
|
||||
public final ModelKey<T> alexKey;
|
||||
private final Key steveKey;
|
||||
private final Key alexKey;
|
||||
|
||||
PlayerModelKey(Identifier id, Function<Boolean, T> factory) {
|
||||
private final RendererFactory rendererFactory;
|
||||
|
||||
PlayerModelKey(Identifier id, Function<Boolean, M> factory, RendererFactory rendererFactory) {
|
||||
this.key = Mson.getInstance().registerModel(id, () -> factory.apply(slim));
|
||||
this.rendererFactory = rendererFactory;
|
||||
|
||||
steveKey = new Key(false);
|
||||
alexKey = new Key(true);
|
||||
}
|
||||
|
||||
public T createModel(boolean slimArms) {
|
||||
return (slimArms ? alexKey : steveKey).createModel();
|
||||
public Key getKey(boolean slimArms) {
|
||||
return slimArms ? alexKey : steveKey;
|
||||
}
|
||||
|
||||
private class Key implements ModelKey<T> {
|
||||
public class Key implements ModelKey<M> {
|
||||
|
||||
private final boolean slim;
|
||||
final boolean slim;
|
||||
|
||||
public Key(boolean slim) {
|
||||
this.slim = slim;
|
||||
|
@ -43,10 +50,18 @@ public class PlayerModelKey<T extends Model & MsonModel> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public T createModel() {
|
||||
public M createModel() {
|
||||
PlayerModelKey.this.slim = this.slim;
|
||||
return key.createModel();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Function<EntityRenderDispatcher, PlayerEntityRenderer> getFactory() {
|
||||
return d -> rendererFactory.create(d, slim, (ModelKey<? extends ClientPonyModel<AbstractClientPlayerEntity>>)this);
|
||||
}
|
||||
}
|
||||
|
||||
public interface RendererFactory {
|
||||
PlayerEntityRenderer create(EntityRenderDispatcher dispatcher, boolean slim, ModelKey<? extends ClientPonyModel<AbstractClientPlayerEntity>> key);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,9 +19,10 @@ public class ArmourWrapper<T extends LivingEntity> implements IEquestrianArmour<
|
|||
}
|
||||
|
||||
@Override
|
||||
public void apply(IPonyData meta) {
|
||||
public ArmourWrapper<T> apply(IPonyData meta) {
|
||||
outerLayer.apply(meta);
|
||||
innerLayer.apply(meta);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,41 +1,27 @@
|
|||
package com.minelittlepony.client.model.entity.race;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.minelittlepony.client.model.ModelWrapper;
|
||||
import com.minelittlepony.client.model.entity.ModelSeapony;
|
||||
import com.minelittlepony.client.render.entity.RenderPonyPlayer;
|
||||
import com.minelittlepony.client.render.entity.RenderSeaponyPlayer;
|
||||
import com.minelittlepony.model.IModel;
|
||||
import com.minelittlepony.client.model.ModelType;
|
||||
import com.minelittlepony.client.model.PlayerModelKey;
|
||||
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.Arrays;
|
||||
import java.util.List;
|
||||
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.
|
||||
*/
|
||||
DEFAULT("default", "slim", Race.HUMAN, ModelEarthPony::new),
|
||||
EARTHPONY(Race.EARTH, ModelEarthPony::new),
|
||||
PEGASUS(Race.PEGASUS, ModelPegasus::new),
|
||||
BATPONY(Race.BATPONY, ModelPegasus::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.getWrappedModel(slimArms), getWrappedModel(slimArms));
|
||||
}
|
||||
};
|
||||
DEFAULT("default", "slim", Race.HUMAN),
|
||||
EARTHPONY(Race.EARTH),
|
||||
PEGASUS(Race.PEGASUS),
|
||||
BATPONY(Race.BATPONY),
|
||||
UNICORN(Race.UNICORN),
|
||||
ALICORN(Race.ALICORN),
|
||||
CHANGELING(Race.CHANGELING),
|
||||
ZEBRA(Race.ZEBRA),
|
||||
SEAPONY(Race.SEAPONY);
|
||||
|
||||
public static final List<PlayerModels> registry = Arrays.asList(values());
|
||||
private static final Map<Race, PlayerModels> raceModelsMap = Maps.newEnumMap(Race.class);
|
||||
|
@ -46,71 +32,34 @@ public enum PlayerModels {
|
|||
}
|
||||
}
|
||||
|
||||
private final Function<Boolean, IModel> resolver;
|
||||
|
||||
private final PendingModel normal;
|
||||
private final PendingModel slim;
|
||||
private final String normal;
|
||||
private final String slim;
|
||||
|
||||
private final Race race;
|
||||
|
||||
PlayerModels(Race race, Function<Boolean, IModel> resolver) {
|
||||
normal = new PendingModel(name().toLowerCase());
|
||||
slim = new PendingModel("slim" + normal.key);
|
||||
|
||||
this.resolver = resolver;
|
||||
PlayerModels(Race race) {
|
||||
normal = name().toLowerCase();
|
||||
slim = "slim" + normal;
|
||||
|
||||
this.race = race;
|
||||
}
|
||||
|
||||
PlayerModels(String normalKey, String slimKey, Race race, Function<Boolean, IModel> resolver) {
|
||||
normal = new PendingModel(normalKey);
|
||||
slim = new PendingModel(slimKey);
|
||||
|
||||
this.resolver = resolver;
|
||||
PlayerModels(String normalKey, String slimKey, Race race) {
|
||||
normal = normalKey;
|
||||
slim = slimKey;
|
||||
|
||||
this.race = race;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public PendingModel getPendingModel(boolean isSlim) {
|
||||
return isSlim ? slim : normal;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public <T extends LivingEntity, M extends IModel> ModelWrapper<T, M> getWrappedModel(boolean isSlim) {
|
||||
return getPendingModel(isSlim).getWrappedModel(isSlim);
|
||||
public PlayerModelKey<?, ?> getModelKey() {
|
||||
return ModelType.getPlayerModel(race);
|
||||
}
|
||||
|
||||
public String getId(boolean isSlim) {
|
||||
return getPendingModel(isSlim).key;
|
||||
}
|
||||
|
||||
public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) {
|
||||
return new RenderPonyPlayer(manager, getWrappedModel(slimArms));
|
||||
return isSlim ? slim : normal;
|
||||
}
|
||||
|
||||
public static PlayerModels forRace(Race race) {
|
||||
return raceModelsMap.getOrDefault(race.getAlias(), DEFAULT);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
private final class PendingModel {
|
||||
@Nullable
|
||||
private ModelWrapper<?, IModel> model;
|
||||
|
||||
private final String key;
|
||||
|
||||
PendingModel(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends LivingEntity, M extends IModel> ModelWrapper<T, M> getWrappedModel(boolean isSlim) {
|
||||
if (model == null) {
|
||||
model = new ModelWrapper<>(resolver.apply(isSlim));
|
||||
}
|
||||
|
||||
return (ModelWrapper<T, M>)model;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.minelittlepony.client.PonyRenderManager;
|
|||
import com.minelittlepony.client.model.IPonyModel;
|
||||
import com.minelittlepony.client.model.ModelWrapper;
|
||||
import com.minelittlepony.client.transform.PonyPosture;
|
||||
import com.minelittlepony.mson.api.ModelKey;
|
||||
import com.minelittlepony.pony.IPony;
|
||||
import com.minelittlepony.util.math.MathUtil;
|
||||
import com.mojang.blaze3d.platform.GlStateManager.DestFactor;
|
||||
|
@ -132,10 +133,10 @@ public class RenderPony<T extends LivingEntity, M extends EntityModel<T> & IPony
|
|||
return playerModel.getBody();
|
||||
}
|
||||
|
||||
public M setPonyModel(ModelWrapper<T, M> model) {
|
||||
playerModel = model;
|
||||
public ModelWrapper<T, M> setPonyModel(ModelKey<? extends M> model) {
|
||||
playerModel = new ModelWrapper<>(model.createModel());
|
||||
|
||||
return getModel();
|
||||
return playerModel;
|
||||
}
|
||||
|
||||
public void updateMetadata(Identifier texture) {
|
||||
|
|
|
@ -38,7 +38,7 @@ public abstract class RenderPonyMob<T extends MobEntity, M extends EntityModel<T
|
|||
public RenderPonyMob(EntityRenderDispatcher manager, ModelKey<? super M> key) {
|
||||
super(manager, (M)key.createModel(), 0.5F);
|
||||
|
||||
this.model = renderPony.setPonyModel(new ModelWrapper<>(model));
|
||||
this.model = renderPony.setPonyModel((ModelKey<M>)key).getBody();
|
||||
|
||||
addLayers();
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ import com.minelittlepony.client.render.entity.feature.LayerPonyCape;
|
|||
import com.minelittlepony.client.render.entity.feature.LayerPonyCustomHead;
|
||||
import com.minelittlepony.client.render.entity.feature.LayerPonyElytra;
|
||||
import com.minelittlepony.model.gear.IGear;
|
||||
import com.minelittlepony.mson.api.ModelKey;
|
||||
import com.minelittlepony.pony.IPony;
|
||||
import com.minelittlepony.pony.meta.Race;
|
||||
|
||||
|
@ -38,10 +39,10 @@ public class RenderPonyPlayer extends PlayerEntityRenderer implements IPonyRende
|
|||
|
||||
protected final RenderPony<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> renderPony = new RenderPony<>(this);
|
||||
|
||||
public RenderPonyPlayer(EntityRenderDispatcher manager, ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> model) {
|
||||
super(manager, false);
|
||||
public RenderPonyPlayer(EntityRenderDispatcher manager, boolean slim, ModelKey<? extends ClientPonyModel<AbstractClientPlayerEntity>> key) {
|
||||
super(manager, slim);
|
||||
|
||||
this.model = renderPony.setPonyModel(model);
|
||||
this.model = renderPony.setPonyModel(key).getBody();
|
||||
|
||||
addLayers();
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ public class RenderPonyTrader extends RenderPonyMob.Caster<WanderingTraderEntity
|
|||
public static final Identifier TEXTURE = new Identifier("minelittlepony", "textures/entity/wandering_trader_pony.png");
|
||||
|
||||
public RenderPonyTrader(EntityRenderDispatcher manager) {
|
||||
super(manager, ModelType.ALICORN.steveKey);
|
||||
super(manager, ModelType.ALICORN.getKey(false));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
package com.minelittlepony.client.render.entity;
|
||||
|
||||
import com.minelittlepony.client.model.ClientPonyModel;
|
||||
import com.minelittlepony.client.model.ModelWrapper;
|
||||
import com.minelittlepony.client.model.ModelType;
|
||||
import com.minelittlepony.mson.api.ModelKey;
|
||||
import com.minelittlepony.pony.IPony;
|
||||
import com.minelittlepony.pony.meta.Race;
|
||||
import com.minelittlepony.util.math.MathUtil;
|
||||
|
||||
import net.minecraft.client.network.AbstractClientPlayerEntity;
|
||||
|
@ -11,16 +13,14 @@ import net.minecraft.particle.ParticleTypes;
|
|||
|
||||
public class RenderSeaponyPlayer extends RenderPonyPlayer {
|
||||
|
||||
protected final ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> seapony;
|
||||
protected final ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> normalPony;
|
||||
protected final ModelKey<? extends ClientPonyModel<AbstractClientPlayerEntity>> seapony;
|
||||
protected final ModelKey<? extends ClientPonyModel<AbstractClientPlayerEntity>> normalPony;
|
||||
|
||||
public RenderSeaponyPlayer(EntityRenderDispatcher manager, boolean useSmallArms,
|
||||
ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> model,
|
||||
ModelWrapper<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>> alternate) {
|
||||
super(manager, model);
|
||||
public RenderSeaponyPlayer(EntityRenderDispatcher manager, boolean slim, ModelKey<? extends ClientPonyModel<AbstractClientPlayerEntity>> key) {
|
||||
super(manager, slim, key);
|
||||
|
||||
seapony = alternate;
|
||||
normalPony = model;
|
||||
seapony = ModelType.<AbstractClientPlayerEntity, ClientPonyModel<AbstractClientPlayerEntity>>getPlayerModel(Race.UNICORN).getKey(slim);
|
||||
normalPony = key;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -29,7 +29,7 @@ public class RenderSeaponyPlayer extends RenderPonyPlayer {
|
|||
|
||||
boolean wet = pony.isPartiallySubmerged(player);
|
||||
|
||||
model = renderPony.setPonyModel(wet ? seapony : normalPony);
|
||||
model = renderPony.setPonyModel(wet ? seapony : normalPony).getBody();
|
||||
|
||||
float state = wet ? 100 : 0;
|
||||
float interpolated = pony.getMetadata().getInterpolator(player.getUuid()).interpolate("seapony_state", state, 5);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.minelittlepony.client.render.entity.feature;
|
||||
|
||||
import com.minelittlepony.client.model.IPonyModel;
|
||||
import com.minelittlepony.client.model.ModelWrapper;
|
||||
import com.minelittlepony.client.render.IPonyRender;
|
||||
|
||||
import net.minecraft.client.render.VertexConsumerProvider;
|
||||
|
@ -42,11 +43,7 @@ public abstract class AbstractPonyLayer<T extends LivingEntity, M extends Entity
|
|||
return (C)context;
|
||||
}
|
||||
|
||||
public M getPlayerModel() {
|
||||
return getContext().getModelWrapper().getBody();
|
||||
}
|
||||
|
||||
public M getMainModel() {
|
||||
return getContext().getModel();
|
||||
public ModelWrapper<T, M> getModelWrapper() {
|
||||
return getContext().getModelWrapper();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,8 +24,11 @@ public class LayerDJPon3Head<T extends AbstractClientPlayerEntity, M extends Ent
|
|||
public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) {
|
||||
if ("deadmau5".equals(entity.getName().getString())) {
|
||||
stack.push();
|
||||
getPlayerModel().transform(BodyPart.HEAD, stack);
|
||||
getPlayerModel().getHead().rotate(stack);
|
||||
|
||||
M body = getModelWrapper().getBody();
|
||||
|
||||
body.transform(BodyPart.HEAD, stack);
|
||||
body.getHead().rotate(stack);
|
||||
|
||||
stack.scale(1.3333334F, 1.3333334F, 1.3333334F);
|
||||
stack.translate(0, 0.3F, 0);
|
||||
|
|
|
@ -51,7 +51,7 @@ public class LayerGear<T extends LivingEntity, M extends EntityModel<T> & IPonyM
|
|||
return;
|
||||
}
|
||||
|
||||
M model = getPlayerModel();
|
||||
M model = getModelWrapper().getBody();
|
||||
|
||||
Map<BodyPart, Float> renderStackingOffsets = new HashMap<>();
|
||||
|
||||
|
|
|
@ -14,8 +14,6 @@ import net.minecraft.entity.LivingEntity;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Arm;
|
||||
|
||||
import static com.mojang.blaze3d.platform.GlStateManager.*;
|
||||
|
||||
public class LayerHeldPonyItem<T extends LivingEntity, M extends EntityModel<T> & IPonyModel<T>> extends AbstractPonyLayer<T, M> {
|
||||
|
||||
public LayerHeldPonyItem(IPonyRender<T, M> livingPony) {
|
||||
|
@ -56,11 +54,11 @@ public class LayerHeldPonyItem<T extends LivingEntity, M extends EntityModel<T>
|
|||
|
||||
private void renderHeldItem(T entity, ItemStack drop, ModelTransformation.Type transform, Arm arm, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv) {
|
||||
if (!drop.isEmpty()) {
|
||||
pushMatrix();
|
||||
stack.push();
|
||||
renderArm(arm, stack);
|
||||
|
||||
if (getMainModel().getAttributes().isCrouching) {
|
||||
translatef(0, 0.2F, 0);
|
||||
if (getModel().getAttributes().isCrouching) {
|
||||
stack.translate(0, 0.2F, 0);
|
||||
}
|
||||
|
||||
float left = arm == Arm.LEFT ? 1 : -1;
|
||||
|
@ -77,7 +75,7 @@ public class LayerHeldPonyItem<T extends LivingEntity, M extends EntityModel<T>
|
|||
MinecraftClient.getInstance().getFirstPersonRenderer().renderItem(entity, drop, transform, arm == Arm.LEFT, stack, renderContext, lightUv);
|
||||
postItemRender(entity, drop, transform, arm, stack, renderContext);
|
||||
|
||||
popMatrix();
|
||||
stack.pop();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -55,8 +55,9 @@ public class LayerPonyElytra<T extends LivingEntity, M extends EntityModel<T> &
|
|||
}
|
||||
|
||||
protected void preRenderCallback(MatrixStack stack) {
|
||||
stack.translate(0, getPlayerModel().getRiderYOffset(), 0.125F);
|
||||
getPlayerModel().transform(BodyPart.BODY, stack);
|
||||
M body = getModelWrapper().getBody();
|
||||
stack.translate(0, body.getRiderYOffset(), 0.125F);
|
||||
body.transform(BodyPart.BODY, stack);
|
||||
}
|
||||
|
||||
protected EntityModel<T> getElytraModel() {
|
||||
|
|
|
@ -6,5 +6,5 @@ public interface IModelWrapper {
|
|||
/**
|
||||
* Updates metadata values to this wrapper's contained models.
|
||||
*/
|
||||
void apply(IPonyData meta);
|
||||
IModelWrapper apply(IPonyData meta);
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ public enum Race implements ITriggerPixelMapped<Race> {
|
|||
CHANGELING (0x282b29, true, true),
|
||||
ZEBRA (0xd0cccf, false, false),
|
||||
CHANGEDLING (0xcaed5a, CHANGELING),
|
||||
GRIFFIN (0xae9145, PEGASUS),
|
||||
GRYPHON (0xae9145, PEGASUS),
|
||||
HIPPOGRIFF (0xd6ddac, PEGASUS),
|
||||
KIRIN (0xfa88af, UNICORN),
|
||||
BATPONY (0xeeeeee, true, false),
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"parent": "minelittlepony:steve_pony",
|
||||
"locals": {
|
||||
"arm_width": 3,
|
||||
"arm_rotation_x": 2,
|
||||
"arm_rotation_y": 8.5
|
||||
}
|
||||
}
|
335
src/main/resources/assets/minelittlepony/models/armour.json
Normal file
335
src/main/resources/assets/minelittlepony/models/armour.json
Normal file
|
@ -0,0 +1,335 @@
|
|||
{
|
||||
"parent": "mson:steve",
|
||||
"texture": {
|
||||
"w": 64, "h": 64
|
||||
},
|
||||
"locals": {
|
||||
"arm_length": 12,
|
||||
"arm_width": 4,
|
||||
"arm_depth": 4,
|
||||
"arm_x": 0,
|
||||
"arm_x_neg": ["#arm_x", "-", "#arm_width"],
|
||||
"arm_z": [2, "-", "#arm_depth"],
|
||||
"arm_rotation_x": 3,
|
||||
"arm_rotation_x_neg": [0, "-", "#arm_rotation_x"],
|
||||
"arm_rotation_y": 8
|
||||
},
|
||||
"head": {
|
||||
"offset": [ 0, -1, -2 ],
|
||||
"center": [ 0, 0, -2 ],
|
||||
"cubes": [
|
||||
{ "from": [-4, -4, -4], "size": [ 8, 8, 8] }
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"type": "mson:slot",
|
||||
"name": "snout",
|
||||
"implementation": "com.minelittlepony.client.model.part.PonySnout",
|
||||
"content": "minelittlepony:components/snout"
|
||||
},
|
||||
{
|
||||
"type": "mson:slot",
|
||||
"name": "ears",
|
||||
"implementation": "com.minelittlepony.client.model.part.PonyEars",
|
||||
"content": "minelittlepony:components/ears"
|
||||
}
|
||||
]
|
||||
},
|
||||
"helmet": {
|
||||
"texture": { "u": 32, "v": 0 },
|
||||
"offset": [ 0, -1, -2 ],
|
||||
"center": [ 0, 0, -2 ],
|
||||
"cubes": [
|
||||
{ "from": [-4, -4, -4], "size": [ 8, 8, 8], "stretch": 0.5 }
|
||||
]
|
||||
},
|
||||
"torso": {
|
||||
"texture": { "u": 16, "v": 16 },
|
||||
"cubes": [
|
||||
{ "from": [-4, 4, -2], "size": [ 8, 8, 4] }
|
||||
]
|
||||
},
|
||||
"upper_torso": {
|
||||
"texture": { "u": 24, "v": 0 },
|
||||
"offset": [ 0, 8, 6 ],
|
||||
"cubes": [
|
||||
{
|
||||
"type": "mson:plane", "__comment": "body sides",
|
||||
"texture": { "u": 24, "v": 0 },
|
||||
"face": "east",
|
||||
"position": [ 4, -4, -4 ], "size": [ 8, 8 ]
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "body sides",
|
||||
"texture": { "u": 24, "v": 0 },
|
||||
"mirror": [ false, false, true ],
|
||||
"face": "west",
|
||||
"position": [ -4, -4, -4 ], "size": [ 8, 8 ]
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "cutie mark",
|
||||
"texture": { "u": 4, "v": 0 },
|
||||
"face": "east",
|
||||
"position": [ 4, -4, 4 ], "size": [ 8, 4 ]
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "cutie mark",
|
||||
"texture": { "u": 4, "v": 0 },
|
||||
"mirror": [ false, false, true ],
|
||||
"face": "east",
|
||||
"position": [ -4, -4, 4 ], "size": [ 8, 4 ]
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "stomach",
|
||||
"texture": { "u": 56, "v": 0 },
|
||||
"face": "down",
|
||||
"position": [ -4, 4, -4 ],
|
||||
"size": [ 8, 8 ]
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "butt",
|
||||
"texture": { "u": 36, "v": 16 },
|
||||
"face": "south",
|
||||
"position": [ -4, -4, 8 ], "size": [ 8, 4 ]
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "butt",
|
||||
"texture": { "u": 36, "v": 16 },
|
||||
"face": "south",
|
||||
"position": [ -4, 0, 8 ],
|
||||
"size": [ 8, 4 ]
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "butt",
|
||||
"texture": { "u": 36, "v": 16 },
|
||||
"face": "down",
|
||||
"position": [ -4, 4, 4 ], "size": [ 8, 4 ]
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "back",
|
||||
"texture": { "u": 32, "v": 20 },
|
||||
"mirror": [ false, false, true ],
|
||||
"face": "up",
|
||||
"position": [ -4, -4, -4 ], "size": [ 8, 12 ]
|
||||
}
|
||||
],
|
||||
"children": [
|
||||
{
|
||||
"type": "mson:planar",
|
||||
"texture": { "u": 32, "v": 0 },
|
||||
"rotate": [0.5, 0, 0],
|
||||
"up": [-1, 2, 2, 2, 6],
|
||||
"down": [-1, 4, 2, 2, 6],
|
||||
"east": [ 1, 2, 2, 2, 6],
|
||||
"south":[-1, 2, 8, 2, 2],
|
||||
"cubes": [
|
||||
{
|
||||
"type": "mson:plane",
|
||||
"mirror": [ false, false, true ],
|
||||
"face": "west",
|
||||
"position": [ -1, -2, -2 ], "size": [ 2, 6 ]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"neck": {
|
||||
"type": "mson:planar",
|
||||
"texture": { "u": 0, "v": 16 },
|
||||
"rotate": [0.166, 0, 0],
|
||||
"north": [-2, 1.199998, -2.8, 4, 4],
|
||||
"south": [-2, 1.199998, 1.2, 4, 4],
|
||||
"east": [ 2, 1.199998, -2.8, 4, 4],
|
||||
"west": [-2, 1.199998, -2.8, 4, 4]
|
||||
},
|
||||
"jacket": {
|
||||
"texture": { "u": 16, "v": 32 },
|
||||
"cubes": [
|
||||
{ "from": [-4, 0, -2], "size": [ 8, 12, 4], "stretch": 0.25 },
|
||||
{ "from": [-4, 4, -2], "size": [ 8, 8, 4 ], "stretch": 0.25 }
|
||||
]
|
||||
},
|
||||
"saddle": {
|
||||
"texture": { "u": 24, "v": 0 },
|
||||
"offset": [0, 8, 6],
|
||||
"cubes": [
|
||||
{
|
||||
"type": "mson:plane", "__comment": "body sides a",
|
||||
"texture": { "u": 12, "v": 32 },
|
||||
"face": "east",
|
||||
"position": [ 4, -4, -4 ], "size": [ 4, 8 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "body sides a",
|
||||
"texture": { "u": 12, "v": 32 },
|
||||
"mirror": [ false, false, true ],
|
||||
"face": "west",
|
||||
"position": [ -4, -4, -4 ], "size": [ 4, 8 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "body sides b",
|
||||
"texture": { "u": 12, "v": 48 },
|
||||
"face": "east",
|
||||
"position": [ 4, 0, -4 ], "size": [ 4, 8 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "body sides b",
|
||||
"mirror": [ false, false, true ],
|
||||
"texture": { "u": 12, "v": 48 },
|
||||
"face": "west",
|
||||
"position": [ -4, 0, -4 ], "size": [ 4, 8 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "qt mark a",
|
||||
"texture": { "u": 0, "v": 32 },
|
||||
"face": "east",
|
||||
"position": [ 4, -4, 4 ], "size": [ 4, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "qt mark a",
|
||||
"mirror": [ false, false, true ],
|
||||
"texture": { "u": 0, "v": 32 },
|
||||
"face": "west",
|
||||
"position": [ -4, -4, 4 ], "size": [ 4, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "qt mark b",
|
||||
"texture": { "u": 0, "v": 48 },
|
||||
"face": "east",
|
||||
"position": [ 4, 0, 4 ], "size": [ 4, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "qt mark b",
|
||||
"texture": { "u": 0, "v": 48 },
|
||||
"face": "west",
|
||||
"position": [ -4, 0, 4 ], "size": [ 4, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "stomach a",
|
||||
"texture": { "u": 28, "v": 48 },
|
||||
"face": "down",
|
||||
"position": [ -4, 4, -4 ], "size": [ 8, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "stomach b",
|
||||
"texture": { "u": 44, "v": 48 },
|
||||
"face": "down",
|
||||
"position": [ -4, 4, 0 ], "size": [ 8, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "stomach c",
|
||||
"texture": { "u": 36, "v": 32 },
|
||||
"face": "down",
|
||||
"position": [ -4, 4, 4 ], "size": [ 8, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "butt",
|
||||
"texture": { "u": 36, "v": 32 },
|
||||
"face": "south",
|
||||
"position": [ -4, -4, 8 ], "size": [ 8, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "butt",
|
||||
"texture": { "u": 36, "v": 32 },
|
||||
"face": "south",
|
||||
"position": [ -4, 0, 8 ], "size": [ 8, 4 ], "stretch": 0.25
|
||||
},
|
||||
{
|
||||
"type": "mson:plane", "__comment": "back",
|
||||
"texture": { "u": 32, "v": 36 },
|
||||
"face": "up",
|
||||
"position": [ -4, -4, -4 ], "size": [ 8, 12 ], "stretch": 0.25
|
||||
}
|
||||
]
|
||||
},
|
||||
"tail": {
|
||||
"type": "mson:slot",
|
||||
"name": "tail",
|
||||
"implementation": "com.minelittlepony.client.model.part.PonyTail",
|
||||
"content": "minelittlepony:components/tail"
|
||||
},
|
||||
"right_arm": {
|
||||
"center": ["#arm_rotation_x_neg", "#arm_rotation_y", 0],
|
||||
"texture": { "u": 40, "v": 16 },
|
||||
"cubes": [
|
||||
{
|
||||
"from": [ "#arm_x_neg", 4, "#arm_z"],
|
||||
"size": [ "#arm_width", "#arm_length", "#arm_depth" ]
|
||||
}
|
||||
]
|
||||
},
|
||||
"left_arm": {
|
||||
"center": ["#arm_rotation_x", "#arm_rotation_y", 0],
|
||||
"texture": { "u": 32, "v": 48 },
|
||||
"cubes": [
|
||||
{
|
||||
"from": [ "#arm_x", 4, "#arm_z"],
|
||||
"size": [ "#arm_width", "#arm_length", "#arm_depth" ]
|
||||
}
|
||||
]
|
||||
},
|
||||
"right_leg": {
|
||||
"center": ["#arm_rotation_x_neg", 0, 0],
|
||||
"texture": { "u": 0, "v": 16 },
|
||||
"cubes": [
|
||||
{
|
||||
"from": [ "#arm_x_neg", 4, "#arm_z"],
|
||||
"size": [ "#arm_width", "#arm_length", "#arm_depth" ]
|
||||
}
|
||||
]
|
||||
},
|
||||
"left_leg": {
|
||||
"center": ["#arm_rotation_x", 0, 0],
|
||||
"texture": { "u": 16, "v": 48 },
|
||||
"cubes": [
|
||||
{
|
||||
"from": [ "#arm_x", 4, "#arm_z"],
|
||||
"size": [ "#arm_width", "#arm_length", "#arm_depth" ]
|
||||
}
|
||||
]
|
||||
},
|
||||
"right_sleeve": {
|
||||
"center": ["#arm_rotation_x_neg", "#arm_rotation_y", 0],
|
||||
"texture": { "u": 40, "v": 32 },
|
||||
"cubes": [
|
||||
{
|
||||
"from": [ "#arm_x_neg", 4, "#arm_z"],
|
||||
"size": [ "#arm_width", "#arm_length", "#arm_depth" ],
|
||||
"stretch": 0.25
|
||||
}
|
||||
]
|
||||
},
|
||||
"left_sleeve": {
|
||||
"center": ["#arm_rotation_x", "#arm_rotation_y", 0],
|
||||
"texture": { "u": 48, "v": 48 },
|
||||
"cubes": [
|
||||
{
|
||||
"from": [ "#arm_x", 4, "#arm_z"],
|
||||
"size": [ "#arm_width", "#arm_length", "#arm_depth" ],
|
||||
"stretch": 0.25
|
||||
}
|
||||
]
|
||||
},
|
||||
"right_pant_leg": {
|
||||
"center": ["#arm_rotation_x_neg", 0, 0],
|
||||
"texture": { "u": 0, "v": 32 },
|
||||
"cubes": [
|
||||
{
|
||||
"from": [ "#arm_x_neg", 4, "#arm_z"],
|
||||
"size": [ "#arm_width", "#arm_length", "#arm_depth" ],
|
||||
"stretch": 0.25
|
||||
}
|
||||
]
|
||||
},
|
||||
"left_pant_leg": {
|
||||
"center": ["#arm_rotation_x", 0, 0],
|
||||
"texture": { "u": 0, "v": 48 },
|
||||
"cubes": [
|
||||
{
|
||||
"from": [ "#arm_x", 4, "#arm_z"],
|
||||
"size": [ "#arm_width", "#arm_length", "#arm_depth" ],
|
||||
"stretch": 0.25
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"parent": "minelittlepony:seapony"
|
||||
"parent": "minelittlepony:races/sea_pony"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "minelittlepony:steve_pony"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "minelittlepony:races/pegasus"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "minelittlepony:races/pegasus"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "minelittlepony:races/unicorn"
|
||||
}
|
Loading…
Reference in a new issue