Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
505 changes: 500 additions & 5 deletions LICENSE

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ dependencies {

// MixinExtras
compileOnly("io.github.llamalad7:mixinextras-common:0.5.0")

// ASM for building
compileOnly("org.ow2.asm:asm-tree:9.9")
}

configurations {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public static UUID getUUID(String username) {
*/
private static JsonObject getApiData(String data) {
try {
URI uri = URI.create("https://api.minecraftapi.net/api/v2/profile/" + data);
URI uri = URI.create("https://api.minecraftapi.net/v3/profile/" + data + "?params=[full_uuid,name]");
HttpURLConnection httpurlconnection = (HttpURLConnection) uri.toURL().openConnection(Minecraft.getInstance().getProxy());
httpurlconnection.setRequestProperty("User-Agent", "minecraftcapes-mod/" + MINECRAFT_VERSION);
httpurlconnection.setDoInput(true);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package net.minecraftcapes.mixin;

import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;

import java.util.List;
import java.util.Set;

public class MinecraftCapesMixinPlugin implements IMixinConfigPlugin {

private static Boolean isLunar() {
try {
Class.forName("com.moonsworth.lunar.genesis.Genesis");
return true;
} catch (Throwable ignored) {
}

return false;
}

@Override
public void onLoad(String s) {
}

@Override
public String getRefMapperConfig() {
return null;
}

@Override
public boolean shouldApplyMixin(String target, String mixin) {
boolean lunar = isLunar();

// Anything in your lunar package only applies on Lunar
if (mixin.contains("lunar.")) {
return lunar;
}

// Disable fragile vanilla mixins when running on Lunar
if (mixin.contains("vanilla.")) {
return !lunar;
}

return true;
}

@Override
public void acceptTargets(Set<String> set, Set<String> set1) {}

@Override
public List<String> getMixins() {
return null;
}

@Override
public void preApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) {}

@Override
public void postApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) {}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.minecraftcapes.mixin;
package net.minecraftcapes.mixin.common;

import net.minecraft.client.renderer.entity.state.AvatarRenderState;
import net.minecraft.resources.Identifier;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.minecraftcapes.mixin;
package net.minecraftcapes.mixin.common;

import net.minecraft.client.entity.ClientAvatarEntity;
import net.minecraft.client.model.player.PlayerModel;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.minecraftcapes.mixin;
package net.minecraftcapes.mixin.common;

import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.model.Model;
Expand All @@ -15,34 +16,25 @@
import net.minecraftcapes.player.ExtendedRenderState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

@Mixin(CapeLayer.class)
@Mixin(value = CapeLayer.class, priority = 0)
public abstract class MixinCapeLayer extends RenderLayer<AvatarRenderState, PlayerModel> {

public MixinCapeLayer(RenderLayerParent<AvatarRenderState, PlayerModel> p_117346_) {
super(p_117346_);
}

@Redirect(method = "submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;ILnet/minecraft/client/renderer/entity/state/AvatarRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/rendertype/RenderType;IIILnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;)V"))
private void minecraftcapes$submitCape(SubmitNodeCollector instance, Model model, Object object, PoseStack poseStack, RenderType renderType, int p_432874_, int overlay, int outlineColor, ModelFeatureRenderer.CrumblingOverlay crumblingOverlay, @Local AvatarRenderState avatarRenderState) {
@WrapWithCondition(method = "submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;ILnet/minecraft/client/renderer/entity/state/AvatarRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/rendertype/RenderType;IIILnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;)V"))
private boolean minecraftcapes$submitCape(SubmitNodeCollector instance, Model model, Object object, PoseStack poseStack, RenderType renderType, int i, int overlay, int outlineColor, ModelFeatureRenderer.CrumblingOverlay crumblingOverlay, @Local AvatarRenderState avatarRenderState) {
ExtendedRenderState extendedRenderState = (ExtendedRenderState) avatarRenderState;
if(extendedRenderState.minecraftcapes$getCapeEnabled()) {
instance.order(0).submitModel(model, object, poseStack, RenderTypes.armorCutoutNoCull(avatarRenderState.skin.cape().texturePath()), p_432874_, overlay, -1, null, outlineColor, crumblingOverlay);
instance.order(0).submitModel(model, object, poseStack, RenderTypes.armorCutoutNoCull(avatarRenderState.skin.cape().texturePath()), i, overlay, -1, null, outlineColor, crumblingOverlay);
if(extendedRenderState.minecraftcapes$hasCapeGlint()) {
instance.order(1).submitModel(model, object, poseStack, RenderTypes.armorEntityGlint(), p_432874_, overlay, -1, null, outlineColor, crumblingOverlay);
instance.order(1).submitModel(model, object, poseStack, RenderTypes.armorEntityGlint(), i, overlay, -1, null, outlineColor, crumblingOverlay);
}
return false;
} else {
instance.submitModel(
model,
avatarRenderState,
poseStack,
renderType,
p_432874_,
overlay,
outlineColor,
crumblingOverlay
);
return true;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.minecraftcapes.mixin;
package net.minecraftcapes.mixin.common;

import net.minecraft.client.entity.ClientAvatarEntity;
import net.minecraft.client.entity.ClientMannequin;
Expand All @@ -14,9 +14,9 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(ClientMannequin.class)
public abstract class ClientMannequinMixin extends Mannequin implements ClientAvatarEntity {
public abstract class MixinClientMannequin extends Mannequin implements ClientAvatarEntity {

protected ClientMannequinMixin(Level p_445957_) {
protected MixinClientMannequin(Level p_445957_) {
super(p_445957_);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.minecraftcapes.mixin;
package net.minecraftcapes.mixin.common;

import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.blaze3d.vertex.PoseStack;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package net.minecraftcapes.mixin;
package net.minecraftcapes.mixin.common;

import com.mojang.authlib.GameProfile;
import net.minecraft.client.multiplayer.PlayerInfo;
import net.minecraft.world.entity.player.PlayerSkin;
import net.minecraftcapes.player.DownloadManager;
import net.minecraftcapes.player.PlayerHandler;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -12,20 +11,13 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.util.function.Supplier;

@Mixin(PlayerInfo.class)
public class MixinPlayerInfo {

@Shadow
@Final
private GameProfile profile;

@Inject(method = "createSkinLookup", at = @At("HEAD"))
private static void minecraftcapes$downloadPlayerInfo(GameProfile profile, CallbackInfoReturnable<Supplier<PlayerSkin>> cir) {
DownloadManager.prepareDownload(profile.id(), profile.name(), false);
}


@Inject(method = "getSkin", at = @At("RETURN"), cancellable = true)
public void minecraftcapes$getSkin(CallbackInfoReturnable<PlayerSkin> cir) {
PlayerHandler playerHandler = PlayerHandler.get(profile.id());
Expand All @@ -34,5 +26,5 @@ public class MixinPlayerInfo {
cir.setReturnValue(playerHandler.getSkin(cir.getReturnValue()));
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package net.minecraftcapes.mixin.lunar;

import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeDeformation;
import net.minecraft.client.model.geom.builders.CubeListBuilder;
import net.minecraft.client.model.geom.builders.LayerDefinition;
import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.model.player.PlayerEarsModel;
import net.minecraft.client.model.player.PlayerModel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;

@Mixin(PlayerEarsModel.class)
public class MixinPlayerEarsModel {

/**
* I wouldn't usually recommend an overwrite but it stops Lunar complaining...
* @return
*/
@Overwrite
public static LayerDefinition createEarsLayer() {
MeshDefinition meshdefinition = PlayerModel.createMesh(CubeDeformation.NONE, false);
PartDefinition partdefinition = meshdefinition.getRoot().clearRecursively();
PartDefinition partdefinition1 = partdefinition.getChild("head");
CubeListBuilder cubelistbuilder = CubeListBuilder.create().texOffs(0, 0).addBox(-3.0F, -6.0F, -1.0F, 6.0F, 6.0F, 1.0F, new CubeDeformation(1.0F, 1.0F, 0.2F));
partdefinition1.addOrReplaceChild("left_ear", cubelistbuilder, PartPose.offset(-6.0F, -6.0F, 0.0F));
partdefinition1.addOrReplaceChild("right_ear", cubelistbuilder, PartPose.offset(6.0F, -6.0F, 0.0F));
return LayerDefinition.create(meshdefinition, 14, 7);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package net.minecraftcapes.mixin.lunar;

import com.mojang.authlib.GameProfile;
import net.minecraft.client.multiplayer.PlayerInfo;
import net.minecraftcapes.player.DownloadManager;
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.CallbackInfo;

@Mixin(PlayerInfo.class)
public class MixinPlayerInfo {

@Inject(method = "<init>", at = @At("RETURN"))
private void minecraftcapes$init(GameProfile profile, boolean p_254409_, CallbackInfo ci) {
DownloadManager.prepareDownload(profile.id(), profile.name(), false);
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.minecraftcapes.mixin;
package net.minecraftcapes.mixin.vanilla;

import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.client.model.geom.ModelPart;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package net.minecraftcapes.mixin.vanilla;

import com.mojang.authlib.GameProfile;
import net.minecraft.client.multiplayer.PlayerInfo;
import net.minecraft.world.entity.player.PlayerSkin;
import net.minecraftcapes.player.DownloadManager;
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;

import java.util.function.Supplier;

@Mixin(PlayerInfo.class)
public class MixinPlayerInfo {

@Inject(method = "createSkinLookup", at = @At("HEAD"))
private static void minecraftcapes$downloadPlayerInfo(GameProfile profile, CallbackInfoReturnable<Supplier<PlayerSkin>> cir) {
DownloadManager.prepareDownload(profile.id(), profile.name(), false);
}

}
18 changes: 11 additions & 7 deletions common/src/main/resources/minecraftcapes.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,20 @@
"required" : true,
"minVersion" : "0.8",
"package" : "net.minecraftcapes.mixin",
"plugin" : "net.minecraftcapes.mixin.MinecraftCapesMixinPlugin",
"refmap" : "minecraftcapes.refmap.json",
"compatibilityLevel" : "JAVA_17",
"client" : [
"ClientMannequinMixin",
"MixinAvatarRenderer",
"MixinAvatarRenderState",
"MixinCapeLayer",
"MixinDeadmau5EarsLayer",
"MixinPlayerEarsModel",
"MixinPlayerInfo"
"common.MixinAvatarRenderer",
"common.MixinAvatarRenderState",
"common.MixinCapeLayer",
"common.MixinClientMannequin",
"common.MixinDeadmau5EarsLayer",
"common.MixinPlayerInfo",
"lunar.MixinPlayerEarsModel",
"lunar.MixinPlayerInfo",
"vanilla.MixinPlayerEarsModel",
"vanilla.MixinPlayerInfo"
],
"injectors" : {
"defaultRequire" : 1
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Every field you add must be added to the root build.gradle expandProps map.

# Project
version=1.0.0
version=1.0.1
group=net.minecraftcapes
java_version=21
lombok_version=9.1.0
Expand All @@ -13,7 +13,7 @@ pack_format=75
mod_name=MinecraftCapes
mod_author=[james090500,Siriuo]
mod_id=minecraftcapes
license=All Rights Reserved
license=LGPL-2.1-only
credits=
description=Custom Cape, Elytras and Deadmau5 textures for minecraft which everyone with the mod can see!
minecraft_version_range=[1.21.11]
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
Loading