diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java new file mode 100644 index 0000000..46e10ff --- /dev/null +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -0,0 +1,90 @@ +package org.saturnclient.saturnclient.cosmetics; + +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.saturnclient.auth.SaturnPlayer; +import org.saturnclient.saturnclient.auth.SaturnSocket; + +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.equipment.EquipmentModel; +import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; +import net.minecraft.client.render.entity.equipment.EquipmentModel.LayerType; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.client.render.entity.model.EntityModelLayers; +import net.minecraft.client.render.entity.model.LoadedEntityModels; +import net.minecraft.client.render.entity.model.PlayerCapeModel; +import net.minecraft.client.render.entity.model.PlayerEntityModel; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.util.SkinTextures; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.EquippableComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.item.equipment.EquipmentAsset; +import net.minecraft.registry.RegistryKey; +import net.minecraft.util.Identifier; + +public class CloakFeatureRenderer extends FeatureRenderer { + private final BipedEntityModel model; + private final EquipmentModelLoader equipmentModelLoader; + + public CloakFeatureRenderer(FeatureRendererContext context, + LoadedEntityModels modelLoader, EquipmentModelLoader equipmentModelLoader) { + super(context); + this.model = new PlayerCapeModel( + modelLoader.getModelPart(EntityModelLayers.PLAYER_CAPE)); + this.equipmentModelLoader = equipmentModelLoader; + } + + private boolean hasCustomModelForLayer(ItemStack stack, EquipmentModel.LayerType layerType) { + EquippableComponent equippableComponent = (EquippableComponent) stack.get(DataComponentTypes.EQUIPPABLE); + if (equippableComponent != null && !equippableComponent.assetId().isEmpty()) { + EquipmentModel equipmentModel = this.equipmentModelLoader + .get((RegistryKey) equippableComponent.assetId().get()); + return !equipmentModel.getLayers(layerType).isEmpty(); + } else { + return false; + } + } + + public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, + PlayerEntityRenderState playerEntityRenderState, float f, float g) { + if (!playerEntityRenderState.invisible && playerEntityRenderState.capeVisible) { + SkinTextures skinTextures = playerEntityRenderState.skinTextures; + + if (skinTextures.capeTexture() == null) { + String name = playerEntityRenderState.name; + String uuid = SaturnSocket.playerNames.get(name); + if (uuid == null || !SaturnSocket.players.containsKey(uuid)) { + return; + } + + SaturnPlayer player = SaturnSocket.players.get(uuid); + + if (player.cloak == "") { + return; + } + + Identifier customCape = Identifier.of(SaturnClient.MOD_ID, "textures/cloaks/" + player.cloak + ".png"); + + if (!this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.WINGS)) { + matrixStack.push(); + if (this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.HUMANOID)) { + matrixStack.translate(0.0F, -0.053125F, 0.06875F); + } + + VertexConsumer vertexConsumer = vertexConsumerProvider + .getBuffer(RenderLayer.getEntityAlpha(customCape)); + ((PlayerEntityModel) this.getContextModel()).copyTransforms(this.model); + this.model.setAngles(playerEntityRenderState); + this.model.render(matrixStack, vertexConsumer, 0xF000F0, OverlayTexture.DEFAULT_UV); + matrixStack.pop(); + } + } + } + } +} diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java index c06e7c0..be39eb2 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java @@ -20,7 +20,7 @@ import org.saturnclient.saturnclient.SaturnClient; * Originally created by IIpho3nix and modified for Saturn Client by leo. */ public class Cloaks { - private static final String[] ANIMATED_CLOAKS = { "glitch" }; + private static final String[] ANIMATED_CLOAKS = { }; private static final String CLOAKS_RESOURCE_PATH = "assets/saturnclient/textures/cloaks/"; public static final List availableCloaks = new ArrayList<>(); diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/CapeRenderer.java b/src/main/java/org/saturnclient/saturnclient/mixin/CapeRenderer.java deleted file mode 100644 index 233dbf9..0000000 --- a/src/main/java/org/saturnclient/saturnclient/mixin/CapeRenderer.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.util.SkinTextures; -import net.minecraft.util.Identifier; - -import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -/** - * Mixin for handling custom cloaks in the AbstractClientPlayerEntity class. - * Injects custom cloak textures for players who have them assigned. - */ -@Mixin(AbstractClientPlayerEntity.class) -@Environment(EnvType.CLIENT) -public abstract class CapeRenderer { - /** - * Injects custom cloak textures into the player's skin textures. - */ - @Inject(method = "getSkinTextures", at = @At("RETURN"), cancellable = true) - private void injectCustomTextures(CallbackInfoReturnable cir) { - AbstractClientPlayerEntity player = (AbstractClientPlayerEntity) (Object) this; - String uuid = player.getUuidAsString().replace("-", ""); - - Identifier cloakTexture = Cloaks.getCurrentCloakTexture(uuid); - if (cloakTexture != null) { - SkinTextures textures = cir.getReturnValue(); - cir.setReturnValue(new SkinTextures( - textures.texture(), - textures.textureUrl(), - cloakTexture, - textures.elytraTexture(), - textures.model(), - textures.secure())); - } - } -} \ No newline at end of file diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java index c770261..8a90739 100644 --- a/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java +++ b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -7,6 +7,7 @@ import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.entity.player.PlayerEntity; +import org.saturnclient.saturnclient.cosmetics.CloakFeatureRenderer; import org.saturnclient.saturnclient.cosmetics.HatFeatureRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -22,7 +23,8 @@ public abstract class PlayerEntityRendererMixin } @Inject(method = "", at = @At("TAIL")) - private void addCustomFeatureRenderer(EntityRendererFactory.Context context, boolean slim, CallbackInfo ci) { + private void addCustomFeatureRenderer(EntityRendererFactory.Context ctx, boolean slim, CallbackInfo ci) { this.addFeature(new HatFeatureRenderer(this)); + this.addFeature(new CloakFeatureRenderer(this, ctx.getEntityModels(), ctx.getEquipmentModelLoader())); } } \ No newline at end of file diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/glitch.png b/src/main/resources/assets/saturnclient/textures/cloaks/glitch.png index dfcce24..e0d7f86 100644 Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/glitch.png and b/src/main/resources/assets/saturnclient/textures/cloaks/glitch.png differ diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/glitch_.png b/src/main/resources/assets/saturnclient/textures/cloaks/glitch_.png new file mode 100644 index 0000000..6370fba Binary files /dev/null and b/src/main/resources/assets/saturnclient/textures/cloaks/glitch_.png differ diff --git a/src/main/resources/saturnclient.mixins.json b/src/main/resources/saturnclient.mixins.json index ae67074..54fdca6 100644 --- a/src/main/resources/saturnclient.mixins.json +++ b/src/main/resources/saturnclient.mixins.json @@ -4,7 +4,6 @@ "package": "org.saturnclient.saturnclient.mixin", "compatibilityLevel": "JAVA_17", "client": [ - "CapeRenderer", "TabListMixin", "NameTagMixin", "PlayerEntityRendererMixin",