Striders are now dragons
|
@ -13,19 +13,7 @@ import com.minelittlepony.api.model.gear.IGear;
|
||||||
import com.minelittlepony.api.pony.meta.Race;
|
import com.minelittlepony.api.pony.meta.Race;
|
||||||
import com.minelittlepony.api.pony.meta.Wearable;
|
import com.minelittlepony.api.pony.meta.Wearable;
|
||||||
import com.minelittlepony.client.model.armour.PonyArmourModel;
|
import com.minelittlepony.client.model.armour.PonyArmourModel;
|
||||||
import com.minelittlepony.client.model.entity.BreezieModel;
|
import com.minelittlepony.client.model.entity.*;
|
||||||
import com.minelittlepony.client.model.entity.EnderStallionModel;
|
|
||||||
import com.minelittlepony.client.model.entity.GuardianPonyModel;
|
|
||||||
import com.minelittlepony.client.model.entity.IllagerPonyModel;
|
|
||||||
import com.minelittlepony.client.model.entity.ParaspriteModel;
|
|
||||||
import com.minelittlepony.client.model.entity.PiglinPonyModel;
|
|
||||||
import com.minelittlepony.client.model.entity.PillagerPonyModel;
|
|
||||||
import com.minelittlepony.client.model.entity.PonyArmourStandModel;
|
|
||||||
import com.minelittlepony.client.model.entity.SkeleponyModel;
|
|
||||||
import com.minelittlepony.client.model.entity.VillagerPonyModel;
|
|
||||||
import com.minelittlepony.client.model.entity.WitchPonyModel;
|
|
||||||
import com.minelittlepony.client.model.entity.ZomponyModel;
|
|
||||||
import com.minelittlepony.client.model.entity.ZomponyVillagerModel;
|
|
||||||
import com.minelittlepony.client.model.entity.race.AlicornModel;
|
import com.minelittlepony.client.model.entity.race.AlicornModel;
|
||||||
import com.minelittlepony.client.model.entity.race.ChangelingModel;
|
import com.minelittlepony.client.model.entity.race.ChangelingModel;
|
||||||
import com.minelittlepony.client.model.entity.race.EarthPonyModel;
|
import com.minelittlepony.client.model.entity.race.EarthPonyModel;
|
||||||
|
@ -71,7 +59,8 @@ public final class ModelType {
|
||||||
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<ParaspriteModel<VexEntity>> VEX = register("vex", ParaspriteModel::new);
|
public static final ModelKey<ParaspriteModel<VexEntity>> VEX = register("vex", ParaspriteModel::new);
|
||||||
public static final ModelKey<ParaspriteModel<StriderEntity>> STRIDER = register("strider", ParaspriteModel::new);
|
public static final ModelKey<SpikeModel<StriderEntity>> STRIDER = register("strider", SpikeModel::new);
|
||||||
|
public static final ModelKey<SaddleModel<StriderEntity>> STRIDER_SADDLE = register("strider_saddle", SaddleModel::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);
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.minelittlepony.client.model.entity;
|
||||||
|
|
||||||
|
import net.minecraft.client.model.ModelPart;
|
||||||
|
import net.minecraft.client.render.VertexConsumer;
|
||||||
|
import net.minecraft.client.render.entity.model.EntityModel;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
|
||||||
|
public class SaddleModel<T extends LivingEntity> extends EntityModel<T> {
|
||||||
|
|
||||||
|
private ModelPart root;
|
||||||
|
|
||||||
|
public SaddleModel(ModelPart tree) {
|
||||||
|
root = tree;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAngles(T entity, float move, float swing, float ticks, float headYaw, float headPitch) {
|
||||||
|
root.pivotY = -MathHelper.cos(move * 1.5f) * 2.0f * swing;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
|
||||||
|
root.render(matrices, vertices, light, overlay, red, green, blue, alpha);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,103 @@
|
||||||
|
package com.minelittlepony.client.model.entity;
|
||||||
|
|
||||||
|
import net.minecraft.client.model.ModelPart;
|
||||||
|
import net.minecraft.client.render.entity.model.BipedEntityModel;
|
||||||
|
import net.minecraft.entity.LivingEntity;
|
||||||
|
import net.minecraft.entity.passive.StriderEntity;
|
||||||
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
|
||||||
|
public class SpikeModel<T extends LivingEntity> extends BipedEntityModel<T> {
|
||||||
|
|
||||||
|
private final ModelPart tail;
|
||||||
|
private final ModelPart tail2;
|
||||||
|
private final ModelPart tail3;
|
||||||
|
|
||||||
|
public SpikeModel(ModelPart tree) {
|
||||||
|
super(tree);
|
||||||
|
tail = body.getChild("tail");
|
||||||
|
tail2 = tail.getChild("tail2");
|
||||||
|
tail3 = tail2.getChild("tail3");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAngles(T entity, float move, float swing, float ticks, float headYaw, float headPitch) {
|
||||||
|
swing *= 2;
|
||||||
|
move *= 1.5F;
|
||||||
|
child = false;
|
||||||
|
|
||||||
|
head.pivotX = 0;
|
||||||
|
head.pivotZ = 0;
|
||||||
|
head.pivotY = 0;
|
||||||
|
|
||||||
|
super.setAngles(entity, move, swing, ticks, headYaw, headPitch);
|
||||||
|
|
||||||
|
leftArm.pivotY++;
|
||||||
|
rightArm.pivotY++;
|
||||||
|
body.pitch += 0.15F;
|
||||||
|
|
||||||
|
if ((entity instanceof StriderEntity strider && strider.isSaddled())) {
|
||||||
|
leftArm.pitch = 3.15F;
|
||||||
|
leftArm.yaw = 1;
|
||||||
|
rightArm.pitch = 3.15F;
|
||||||
|
rightArm.yaw = -1;
|
||||||
|
|
||||||
|
head.pivotY += 4;
|
||||||
|
head.pivotZ = -3;
|
||||||
|
hat.pivotY += 4;
|
||||||
|
hat.pivotZ = -3;
|
||||||
|
|
||||||
|
leftLeg.pitch += 0.4F;
|
||||||
|
rightLeg.pitch += 0.4F;
|
||||||
|
} else {
|
||||||
|
float flailAmount = 1 + (float)MathHelper.clamp(entity.getVelocity().y * 10, 0, 7);
|
||||||
|
|
||||||
|
leftArm.roll -= 0.2F * flailAmount;
|
||||||
|
rightArm.roll += 0.2F * flailAmount;
|
||||||
|
|
||||||
|
leftArm.pivotZ += 2;
|
||||||
|
leftArm.pitch -= 0.3F;
|
||||||
|
|
||||||
|
rightArm.pivotZ += 2;
|
||||||
|
rightArm.pitch -= 0.3F;
|
||||||
|
|
||||||
|
if (entity instanceof StriderEntity strider && strider.isCold()) {
|
||||||
|
float armMotion = (float)Math.sin(ticks / 10F) / 10F;
|
||||||
|
|
||||||
|
leftArm.pitch = -1 - armMotion;
|
||||||
|
rightArm.pitch = -1 + armMotion;
|
||||||
|
|
||||||
|
leftArm.yaw = 0.8F;
|
||||||
|
rightArm.yaw = -0.8F;
|
||||||
|
|
||||||
|
leftArm.pivotZ -= 3;
|
||||||
|
rightArm.pivotZ -= 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tail.pitch = (float)Math.sin(move) / 3F - 0.5F;
|
||||||
|
tail2.pitch = -tail.pitch / 2;
|
||||||
|
tail3.pitch = tail2.pitch / 2;
|
||||||
|
|
||||||
|
tail.yaw = (float)Math.sin(ticks / 20F) / 40 + (float)Math.sin(move / 20F) / 4;
|
||||||
|
tail2.yaw = tail.yaw / 2;
|
||||||
|
tail3.yaw = tail2.yaw / 2;
|
||||||
|
|
||||||
|
for (var part : this.getHeadParts()) {
|
||||||
|
part.pivotY += 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var part : this.getBodyParts()) {
|
||||||
|
part.pivotY += 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ import java.util.UUID;
|
||||||
/**
|
/**
|
||||||
* All currently loaded background ponies.
|
* All currently loaded background ponies.
|
||||||
*/
|
*/
|
||||||
class BackgroundPonyList implements VariatedTextureSupplier.VariatedTexture {
|
class BackgroundPonyList {
|
||||||
/**
|
/**
|
||||||
* All currently loaded background ponies.
|
* All currently loaded background ponies.
|
||||||
*/
|
*/
|
||||||
|
@ -25,6 +25,7 @@ class BackgroundPonyList implements VariatedTextureSupplier.VariatedTexture {
|
||||||
|
|
||||||
public BackgroundPonyList(Identifier id) {
|
public BackgroundPonyList(Identifier id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
reloadAll(MinecraftClient.getInstance().getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier getId(UUID uuid) {
|
public Identifier getId(UUID uuid) {
|
||||||
|
@ -47,9 +48,4 @@ class BackgroundPonyList implements VariatedTextureSupplier.VariatedTexture {
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloadListener {
|
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");
|
||||||
|
public static final Identifier BACKGROUND_PONIES = new Identifier("minelittlepony", "textures/entity/pony");
|
||||||
|
|
||||||
private final PonyConfig config;
|
private final PonyConfig config;
|
||||||
|
|
||||||
|
@ -100,7 +101,7 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPony getBackgroundPony(UUID uuid) {
|
public IPony getBackgroundPony(UUID uuid) {
|
||||||
return ((Pony)getPony(MineLittlePony.getInstance().getVariatedTextures().get(VariatedTextureSupplier.BACKGROUND_PONIES).get(uuid))).defaulted();
|
return ((Pony)getPony(MineLittlePony.getInstance().getVariatedTextures().get(BACKGROUND_PONIES, uuid))).defaulted();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -12,21 +12,11 @@ import java.util.UUID;
|
||||||
public class VariatedTextureSupplier implements SimpleSynchronousResourceReloadListener {
|
public class VariatedTextureSupplier implements SimpleSynchronousResourceReloadListener {
|
||||||
private static final Identifier ID = new Identifier("minelittlepony", "variated_textures");
|
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<>();
|
private final Map<Identifier, BackgroundPonyList> entries = new HashMap<>();
|
||||||
|
|
||||||
public VariatedTextureSupplier() {
|
|
||||||
get(BACKGROUND_PONIES);
|
|
||||||
get(BREEZIE_PONIES);
|
|
||||||
get(PARASPRITE_PONIES);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reload(ResourceManager manager) {
|
public void reload(ResourceManager manager) {
|
||||||
entries.forEach((key, value) -> value.reloadAll(manager));
|
entries.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -34,15 +24,15 @@ public class VariatedTextureSupplier implements SimpleSynchronousResourceReloadL
|
||||||
return ID;
|
return ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VariatedTexture get(Identifier id) {
|
private BackgroundPonyList get(Identifier id) {
|
||||||
return entries.computeIfAbsent(id, BackgroundPonyList::new);
|
return entries.computeIfAbsent(id, BackgroundPonyList::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface VariatedTexture {
|
public Identifier get(Identifier poolId, UUID seed) {
|
||||||
Identifier get(UUID uuid);
|
return get(poolId).getId(seed);
|
||||||
|
}
|
||||||
|
|
||||||
default Identifier get(Entity entity) {
|
public Identifier get(Identifier poolId, Entity entity) {
|
||||||
return get(entity.getUuid());
|
return get(poolId, entity.getUuid());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,12 +10,13 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import com.minelittlepony.client.MineLittlePony;
|
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
|
* AKA a breezie :D
|
||||||
*/
|
*/
|
||||||
public class AllayRenderer extends MobEntityRenderer<AllayEntity, BreezieModel<AllayEntity>> {
|
public class AllayRenderer extends MobEntityRenderer<AllayEntity, BreezieModel<AllayEntity>> {
|
||||||
|
public static final Identifier BREEZIE_PONIES = new Identifier("minelittlepony", "textures/entity/allay/pony");
|
||||||
|
|
||||||
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()));
|
||||||
|
@ -23,7 +24,7 @@ public class AllayRenderer extends MobEntityRenderer<AllayEntity, BreezieModel<A
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Identifier getTexture(AllayEntity allayEntity) {
|
public Identifier getTexture(AllayEntity allayEntity) {
|
||||||
return MineLittlePony.getInstance().getVariatedTextures().get(VariatedTextureSupplier.BREEZIE_PONIES).get(allayEntity);
|
return MineLittlePony.getInstance().getVariatedTextures().get(BREEZIE_PONIES, allayEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -3,27 +3,28 @@ package com.minelittlepony.client.render.entity;
|
||||||
import net.minecraft.client.render.entity.EntityRendererFactory;
|
import net.minecraft.client.render.entity.EntityRendererFactory;
|
||||||
import net.minecraft.client.render.entity.MobEntityRenderer;
|
import net.minecraft.client.render.entity.MobEntityRenderer;
|
||||||
import net.minecraft.client.render.entity.feature.SaddleFeatureRenderer;
|
import net.minecraft.client.render.entity.feature.SaddleFeatureRenderer;
|
||||||
|
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.passive.StriderEntity;
|
||||||
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.ParaspriteModel;
|
|
||||||
|
|
||||||
public class StriderRenderer extends MobEntityRenderer<StriderEntity, ParaspriteModel<StriderEntity>> {
|
public class StriderRenderer extends MobEntityRenderer<StriderEntity, EntityModel<StriderEntity>> {
|
||||||
private static final Identifier NORMAL = new Identifier("minelittlepony", "textures/entity/strider/strider_pony.png");
|
public static final Identifier DRAGON_PONIES = new Identifier("minelittlepony", "textures/entity/strider/pony");
|
||||||
private static final Identifier CONFUSED = new Identifier("minelittlepony", "textures/entity/strider/strider_confused_pony.png");
|
public static final Identifier COLD_DRAGON_PONIES = new Identifier("minelittlepony", "textures/entity/strider/cold_pony");
|
||||||
|
|
||||||
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 StriderRenderer(EntityRendererFactory.Context context) {
|
public StriderRenderer(EntityRendererFactory.Context context) {
|
||||||
super(context, ModelType.STRIDER.createModel(), 0.5F);
|
super(context, ModelType.STRIDER.createModel(), 0.5F);
|
||||||
addFeature(new SaddleFeatureRenderer<>(this, ModelType.STRIDER.createModel(), SADDLE));
|
addFeature(new SaddleFeatureRenderer<>(this, ModelType.STRIDER_SADDLE.createModel(), SADDLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Identifier getTexture(StriderEntity entity) {
|
public Identifier getTexture(StriderEntity entity) {
|
||||||
return entity.isCold() ? CONFUSED : NORMAL;
|
return MineLittlePony.getInstance().getVariatedTextures().get(entity.isCold() ? COLD_DRAGON_PONIES : DRAGON_PONIES, entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -8,9 +8,10 @@ import net.minecraft.util.Identifier;
|
||||||
import com.minelittlepony.client.MineLittlePony;
|
import com.minelittlepony.client.MineLittlePony;
|
||||||
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;
|
||||||
import com.minelittlepony.client.pony.VariatedTextureSupplier;
|
|
||||||
|
|
||||||
public class VexRenderer extends MobEntityRenderer<VexEntity, ParaspriteModel<VexEntity>> {
|
public class VexRenderer extends MobEntityRenderer<VexEntity, ParaspriteModel<VexEntity>> {
|
||||||
|
public static final Identifier PARASPRITE_PONIES = new Identifier("minelittlepony", "textures/entity/illager/vex_pony");
|
||||||
|
|
||||||
public VexRenderer(EntityRendererFactory.Context context) {
|
public VexRenderer(EntityRendererFactory.Context context) {
|
||||||
super(context, ModelType.VEX.createModel(), 0.3F);
|
super(context, ModelType.VEX.createModel(), 0.3F);
|
||||||
}
|
}
|
||||||
|
@ -22,7 +23,7 @@ public class VexRenderer extends MobEntityRenderer<VexEntity, ParaspriteModel<Ve
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Identifier getTexture(VexEntity entity) {
|
public Identifier getTexture(VexEntity entity) {
|
||||||
return MineLittlePony.getInstance().getVariatedTextures().get(VariatedTextureSupplier.PARASPRITE_PONIES).get(entity);
|
return MineLittlePony.getInstance().getVariatedTextures().get(PARASPRITE_PONIES, entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,167 @@
|
||||||
{
|
{
|
||||||
"parent": "minelittlepony:vex",
|
"parent": "mson:steve",
|
||||||
|
"texture": {
|
||||||
|
"w": 64, "h": 64
|
||||||
|
},
|
||||||
"data": {
|
"data": {
|
||||||
"saddle": {
|
"head": {
|
||||||
"pivot": [-4, -4, -4],
|
|
||||||
"texture": {"u": 0, "v": 16},
|
|
||||||
"visible": true,
|
|
||||||
"cubes": [
|
"cubes": [
|
||||||
{"from": [-4, -0.1, -4], "size": [16, 16, 16] }
|
{ "from": [-3, -7, -3], "size": [ 6, 6, 6] },
|
||||||
|
{ "from": [-2, -3, -4.5], "size": [ 4, 2, 2], "texture": { "v": 12 } }
|
||||||
|
],
|
||||||
|
"children": {
|
||||||
|
"left_ear": {
|
||||||
|
"texture": { "u": 18 },
|
||||||
|
"pivot": [2.5, -4, 0],
|
||||||
|
"rotate": [45, 0, 30],
|
||||||
|
"type": "mson:planar",
|
||||||
|
"up": [0, 0, 0, 2, 2, 8, 16 ]
|
||||||
|
},
|
||||||
|
"left_ear_2": {
|
||||||
|
"texture": { "u": 22 },
|
||||||
|
"pivot": [2.5, -4, 0],
|
||||||
|
"rotate": [35, -10, 50],
|
||||||
|
"type": "mson:planar",
|
||||||
|
"up": [0, 0, 0, 2, 2, 8, 16 ]
|
||||||
|
},
|
||||||
|
"right_ear": {
|
||||||
|
"texture": { "u": 18, "v": 2 },
|
||||||
|
"pivot": [-2.5, -4, 0],
|
||||||
|
"rotate": [45, 0, -30],
|
||||||
|
"type": "mson:planar",
|
||||||
|
"up": [-2, 0, 0, 2, 2, 8, 16 ]
|
||||||
|
},
|
||||||
|
"right_ear_2": {
|
||||||
|
"texture": { "u": 22, "v": 2 },
|
||||||
|
"pivot": [-2.5, -4, 0],
|
||||||
|
"rotate": [35, -10, -10],
|
||||||
|
"type": "mson:planar",
|
||||||
|
"up": [-2, 0, 0, 2, 2, 8, 16 ]
|
||||||
|
},
|
||||||
|
"top_spines": {
|
||||||
|
"texture": { "u": 8, "v": 12 },
|
||||||
|
"pivot": [-1, -12, 0],
|
||||||
|
"rotate": [15, 0, 0],
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [0, 1, 0], "size": [ 2, 5, 4], "dilate": -0.1 },
|
||||||
|
{ "from": [0, 0, -4], "size": [ 2, 5, 4] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"back_spines": {
|
||||||
|
"texture": { "u": 8, "v": 12 },
|
||||||
|
"pivot": [-1, -6, 8],
|
||||||
|
"rotate": [-65, 0, 0],
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [0, 0, -4], "size": [ 2, 5, 4], "dilate": -0.2 },
|
||||||
|
{ "from": [0, 2, -1], "size": [ 2, 5, 4], "dilate": -0.3 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hat": {
|
||||||
|
"texture": { "u": 24, "v": 0 },
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [-3, -7, -3], "size": [ 6, 6, 6], "dilate": [0.5, 0.5, 0.5] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"body": {
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [-2, -1, -2], "size": [ 4, 2, 3], "texture": { "v": 21 } },
|
||||||
|
{ "from": [-3, 1, -2.5], "size": [ 6, 4, 5], "texture": { "v": 26 } },
|
||||||
|
{ "from": [-4, 5, -3], "size": [ 8, 8, 8], "texture": { "v": 35 } }
|
||||||
|
],
|
||||||
|
"children": {
|
||||||
|
"spines": {
|
||||||
|
"texture": { "u": 8, "v": 12 },
|
||||||
|
"pivot": [-1, 0, 0],
|
||||||
|
"rotate": [45, 0, 0],
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [0, 0, 0], "size": [ 2, 5, 4], "dilate": -0.4 },
|
||||||
|
{ "from": [0, 2, -3], "size": [ 2, 5, 4], "dilate": -0.4 },
|
||||||
|
{ "from": [0, 4, -4], "size": [ 2, 5, 4], "dilate": -0.4 }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"tail": {
|
||||||
|
"pivot": [-4, 7, 5],
|
||||||
|
"rotate": [-25, 0, 0],
|
||||||
|
"texture": { "v": 51 },
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [2, 0, 0], "size": [ 4, 4, 5] }
|
||||||
|
],
|
||||||
|
"children": {
|
||||||
|
"tail2": {
|
||||||
|
"pivot": [0.5, 0, 3],
|
||||||
|
"rotate": [65, 0, 0],
|
||||||
|
"texture": { "u": 11, "v": 53 },
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [2, 0, -2], "size": [ 3, 3, 7] }
|
||||||
|
],
|
||||||
|
"children": {
|
||||||
|
"spines": {
|
||||||
|
"texture": { "u": 8, "v": 12 },
|
||||||
|
"pivot": [2.5, 3, 5],
|
||||||
|
"rotate": [230, 0, 0],
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [0, 0, -4], "size": [ 2, 5, 4], "dilate": -0.6 },
|
||||||
|
{ "from": [0, 2, -1], "size": [ 2, 5, 4], "dilate": -0.8 }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"tail3": {
|
||||||
|
"pivot": [2.5, 0, 5],
|
||||||
|
"rotate": [-15, 0, 0],
|
||||||
|
"texture": { "u": 0, "v": 60 },
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [0, 0, 0], "size": [ 2, 2, 2] }
|
||||||
|
],
|
||||||
|
"children": {
|
||||||
|
"spines": {
|
||||||
|
"pivot": [-0.5, 0, 3],
|
||||||
|
"rotate": [-10, 45, 0],
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [0, 0, 0], "size": [ 2, 1, 2] }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"right_arm": {
|
||||||
|
"pivot": [-5, 3, 0],
|
||||||
|
"texture": { "u": 24 },
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [-1, -2, -2], "size": [ 3, 3, 3], "texture": { "v": 12 }, "dilate": -0.25 },
|
||||||
|
{ "from": [-0.5, 0.75, -1.5], "size": [ 2, 6, 2], "texture": { "v": 18 } }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"left_arm": {
|
||||||
|
"pivot": [5, 3, 0],
|
||||||
|
"texture": { "u": 40, "v": 16 },
|
||||||
|
"mirror": [true, false, false],
|
||||||
|
"texture": { "u": 36 },
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [-2, -2, -2], "size": [ 3, 3, 3], "texture": { "v": 12 }, "dilate": -0.25 },
|
||||||
|
{ "from": [-1.5, 0.75, -1.5], "size": [ 2, 6, 2], "texture": { "v": 18 } }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"right_leg": {
|
||||||
|
"pivot": [-1.9, 3, 0],
|
||||||
|
"texture": { "u": 24 },
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [-2, 0, -2], "size": [ 3, 4, 3], "texture": { "v": 28 } },
|
||||||
|
{ "from": [-2, 4, -3], "size": [ 3, 1, 4], "texture": { "v": 35 } }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"left_leg": {
|
||||||
|
"pivot": [1.9, 3, 0],
|
||||||
|
"texture": { "u": 38 },
|
||||||
|
"mirror": [true, false, false],
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [-1, 0, -2], "size": [ 3, 4, 3 ], "texture": { "v": 28 } },
|
||||||
|
{ "from": [-1, 4, -3], "size": [ 3, 1, 4], "texture": { "v": 35 } }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"texture": {
|
||||||
|
"w": 64, "h": 64
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"saddle": {
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [-8, -7, -8], "size": [ 16, 13, 16], "dilate": 0.5 }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pillow": {
|
||||||
|
"texture": { "v": 29 },
|
||||||
|
"cubes": [
|
||||||
|
{ "from": [-8, -7, -8], "size": [ 16, 13, 16] }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 7 KiB |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 7 KiB |
After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 5.3 KiB |