Added breezie variants, and vexes are now parasprites with variants
|
@ -4,6 +4,7 @@ import com.minelittlepony.api.pony.IPonyManager;
|
|||
import com.minelittlepony.api.pony.network.fabric.Channel;
|
||||
import com.minelittlepony.client.model.ModelType;
|
||||
import com.minelittlepony.client.pony.PonyManager;
|
||||
import com.minelittlepony.client.pony.VariatedTextureSupplier;
|
||||
import com.minelittlepony.client.render.PonyRenderDispatcher;
|
||||
import com.minelittlepony.client.settings.ClientPonyConfig;
|
||||
import com.minelittlepony.common.client.gui.VisibilityMode;
|
||||
|
@ -44,6 +45,7 @@ public class MineLittlePony implements ClientModInitializer {
|
|||
|
||||
private ClientPonyConfig config;
|
||||
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");
|
||||
|
||||
|
@ -68,10 +70,12 @@ public class MineLittlePony implements ClientModInitializer {
|
|||
|
||||
config = new ClientPonyConfig(GamePaths.getConfigDirectory().resolve("minelp.json"));
|
||||
ponyManager = new PonyManager(config);
|
||||
variatedTextures = new VariatedTextureSupplier();
|
||||
|
||||
KeyBindingHelper.registerKeyBinding(keyBinding);
|
||||
|
||||
ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(ponyManager);
|
||||
ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(variatedTextures);
|
||||
|
||||
// convert legacy pony skins
|
||||
SkinFilterCallback.EVENT.register(new LegacySkinConverter());
|
||||
|
@ -141,5 +145,9 @@ public class MineLittlePony implements ClientModInitializer {
|
|||
public IPonyManager getManager() {
|
||||
return ponyManager;
|
||||
}
|
||||
|
||||
public VariatedTextureSupplier getVariatedTextures() {
|
||||
return variatedTextures;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ import net.minecraft.client.render.entity.model.ArmorStandEntityModel;
|
|||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.mob.VexEntity;
|
||||
import net.minecraft.entity.passive.AllayEntity;
|
||||
import net.minecraft.entity.passive.StriderEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
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<GuardianPonyModel> GUARDIAN = register("guardian", GuardianPonyModel::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> PARASPRITE = register("parasprite", 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<BreezieModel<AllayEntity>> ALLAY = register("allay", BreezieModel::new);
|
||||
|
||||
public static final ModelKey<PonyElytra<?>> ELYTRA = register("elytra", PonyElytra::new);
|
||||
|
|
|
@ -5,46 +5,64 @@ import net.minecraft.client.render.RenderLayer;
|
|||
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.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;
|
||||
private ModelPart leftWing;
|
||||
private ModelPart rightWing;
|
||||
public class ParaspriteModel<T extends LivingEntity> extends EntityModel<T> {
|
||||
|
||||
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) {
|
||||
super(RenderLayer::getEntityTranslucent);
|
||||
child = false;
|
||||
body = tree;
|
||||
saddle = tree.getChild("saddle");
|
||||
root = tree;
|
||||
body = tree.getChild("body");
|
||||
jaw = body.getChild("jaw");
|
||||
lips = body.getChild("lips");
|
||||
leftWing = tree.getChild("leftWing");
|
||||
rightWing = tree.getChild("rightWing");
|
||||
}
|
||||
|
||||
@Override
|
||||
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);
|
||||
saddle.render(matrices, vertices, light, overlay, red, green, blue, alpha);
|
||||
root.render(matrices, vertices, light, overlay, red, green, blue, alpha);
|
||||
}
|
||||
|
||||
@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()) {
|
||||
body.yaw = 0;
|
||||
body.pitch = 0;
|
||||
root.yaw = 0;
|
||||
root.pitch = 0;
|
||||
} else {
|
||||
body.yaw = headYaw * 0.017453292F;
|
||||
body.pitch = headPitch * 0.017453292F;
|
||||
root.yaw = headYaw * 0.017453292F;
|
||||
root.pitch = headPitch * 0.017453292F;
|
||||
}
|
||||
saddle.copyTransform(body);
|
||||
|
||||
float sin = (float)Math.sin(ticks) / 2;
|
||||
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.roll = 0.5F + cos;
|
||||
leftWing.yaw = 0.5F - sin;
|
||||
|
|
|
@ -15,12 +15,18 @@ import java.util.UUID;
|
|||
/**
|
||||
* All currently loaded background ponies.
|
||||
*/
|
||||
class BackgroundPonyList {
|
||||
class BackgroundPonyList implements VariatedTextureSupplier.VariatedTexture {
|
||||
/**
|
||||
* All currently loaded background ponies.
|
||||
*/
|
||||
private final List<Identifier> backgroundPonyList = new ArrayList<>();
|
||||
|
||||
private final Identifier id;
|
||||
|
||||
public BackgroundPonyList(Identifier id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Identifier getId(UUID uuid) {
|
||||
if (backgroundPonyList.isEmpty() || isUser(uuid)) {
|
||||
return IPonyManager.getDefaultSkin(uuid);
|
||||
|
@ -33,12 +39,17 @@ class BackgroundPonyList {
|
|||
|
||||
public void reloadAll(ResourceManager resourceManager) {
|
||||
backgroundPonyList.clear();
|
||||
backgroundPonyList.addAll(resourceManager.findResources("textures/entity/pony", path -> path.getPath().endsWith(".png")).keySet());
|
||||
MineLittlePony.logger.info("Detected {} background ponies installed.", backgroundPonyList.size());
|
||||
backgroundPonyList.addAll(resourceManager.findResources(id.getPath(), path -> path.getPath().endsWith(".png")).keySet());
|
||||
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
|
||||
&& MinecraftClient.getInstance().player.getUuid().equals(uuid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Identifier get(UUID uuid) {
|
||||
return getId(uuid);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,30 +11,25 @@ import com.minelittlepony.settings.PonyConfig;
|
|||
import com.minelittlepony.settings.PonyLevel;
|
||||
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.util.DefaultSkinHelper;
|
||||
import net.minecraft.resource.ResourceManager;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.profiler.Profiler;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 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 final BackgroundPonyList backgroundPonyList = new BackgroundPonyList();
|
||||
|
||||
private final PonyConfig config;
|
||||
|
||||
private final LoadingCache<Identifier, IPony> poniesCache = CacheBuilder.newBuilder()
|
||||
|
@ -105,7 +100,7 @@ public class PonyManager implements IPonyManager, IdentifiableResourceReloadList
|
|||
|
||||
@Override
|
||||
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
|
||||
|
@ -119,24 +114,14 @@ public class PonyManager implements IPonyManager, IdentifiableResourceReloadList
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> reload(Synchronizer sync, ResourceManager sender,
|
||||
Profiler serverProfiler, Profiler clientProfiler,
|
||||
Executor serverExecutor, Executor clientExecutor) {
|
||||
|
||||
sync.getClass();
|
||||
return sync.whenPrepared(null).thenRunAsync(() -> {
|
||||
clientProfiler.startTick();
|
||||
clientProfiler.push("Reloading all background ponies");
|
||||
poniesCache.invalidateAll();
|
||||
backgroundPonyList.reloadAll(sender);
|
||||
public void reload(ResourceManager var1) {
|
||||
clearCache();
|
||||
PonySkullRenderer.reload();
|
||||
clientProfiler.pop();
|
||||
clientProfiler.endTick();
|
||||
}, clientExecutor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Identifier getFabricId() {
|
||||
return ID;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -57,7 +57,7 @@ public final class MobRenderers {
|
|||
pony.switchRenderer(state, EntityType.ARMOR_STAND, PonyStandRenderer::new);
|
||||
});
|
||||
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) -> {
|
||||
pony.switchRenderer(state, EntityType.ALLAY, AllayRenderer::new);
|
||||
|
|
|
@ -7,12 +7,15 @@ import net.minecraft.entity.passive.AllayEntity;
|
|||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
import com.minelittlepony.client.MineLittlePony;
|
||||
import com.minelittlepony.client.model.ModelType;
|
||||
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>> {
|
||||
private static final Identifier TEXTURE = new Identifier("minelittlepony", "textures/entity/allay/allay_pony.png");
|
||||
|
||||
public AllayRenderer(EntityRendererFactory.Context context) {
|
||||
super(context, ModelType.ALLAY.createModel(), 0.4f);
|
||||
addFeature(new HeldItemFeatureRenderer<AllayEntity, BreezieModel<AllayEntity>>(this, context.getHeldItemRenderer()));
|
||||
|
@ -20,7 +23,7 @@ public class AllayRenderer extends MobEntityRenderer<AllayEntity, BreezieModel<A
|
|||
|
||||
@Override
|
||||
public Identifier getTexture(AllayEntity allayEntity) {
|
||||
return TEXTURE;
|
||||
return MineLittlePony.getInstance().getVariatedTextures().get(VariatedTextureSupplier.BREEZIE_PONIES).get(allayEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -10,16 +10,15 @@ import net.minecraft.util.Identifier;
|
|||
import com.minelittlepony.client.model.ModelType;
|
||||
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 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");
|
||||
|
||||
public ParaspriteRenderer(EntityRendererFactory.Context context) {
|
||||
super(context, ModelType.PARASPRITE.createModel(), 0.5F);
|
||||
addFeature(new SaddleFeatureRenderer<>(this, ModelType.PARASPRITE.createModel(), SADDLE));
|
||||
public StriderRenderer(EntityRendererFactory.Context context) {
|
||||
super(context, ModelType.STRIDER.createModel(), 0.5F);
|
||||
addFeature(new SaddleFeatureRenderer<>(this, ModelType.STRIDER.createModel(), SADDLE));
|
||||
}
|
||||
|
||||
@Override
|
|
@ -1,24 +1,18 @@
|
|||
package com.minelittlepony.client.render.entity;
|
||||
|
||||
import net.minecraft.client.render.entity.BipedEntityRenderer;
|
||||
import net.minecraft.client.render.entity.EntityRendererFactory;
|
||||
import net.minecraft.client.render.entity.*;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.entity.mob.VexEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
import com.minelittlepony.client.MineLittlePony;
|
||||
import com.minelittlepony.client.model.ModelType;
|
||||
import com.minelittlepony.client.model.entity.BreezieModel;
|
||||
|
||||
/**
|
||||
* 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");
|
||||
import com.minelittlepony.client.model.entity.ParaspriteModel;
|
||||
import com.minelittlepony.client.pony.VariatedTextureSupplier;
|
||||
|
||||
public class VexRenderer extends MobEntityRenderer<VexEntity, ParaspriteModel<VexEntity>> {
|
||||
public VexRenderer(EntityRendererFactory.Context context) {
|
||||
super(context, ModelType.BREEZIE.createModel(), 0.3F);
|
||||
super(context, ModelType.VEX.createModel(), 0.3F);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -28,7 +22,7 @@ public class VexRenderer extends BipedEntityRenderer<VexEntity, BreezieModel<Vex
|
|||
|
||||
@Override
|
||||
public Identifier getTexture(VexEntity entity) {
|
||||
return entity.isCharging() ? VEX_CHARGING : VEX;
|
||||
return MineLittlePony.getInstance().getVariatedTextures().get(VariatedTextureSupplier.PARASPRITE_PONIES).get(entity);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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] }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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] }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
13
src/main/resources/assets/minelittlepony/models/strider.json
Normal 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] }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4,11 +4,26 @@
|
|||
},
|
||||
"data": {
|
||||
"body": {
|
||||
"pivot": [-4, -4, -4],
|
||||
"pivot": [0, 0, 0],
|
||||
"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": {
|
||||
"name": "leftWing",
|
||||
"pivot": [0, -2, 4],
|
||||
|
@ -34,14 +49,6 @@
|
|||
"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] }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 9.9 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 9.9 KiB |
After Width: | Height: | Size: 8 KiB |
After Width: | Height: | Size: 7.5 KiB |