1.20.1 -> 1.20.2

This commit is contained in:
Sollace 2023-09-24 23:43:31 +01:00
parent d346f7f60d
commit 47adfd5d83
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
30 changed files with 142 additions and 204 deletions

View file

@ -4,8 +4,7 @@ buildscript {
} }
} }
plugins { plugins {
id 'java-library' id 'fabric-loom' version '1.3-SNAPSHOT'
id 'fabric-loom' version '1.1-SNAPSHOT'
id 'maven-publish' id 'maven-publish'
id 'com.modrinth.minotaur' version '2.+' id 'com.modrinth.minotaur' version '2.+'
id 'org.ajoberstar.reckon' version '0.13.0' id 'org.ajoberstar.reckon' version '0.13.0'
@ -84,7 +83,10 @@ processResources {
inputs.property "version", project.version.toString() inputs.property "version", project.version.toString()
filesMatching("fabric.mod.json") { filesMatching("fabric.mod.json") {
expand "version": project.version.toString() expand "version": project.version.toString(),
"minecraftVersion": project.minecraft_version_range,
"loaderVersion": ">=${project.loader_version}",
"fabricVersion": ">=${project.fabric_version}"
} }
from 'LICENSE' from 'LICENSE'
@ -113,6 +115,7 @@ modrinth {
versionNumber = version.toString() versionNumber = version.toString()
versionName = archivesBaseName + '-' + version versionName = archivesBaseName + '-' + version
changelog = "[Changelog](https://github.com/MineLittlePony/MineLittlePony/releases/tag/${version.toString()})" changelog = "[Changelog](https://github.com/MineLittlePony/MineLittlePony/releases/tag/${version.toString()})"
loaders = ['fabric', 'quilt']
uploadFile = remapJar uploadFile = remapJar
outlet.mcVersions().each{ver -> outlet.mcVersions().each{ver ->
gameVersions.add ver gameVersions.add ver

View file

@ -3,10 +3,10 @@ org.gradle.daemon=false
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/develop # check these on https://fabricmc.net/develop
minecraft_version=1.20.1 minecraft_version=1.20.2-rc1
yarn_mappings=1.20.1+build.9 yarn_mappings=1.20.2-rc1+build.2
loader_version=0.14.21 loader_version=0.14.22
fabric_version=0.85.0+1.20.1 fabric_version=0.88.5+1.20.2
# Mod Properties # Mod Properties
group=com.minelittlepony group=com.minelittlepony
@ -15,12 +15,12 @@ org.gradle.daemon=false
description=Mine Little Pony turns players and mobs into ponies. Press F9 ingame to access settings. description=Mine Little Pony turns players and mobs into ponies. Press F9 ingame to access settings.
# Publishing # Publishing
minecraft_version_range=>=1.20.0 minecraft_version_range=>=1.20.2
modrinth_loader_type=fabric modrinth_loader_type=fabric
modrinth_project_id=JBjInUXM modrinth_project_id=JBjInUXM
# Dependencies # Dependencies
modmenu_version=7.1.0 modmenu_version=8.0.0-beta.1
kirin_version=1.15.2 kirin_version=1.16.0-beta.1+1.20.2
hd_skins_version=6.10.0+1.20 hd_skins_version=6.11.0-beta.2+1.20.2
mson_version=1.8.1 mson_version=1.9.0-beta.1

View file

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View file

@ -1,20 +1,40 @@
package com.minelittlepony.api.pony; package com.minelittlepony.api.pony;
import net.minecraft.client.util.DefaultSkinHelper;
import net.minecraft.client.util.SkinTextures;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import java.util.HashMap; import com.minelittlepony.api.pony.meta.Race;
import java.util.Map;
import java.util.*;
public final class DefaultPonySkinHelper { public final class DefaultPonySkinHelper {
public static final Identifier STEVE = new Identifier("minelittlepony", "textures/entity/player/wide/steve_pony.png"); public static final Identifier STEVE = new Identifier("minelittlepony", "textures/entity/player/wide/steve_pony.png");
private static final Map<Identifier, Identifier> SKINS = new HashMap<>(); private static final Map<SkinTextures, SkinTextures> SKINS = new HashMap<>();
public static Identifier getPonySkin(Identifier original) { public static SkinTextures getTextures(SkinTextures original) {
return SKINS.computeIfAbsent(original, DefaultPonySkinHelper::computePonySkin); return SKINS.computeIfAbsent(original, o -> {
return new SkinTextures(
new Identifier("minelittlepony", original.texture().getPath().replace(".png", "_pony.png")),
null,
null,
null,
original.model(),
false
);
});
} }
private static Identifier computePonySkin(Identifier original) { public static String getModelType(UUID id) {
return new Identifier("minelittlepony", original.getPath().replace(".png", "_pony.png")); SkinTextures textures = DefaultSkinHelper.getTexture(id);
return getModelType(IPony.getManager().getPony(textures.texture(), id).race(), textures.model());
}
public static String getModelType(Race race, SkinTextures.Model armShape) {
if (race.isHuman()) {
return armShape.getName();
}
return (armShape == SkinTextures.Model.SLIM) ? armShape.getName() + race.name().toLowerCase(Locale.ROOT) : race.name().toLowerCase(Locale.ROOT);
} }
} }

View file

@ -2,8 +2,7 @@ package com.minelittlepony.api.pony.meta;
import com.minelittlepony.api.pony.TriggerPixelType; import com.minelittlepony.api.pony.TriggerPixelType;
import java.util.Arrays; import java.util.*;
import java.util.List;
public enum Race implements TriggerPixelType<Race> { public enum Race implements TriggerPixelType<Race> {
HUMAN (0x000000, false, false), HUMAN (0x000000, false, false),
@ -73,11 +72,4 @@ public enum Race implements TriggerPixelType<Race> {
public int getColorCode() { public int getColorCode() {
return triggerPixel; return triggerPixel;
} }
public String getModelId(boolean isSlim) {
if (isHuman()) {
return isSlim ? "slim" : "default";
}
return isSlim ? "slim" + name().toLowerCase() : name().toLowerCase();
}
} }

View file

@ -6,7 +6,6 @@ import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.*; import net.minecraft.text.*;
import com.minelittlepony.client.render.MobRenderers; import com.minelittlepony.client.render.MobRenderers;
import com.minelittlepony.client.render.PonyRenderDispatcher;
import com.minelittlepony.client.settings.ClientPonyConfig; import com.minelittlepony.client.settings.ClientPonyConfig;
import com.minelittlepony.common.client.gui.GameGui; import com.minelittlepony.common.client.gui.GameGui;
import com.minelittlepony.common.client.gui.ScrollContainer; import com.minelittlepony.common.client.gui.ScrollContainer;
@ -118,7 +117,7 @@ public class GuiPonySettings extends GameGui {
.onChange(i == config.horsieMode ? (v -> { .onChange(i == config.horsieMode ? (v -> {
v = ((Setting<Boolean>)i).set(v); v = ((Setting<Boolean>)i).set(v);
PonyRenderDispatcher.getInstance().initialise(MinecraftClient.getInstance().getEntityRenderDispatcher(), true); MineLittlePony.getInstance().getRenderDispatcher().initialise(MinecraftClient.getInstance().getEntityRenderDispatcher(), true);
return v; return v;
}) : (Setting<Boolean>)i) }) : (Setting<Boolean>)i)
.setEnabled(enabled); .setEnabled(enabled);
@ -189,10 +188,10 @@ public class GuiPonySettings extends GameGui {
} }
@Override @Override
public void render(DrawContext context, int mouseX, int mouseY, float partialTicks) { public void render(DrawContext context, int mouseX, int mouseY, float tickDelta) {
renderBackground(context); renderBackground(context, mouseX, mouseY, tickDelta);
super.render(context, mouseX, mouseY, partialTicks); super.render(context, mouseX, mouseY, tickDelta);
content.render(context, mouseX, mouseY, partialTicks); content.render(context, mouseX, mouseY, tickDelta);
} }
@Override @Override

View file

@ -40,14 +40,14 @@ public class MineLittlePony implements ClientModInitializer {
public static final Logger logger = LogManager.getLogger("MineLittlePony"); public static final Logger logger = LogManager.getLogger("MineLittlePony");
private final PonyRenderDispatcher renderManager = PonyRenderDispatcher.getInstance();
private ClientPonyConfig config; private ClientPonyConfig config;
private PonyManager ponyManager; private PonyManager ponyManager;
private VariatedTextureSupplier variatedTextures; 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");
private final PonyRenderDispatcher renderDispatcher = new PonyRenderDispatcher();
private boolean hasHdSkins; private boolean hasHdSkins;
private boolean hasModMenu; private boolean hasModMenu;
@ -82,7 +82,9 @@ public class MineLittlePony implements ClientModInitializer {
// general events // general events
ClientReadyCallback.Handler.register(); ClientReadyCallback.Handler.register();
ClientTickEvents.END_CLIENT_TICK.register(this::onTick); ClientTickEvents.END_CLIENT_TICK.register(this::onTick);
ClientReadyCallback.EVENT.register(this::onClientReady); ClientReadyCallback.EVENT.register(client -> {
renderDispatcher.initialise(client.getEntityRenderDispatcher(), false);
});
ScreenInitCallback.EVENT.register(this::onScreenInit); ScreenInitCallback.EVENT.register(this::onScreenInit);
config.load(); config.load();
@ -93,10 +95,6 @@ public class MineLittlePony implements ClientModInitializer {
FabricLoader.getInstance().getEntrypoints("minelittlepony", ClientModInitializer.class).forEach(ClientModInitializer::onInitializeClient); FabricLoader.getInstance().getEntrypoints("minelittlepony", ClientModInitializer.class).forEach(ClientModInitializer::onInitializeClient);
} }
private void onClientReady(MinecraftClient client) {
renderManager.initialise(client.getEntityRenderDispatcher(), false);
}
private void onTick(MinecraftClient client) { private void onTick(MinecraftClient client) {
boolean inGame = client.world != null && client.player != null && client.currentScreen == null; boolean inGame = client.world != null && client.player != null && client.currentScreen == null;
@ -148,5 +146,12 @@ public class MineLittlePony implements ClientModInitializer {
public VariatedTextureSupplier getVariatedTextures() { public VariatedTextureSupplier getVariatedTextures() {
return variatedTextures; return variatedTextures;
} }
/**
* Gets the static pony render manager responsible for all entity renderers.
*/
public PonyRenderDispatcher getRenderDispatcher() {
return renderDispatcher;
}
} }

View file

@ -31,7 +31,7 @@ public class PonyBounds {
float delta = MinecraftClient.getInstance().getTickDelta(); float delta = MinecraftClient.getInstance().getTickDelta();
Entity vehicle = entity.getVehicle(); Entity vehicle = entity.getVehicle();
double vehicleOffset = vehicle == null ? 0 : vehicle.getHeight() - vehicle.getMountedHeightOffset(); double vehicleOffset = vehicle == null ? 0 : vehicle.getHeight() - entity.getRidingOffset(vehicle);
return new Vec3d( return new Vec3d(
MathHelper.lerp(delta, entity.prevX, entity.getX()), MathHelper.lerp(delta, entity.prevX, entity.getX()),

View file

@ -4,7 +4,6 @@ import com.minelittlepony.common.client.gui.ScrollContainer;
import com.minelittlepony.common.client.gui.Tooltip; import com.minelittlepony.common.client.gui.Tooltip;
import com.minelittlepony.common.client.gui.element.Button; import com.minelittlepony.common.client.gui.element.Button;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@ -25,15 +24,7 @@ public class SkinsProxy {
@Nullable @Nullable
public Identifier getSkinTexture(GameProfile profile) { public Identifier getSkinTexture(GameProfile profile) {
PlayerSkinProvider skins = MinecraftClient.getInstance().getSkinProvider(); PlayerSkinProvider skins = MinecraftClient.getInstance().getSkinProvider();
return skins.getSkinTextures(profile).texture();
@Nullable
MinecraftProfileTexture texture = skins.getTextures(profile).get(MinecraftProfileTexture.Type.SKIN);
if (texture == null) {
return null;
}
return skins.loadSkin(texture, MinecraftProfileTexture.Type.SKIN);
} }
public void renderOption(Screen screen, @Nullable Screen parent, int row, int RIGHT, ScrollContainer content) { public void renderOption(Screen screen, @Nullable Screen parent, int row, int RIGHT, ScrollContainer content) {

View file

@ -2,11 +2,9 @@ package com.minelittlepony.client.hdskins;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import com.minelittlepony.api.pony.IPony; import com.minelittlepony.api.pony.*;
import com.minelittlepony.api.pony.IPonyManager;
import com.minelittlepony.client.IPreviewModel; import com.minelittlepony.client.IPreviewModel;
import com.minelittlepony.client.render.EquineRenderManager; import com.minelittlepony.client.render.EquineRenderManager;
import com.minelittlepony.hdskins.client.VanillaModels;
import com.minelittlepony.hdskins.client.gui.player.*; import com.minelittlepony.hdskins.client.gui.player.*;
import com.minelittlepony.hdskins.client.gui.player.skins.PlayerSkins; import com.minelittlepony.hdskins.client.gui.player.skins.PlayerSkins;
@ -31,16 +29,4 @@ class DummyPony extends DummyPlayer implements IPreviewModel, IPonyManager.Force
public boolean isSubmergedInWater() { public boolean isSubmergedInWater() {
return getTextures().getPosture().getActiveSkinType() == MineLPHDSkins.seaponySkinType || super.isSubmergedInWater(); return getTextures().getPosture().getActiveSkinType() == MineLPHDSkins.seaponySkinType || super.isSubmergedInWater();
} }
@Override
public String getModel() {
if (getTextures().getPosture().getActiveSkinType() == MineLPHDSkins.seaponySkinType) {
return VanillaModels.isSlim(getTextures().getSkinVariant()) ? "slimseapony" : "seapony";
}
return IPony.getManager()
.getPony(this)
.metadata()
.getRace()
.getModelId(VanillaModels.isSlim(getTextures().getSkinVariant()));
}
} }

View file

@ -1,6 +1,5 @@
package com.minelittlepony.client.hdskins; package com.minelittlepony.client.hdskins;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text; import net.minecraft.text.Text;

View file

@ -118,13 +118,9 @@ public class MineLPHDSkins extends SkinsProxy implements ClientModInitializer {
@Override @Override
public Identifier getSkinTexture(GameProfile profile) { public Identifier getSkinTexture(GameProfile profile) {
return HDSkins.getInstance().getProfileRepository()
Identifier skin = HDSkins.getInstance().getProfileRepository().getTextures(profile).get(SkinType.SKIN); .getNow(profile)
.getSkin(SkinType.SKIN)
if (skin != null) { .orElseGet(() -> super.getSkinTexture(profile));
return skin;
}
return super.getSkinTexture(profile);
} }
} }

View file

@ -56,7 +56,7 @@ abstract class MixinClientPlayerEntity extends AbstractClientPlayerEntity implem
if (hasVehicle()) { if (hasVehicle()) {
value += getVehicle().getEyeHeight(getVehicle().getPose()); value += getVehicle().getEyeHeight(getVehicle().getPose());
value -= getVehicle().getMountedHeightOffset(); value -= getRidingOffset(getVehicle());
} }
return Math.max(value, 0.1F); return Math.max(value, 0.1F);

View file

@ -2,11 +2,12 @@ package com.minelittlepony.client.mixin;
import com.minelittlepony.api.config.PonyLevel; import com.minelittlepony.api.config.PonyLevel;
import com.minelittlepony.api.pony.DefaultPonySkinHelper; import com.minelittlepony.api.pony.DefaultPonySkinHelper;
import com.minelittlepony.api.pony.IPony;
import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.MineLittlePony;
import net.minecraft.client.util.DefaultSkinHelper; import net.minecraft.client.util.DefaultSkinHelper;
import net.minecraft.client.util.SkinTextures;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -21,28 +22,16 @@ abstract class MixinDefaultSkinHelper {
cancellable = true) cancellable = true)
private static void onGetTexture(CallbackInfoReturnable<Identifier> cir) { private static void onGetTexture(CallbackInfoReturnable<Identifier> cir) {
if (MineLittlePony.getInstance().getConfig().ponyLevel.get() == PonyLevel.PONIES) { if (MineLittlePony.getInstance().getConfig().ponyLevel.get() == PonyLevel.PONIES) {
cir.setReturnValue(DefaultPonySkinHelper.getPonySkin(cir.getReturnValue())); cir.setReturnValue(DefaultPonySkinHelper.STEVE);
} }
} }
@Inject(method = "getTexture(Ljava/util/UUID;)Lnet/minecraft/util/Identifier;", @Inject(method = "getTexture(Ljava/util/UUID;)Lnet/minecraft/client/util/SkinTextures;",
at = @At("RETURN"), at = @At("RETURN"),
cancellable = true) cancellable = true)
private static void onGetTexture(UUID uuid, CallbackInfoReturnable<Identifier> cir) { private static void onGetTexture(UUID uuid, CallbackInfoReturnable<SkinTextures> cir) {
if (MineLittlePony.getInstance().getConfig().ponyLevel.get() == PonyLevel.PONIES) { if (MineLittlePony.getInstance().getConfig().ponyLevel.get() == PonyLevel.PONIES) {
cir.setReturnValue(DefaultPonySkinHelper.getPonySkin(cir.getReturnValue())); cir.setReturnValue(DefaultPonySkinHelper.getTextures(cir.getReturnValue()));
}
}
@Inject(method = "getModel(Ljava/util/UUID;)Ljava/lang/String;",
at = @At("RETURN"),
cancellable = true)
private static void onGetModel(UUID uuid, CallbackInfoReturnable<String> cir) {
if (MineLittlePony.getInstance().getConfig().ponyLevel.get() == PonyLevel.PONIES) {
cir.setReturnValue(IPony.getManager()
.getPony(DefaultSkinHelper.getTexture(uuid), uuid)
.race()
.getModelId("slim".equalsIgnoreCase(cir.getReturnValue())));
} }
} }
} }

View file

@ -1,29 +0,0 @@
package com.minelittlepony.client.mixin;
import com.minelittlepony.api.pony.IPony;
import com.minelittlepony.client.IPreviewModel;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(EntityRenderDispatcher.class)
abstract class MixinEntityRenderDispatcher {
@Redirect(
method = "getRenderer(Lnet/minecraft/entity/Entity;)Lnet/minecraft/client/render/entity/EntityRenderer;",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;getModel()Ljava/lang/String;"))
private String getPlayerModel(AbstractClientPlayerEntity player, Entity entity) {
if (player instanceof IPreviewModel) {
return player.getModel();
}
return IPony.getManager()
.getPony(player)
.race()
.getModelId(player.getModel().contains("slim"));
}
}

View file

@ -4,7 +4,7 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
import com.minelittlepony.client.render.PonyRenderDispatcher; import com.minelittlepony.client.MineLittlePony;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -42,6 +42,6 @@ abstract class MixinHeldItemRenderer {
VertexConsumerProvider renderContext, VertexConsumerProvider renderContext,
@Nullable World world, @Nullable World world,
int lightUv, int overlayUv, int posLong) { int lightUv, int overlayUv, int posLong) {
PonyRenderDispatcher.getInstance().getMagicRenderer().renderItem(target, entity, item, transform, left, stack, renderContext, world, lightUv, posLong); MineLittlePony.getInstance().getRenderDispatcher().getMagicRenderer().renderItem(target, entity, item, transform, left, stack, renderContext, world, lightUv, posLong);
} }
} }

View file

@ -6,7 +6,6 @@ import com.minelittlepony.api.config.PonyLevel;
import com.minelittlepony.api.pony.IPony; import com.minelittlepony.api.pony.IPony;
import com.minelittlepony.api.pony.IPonyManager; import com.minelittlepony.api.pony.IPonyManager;
import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.MineLittlePony;
import com.minelittlepony.client.render.PonyRenderDispatcher;
import com.minelittlepony.client.render.blockentity.skull.PonySkullRenderer; import com.minelittlepony.client.render.blockentity.skull.PonySkullRenderer;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -65,7 +64,7 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
} }
if (entity instanceof LivingEntity living) { if (entity instanceof LivingEntity living) {
return Optional.ofNullable(PonyRenderDispatcher.getInstance().getPonyRenderer(living)).map(d -> d.getEntityPony(living)); return Optional.ofNullable(MineLittlePony.getInstance().getRenderDispatcher().getPonyRenderer(living)).map(d -> d.getEntityPony(living));
} }
return Optional.empty(); return Optional.empty();
@ -76,19 +75,19 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
Identifier skin = getSkin(player); Identifier skin = getSkin(player);
UUID uuid = player.getGameProfile() == null ? player.getUuid() : player.getGameProfile().getId(); UUID uuid = player.getGameProfile() == null ? player.getUuid() : player.getGameProfile().getId();
if (skin == null) { if (skin != null) {
if (config.ponyLevel.get() == PonyLevel.PONIES) { if (player instanceof IPonyManager.ForcedPony) {
return getBackgroundPony(uuid); return getPony(skin);
} }
return getAsDefaulted(getPony(DefaultSkinHelper.getTexture(uuid))); return getPony(skin, uuid);
} }
if (player instanceof IPonyManager.ForcedPony) { if (config.ponyLevel.get() == PonyLevel.PONIES) {
return getPony(skin); return getBackgroundPony(uuid);
} }
return getPony(skin, uuid); return getAsDefaulted(getPony(DefaultSkinHelper.getTexture(uuid).texture()));
} }
@Override @Override
@ -104,7 +103,7 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
@Override @Override
public IPony getBackgroundPony(UUID uuid) { public IPony getBackgroundPony(UUID uuid) {
return getAsDefaulted(getPony(MineLittlePony.getInstance().getVariatedTextures().get(BACKGROUND_PONIES, uuid).orElse(DefaultSkinHelper.getTexture(uuid)))); return getAsDefaulted(getPony(MineLittlePony.getInstance().getVariatedTextures().get(BACKGROUND_PONIES, uuid).orElse(DefaultSkinHelper.getTexture(uuid).texture())));
} }
private IPony getAsDefaulted(IPony pony) { private IPony getAsDefaulted(IPony pony) {
@ -121,7 +120,7 @@ public class PonyManager implements IPonyManager, SimpleSynchronousResourceReloa
return null; return null;
} }
if (player instanceof AbstractClientPlayerEntity) { if (player instanceof AbstractClientPlayerEntity) {
return ((AbstractClientPlayerEntity)player).getSkinTexture(); return ((AbstractClientPlayerEntity)player).method_52814().texture();
} }
return null; return null;

View file

@ -79,7 +79,7 @@ public class EquineRenderManager<T extends LivingEntity, M extends EntityModel<T
if (entity.hasVehicle() && entity.getVehicle() instanceof LivingEntity) { if (entity.hasVehicle() && entity.getVehicle() instanceof LivingEntity) {
LivingEntity ridingEntity = (LivingEntity) entity.getVehicle(); LivingEntity ridingEntity = (LivingEntity) entity.getVehicle();
IPonyRenderContext<LivingEntity, ?> renderer = PonyRenderDispatcher.getInstance().getPonyRenderer(ridingEntity); IPonyRenderContext<LivingEntity, ?> renderer = MineLittlePony.getInstance().getRenderDispatcher().getPonyRenderer(ridingEntity);
if (renderer != null) { if (renderer != null) {
// negate vanilla translations so the rider begins at the ridees feet. // negate vanilla translations so the rider begins at the ridees feet.

View file

@ -83,7 +83,7 @@ public final class MobRenderers {
public boolean set(boolean value) { public boolean set(boolean value) {
value = option().set(value); value = option().set(value);
apply(PonyRenderDispatcher.getInstance(), false); apply(MineLittlePony.getInstance().getRenderDispatcher(), false);
return value; return value;
} }

View file

@ -1,7 +1,10 @@
package com.minelittlepony.client.render; package com.minelittlepony.client.render;
import java.util.Locale;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate;
import com.minelittlepony.api.pony.IPony;
import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.api.pony.meta.Race;
import com.minelittlepony.client.mixin.MixinEntityRenderers; import com.minelittlepony.client.mixin.MixinEntityRenderers;
import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.IPonyModel;
@ -12,31 +15,25 @@ import org.jetbrains.annotations.Nullable;
import com.minelittlepony.mson.api.Mson; import com.minelittlepony.mson.api.Mson;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.entity.*;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.client.util.SkinTextures;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.util.Identifier;
/** /**
* Render manager responsible for replacing and restoring entity renderers when the client settings change. * Render manager responsible for replacing and restoring entity renderers when the client settings change.
* Old values are persisted internally.
*/ */
public class PonyRenderDispatcher { public class PonyRenderDispatcher {
private static final PonyRenderDispatcher INSTANCE = new PonyRenderDispatcher();
/**
* Gets the static pony render manager responsible for all entity renderers.
*/
public static PonyRenderDispatcher getInstance() {
return INSTANCE;
}
private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer(); private LevitatingItemRenderer magicRenderer = new LevitatingItemRenderer();
public LevitatingItemRenderer getMagicRenderer() {
return magicRenderer;
}
/** /**
* Registers all new player skin types. (currently only pony and slimpony). * Registers all new player skin types. (currently only pony and slimpony).
*/ */
@ -50,14 +47,18 @@ public class PonyRenderDispatcher {
} }
private void registerPlayerSkin(EntityRenderDispatcher manager, Race race) { private void registerPlayerSkin(EntityRenderDispatcher manager, Race race) {
addPlayerSkin(manager, false, race); addPlayerSkin(manager, SkinTextures.Model.SLIM, race);
addPlayerSkin(manager, true, race); addPlayerSkin(manager, SkinTextures.Model.WIDE, race);
} }
private void addPlayerSkin(EntityRenderDispatcher manager, boolean slimArms, Race race) { private void addPlayerSkin(EntityRenderDispatcher manager, SkinTextures.Model armShape, Race race) {
Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer( Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer(
race.getModelId(slimArms), new Identifier("minelittlepony", race.name().toLowerCase(Locale.ROOT) + "/" + armShape.getName()),
ModelType.getPlayerModel(race).getFactory(slimArms) (Predicate<AbstractClientPlayerEntity>)(player -> {
return IPony.getManager().getPony(player).metadata().getRace() == race
&& player.method_52814().model() == armShape;
}),
ModelType.getPlayerModel(race).getFactory(armShape == SkinTextures.Model.SLIM)
); );
} }
@ -79,10 +80,6 @@ public class PonyRenderDispatcher {
}); });
} }
public LevitatingItemRenderer getMagicRenderer() {
return magicRenderer;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Nullable @Nullable
public <T extends LivingEntity, M extends EntityModel<T> & IPonyModel<T>> IPonyRenderContext<T, M> getPonyRenderer(@Nullable T entity) { public <T extends LivingEntity, M extends EntityModel<T> & IPonyModel<T>> IPonyRenderContext<T, M> getPonyRenderer(@Nullable T entity) {

View file

@ -16,7 +16,6 @@ import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.util.DefaultSkinHelper; import net.minecraft.client.util.DefaultSkinHelper;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.Uuids;
import net.minecraft.util.math.RotationAxis; import net.minecraft.util.math.RotationAxis;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -46,7 +45,7 @@ public class PlayerPonySkull implements ISkull {
return skin; return skin;
} }
return DefaultSkinHelper.getTexture(Uuids.getUuidFromProfile(profile)); return DefaultSkinHelper.getTexture(profile).texture();
} }
return DefaultSkinHelper.getTexture(); return DefaultSkinHelper.getTexture();

View file

@ -99,7 +99,7 @@ public abstract class AbstractPonyRenderer<T extends MobEntity, M extends Entity
if (!entity.hasVehicle()) { if (!entity.hasVehicle()) {
stack.translate(0, 0, -entity.getWidth() / 2); // move us to the center of the shadow stack.translate(0, 0, -entity.getWidth() / 2); // move us to the center of the shadow
} else { } else {
stack.translate(0, entity.getHeightOffset(), 0); stack.translate(0, entity.getRidingOffset(entity.getVehicle()), 0);
} }
stack.scale(scale, scale, scale); stack.scale(scale, scale, scale);

View file

@ -68,8 +68,8 @@ public class PlayerPonyRenderer extends PlayerEntityRenderer implements IPonyRen
@Override @Override
protected void scale(AbstractClientPlayerEntity entity, MatrixStack stack, float tickDelta) { protected void scale(AbstractClientPlayerEntity entity, MatrixStack stack, float tickDelta) {
if (manager.getModel().getAttributes().isSitting) { if (manager.getModel().getAttributes().isSitting && entity.hasVehicle()) {
stack.translate(0, entity.getHeightOffset(), 0); stack.translate(0, entity.getRidingOffset(entity.getVehicle()), 0);
} }
} }
@ -144,7 +144,7 @@ public class PlayerPonyRenderer extends PlayerEntityRenderer implements IPonyRen
stack.translate(reflect * 0.1F, -0.54F, 0); stack.translate(reflect * 0.1F, -0.54F, 0);
Identifier texture = getTexture(player); Identifier texture = getTexture(player);
Identifier playerSkin = player.getSkinTexture(); Identifier playerSkin = player.method_52814().texture();
VertexConsumerProvider interceptedContext = layer -> { VertexConsumerProvider interceptedContext = layer -> {
return renderContext.getBuffer(RenderLayerUtil return renderContext.getBuffer(RenderLayerUtil
.getTexture(layer) .getTexture(layer)

View file

@ -85,7 +85,7 @@ public class ArmourFeature<T extends LivingEntity, M extends EntityModel<T> & IP
} }
if (stack.getItem() instanceof ArmorItem armor) { if (stack.getItem() instanceof ArmorItem armor) {
ArmorTrim.getTrim(entity.getWorld().getRegistryManager(), stack).ifPresent(trim -> { ArmorTrim.getTrim(entity.getWorld().getRegistryManager(), stack, true).ifPresent(trim -> {
pony.getArmourModel(stack, layer, ArmourVariant.TRIM) pony.getArmourModel(stack, layer, ArmourVariant.TRIM)
.filter(m -> m.poseModel(entity, limbAngle, limbDistance, age, headYaw, headPitch, armorSlot, layer, pony.body())) .filter(m -> m.poseModel(entity, limbAngle, limbDistance, age, headYaw, headPitch, armorSlot, layer, pony.body()))
.ifPresent(m -> { .ifPresent(m -> {
@ -107,7 +107,7 @@ public class ArmourFeature<T extends LivingEntity, M extends EntityModel<T> & IP
); );
return sprite.getTextureSpecificVertexConsumer( return sprite.getTextureSpecificVertexConsumer(
ItemRenderer.getDirectItemGlintConsumer(provider, TexturedRenderLayers.getArmorTrims(), true, glint) ItemRenderer.getDirectItemGlintConsumer(provider, TexturedRenderLayers.getArmorTrims(trim.getPattern().value().decal()), true, glint)
); );
} }
} }

View file

@ -25,8 +25,8 @@ public class CapeFeature<M extends ClientPonyModel<AbstractClientPlayerEntity>>
public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, AbstractClientPlayerEntity player, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, AbstractClientPlayerEntity player, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) {
M model = getModelWrapper().body(); M model = getModelWrapper().body();
if (player.hasSkinTexture() && !player.isInvisible() if (!player.isInvisible()
&& player.isPartVisible(PlayerModelPart.CAPE) && player.getCapeTexture() != null && player.isPartVisible(PlayerModelPart.CAPE) && player.method_52814().capeTexture() != null
&& player.getEquippedStack(EquipmentSlot.CHEST).getItem() != Items.ELYTRA) { && player.getEquippedStack(EquipmentSlot.CHEST).getItem() != Items.ELYTRA) {
stack.push(); stack.push();
@ -64,7 +64,7 @@ public class CapeFeature<M extends ClientPonyModel<AbstractClientPlayerEntity>>
stack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180)); stack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180));
stack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90)); stack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90));
VertexConsumer vertices = renderContext.getBuffer(RenderLayer.getEntitySolid(player.getCapeTexture())); VertexConsumer vertices = renderContext.getBuffer(RenderLayer.getEntitySolid(player.method_52814().capeTexture()));
model.renderCape(stack, vertices, lightUv, OverlayTexture.DEFAULT_UV); model.renderCape(stack, vertices, lightUv, OverlayTexture.DEFAULT_UV);
stack.pop(); stack.pop();
} }

View file

@ -36,7 +36,7 @@ public class DJPon3Feature<T extends AbstractClientPlayerEntity, M extends Entit
deadMau5.setVisible(true); deadMau5.setVisible(true);
VertexConsumer vertices = renderContext.getBuffer(deadMau5.getLayer(entity.getSkinTexture())); VertexConsumer vertices = renderContext.getBuffer(deadMau5.getLayer(entity.method_52814().texture()));
deadMau5.render(stack, vertices, OverlayTexture.DEFAULT_UV, lightUv, limbDistance, limbAngle, tickDelta, 1); deadMau5.render(stack, vertices, OverlayTexture.DEFAULT_UV, lightUv, limbDistance, limbAngle, tickDelta, 1);

View file

@ -14,6 +14,7 @@ import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.PlayerModelPart; import net.minecraft.client.render.entity.PlayerModelPart;
import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.util.SkinTextures;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Items; import net.minecraft.item.Items;
@ -66,21 +67,15 @@ public class ElytraFeature<T extends LivingEntity, M extends EntityModel<T> & IP
} }
protected Identifier getElytraTexture(T entity) { protected Identifier getElytraTexture(T entity) {
if (entity instanceof AbstractClientPlayerEntity) { if (entity instanceof AbstractClientPlayerEntity player) {
AbstractClientPlayerEntity player = (AbstractClientPlayerEntity) entity; SkinTextures textures = player.method_52814();
Identifier result; if (textures.elytraTexture() != null) {
return textures.elytraTexture();
if (player.hasSkinTexture()) {
result = player.getElytraTexture();
if (result != null) return result;
} }
if (player.hasSkinTexture() && player.isPartVisible(PlayerModelPart.CAPE)) { if (textures.capeTexture() != null && player.isPartVisible(PlayerModelPart.CAPE)) {
result = player.getCapeTexture(); return textures.capeTexture();
if (result != null) return result;
} }
} }

View file

@ -8,8 +8,8 @@ import org.jetbrains.annotations.Nullable;
import com.minelittlepony.api.pony.IPony; import com.minelittlepony.api.pony.IPony;
import com.minelittlepony.client.SkinsProxy; import com.minelittlepony.client.SkinsProxy;
import com.minelittlepony.util.FunctionUtil; import com.minelittlepony.util.FunctionUtil;
import com.mojang.authlib.GameProfile;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function; import java.util.function.Function;
public class PlayerTextureSupplier { public class PlayerTextureSupplier {
@ -25,24 +25,20 @@ public class PlayerTextureSupplier {
} }
static final class Entry { static final class Entry {
@Nullable private final CompletableFuture<Identifier> profile;
private GameProfile profile;
Entry(LivingEntity entity) { Entry(LivingEntity entity) {
SkullBlockEntity.loadProperties(new GameProfile(null, entity.getCustomName().getString()), resolved -> { profile = SkullBlockEntity.fetchProfile(entity.getCustomName().getString()).thenApply(profile -> {
profile = resolved; return profile
.map(p -> SkinsProxy.instance.getSkinTexture(p))
.filter(skin -> !IPony.getManager().getPony(skin).race().isHuman())
.orElse(null);
}); });
} }
@Nullable @Nullable
public Identifier getTexture() { public Identifier getTexture() {
if (profile != null) { return profile.getNow(null);
Identifier skin = SkinsProxy.instance.getSkinTexture(profile);
if (skin != null && !IPony.getManager().getPony(skin).race().isHuman()) {
return skin;
}
}
return null;
} }
} }
} }

View file

@ -3,9 +3,11 @@ accessible class net/minecraft/client/render/RenderLayer$MultiPhaseP
accessible class net/minecraft/client/render/RenderPhase$TextureBase accessible class net/minecraft/client/render/RenderPhase$TextureBase
accessible class net/minecraft/client/render/VertexConsumers$Union accessible class net/minecraft/client/render/VertexConsumers$Union
accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;ILnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;ILnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase;
accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;IZZLnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase; accessible method net/minecraft/client/render/RenderLayer of (Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;Lnet/minecraft/client/render/VertexFormat$DrawMode;IZZLnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;)Lnet/minecraft/client/render/RenderLayer$MultiPhase;
accessible method net/minecraft/client/render/RenderLayer$MultiPhase getPhases ()Lnet/minecraft/client/render/RenderLayer$MultiPhaseParameters; accessible method net/minecraft/client/render/RenderLayer$MultiPhase getPhases ()Lnet/minecraft/client/render/RenderLayer$MultiPhaseParameters;
accessible method net/minecraft/client/render/RenderPhase$TextureBase getId ()Ljava/util/Optional; accessible method net/minecraft/client/render/RenderPhase$TextureBase getId ()Ljava/util/Optional;
accessible field net/minecraft/client/render/RenderLayer$MultiPhaseParameters texture Lnet/minecraft/client/render/RenderPhase$TextureBase; accessible field net/minecraft/client/render/RenderLayer$MultiPhaseParameters texture Lnet/minecraft/client/render/RenderPhase$TextureBase;
accessible method net/minecraft/block/entity/SkullBlockEntity fetchProfile (Ljava/lang/String;)Ljava/util/concurrent/CompletableFuture;

View file

@ -8,7 +8,6 @@
"IResizeable", "IResizeable",
"MixinCamera", "MixinCamera",
"MixinDefaultSkinHelper", "MixinDefaultSkinHelper",
"MixinEntityRenderDispatcher",
"MixinEntityRenderers", "MixinEntityRenderers",
"MixinSkullBlockEntityRenderer", "MixinSkullBlockEntityRenderer",
"MixinHeldItemRenderer", "MixinHeldItemRenderer",