Update skin type ids and implement apis for controlling what skin and model the player gets through mine little pony

This commit is contained in:
Sollace 2024-04-30 18:32:05 +01:00
parent cc463bb293
commit 62d606ada4
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
25 changed files with 171 additions and 111 deletions

View file

@ -7,8 +7,13 @@ import net.minecraft.entity.Entity;
import com.minelittlepony.api.model.PonyModel;
import com.minelittlepony.api.model.ModelAttributes;
/**
* Event triggered when a pony model's state is being evaluated.
* <p>
* Subscribers have the option to read the pony model's attributes or modify them if neccessary to
* allow for custom animations.
*/
public interface PonyModelPrepareCallback {
Event<PonyModelPrepareCallback> EVENT = EventFactory.createArrayBacked(PonyModelPrepareCallback.class, listeners -> (entity, model, mode) -> {
for (PonyModelPrepareCallback event : listeners) {
event.onPonyModelPrepared(entity, model, mode);

View file

@ -0,0 +1,29 @@
package com.minelittlepony.api.events;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
import net.minecraft.entity.Entity;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.api.pony.Pony;
/**
* Event for mods that want to replace the skin being used by a pony.
*/
public interface PonySkinResolver {
Event<PonySkinResolver> EVENT = EventFactory.createArrayBacked(PonySkinResolver.class, listeners -> (entity, pony, result) -> {
for (PonySkinResolver event : listeners) {
result = event.onPonySkinResolving(entity, pony, result);
}
return result;
});
@Nullable
Identifier onPonySkinResolving(Entity entity, PonyLookup ponyLookup, @Nullable Identifier previousResult);
interface PonyLookup {
Pony getPony(Identifier skin);
}
}

View file

@ -1,7 +1,7 @@
package com.minelittlepony.api.model;
public interface PreviewModel {
boolean forceSeapony();
import net.minecraft.util.Identifier;
boolean forceNirik();
public interface PreviewModel {
Identifier getForm();
}

View file

@ -6,16 +6,15 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import com.minelittlepony.api.pony.meta.Race;
import com.minelittlepony.client.MineLittlePony;
import java.util.*;
import java.util.function.Function;
public final class DefaultPonySkinHelper {
public static final Identifier STEVE = MineLittlePony.id("textures/entity/player/wide/steve_pony.png");
public static final Identifier STEVE = id("textures/entity/player/wide/steve_pony.png");
public static final Identifier SEAPONY_SKIN_TYPE_ID = MineLittlePony.id("seapony");
public static final Identifier NIRIK_SKIN_TYPE_ID = MineLittlePony.id("nirik");
public static final Identifier SEAPONY_SKIN_TYPE_ID = id("seapony");
public static final Identifier NIRIK_SKIN_TYPE_ID = id("nirik");
private static final Function<SkinTextures, SkinTextures> SKINS = Util.memoize(original -> new SkinTextures(
new Identifier("minelittlepony", original.texture().getPath().replace(".png", "_pony.png")),
@ -26,6 +25,10 @@ public final class DefaultPonySkinHelper {
false
));
public static Identifier id(String name) {
return new Identifier("minelittlepony", name);
}
public static SkinTextures getTextures(SkinTextures original) {
return SKINS.apply(original);
}

View file

@ -0,0 +1,49 @@
package com.minelittlepony.api.pony;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.client.render.entity.PlayerPonyRenderer;
import java.util.*;
import java.util.function.Predicate;
/**
* The different forms a pony can take.
* <p>
* The default is land, which is your typical pony with four legs.
* Other options are water (seaponies that go shoop-de-doo)
* And Niriks (the burning form of kirins)
*/
public record PonyForm(Identifier id, Predicate<PlayerEntity> shouldApply, RendererFactory<?> factory) {
public static final Identifier DEFAULT = DefaultPonySkinHelper.id("land");
public static final Identifier SEAPONY = DefaultPonySkinHelper.id("seapony");
public static final Identifier NIRIK = DefaultPonySkinHelper.id("nirik");
public static final List<Identifier> VALUES = new ArrayList<>();
public static final Map<Identifier, PonyForm> REGISTRY = new HashMap<>();
public static void register(Identifier id, Predicate<PlayerEntity> shouldApply, RendererFactory<?> factory) {
VALUES.add(0, id);
REGISTRY.put(id, new PonyForm(id, shouldApply, factory));
}
@Nullable
public static PonyForm of(PlayerEntity player) {
for (Identifier id : VALUES) {
PonyForm form = REGISTRY.get(id);
if (form != null && form.shouldApply().test(player)) {
return form;
}
}
return null;
}
public interface RendererFactory<T extends PlayerPonyRenderer> {
T create(EntityRendererFactory.Context context, boolean slimArms);
}
}

View file

@ -86,16 +86,9 @@ public final class PonyPosture {
return isSitting(entity) && getMountPony(entity).map(Pony::race).orElse(Race.HUMAN) != Race.HUMAN;
}
public static boolean isSeaponyModifier(LivingEntity entity) {
if (entity instanceof PreviewModel preview) {
return preview.forceSeapony();
}
return hasSeaponyForm(entity) && isPartiallySubmerged(entity);
}
public static boolean hasSeaponyForm(LivingEntity entity) {
if (entity instanceof PreviewModel preview) {
return preview.forceSeapony();
return preview.getForm() == PonyForm.SEAPONY;
}
return Pony.getManager().getPony(entity).filter(pony -> {
return (pony.race() == Race.SEAPONY
@ -104,17 +97,9 @@ public final class PonyPosture {
}).isPresent();
}
public static boolean isNirikModifier(LivingEntity entity) {
if (entity instanceof PreviewModel preview) {
return preview.forceNirik();
}
return false;
}
public static boolean hasNirikForm(LivingEntity entity) {
if (entity instanceof PreviewModel preview) {
return preview.forceNirik();
return preview.getForm() == PonyForm.NIRIK;
}
return Pony.getManager().getPony(entity).filter(pony -> {
return (pony.race() == Race.KIRIN

View file

@ -1,8 +1,10 @@
package com.minelittlepony.client;
import com.google.common.base.MoreObjects;
import com.google.common.cache.*;
import com.minelittlepony.api.config.PonyConfig;
import com.minelittlepony.api.config.PonyLevel;
import com.minelittlepony.api.events.PonySkinResolver;
import com.minelittlepony.api.pony.*;
import com.minelittlepony.client.render.blockentity.skull.PonySkullRenderer;
@ -50,7 +52,10 @@ public class PonyManagerImpl implements PonyManager, SimpleSynchronousResourceRe
@Override
public Pony getPony(PlayerEntity player) {
return getPony(getSkin(player), player instanceof ForcedPony ? null : player.getGameProfile() == null ? player.getUuid() : player.getGameProfile().getId());
final UUID id = player instanceof ForcedPony ? null : player.getGameProfile() == null ? player.getUuid() : player.getGameProfile().getId();
Identifier skin = getSkin(player);
skin = MoreObjects.firstNonNull(PonySkinResolver.EVENT.invoker().onPonySkinResolving(player, s -> getPony(s, id), skin), skin);
return getPony(skin, id);
}
@Override
@ -59,6 +64,7 @@ public class PonyManagerImpl implements PonyManager, SimpleSynchronousResourceRe
return Optional.of(getPony(player));
}
Identifier skin = getSkin(entity);
skin = MoreObjects.firstNonNull(PonySkinResolver.EVENT.invoker().onPonySkinResolving(entity, s -> getPony(s, null), skin), skin);
return skin == null ? Optional.empty() : Optional.of(getPony(skin, null));
}

View file

@ -1,6 +1,7 @@
package com.minelittlepony.client.compat.hdskins;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.util.Identifier;
import com.minelittlepony.api.model.PreviewModel;
import com.minelittlepony.api.pony.*;
@ -20,12 +21,13 @@ class DummyPony extends DummyPlayer implements PreviewModel, PonyManager.ForcedP
}
@Override
public boolean forceSeapony() {
return getTextures().getPosture().getActiveSkinType() == MineLPHDSkins.seaponySkinType;
}
@Override
public boolean forceNirik() {
return getTextures().getPosture().getActiveSkinType() == MineLPHDSkins.nirikSkinType;
public Identifier getForm() {
if (getTextures().getPosture().getActiveSkinType() == MineLPHDSkins.seaponySkinType) {
return PonyForm.SEAPONY;
}
if (getTextures().getPosture().getActiveSkinType() == MineLPHDSkins.nirikSkinType) {
return PonyForm.NIRIK;
}
return PonyForm.DEFAULT;
}
}

View file

@ -2,7 +2,9 @@ package com.minelittlepony.client.render;
import java.util.function.Function;
import com.google.common.base.Predicates;
import com.minelittlepony.api.model.PonyModel;
import com.minelittlepony.api.model.PreviewModel;
import com.minelittlepony.api.pony.*;
import com.minelittlepony.client.mixin.MixinEntityRenderers;
import com.minelittlepony.client.render.entity.*;
@ -18,7 +20,6 @@ import net.minecraft.client.util.SkinTextures;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.util.Identifier;
/**
* Render manager responsible for replacing and restoring entity renderers when the client settings change.
@ -26,6 +27,17 @@ import net.minecraft.util.Identifier;
public class PonyRenderDispatcher {
private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer();
public PonyRenderDispatcher() {
PonyForm.register(PonyForm.DEFAULT, Predicates.alwaysTrue(), PlayerPonyRenderer::new);
PonyForm.register(PonyForm.SEAPONY, PonyPosture::hasSeaponyForm, (context, slimArms) -> new AquaticPlayerPonyRenderer(context, slimArms, DefaultPonySkinHelper.SEAPONY_SKIN_TYPE_ID, entity -> {
if (entity instanceof PreviewModel preview) {
return preview.getForm() == PonyForm.SEAPONY;
}
return PonyPosture.hasSeaponyForm(entity) && PonyPosture.isPartiallySubmerged(entity);
}));
PonyForm.register(PonyForm.NIRIK, PonyPosture::hasNirikForm, (context, slimArms) -> new FormChangingPlayerPonyRenderer(context, slimArms, DefaultPonySkinHelper.NIRIK_SKIN_TYPE_ID, PonyPosture::hasNirikForm));
}
public LevitatingItemRenderer getMagicRenderer() {
return magicRenderer;
}
@ -34,42 +46,20 @@ public class PonyRenderDispatcher {
* Registers all new player skin types. (currently only pony and slimpony).
*/
public void initialise(EntityRenderDispatcher manager, boolean force) {
for (SkinTextures.Model armShape : SkinTextures.Model.values()) {
addPlayerRenderer(armShape);
}
PonyForm.REGISTRY.values().forEach(form -> {
for (SkinTextures.Model armShape : SkinTextures.Model.values()) {
Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer(
form.id().withSuffixedPath("/" + armShape.getName()),
player -> !Pony.getManager().getPony(player).race().isHuman()
&& player.getSkinTextures().model() == armShape
&& form.shouldApply().test(player) && PonyForm.of(player) == form,
context -> form.factory().create(context, armShape == SkinTextures.Model.SLIM)
);
}
});
MobRenderers.REGISTRY.values().forEach(i -> i.apply(this, force));
}
private void addPlayerRenderer(SkinTextures.Model armShape) {
Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer(
new Identifier("minelittlepony", "sea/" + armShape.getName()),
player -> {
return !Pony.getManager().getPony(player).race().isHuman()
&& PonyPosture.hasSeaponyForm(player)
&& player.getSkinTextures().model() == armShape;
},
context -> new AquaticPlayerPonyRenderer(context, armShape == SkinTextures.Model.SLIM)
);
Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer(
new Identifier("minelittlepony", "nirik/" + armShape.getName()),
player -> {
return !Pony.getManager().getPony(player).race().isHuman()
&& PonyPosture.hasNirikForm(player)
&& player.getSkinTextures().model() == armShape;
},
context -> new FormChangingPlayerPonyRenderer(context, armShape == SkinTextures.Model.SLIM, DefaultPonySkinHelper.NIRIK_SKIN_TYPE_ID, PonyPosture::isNirikModifier)
);
Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer(
new Identifier("minelittlepony", "land/" + armShape.getName()),
player -> {
return !Pony.getManager().getPony(player).race().isHuman()
&& !PonyPosture.hasSeaponyForm(player) && !PonyPosture.hasNirikForm(player)
&& player.getSkinTextures().model() == armShape;
},
context -> new PlayerPonyRenderer(context, armShape == SkinTextures.Model.SLIM)
);
}
/**
*
* Replaces an entity renderer depending on whether we want ponies or not.
@ -80,25 +70,17 @@ public class PonyRenderDispatcher {
* @param <T> The entity type
*/
<T extends Entity, V extends T> void switchRenderer(MobRenderers state, EntityType<V> type, Function<EntityRendererFactory.Context, EntityRenderer<T>> factory) {
Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, ctx -> {
if (!state.get()) {
return MixinEntityRenderers.getRendererFactories().get(type).create(ctx);
}
return factory.apply(ctx);
});
Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(type, ctx -> state.get()
? factory.apply(ctx)
: MixinEntityRenderers.getRendererFactories().get(type).create(ctx)
);
}
@SuppressWarnings("unchecked")
@Nullable
public <T extends LivingEntity, M extends EntityModel<T> & PonyModel<T>> PonyRenderContext<T, M> getPonyRenderer(@Nullable T entity) {
if (entity == null) {
return null;
}
EntityRenderer<?> renderer = MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(entity);
if (renderer instanceof PonyRenderContext) {
return (PonyRenderContext<T, M>) renderer;
if (entity != null && MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(entity) instanceof PonyRenderContext c) {
return c;
}
return null;

View file

@ -5,16 +5,19 @@ import com.minelittlepony.api.pony.*;
import com.minelittlepony.api.pony.meta.Race;
import com.minelittlepony.util.MathUtil;
import java.util.function.Predicate;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.util.Identifier;
public class AquaticPlayerPonyRenderer extends FormChangingPlayerPonyRenderer {
public AquaticPlayerPonyRenderer(EntityRendererFactory.Context context, boolean slim) {
super(context, slim, DefaultPonySkinHelper.SEAPONY_SKIN_TYPE_ID, PonyPosture::isSeaponyModifier);
public AquaticPlayerPonyRenderer(EntityRendererFactory.Context context, boolean slim, Identifier alternateFormSkinId, Predicate<AbstractClientPlayerEntity> formModifierPredicate) {
super(context, slim, alternateFormSkinId, formModifierPredicate);
}
@Override
@ -32,12 +35,12 @@ public class AquaticPlayerPonyRenderer extends FormChangingPlayerPonyRenderer {
@Override
protected Race getPlayerRace(AbstractClientPlayerEntity entity, Pony pony) {
Race race = super.getPlayerRace(entity, pony);
return PonyPosture.isSeaponyModifier(entity) ? Race.SEAPONY : race == Race.SEAPONY ? Race.UNICORN : race;
return transformed ? Race.SEAPONY : race == Race.SEAPONY ? Race.UNICORN : race;
}
@Override
protected void setupTransforms(AbstractClientPlayerEntity player, MatrixStack matrices, float animationProgress, float bodyYaw, float tickDelta, float scale) {
if (PonyPosture.isSeaponyModifier(player)) {
if (transformed) {
matrices.translate(0, 0.6 * scale, 0);
if (player.isInSneakingPose()) {
matrices.translate(0, 0.125 * scale, 0);

View file

@ -1,14 +1,12 @@
package com.minelittlepony.client.render.entity;
import com.minelittlepony.api.model.ModelAttributes;
import com.minelittlepony.api.pony.*;
import java.util.function.Predicate;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Arm;
import net.minecraft.util.Identifier;
public class FormChangingPlayerPonyRenderer extends PlayerPonyRenderer {
@ -33,14 +31,8 @@ public class FormChangingPlayerPonyRenderer extends PlayerPonyRenderer {
}
@Override
public void render(AbstractClientPlayerEntity player, float entityYaw, float tickDelta, MatrixStack stack, VertexConsumerProvider renderContext, int light) {
super.render(player, entityYaw, tickDelta, stack, renderContext, light);
updateForm(player);
}
@Override
protected void renderArm(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, AbstractClientPlayerEntity player, Arm side) {
super.renderArm(stack, renderContext, lightUv, player, side);
protected final void preRender(AbstractClientPlayerEntity player, ModelAttributes.Mode mode) {
super.preRender(player, mode);
updateForm(player);
}

View file

@ -75,10 +75,14 @@ public class PlayerPonyRenderer extends PlayerEntityRenderer implements PonyRend
super.scale(entity, stack, tickDelta);
}
protected void preRender(AbstractClientPlayerEntity player, ModelAttributes.Mode mode) {
manager.preRender(player, mode);
}
@Override
public void render(AbstractClientPlayerEntity entity, float entityYaw, float tickDelta, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv) {
// EntityModelFeatures: We have to force it to use our models otherwise EMF overrides it and breaks pony rendering
manager.preRender(entity, ModelAttributes.Mode.THIRD_PERSON);
preRender(entity, ModelAttributes.Mode.THIRD_PERSON);
shadowRadius = manager.getShadowSize();
super.render(entity, entityYaw, tickDelta, stack, renderContext, lightUv);
DebugBoundingBoxRenderer.render(getEntityPony(entity), this, entity, stack, renderContext, tickDelta);
@ -143,7 +147,7 @@ public class PlayerPonyRenderer extends PlayerEntityRenderer implements PonyRend
}
protected void renderArm(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, AbstractClientPlayerEntity player, Arm side) {
manager.preRender(player, ModelAttributes.Mode.FIRST_PERSON);
preRender(player, ModelAttributes.Mode.FIRST_PERSON);
stack.push();
float reflect = side == Arm.LEFT ? 1 : -1;

View file

@ -50,7 +50,7 @@
"minelp.debug.size": "Grootte ignoreer",
"minelp.debug.race": "Ras oorheersing",
"minelp.debug.armour": "Deaktiveer geponifiseerde pantserteksture",
"skin_type.minelp.seapony": "Seeponie",
"skin_type.minelittlepony.seapony": "Seeponie",
"skin_type.minelittlepony.crown": "Kroon",
"skin_type.minelittlepony.muffin": "Muffin hoed",
"skin_type.minelittlepony.hat": "Hekshoed",

View file

@ -51,7 +51,7 @@
"minelp.debug.size": "Überschreibe Größe",
"minelp.debug.race": "Überschreibe Spezies",
"minelp.debug.armour": "Ponifizierte Rüstungsständer deaktivieren",
"skin_type.minelp.seapony": "Seepony",
"skin_type.minelittlepony.seapony": "Seepony",
"skin_type.minelittlepony.crown": "Krone",
"skin_type.minelittlepony.muffin": "Muffin-Mütze",
"skin_type.minelittlepony.hat": "Hexen Hut",

View file

@ -50,7 +50,7 @@
"minelp.debug.size": "Size Override",
"minelp.debug.race": "Race Override",
"minelp.debug.armour": "Disable ponified armour textures",
"skin_type.minelp.seapony": "Seapony",
"skin_type.minelittlepony.seapony": "Seapony",
"skin_type.minelittlepony.crown": "Crown",
"skin_type.minelittlepony.muffin": "Muffin Hat",
"skin_type.minelittlepony.hat": "Witch's Hat",

View file

@ -51,7 +51,7 @@
"minelp.debug.size": "Bow Width",
"minelp.debug.race": "Sail Height",
"minelp.debug.armour": "Batten down the hatches",
"skin_type.minelp.seapony": "Maremaid",
"skin_type.minelittlepony.seapony": "Maremaid",
"skin_type.minelittlepony.crown": "Captain's Tricorne",
"skin_type.minelittlepony.muffin": "Galley-man's Headwear",
"skin_type.minelittlepony.hat": "Olde Hag's Gown",

View file

@ -50,7 +50,7 @@
"minelp.debug.size": "ǝpᴉɹɹǝʌO ǝzᴉS",
"minelp.debug.race": "ǝpᴉɹɹǝʌO ǝɔɐᴚ",
"minelp.debug.armour": "sǝɹnʇxǝʇ ɹnoɯɹɐ pǝᴉɟᴉuod ǝlqɐsᴉD",
"skin_type.minelp.seapony": "ʎuodɐǝS",
"skin_type.minelittlepony.seapony": "ʎuodɐǝS",
"skin_type.minelittlepony.crown": "uʍoɹƆ",
"skin_type.minelittlepony.muffin": "ʇɐH uᴉɟɟnW",
"skin_type.minelittlepony.hat": "ʇɐH ɥɔʇᴉM",

View file

@ -54,8 +54,8 @@
"minelp.debug.race": "Race Override",
"minelp.debug.armour": "Disable ponified armour textures",
"skin_type.minelp.seapony": "Seapony Form",
"skin_type.minelp.nirik": "Kirin Nirik Form",
"skin_type.minelittlepony.seapony": "Seapony Form",
"skin_type.minelittlepony.nirik": "Kirin Nirik Form",
"skin_type.minelittlepony.crown": "Crown",
"skin_type.minelittlepony.muffin": "Muffin Hat",
"skin_type.minelittlepony.hat": "Witch Hat",

View file

@ -51,7 +51,7 @@
"minelp.debug.size": "Bulk Override",
"minelp.debug.race": "Kind Override",
"minelp.debug.armour": "Cripple horselingified armour skins",
"skin_type.minelp.seapony": "Seahorseling",
"skin_type.minelittlepony.seapony": "Seahorseling",
"skin_type.minelittlepony.crown": "Kinehelm",
"skin_type.minelittlepony.muffin": "Muffin Hat",
"skin_type.minelittlepony.hat": "Witch Hat",

View file

@ -51,7 +51,7 @@
"minelp.debug.size": "Size Owewwide",
"minelp.debug.race": "Waze Owewwide",
"minelp.debug.armour": "Disabl ponifid armr texturez",
"skin_type.minelp.seapony": "Seeponeh",
"skin_type.minelittlepony.seapony": "Seeponeh",
"skin_type.minelittlepony.crown": "Meown",
"skin_type.minelittlepony.muffin": "Muffin Hat plz",
"skin_type.minelittlepony.hat": "Crazy Kitteh Ownr Hat",

View file

@ -50,7 +50,7 @@
"minelp.debug.size": "Переопределение размера",
"minelp.debug.race": "Переопределение расы",
"minelp.debug.armour": "Отключить понифицированную броню",
"skin_type.minelp.seapony": "Морской пони",
"skin_type.minelittlepony.seapony": "Морской пони",
"skin_type.minelittlepony.crown": "Корона",
"skin_type.minelittlepony.muffin": "Маффин",
"skin_type.minelittlepony.hat": "Шляпа Ведьмы",

View file

@ -52,7 +52,7 @@
"minelp.debug.race": "Nadjačavanje vrste",
"minelp.debug.armour": "Onemogući ponified oklop tekstura",
"skin_type.minelp.seapony": "Vodeni Poni",
"skin_type.minelittlepony.seapony": "Vodeni Poni",
"skin_type.minelittlepony.crown": "Kruna",
"skin_type.minelittlepony.muffin": "Mafin Šešir",
"skin_type.minelittlepony.hat": "Veštičiji Šešir",

View file

@ -53,8 +53,8 @@
"minelp.debug.race": "覆盖种族",
"minelp.debug.armour": "停用小马化护甲纹理",
"skin_type.minelp.seapony": "海马形态",
"skin_type.minelp.nirik": "麒麟 逆麟形态",
"skin_type.minelittlepony.seapony": "海马形态",
"skin_type.minelittlepony.nirik": "麒麟 逆麟形态",
"skin_type.minelittlepony.crown": "头冠",
"skin_type.minelittlepony.muffin": "马芬帽",
"skin_type.minelittlepony.hat": "女巫帽",

View file

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB