Added breezie variants, and vexes are now parasprites with variants

This commit is contained in:
Sollace 2022-06-17 23:42:17 +02:00
parent 07e55b75d3
commit e33881e63d
24 changed files with 296 additions and 212 deletions

View file

@ -4,6 +4,7 @@ import com.minelittlepony.api.pony.IPonyManager;
import com.minelittlepony.api.pony.network.fabric.Channel; import com.minelittlepony.api.pony.network.fabric.Channel;
import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.client.pony.PonyManager; import com.minelittlepony.client.pony.PonyManager;
import com.minelittlepony.client.pony.VariatedTextureSupplier;
import com.minelittlepony.client.render.PonyRenderDispatcher; import com.minelittlepony.client.render.PonyRenderDispatcher;
import com.minelittlepony.client.settings.ClientPonyConfig; import com.minelittlepony.client.settings.ClientPonyConfig;
import com.minelittlepony.common.client.gui.VisibilityMode; import com.minelittlepony.common.client.gui.VisibilityMode;
@ -44,6 +45,7 @@ public class MineLittlePony implements ClientModInitializer {
private ClientPonyConfig config; private ClientPonyConfig config;
private PonyManager ponyManager; private PonyManager ponyManager;
private VariatedTextureSupplier variatedTextures;
private final KeyBinding keyBinding = new KeyBinding("key.minelittlepony.settings", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_F9, "key.categories.misc"); private final KeyBinding keyBinding = new KeyBinding("key.minelittlepony.settings", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_F9, "key.categories.misc");
@ -68,10 +70,12 @@ public class MineLittlePony implements ClientModInitializer {
config = new ClientPonyConfig(GamePaths.getConfigDirectory().resolve("minelp.json")); config = new ClientPonyConfig(GamePaths.getConfigDirectory().resolve("minelp.json"));
ponyManager = new PonyManager(config); ponyManager = new PonyManager(config);
variatedTextures = new VariatedTextureSupplier();
KeyBindingHelper.registerKeyBinding(keyBinding); KeyBindingHelper.registerKeyBinding(keyBinding);
ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(ponyManager); ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(ponyManager);
ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(variatedTextures);
// convert legacy pony skins // convert legacy pony skins
SkinFilterCallback.EVENT.register(new LegacySkinConverter()); SkinFilterCallback.EVENT.register(new LegacySkinConverter());
@ -141,5 +145,9 @@ public class MineLittlePony implements ClientModInitializer {
public IPonyManager getManager() { public IPonyManager getManager() {
return ponyManager; return ponyManager;
} }
public VariatedTextureSupplier getVariatedTextures() {
return variatedTextures;
}
} }

View file

@ -6,6 +6,7 @@ import net.minecraft.client.render.entity.model.ArmorStandEntityModel;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.mob.VexEntity; import net.minecraft.entity.mob.VexEntity;
import net.minecraft.entity.passive.AllayEntity; import net.minecraft.entity.passive.AllayEntity;
import net.minecraft.entity.passive.StriderEntity;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import com.minelittlepony.api.model.gear.IGear; import com.minelittlepony.api.model.gear.IGear;
@ -69,8 +70,8 @@ public final class ModelType {
public static final ModelKey<IllagerPonyModel<?>> ILLAGER = register("illager", IllagerPonyModel::new); public static final ModelKey<IllagerPonyModel<?>> ILLAGER = register("illager", IllagerPonyModel::new);
public static final ModelKey<GuardianPonyModel> GUARDIAN = register("guardian", GuardianPonyModel::new); public static final ModelKey<GuardianPonyModel> GUARDIAN = register("guardian", GuardianPonyModel::new);
public static final ModelKey<EnderStallionModel> ENDERMAN = register("enderman", EnderStallionModel::new); public static final ModelKey<EnderStallionModel> ENDERMAN = register("enderman", EnderStallionModel::new);
public static final ModelKey<BreezieModel<VexEntity>> BREEZIE = register("breezie", BreezieModel::new); public static final ModelKey<ParaspriteModel<VexEntity>> VEX = register("vex", ParaspriteModel::new);
public static final ModelKey<ParaspriteModel> PARASPRITE = register("parasprite", ParaspriteModel::new); public static final ModelKey<ParaspriteModel<StriderEntity>> STRIDER = register("strider", ParaspriteModel::new);
public static final ModelKey<BreezieModel<AllayEntity>> ALLAY = register("allay", BreezieModel::new); public static final ModelKey<BreezieModel<AllayEntity>> ALLAY = register("allay", BreezieModel::new);
public static final ModelKey<PonyElytra<?>> ELYTRA = register("elytra", PonyElytra::new); public static final ModelKey<PonyElytra<?>> ELYTRA = register("elytra", PonyElytra::new);

View file

@ -5,46 +5,64 @@ import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.passive.StriderEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.mob.VexEntity;
public class ParaspriteModel extends EntityModel<StriderEntity> { import com.minelittlepony.common.util.animation.Interpolator;
private ModelPart body; public class ParaspriteModel<T extends LivingEntity> extends EntityModel<T> {
private ModelPart leftWing;
private ModelPart rightWing;
private ModelPart saddle; private final ModelPart root;
private final ModelPart body;
private final ModelPart jaw;
private final ModelPart lips;
private final ModelPart leftWing;
private final ModelPart rightWing;
public ParaspriteModel(ModelPart tree) { public ParaspriteModel(ModelPart tree) {
super(RenderLayer::getEntityTranslucent); super(RenderLayer::getEntityTranslucent);
child = false; child = false;
body = tree; root = tree;
saddle = tree.getChild("saddle"); body = tree.getChild("body");
jaw = body.getChild("jaw");
lips = body.getChild("lips");
leftWing = tree.getChild("leftWing"); leftWing = tree.getChild("leftWing");
rightWing = tree.getChild("rightWing"); rightWing = tree.getChild("rightWing");
} }
@Override @Override
public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
body.render(matrices, vertices, light, overlay, red, green, blue, alpha); root.render(matrices, vertices, light, overlay, red, green, blue, alpha);
saddle.render(matrices, vertices, light, overlay, red, green, blue, alpha);
} }
@Override @Override
public void setAngles(StriderEntity entity, float move, float swing, float ticks, float headYaw, float headPitch) { public void setAngles(T entity, float move, float swing, float ticks, float headYaw, float headPitch) {
body.pitch = 0;
lips.visible = false;
if (entity.hasPassengers()) { if (entity.hasPassengers()) {
body.yaw = 0; root.yaw = 0;
body.pitch = 0; root.pitch = 0;
} else { } else {
body.yaw = headYaw * 0.017453292F; root.yaw = headYaw * 0.017453292F;
body.pitch = headPitch * 0.017453292F; root.pitch = headPitch * 0.017453292F;
} }
saddle.copyTransform(body);
float sin = (float)Math.sin(ticks) / 2; float sin = (float)Math.sin(ticks) / 2;
float cos = (float)Math.cos(ticks) / 3; float cos = (float)Math.cos(ticks) / 3;
float jawOpenAmount = Interpolator.linear(entity.getUuid()).interpolate("jawOpen", entity instanceof VexEntity vex && vex.isCharging() ? 1 : 0, 10);
if (jawOpenAmount > 0) {
jaw.pivotY = Math.max(0, 2 * jawOpenAmount);
lips.pivotY = jaw.pivotY - 1;
lips.visible = true;
body.pitch += 0.3F * jawOpenAmount;
jaw.pitch = 0.6F * jawOpenAmount;
lips.pitch = 0.25F * jawOpenAmount;
}
leftWing.visible = true; leftWing.visible = true;
leftWing.roll = 0.5F + cos; leftWing.roll = 0.5F + cos;
leftWing.yaw = 0.5F - sin; leftWing.yaw = 0.5F - sin;

View file

@ -15,12 +15,18 @@ import java.util.UUID;
/** /**
* All currently loaded background ponies. * All currently loaded background ponies.
*/ */
class BackgroundPonyList { class BackgroundPonyList implements VariatedTextureSupplier.VariatedTexture {
/** /**
* All currently loaded background ponies. * All currently loaded background ponies.
*/ */
private final List<Identifier> backgroundPonyList = new ArrayList<>(); private final List<Identifier> backgroundPonyList = new ArrayList<>();
private final Identifier id;
public BackgroundPonyList(Identifier id) {
this.id = id;
}
public Identifier getId(UUID uuid) { public Identifier getId(UUID uuid) {
if (backgroundPonyList.isEmpty() || isUser(uuid)) { if (backgroundPonyList.isEmpty() || isUser(uuid)) {
return IPonyManager.getDefaultSkin(uuid); return IPonyManager.getDefaultSkin(uuid);
@ -33,12 +39,17 @@ class BackgroundPonyList {
public void reloadAll(ResourceManager resourceManager) { public void reloadAll(ResourceManager resourceManager) {
backgroundPonyList.clear(); backgroundPonyList.clear();
backgroundPonyList.addAll(resourceManager.findResources("textures/entity/pony", path -> path.getPath().endsWith(".png")).keySet()); backgroundPonyList.addAll(resourceManager.findResources(id.getPath(), path -> path.getPath().endsWith(".png")).keySet());
MineLittlePony.logger.info("Detected {} background ponies installed.", backgroundPonyList.size()); MineLittlePony.logger.info("Detected {} ponies installed at {}.", backgroundPonyList.size(), id);
} }
private boolean isUser(UUID uuid) { static boolean isUser(UUID uuid) {
return MinecraftClient.getInstance().player != null return MinecraftClient.getInstance().player != null
&& MinecraftClient.getInstance().player.getUuid().equals(uuid); && MinecraftClient.getInstance().player.getUuid().equals(uuid);
} }
@Override
public Identifier get(UUID uuid) {
return getId(uuid);
}
} }

View file

@ -11,30 +11,25 @@ import com.minelittlepony.settings.PonyConfig;
import com.minelittlepony.settings.PonyLevel; import com.minelittlepony.settings.PonyLevel;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.util.DefaultSkinHelper; import net.minecraft.client.util.DefaultSkinHelper;
import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceManager;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.profiler.Profiler;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
* The PonyManager is responsible for reading and recoding all the pony data associated with an entity of skin. * The PonyManager is responsible for reading and recoding all the pony data associated with an entity of skin.
* *
*/ */
public class PonyManager implements IPonyManager, IdentifiableResourceReloadListener { public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloadListener {
private static final Identifier ID = new Identifier("minelittlepony", "background_ponies"); private static final Identifier ID = new Identifier("minelittlepony", "background_ponies");
private final BackgroundPonyList backgroundPonyList = new BackgroundPonyList();
private final PonyConfig config; private final PonyConfig config;
private final LoadingCache<Identifier, IPony> poniesCache = CacheBuilder.newBuilder() private final LoadingCache<Identifier, IPony> poniesCache = CacheBuilder.newBuilder()
@ -105,7 +100,7 @@ public class PonyManager implements IPonyManager, IdentifiableResourceReloadList
@Override @Override
public IPony getBackgroundPony(UUID uuid) { public IPony getBackgroundPony(UUID uuid) {
return ((Pony)getPony(backgroundPonyList.getId(uuid))).defaulted(); return ((Pony)getPony(MineLittlePony.getInstance().getVariatedTextures().get(VariatedTextureSupplier.BACKGROUND_PONIES).get(uuid))).defaulted();
} }
@Override @Override
@ -119,24 +114,14 @@ public class PonyManager implements IPonyManager, IdentifiableResourceReloadList
} }
@Override @Override
public CompletableFuture<Void> reload(Synchronizer sync, ResourceManager sender, public void reload(ResourceManager var1) {
Profiler serverProfiler, Profiler clientProfiler, clearCache();
Executor serverExecutor, Executor clientExecutor) { PonySkullRenderer.reload();
sync.getClass();
return sync.whenPrepared(null).thenRunAsync(() -> {
clientProfiler.startTick();
clientProfiler.push("Reloading all background ponies");
poniesCache.invalidateAll();
backgroundPonyList.reloadAll(sender);
PonySkullRenderer.reload();
clientProfiler.pop();
clientProfiler.endTick();
}, clientExecutor);
} }
@Override @Override
public Identifier getFabricId() { public Identifier getFabricId() {
return ID; return ID;
} }
} }

View file

@ -0,0 +1,48 @@
package com.minelittlepony.client.pony;
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
import net.minecraft.entity.Entity;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class VariatedTextureSupplier implements SimpleSynchronousResourceReloadListener {
private static final Identifier ID = new Identifier("minelittlepony", "variated_textures");
public static final Identifier BACKGROUND_PONIES = new Identifier("minelittlepony", "textures/entity/pony");
public static final Identifier BREEZIE_PONIES = new Identifier("minelittlepony", "textures/entity/allay/pony");
public static final Identifier PARASPRITE_PONIES = new Identifier("minelittlepony", "textures/entity/illager/vex_pony");
private final Map<Identifier, BackgroundPonyList> entries = new HashMap<>();
public VariatedTextureSupplier() {
get(BACKGROUND_PONIES);
get(BREEZIE_PONIES);
get(PARASPRITE_PONIES);
}
@Override
public void reload(ResourceManager manager) {
entries.forEach((key, value) -> value.reloadAll(manager));
}
@Override
public Identifier getFabricId() {
return ID;
}
public VariatedTexture get(Identifier id) {
return entries.computeIfAbsent(id, BackgroundPonyList::new);
}
public interface VariatedTexture {
Identifier get(UUID uuid);
default Identifier get(Entity entity) {
return get(entity.getUuid());
}
}
}

View file

@ -57,7 +57,7 @@ public final class MobRenderers {
pony.switchRenderer(state, EntityType.ARMOR_STAND, PonyStandRenderer::new); pony.switchRenderer(state, EntityType.ARMOR_STAND, PonyStandRenderer::new);
}); });
public static final MobRenderers STRIDER = register("striders", (state, pony) -> { public static final MobRenderers STRIDER = register("striders", (state, pony) -> {
pony.switchRenderer(state, EntityType.STRIDER, ParaspriteRenderer::new); pony.switchRenderer(state, EntityType.STRIDER, StriderRenderer::new);
}); });
public static final MobRenderers ALLAY = register("allays", (state, pony) -> { public static final MobRenderers ALLAY = register("allays", (state, pony) -> {
pony.switchRenderer(state, EntityType.ALLAY, AllayRenderer::new); pony.switchRenderer(state, EntityType.ALLAY, AllayRenderer::new);

View file

@ -7,12 +7,15 @@ import net.minecraft.entity.passive.AllayEntity;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import com.minelittlepony.client.MineLittlePony;
import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.client.model.entity.BreezieModel; import com.minelittlepony.client.model.entity.BreezieModel;
import com.minelittlepony.client.pony.VariatedTextureSupplier;
/**
* AKA a breezie :D
*/
public class AllayRenderer extends MobEntityRenderer<AllayEntity, BreezieModel<AllayEntity>> { public class AllayRenderer extends MobEntityRenderer<AllayEntity, BreezieModel<AllayEntity>> {
private static final Identifier TEXTURE = new Identifier("minelittlepony", "textures/entity/allay/allay_pony.png");
public AllayRenderer(EntityRendererFactory.Context context) { public AllayRenderer(EntityRendererFactory.Context context) {
super(context, ModelType.ALLAY.createModel(), 0.4f); super(context, ModelType.ALLAY.createModel(), 0.4f);
addFeature(new HeldItemFeatureRenderer<AllayEntity, BreezieModel<AllayEntity>>(this, context.getHeldItemRenderer())); addFeature(new HeldItemFeatureRenderer<AllayEntity, BreezieModel<AllayEntity>>(this, context.getHeldItemRenderer()));
@ -20,7 +23,7 @@ public class AllayRenderer extends MobEntityRenderer<AllayEntity, BreezieModel<A
@Override @Override
public Identifier getTexture(AllayEntity allayEntity) { public Identifier getTexture(AllayEntity allayEntity) {
return TEXTURE; return MineLittlePony.getInstance().getVariatedTextures().get(VariatedTextureSupplier.BREEZIE_PONIES).get(allayEntity);
} }
@Override @Override

View file

@ -10,16 +10,15 @@ import net.minecraft.util.Identifier;
import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.client.model.entity.ParaspriteModel; import com.minelittlepony.client.model.entity.ParaspriteModel;
public class ParaspriteRenderer extends MobEntityRenderer<StriderEntity, ParaspriteModel> { public class StriderRenderer extends MobEntityRenderer<StriderEntity, ParaspriteModel<StriderEntity>> {
private static final Identifier NORMAL = new Identifier("minelittlepony", "textures/entity/strider/strider_pony.png"); private static final Identifier NORMAL = new Identifier("minelittlepony", "textures/entity/strider/strider_pony.png");
private static final Identifier CONFUSED = new Identifier("minelittlepony", "textures/entity/strider/strider_confused_pony.png"); private static final Identifier CONFUSED = new Identifier("minelittlepony", "textures/entity/strider/strider_confused_pony.png");
private static final Identifier SADDLE = new Identifier("minelittlepony", "textures/entity/strider/strider_saddle_pony.png"); private static final Identifier SADDLE = new Identifier("minelittlepony", "textures/entity/strider/strider_saddle_pony.png");
public ParaspriteRenderer(EntityRendererFactory.Context context) { public StriderRenderer(EntityRendererFactory.Context context) {
super(context, ModelType.PARASPRITE.createModel(), 0.5F); super(context, ModelType.STRIDER.createModel(), 0.5F);
addFeature(new SaddleFeatureRenderer<>(this, ModelType.PARASPRITE.createModel(), SADDLE)); addFeature(new SaddleFeatureRenderer<>(this, ModelType.STRIDER.createModel(), SADDLE));
} }
@Override @Override

View file

@ -1,24 +1,18 @@
package com.minelittlepony.client.render.entity; package com.minelittlepony.client.render.entity;
import net.minecraft.client.render.entity.BipedEntityRenderer; import net.minecraft.client.render.entity.*;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.mob.VexEntity; import net.minecraft.entity.mob.VexEntity;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import com.minelittlepony.client.MineLittlePony;
import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.client.model.entity.BreezieModel; import com.minelittlepony.client.model.entity.ParaspriteModel;
import com.minelittlepony.client.pony.VariatedTextureSupplier;
/**
* AKA a breezie :D
*/
public class VexRenderer extends BipedEntityRenderer<VexEntity, BreezieModel<VexEntity>> {
private static final Identifier VEX = new Identifier("minelittlepony", "textures/entity/illager/vex_pony.png");
private static final Identifier VEX_CHARGING = new Identifier("minelittlepony", "textures/entity/illager/vex_charging_pony.png");
public class VexRenderer extends MobEntityRenderer<VexEntity, ParaspriteModel<VexEntity>> {
public VexRenderer(EntityRendererFactory.Context context) { public VexRenderer(EntityRendererFactory.Context context) {
super(context, ModelType.BREEZIE.createModel(), 0.3F); super(context, ModelType.VEX.createModel(), 0.3F);
} }
@Override @Override
@ -28,7 +22,7 @@ public class VexRenderer extends BipedEntityRenderer<VexEntity, BreezieModel<Vex
@Override @Override
public Identifier getTexture(VexEntity entity) { public Identifier getTexture(VexEntity entity) {
return entity.isCharging() ? VEX_CHARGING : VEX; return MineLittlePony.getInstance().getVariatedTextures().get(VariatedTextureSupplier.PARASPRITE_PONIES).get(entity);
} }
} }

View file

@ -1,3 +1,134 @@
{ {
"parent": "minelittlepony:breezie" "parent": "mson:biped",
"texture": {
"w": 64, "h": 64
},
"skeleton": {
"body": {
"neck": {
"head": {}
},
"left_arm": {},
"right_arm": {},
"left_leg": {},
"right_leg": {},
"left_wing": {},
"right_wing": {}
}
},
"data": {
"head": {
"pivot": [0, 1, -4],
"cubes": [
{"from": [-3, -6, -3], "size": [6, 6, 6] },
{"from": [ 2, -7, 1], "size": [1, 1, 1], "texture": {"u": 28, "v": 0} },
{"from": [-3, -7, 1], "size": [1, 1, 1], "texture": {"u": 24, "v": 0} },
{"from": [-1, -2, -4], "size": [2, 2, 1], "texture": {"u": 24, "v": 9} }
],
"children": {
"antennas": {
"rotate": [-15, 0, 0],
"cubes": [
{"from": [ 1, -11, -3], "size": [1, 6, 1], "texture": {"u": 28, "v": 2} },
{"from": [-2, -11, -3], "size": [1, 6, 1], "texture": {"u": 24, "v": 2} }
]
}
}
},
"hat": {
"texture": { "u": 40, "v": 27 },
"pivot": [0, 1, -4],
"children": {
"hat_parts": {
"pivot": [0, 2, 0],
"cubes": [
{"from": [-3, -8, -3], "size": [6, 6, 6], "dilate": 0.2 }
]
}
}
},
"neck": {
"texture": {"u": 40, "v": 0},
"rotate": [5, 0, 0],
"pivot": [-1, -2, -4],
"cubes": [
{"from": [0, 0, 0], "size": [2, 5, 2] }
]
},
"body": {
"texture": {"u": 2, "v": 12},
"pivot": [-3, 2, -3],
"rotate": [-30, 0, 0],
"cubes": [
{"from": [0, 0, 0], "size": [6, 7, 14] }
],
"children": {
"tail": {
"texture": {"u": 40, "v": 7 },
"pivot": [3, 0, 13],
"rotate": [60, 0, 0],
"cubes": [
{"from": [0, 0, 0], "size": [1, 1, 3] }
],
"children": {
"tail_hair": {
"texture": {"u": 32, "v": 0 },
"pivot": [-0.5, -1, 1],
"rotate": [-20, 0, 0],
"cubes": [
{"from": [0, 0, 1], "size": [2, 9, 2] }
]
}
}
}
}
},
"right_arm": {
"pivot": [-3, 8, -5],
"texture": { "u": 36, "v": 12 },
"cubes": [
{ "from": [0, 0, 0], "size": [ 2, 12, 2] }
]
},
"left_arm": {
"pivot": [1, 8, -5],
"texture": { "u": 28, "v": 12 },
"mirror": true,
"cubes": [
{ "from": [0, 0, 0], "size": [ 2, 12, 2] }
]
},
"right_leg": {
"pivot": [-3, 12, 3],
"texture": { "u": 0, "v": 12 },
"cubes": [
{ "from": [0, 0, 0], "size": [ 2, 12, 2] }
]
},
"left_leg": {
"pivot": [1, 12, 3],
"texture": { "u": 8, "v": 12 },
"mirror": true,
"cubes": [
{ "from": [0, 0, 0], "size": [ 2, 12, 2] }
]
},
"left_wing": {
"pivot": [2, 3, 1],
"rotate": [0, -40, 0],
"texture": { "u": 0, "v": 40 },
"cubes": [
{ "from": [0, -12, 0], "size": [ 24, 24, 0] }
]
},
"right_wing": {
"pivot": [-2, 3, 1],
"rotate": [0, 40, 0],
"texture": { "u": 0, "v": 40 },
"mirror": true,
"cubes": [
{ "from": [-22, -12, 0], "size": [ 24, 24, 0] }
]
}
}
} }

View file

@ -1,134 +0,0 @@
{
"parent": "mson:biped",
"texture": {
"w": 64, "h": 64
},
"skeleton": {
"body": {
"neck": {
"head": {}
},
"left_arm": {},
"right_arm": {},
"left_leg": {},
"right_leg": {},
"left_wing": {},
"right_wing": {}
}
},
"data": {
"head": {
"pivot": [0, 1, -4],
"cubes": [
{"from": [-3, -6, -3], "size": [6, 6, 6] },
{"from": [ 2, -7, 1], "size": [1, 1, 1], "texture": {"u": 28, "v": 0} },
{"from": [-3, -7, 1], "size": [1, 1, 1], "texture": {"u": 24, "v": 0} },
{"from": [-1, -2, -4], "size": [2, 2, 1], "texture": {"u": 24, "v": 9} }
],
"children": {
"antennas": {
"rotate": [-15, 0, 0],
"cubes": [
{"from": [ 1, -11, -3], "size": [1, 6, 1], "texture": {"u": 28, "v": 2} },
{"from": [-2, -11, -3], "size": [1, 6, 1], "texture": {"u": 24, "v": 2} }
]
}
}
},
"hat": {
"texture": { "u": 40, "v": 27 },
"pivot": [0, 1, -4],
"children": {
"hat_parts": {
"pivot": [0, 2, 0],
"cubes": [
{"from": [-3, -8, -3], "size": [6, 6, 6], "dilate": 0.2 }
]
}
}
},
"neck": {
"texture": {"u": 40, "v": 0},
"rotate": [5, 0, 0],
"pivot": [-1, -2, -4],
"cubes": [
{"from": [0, 0, 0], "size": [2, 5, 2] }
]
},
"body": {
"texture": {"u": 2, "v": 12},
"pivot": [-3, 2, -3],
"rotate": [-30, 0, 0],
"cubes": [
{"from": [0, 0, 0], "size": [6, 7, 14] }
],
"children": {
"tail": {
"texture": {"u": 40, "v": 7 },
"pivot": [3, 0, 13],
"rotate": [60, 0, 0],
"cubes": [
{"from": [0, 0, 0], "size": [1, 1, 3] }
],
"children": {
"tail_hair": {
"texture": {"u": 32, "v": 0 },
"pivot": [-0.5, -1, 1],
"rotate": [-20, 0, 0],
"cubes": [
{"from": [0, 0, 1], "size": [2, 9, 2] }
]
}
}
}
}
},
"right_arm": {
"pivot": [-3, 8, -5],
"texture": { "u": 36, "v": 12 },
"cubes": [
{ "from": [0, 0, 0], "size": [ 2, 12, 2] }
]
},
"left_arm": {
"pivot": [1, 8, -5],
"texture": { "u": 28, "v": 12 },
"mirror": true,
"cubes": [
{ "from": [0, 0, 0], "size": [ 2, 12, 2] }
]
},
"right_leg": {
"pivot": [-3, 12, 3],
"texture": { "u": 0, "v": 12 },
"cubes": [
{ "from": [0, 0, 0], "size": [ 2, 12, 2] }
]
},
"left_leg": {
"pivot": [1, 12, 3],
"texture": { "u": 8, "v": 12 },
"mirror": true,
"cubes": [
{ "from": [0, 0, 0], "size": [ 2, 12, 2] }
]
},
"left_wing": {
"pivot": [2, 3, 1],
"rotate": [0, -40, 0],
"texture": { "u": 0, "v": 40 },
"cubes": [
{ "from": [0, -12, 0], "size": [ 24, 24, 0] }
]
},
"right_wing": {
"pivot": [-2, 3, 1],
"rotate": [0, 40, 0],
"texture": { "u": 0, "v": 40 },
"mirror": true,
"cubes": [
{ "from": [-22, -12, 0], "size": [ 24, 24, 0] }
]
}
}
}

View file

@ -0,0 +1,13 @@
{
"parent": "minelittlepony:vex",
"data": {
"saddle": {
"pivot": [-4, -4, -4],
"texture": {"u": 0, "v": 16},
"visible": true,
"cubes": [
{"from": [-4, -0.1, -4], "size": [16, 16, 16] }
]
}
}
}

View file

@ -4,10 +4,25 @@
}, },
"data": { "data": {
"body": { "body": {
"pivot": [-4, -4, -4], "pivot": [0, 0, 0],
"cubes": [ "cubes": [
{"from": [0, 0, 0], "size": [8, 8, 8] } {"from": [-4, -4, -4], "size": [8, 5, 8] }
] ],
"children": {
"lips": {
"pivot": [0, 0, 4],
"rotate": [0, 0, 0],
"cubes": [
{"from": [-4, -1, -8], "size": [8, 5, 8], texture: { "u": 0, "v": 24 }, "dilate": -0.1 }
]
},
"jaw": {
"pivot": [0, 0, 4],
"cubes": [
{"from": [-4, 1, -8], "size": [8, 3, 8], texture: { "u": 0, "v": 13 }, "dilate": -0.001 }
]
}
}
}, },
"leftWing": { "leftWing": {
"name": "leftWing", "name": "leftWing",
@ -34,14 +49,6 @@
"size": [ 16, 16 ] "size": [ 16, 16 ]
} }
] ]
},
"saddle": {
"pivot": [-4, -4, -4],
"texture": {"u": 0, "v": 16},
"visible": true,
"cubes": [
{"from": [-4, -0.1, -4], "size": [16, 16, 16] }
]
} }
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB