diff --git a/build.gradle b/build.gradle index 48d842a..dac203e 100644 --- a/build.gradle +++ b/build.gradle @@ -47,11 +47,8 @@ repositories { // Parchment mappings (if needed later) maven { url 'https://maven.parchmentmc.org' } - // Special Model Loader - maven { name = "FelNull Maven"; url = "https://maven.felnull.dev" } - // Player Animation Library - maven { name = "KosmX Maven"; url = 'https://maven.kosmx.dev/' } + maven { name = "KoSmX Maven"; url = 'https://maven.kosmx.dev/' } // Central repository mavenCentral() @@ -83,9 +80,9 @@ dependencies { // Rendering / Model Libraries // ───────────────────────────────────────────── - // Special Model Loader (included inside your mod jar) - modApi "dev.felnull:special-model-loader:1.4.0+pre.1" - include "dev.felnull:special-model-loader:1.4.0+pre.1" + // OBJ Reading Library + implementation "de.javagl:obj:0.4.0" + include "de.javagl:obj:0.4.0" // SVG Rendering Library include implementation("com.formdev:svgSalamander:1.1.4") @@ -95,12 +92,12 @@ dependencies { // Animation // ───────────────────────────────────────────── - // Player Animation Library (bundled into your mod) + // Player Animation Library include modImplementation( "dev.kosmx.player-anim:player-animation-lib-fabric:${project.player_anim}" ) - // Optional: BendyLib (only if you directly use it) + // Optional: BendyLib // include modRuntimeOnly( // "io.github.kosmx.bendy-lib:bendy-lib-fabric:${project.bendylib_version}" // ) @@ -110,7 +107,7 @@ dependencies { // External Libraries // ───────────────────────────────────────────── - // Session Java (auth/session handling) + // Session Java (Saturn auth/session handling) include implementation("com.github.selimaj-dev:session-java:0.1.6") } diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/Emotes.java b/src/main/java/org/saturnclient/cosmetics/Emotes.java similarity index 89% rename from src/main/java/org/saturnclient/saturnclient/cosmetics/Emotes.java rename to src/main/java/org/saturnclient/cosmetics/Emotes.java index 91a53d0..bc0353b 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/Emotes.java +++ b/src/main/java/org/saturnclient/cosmetics/Emotes.java @@ -1,4 +1,4 @@ -package org.saturnclient.saturnclient.cosmetics; +package org.saturnclient.cosmetics; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/cosmetics/cloak/CloakFeatureRenderer.java similarity index 92% rename from src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java rename to src/main/java/org/saturnclient/cosmetics/cloak/CloakFeatureRenderer.java index 6a519d5..a91ff29 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/cosmetics/cloak/CloakFeatureRenderer.java @@ -1,10 +1,9 @@ -package org.saturnclient.saturnclient.cosmetics; +package org.saturnclient.cosmetics.cloak; import java.util.Arrays; import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.config.Config; -import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.RenderLayer; @@ -24,6 +23,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.equipment.EquipmentAsset; import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; +import net.minecraft.util.math.RotationAxis; import net.minecraft.util.math.Vec3d; /** @@ -35,7 +35,7 @@ import net.minecraft.util.math.Vec3d; */ public class CloakFeatureRenderer extends FeatureRenderer { private final EquipmentModelLoader equipmentModelLoader; - private static final int PARTS = 16; + private static final int PARTS = 24; private final float[] segmentValues = new float[PARTS]; private static final float TEX_W = 176f; @@ -208,23 +208,23 @@ public class CloakFeatureRenderer extends FeatureRenderer= 20) { - float value = Math.min(1.0f, playerEntityRenderState.field_53537 / 108.0f) - + (Math.max(0, playerEntityRenderState.field_53536) / 16); + float velX = Math.min(1.0f, playerEntityRenderState.field_53537 / 108.0f); + float rawVelY = playerEntityRenderState.field_53536; + float velY = (rawVelY > 4.0f ? rawVelY : 0.0f) / 16; + + float value = playerEntityRenderState.isSwimming ? 0.0f : velX + velY; + if (Config.cloakPhysics.value) { updateSegmentValues(value); } else { diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java b/src/main/java/org/saturnclient/cosmetics/cloak/Cloaks.java similarity index 98% rename from src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java rename to src/main/java/org/saturnclient/cosmetics/cloak/Cloaks.java index d624942..ef54f85 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java +++ b/src/main/java/org/saturnclient/cosmetics/cloak/Cloaks.java @@ -1,11 +1,9 @@ -package org.saturnclient.saturnclient.cosmetics.cloaks; +package org.saturnclient.cosmetics.cloak; import net.minecraft.util.Identifier; import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.cosmetics.cloaks.utils.AnimatedCloakData; -import org.saturnclient.saturnclient.cosmetics.cloaks.utils.IdentifierUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -17,6 +15,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import org.saturnclient.cosmetics.cloak.utils.AnimatedCloakData; +import org.saturnclient.cosmetics.cloak.utils.IdentifierUtils; import org.saturnclient.saturnclient.SaturnClient; /** diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/GifDecoder.java b/src/main/java/org/saturnclient/cosmetics/cloak/GifDecoder.java similarity index 99% rename from src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/GifDecoder.java rename to src/main/java/org/saturnclient/cosmetics/cloak/GifDecoder.java index 5ab50d0..dcb4b2b 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/GifDecoder.java +++ b/src/main/java/org/saturnclient/cosmetics/cloak/GifDecoder.java @@ -1,4 +1,4 @@ -package org.saturnclient.saturnclient.cosmetics.cloaks; +package org.saturnclient.cosmetics.cloak; import java.awt.*; import java.awt.image.BufferedImage; diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/AnimatedCloakData.java b/src/main/java/org/saturnclient/cosmetics/cloak/utils/AnimatedCloakData.java similarity index 93% rename from src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/AnimatedCloakData.java rename to src/main/java/org/saturnclient/cosmetics/cloak/utils/AnimatedCloakData.java index a38296c..ca92aa0 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/AnimatedCloakData.java +++ b/src/main/java/org/saturnclient/cosmetics/cloak/utils/AnimatedCloakData.java @@ -1,4 +1,4 @@ -package org.saturnclient.saturnclient.cosmetics.cloaks.utils; +package org.saturnclient.cosmetics.cloak.utils; import net.minecraft.util.Identifier; diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/IdentifierUtils.java b/src/main/java/org/saturnclient/cosmetics/cloak/utils/IdentifierUtils.java similarity index 98% rename from src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/IdentifierUtils.java rename to src/main/java/org/saturnclient/cosmetics/cloak/utils/IdentifierUtils.java index 1ffd149..93fb940 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/IdentifierUtils.java +++ b/src/main/java/org/saturnclient/cosmetics/cloak/utils/IdentifierUtils.java @@ -1,4 +1,4 @@ -package org.saturnclient.saturnclient.cosmetics.cloaks.utils; +package org.saturnclient.cosmetics.cloak.utils; import org.saturnclient.saturnclient.SaturnClient; import net.minecraft.client.texture.NativeImage; diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/RandomUtils.java b/src/main/java/org/saturnclient/cosmetics/cloak/utils/RandomUtils.java similarity index 95% rename from src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/RandomUtils.java rename to src/main/java/org/saturnclient/cosmetics/cloak/utils/RandomUtils.java index 0e20412..b555d83 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/utils/RandomUtils.java +++ b/src/main/java/org/saturnclient/cosmetics/cloak/utils/RandomUtils.java @@ -1,4 +1,4 @@ -package org.saturnclient.saturnclient.cosmetics.cloaks.utils; +package org.saturnclient.cosmetics.cloak.utils; import java.util.Random; diff --git a/src/main/java/org/saturnclient/cosmetics/hat/HatFeatureRenderer.java b/src/main/java/org/saturnclient/cosmetics/hat/HatFeatureRenderer.java new file mode 100644 index 0000000..98b536e --- /dev/null +++ b/src/main/java/org/saturnclient/cosmetics/hat/HatFeatureRenderer.java @@ -0,0 +1,39 @@ +package org.saturnclient.cosmetics.hat; + +import org.saturnclient.cosmetics.obj.MtlLoader; +import org.saturnclient.cosmetics.obj.ObjModel; +import org.saturnclient.saturnclient.client.player.SaturnPlayer; + +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.PlayerEntityModel; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.util.math.MatrixStack; + +public class HatFeatureRenderer extends FeatureRenderer { + public HatFeatureRenderer(FeatureRendererContext context) { + super(context); + } + + @Override + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, + PlayerEntityRenderState state, float limbAngle, float limbDistance) { + SaturnPlayer player = SaturnPlayer.get(state.name); + + if (state.invisible || player == null || player.hat.isEmpty()) { + return; + } + + matrices.push(); + + this.getContextModel().head.rotate(matrices); + + ObjModel.cosmetic("hat", player.hat).render(MtlLoader.cosmetic(player.hat), + matrices, vertexConsumers, light, + OverlayTexture.DEFAULT_UV); + + matrices.pop(); + } +} \ No newline at end of file diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/Hats.java b/src/main/java/org/saturnclient/cosmetics/hat/Hats.java similarity index 94% rename from src/main/java/org/saturnclient/saturnclient/cosmetics/Hats.java rename to src/main/java/org/saturnclient/cosmetics/hat/Hats.java index ced3e77..6aee225 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/Hats.java +++ b/src/main/java/org/saturnclient/cosmetics/hat/Hats.java @@ -1,4 +1,4 @@ -package org.saturnclient.saturnclient.cosmetics; +package org.saturnclient.cosmetics.hat; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/saturnclient/cosmetics/obj/MtlLoader.java b/src/main/java/org/saturnclient/cosmetics/obj/MtlLoader.java new file mode 100644 index 0000000..22ce3b9 --- /dev/null +++ b/src/main/java/org/saturnclient/cosmetics/obj/MtlLoader.java @@ -0,0 +1,57 @@ +package org.saturnclient.cosmetics.obj; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import de.javagl.obj.*; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.Identifier; + +public class MtlLoader { + static Map> loadedMtls = new HashMap<>(); + + static Map loadMtl(Identifier mtlId) throws IOException { + try (InputStream is = MinecraftClient.getInstance().getResourceManager() + .getResource(mtlId).get().getInputStream()) { + List mtlList = MtlReader.read(is); + Map mtlMap = new java.util.LinkedHashMap<>(); + for (Mtl mtl : mtlList) { + mtlMap.put(mtl.getName(), mtl); + } + return mtlMap; + } + } + + public static Map of(Identifier mtlId) { + System.out.println(mtlId); + if (loadedMtls.containsKey(mtlId)) + return loadedMtls.get(mtlId); + + try { + Map mtl = loadMtl(mtlId); + loadedMtls.put(mtlId, mtl); + + return mtl; + } catch (IOException e) { + e.printStackTrace(); + + return null; + } + + } + + public static Map cosmetic(String cosmeticId) { + int index = cosmeticId.indexOf('_'); + + String mtlId = (index == -1) ? "" : cosmeticId.substring(index + 1); + + if (mtlId.isEmpty()) + mtlId = "white"; + + return of(Identifier.of("saturnclient", "models/cosmetic/materials/" + mtlId + ".mtl")); + } +} diff --git a/src/main/java/org/saturnclient/cosmetics/obj/ObjModel.java b/src/main/java/org/saturnclient/cosmetics/obj/ObjModel.java new file mode 100644 index 0000000..bfe2ac1 --- /dev/null +++ b/src/main/java/org/saturnclient/cosmetics/obj/ObjModel.java @@ -0,0 +1,102 @@ +package org.saturnclient.cosmetics.obj; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.javagl.obj.Mtl; +import de.javagl.obj.Obj; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.resource.Resource; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; + +public class ObjModel { + private static final ObjectMapper MAPPER = new ObjectMapper(); + public static final Map loadedObjModels = new HashMap<>(); + + public record Config( + @JsonProperty("translate") Vec3d transform, + @JsonProperty("scale") Vec3d scale, + @JsonProperty("rotation") Vec3d rotation) { + + public Config { + transform = transform == null ? new Vec3d(0, 0, 0) : transform; + scale = scale == null ? new Vec3d(1, 1, 1) : scale; + rotation = rotation == null ? new Vec3d(0, 0, 0) : rotation; + } + + @JsonFormat(shape = JsonFormat.Shape.ARRAY) + public record Vec3d(float x, float y, float z) { + } + } + + Obj obj; + Config config; + + public static ObjModel cosmetic(String cosmeticKind, String id) { + return of(Identifier.of("saturnclient", "models/cosmetic/" + cosmeticKind + "/" + id.split("_")[0] + "/model")); + } + + public static ObjModel of(Identifier obj) { + if (loadedObjModels.containsKey(obj)) + return loadedObjModels.get(obj); + + ObjModel o = new ObjModel(obj); + loadedObjModels.put(obj, o); + return o; + } + + ObjModel(Identifier identifier) { + Identifier objId = Identifier.of(identifier.getNamespace(), identifier.getPath() + ".obj"); + Identifier jsonId = Identifier.of(identifier.getNamespace(), identifier.getPath() + ".json"); + + try { + this.obj = ObjRenderer.loadObj(objId); + } catch (IOException e) { + e.printStackTrace(); + } + + // Try loading JSON config if it exists + ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); + Optional resource = resourceManager.getResource(jsonId); + + if (resource.isPresent()) { + try (InputStream stream = resource.get().getInputStream()) { + this.config = MAPPER.readValue(stream, Config.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void render(Map mtlMap, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, + int overlay) { + matrices.push(); + + matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(180.0f)); + matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Y.rotationDegrees(180.0f)); + + if (this.config != null) { + matrices.translate(config.transform.x, config.transform.y, config.transform.z); + + matrices.scale(config.scale.x, config.scale.y, config.scale.z); + + matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(config.rotation.x)); + matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Y.rotationDegrees(config.rotation.y)); + matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Z.rotationDegrees(config.rotation.z)); + } + + ObjRenderer.renderObj(this.obj, mtlMap, matrices, vertexConsumers, light, overlay); + + matrices.pop(); + } +} diff --git a/src/main/java/org/saturnclient/cosmetics/obj/ObjRenderer.java b/src/main/java/org/saturnclient/cosmetics/obj/ObjRenderer.java new file mode 100644 index 0000000..498e4f0 --- /dev/null +++ b/src/main/java/org/saturnclient/cosmetics/obj/ObjRenderer.java @@ -0,0 +1,111 @@ +package org.saturnclient.cosmetics.obj; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import de.javagl.obj.*; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; + +public class ObjRenderer { + public static Obj loadObj(Identifier objId) throws IOException { + try (InputStream is = MinecraftClient.getInstance().getResourceManager() + .getResource(objId).get().getInputStream()) { + return ObjReader.read(is); + } + } + + public static void renderObj(Obj obj, Map mtlMap, MatrixStack matrices, + VertexConsumerProvider vertexConsumers, int light, int overlay) { + MatrixStack.Entry entry = matrices.peek(); + + Map materialGroups = ObjSplitting.splitByMaterialGroups(obj); + + for (Map.Entry group : materialGroups.entrySet()) { + String materialName = group.getKey(); + Obj groupObj = group.getValue(); + + Mtl mtl = mtlMap != null ? mtlMap.get(materialName) : null; + + // Resolve texture identifier using same logic as ObjUnbakedModelModel + Identifier texture = Identifier.of("minecraft:textures/misc/white.png"); + + if (mtl != null) { + String mapKd = mtl.getMapKd(); + if (mapKd != null) { + // "#key" references are not resolvable at runtime without a texture map, + // so we only support direct resource location strings here + if (!mapKd.startsWith("#")) { + texture = Identifier.of(mapKd); + } + } + } + + // Diffuse color (Kd) + float r = 1f, g = 1f, b = 1f; + if (mtl != null) { + FloatTuple kd = mtl.getKd(); + if (kd != null) { + r = kd.getX(); + g = kd.getY(); + b = kd.getZ(); + } + } + + VertexConsumer consumer = vertexConsumers.getBuffer(RenderLayer.getEntityAlpha(texture)); + + int faces = groupObj.getNumFaces(); + final float fr = r, fg = g, fb = b; + + for (int f = 0; f < faces; f++) { + ObjFace face = groupObj.getFace(f); + int verts = face.getNumVertices(); + + // Your original winding order logic, untouched + for (int i = verts - 1; i >= 0; i--) { + writeVertex(groupObj, face, i, consumer, entry, light, overlay, fr, fg, fb); + } + } + } + } + + private static void writeVertex(Obj obj, ObjFace face, int index, VertexConsumer consumer, + MatrixStack.Entry matrix, int light, int overlay, + float r, float g, float b) { + + FloatTuple pos = obj.getVertex(face.getVertexIndex(index)); + float x = pos.getX(); + float y = pos.getY(); + float z = pos.getZ(); + + float nx = 0f, ny = 1f, nz = 0f; + int normalIndex = face.getNormalIndex(index); + if (normalIndex >= 0) { + FloatTuple n = obj.getNormal(normalIndex); + nx = n.getX(); + ny = n.getY(); + nz = n.getZ(); + } + + float u = 0f, v = 0f; + int texIndex = face.getTexCoordIndex(index); + if (texIndex >= 0) { + FloatTuple tc = obj.getTexCoord(texIndex); + u = tc.getX(); + v = 1f - tc.getY(); // Flip V: OBJ bottom-left origin -> Minecraft top-left + } + + consumer.vertex(matrix, x, y, z) + .color(r, g, b, 1f) + .texture(u, v) + .overlay(overlay) + .light(light) + .normal(matrix, nx, ny, nz); + } +} \ No newline at end of file diff --git a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java index 945e3d7..ba767c9 100644 --- a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java +++ b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java @@ -6,13 +6,13 @@ import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.util.math.MatrixStack; +import org.saturnclient.cosmetics.Emotes; +import org.saturnclient.cosmetics.cloak.Cloaks; +import org.saturnclient.cosmetics.hat.Hats; import org.saturnclient.modules.ModManager; import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.config.Config; import org.saturnclient.saturnclient.config.manager.ConfigManager; -import org.saturnclient.saturnclient.cosmetics.Emotes; -import org.saturnclient.saturnclient.cosmetics.Hats; -import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.saturnclient.event.KeyInputHandler; import org.saturnclient.saturnclient.mixin.DrawContextAccessor; import org.saturnclient.ui2.RenderScope; @@ -23,8 +23,6 @@ import org.saturnclient.ui2.screens.TitleMenu; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import dev.felnull.specialmodelloader.api.event.SpecialModelLoaderEvents; - /** * Main class for the Saturn Client mod. */ @@ -47,10 +45,6 @@ public class SaturnClient implements ModInitializer { ClientLifecycleEvents.CLIENT_STOPPING.register(_o -> ConfigManager.save()); - SpecialModelLoaderEvents.LOAD_SCOPE.register(() -> { - return (resourceManager, location) -> MOD_ID.equals(location.getNamespace()); - }); - ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { if (screen != null && !(screen instanceof TitleMenu)) { if (screen instanceof SaturnScreen) { diff --git a/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java b/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java index 442f7d9..4102704 100644 --- a/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java +++ b/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java @@ -3,10 +3,10 @@ package org.saturnclient.saturnclient.client; import java.util.UUID; import java.util.concurrent.TimeUnit; +import org.saturnclient.cosmetics.cloak.Cloaks; +import org.saturnclient.cosmetics.hat.Hats; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.cosmetics.Hats; -import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import dev.kosmx.playerAnim.api.layered.AnimationStack; import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationAccess; diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/HatFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/HatFeatureRenderer.java deleted file mode 100644 index cabc440..0000000 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/HatFeatureRenderer.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.saturnclient.saturnclient.cosmetics; - -import org.saturnclient.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.SaturnClient; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.EquippableComponent; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.ModelTransformationMode; -import net.minecraft.util.Identifier; - -public class HatFeatureRenderer extends FeatureRenderer { - public HatFeatureRenderer(FeatureRendererContext context) { - super(context); - } - - @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, - PlayerEntityRenderState state, float limbAngle, float limbDistance) { - ItemStack headItem = state.equippedHeadStack; - SaturnPlayer player = SaturnPlayer.get(state.name); - - if (!headItem.isEmpty() || state.invisible || player == null || player.hat.isEmpty()) { - return; - } - - matrices.push(); - - this.getContextModel().head.rotate(matrices); - matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(180.0f)); - matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Y.rotationDegrees(180.0f)); - - ItemStack customHat = new ItemStack(Items.STICK); - customHat.set(DataComponentTypes.ITEM_MODEL, - Identifier.of("saturnclient:hat_" + player.hat)); - customHat.set(DataComponentTypes.EQUIPPABLE, - EquippableComponent.builder(EquipmentSlot.HEAD).build()); - - ItemRenderer itemRenderer = SaturnClient.client.getItemRenderer(); - - itemRenderer.renderItem( - customHat, - ModelTransformationMode.THIRD_PERSON_RIGHT_HAND, - light, - OverlayTexture.DEFAULT_UV, - matrices, - vertexConsumers, - null, - 0); - - matrices.pop(); - } -} \ 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 9726b3e..5a9228e 100644 --- a/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java +++ b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -7,8 +7,8 @@ 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.saturnclient.cosmetics.cloak.CloakFeatureRenderer; +import org.saturnclient.cosmetics.hat.HatFeatureRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java b/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java index 0bcd0f8..6cc79d3 100644 --- a/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java +++ b/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java @@ -11,7 +11,7 @@ import com.kitfox.svg.SVGDiagram; import com.kitfox.svg.SVGUniverse; import org.jetbrains.annotations.Nullable; -import org.saturnclient.saturnclient.cosmetics.cloaks.utils.IdentifierUtils; +import org.saturnclient.cosmetics.cloak.utils.IdentifierUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.util.Identifier; diff --git a/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java b/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java index e087a43..96fa7f6 100644 --- a/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java +++ b/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java @@ -1,10 +1,10 @@ package org.saturnclient.ui2.screens; +import org.saturnclient.cosmetics.Emotes; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.saturnclient.config.Config; -import org.saturnclient.saturnclient.cosmetics.Emotes; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.Utils; import org.saturnclient.ui2.anim.Fade; diff --git a/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java b/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java index c537a31..724407a 100644 --- a/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java @@ -1,9 +1,9 @@ package org.saturnclient.ui2.screens.cosmetics; +import org.saturnclient.cosmetics.cloak.Cloaks; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.config.AnimationConfig; -import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.anim.Fade; diff --git a/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java b/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java index be2d1a5..f21723a 100644 --- a/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java @@ -1,9 +1,9 @@ package org.saturnclient.ui2.screens.cosmetics; +import org.saturnclient.cosmetics.hat.Hats; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.config.AnimationConfig; -import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.anim.Fade; diff --git a/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java b/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java index e26449c..2978972 100644 --- a/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java +++ b/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java @@ -1,11 +1,11 @@ package org.saturnclient.ui2.screens.store; +import org.saturnclient.cosmetics.cloak.Cloaks; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.saturnclient.config.Theme; -import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.Utils; import org.saturnclient.ui2.anim.Fade; diff --git a/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java b/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java index 098e09d..328f701 100644 --- a/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java +++ b/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java @@ -1,11 +1,11 @@ package org.saturnclient.ui2.screens.store; +import org.saturnclient.cosmetics.hat.Hats; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.saturnclient.config.Theme; -import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.Utils; import org.saturnclient.ui2.anim.Fade; diff --git a/src/main/resources/assets/saturnclient/items/hat_halo.json b/src/main/resources/assets/saturnclient/items/hat_halo.json deleted file mode 100644 index 9666890..0000000 --- a/src/main/resources/assets/saturnclient/items/hat_halo.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "saturnclient:item/halo/white" - } -} diff --git a/src/main/resources/assets/saturnclient/items/hat_halo_black.json b/src/main/resources/assets/saturnclient/items/hat_halo_black.json deleted file mode 100644 index cb7e0c7..0000000 --- a/src/main/resources/assets/saturnclient/items/hat_halo_black.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "saturnclient:item/halo/black" - } -} diff --git a/src/main/resources/assets/saturnclient/items/hat_horns_black.json b/src/main/resources/assets/saturnclient/items/hat_horns_black.json deleted file mode 100644 index 610dd63..0000000 --- a/src/main/resources/assets/saturnclient/items/hat_horns_black.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "saturnclient:item/horns/black" - } -} diff --git a/src/main/resources/assets/saturnclient/items/hat_horns_white.json b/src/main/resources/assets/saturnclient/items/hat_horns_white.json deleted file mode 100644 index e81956c..0000000 --- a/src/main/resources/assets/saturnclient/items/hat_horns_white.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "saturnclient:item/horns/white" - } -} diff --git a/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.json b/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.json new file mode 100644 index 0000000..e1f2835 --- /dev/null +++ b/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.json @@ -0,0 +1,4 @@ +{ + "translate": [0.0, 0.62, 0.0], + "scale": [0.2, 0.1, 0.2] +} \ No newline at end of file diff --git a/src/main/resources/assets/saturnclient/models/item/halo/halo.obj b/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.obj similarity index 100% rename from src/main/resources/assets/saturnclient/models/item/halo/halo.obj rename to src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.obj diff --git a/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.json b/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.json new file mode 100644 index 0000000..1387e00 --- /dev/null +++ b/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.json @@ -0,0 +1,4 @@ +{ + "translate": [0.0, 0.25, 0.0], + "scale": [0.25, 0.25, 0.25] +} \ No newline at end of file diff --git a/src/main/resources/assets/saturnclient/models/item/horns/horns.obj b/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.obj similarity index 100% rename from src/main/resources/assets/saturnclient/models/item/horns/horns.obj rename to src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.obj diff --git a/src/main/resources/assets/saturnclient/models/item/black.mtl b/src/main/resources/assets/saturnclient/models/cosmetic/materials/black.mtl similarity index 82% rename from src/main/resources/assets/saturnclient/models/item/black.mtl rename to src/main/resources/assets/saturnclient/models/cosmetic/materials/black.mtl index 6670390..3661766 100644 --- a/src/main/resources/assets/saturnclient/models/item/black.mtl +++ b/src/main/resources/assets/saturnclient/models/cosmetic/materials/black.mtl @@ -10,4 +10,4 @@ Ke 0.000000 0.000000 0.000000 Ni 1.450000 d 1.000000 illum 2 -map_Kd saturnclient:item/halo_black +map_Kd saturnclient:textures/item/halo_black.png diff --git a/src/main/resources/assets/saturnclient/models/item/white.mtl b/src/main/resources/assets/saturnclient/models/cosmetic/materials/white.mtl similarity index 83% rename from src/main/resources/assets/saturnclient/models/item/white.mtl rename to src/main/resources/assets/saturnclient/models/cosmetic/materials/white.mtl index f273f55..9c0dc53 100644 --- a/src/main/resources/assets/saturnclient/models/item/white.mtl +++ b/src/main/resources/assets/saturnclient/models/cosmetic/materials/white.mtl @@ -10,4 +10,4 @@ Ke 0.000000 0.000000 0.000000 Ni 1.450000 d 1.000000 illum 2 -map_Kd saturnclient:item/halo +map_Kd saturnclient:textures/item/halo.png diff --git a/src/main/resources/assets/saturnclient/models/item/halo/black.json b/src/main/resources/assets/saturnclient/models/item/halo/black.json deleted file mode 100644 index bd402ad..0000000 --- a/src/main/resources/assets/saturnclient/models/item/halo/black.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "parent": "special-model-loader:builtin/obj", - "model": "saturnclient:models/item/halo/halo.obj", - "mtl_override": "saturnclient:models/item/black.mtl", - "flip_v": true, - "display": { - "thirdperson_righthand": { - "rotation": [0, 0, 0], - "translation": [1.5, 12, 1.5], - "scale": [0.2, 0.2, 0.2] - } - } -} diff --git a/src/main/resources/assets/saturnclient/models/item/halo/white.json b/src/main/resources/assets/saturnclient/models/item/halo/white.json deleted file mode 100644 index 6265076..0000000 --- a/src/main/resources/assets/saturnclient/models/item/halo/white.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "parent": "special-model-loader:builtin/obj", - "model": "saturnclient:models/item/halo/halo.obj", - "mtl_override": "saturnclient:models/item/white.mtl", - "flip_v": true, - "display": { - "thirdperson_righthand": { - "rotation": [0, 0, 0], - "translation": [1.5, 12, 1.5], - "scale": [0.2, 0.2, 0.2] - } - } -} diff --git a/src/main/resources/assets/saturnclient/models/item/horns/black.json b/src/main/resources/assets/saturnclient/models/item/horns/black.json deleted file mode 100644 index effa342..0000000 --- a/src/main/resources/assets/saturnclient/models/item/horns/black.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "parent": "special-model-loader:builtin/obj", - "model": "saturnclient:models/item/horns/horns.obj", - "mtl_override": "saturnclient:models/item/black.mtl", - "flip_v": true, - "display": { - "thirdperson_righthand": { - "rotation": [0, 0, 0], - "translation": [2, 6, 2], - "scale": [0.25, 0.25, 0.25] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/saturnclient/models/item/horns/white.json b/src/main/resources/assets/saturnclient/models/item/horns/white.json deleted file mode 100644 index 1001f92..0000000 --- a/src/main/resources/assets/saturnclient/models/item/horns/white.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "parent": "special-model-loader:builtin/obj", - "model": "saturnclient:models/item/horns/horns.obj", - "mtl_override": "saturnclient:models/item/white.mtl", - "flip_v": true, - "display": { - "thirdperson_righthand": { - "rotation": [0, 0, 0], - "translation": [2, 6, 2], - "scale": [0.25, 0.25, 0.25] - } - } -} \ No newline at end of file