better cosmetics structure

This commit is contained in:
2025-03-28 16:50:40 +01:00
parent 9174c83a33
commit 8b0fe75cb9
20 changed files with 308 additions and 94 deletions
@@ -5,9 +5,10 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.ColorHelper;
import org.saturnclient.saturnclient.auth.SaturnSocket; import org.saturnclient.saturnclient.auth.SaturnSocket;
import org.saturnclient.saturnclient.cloaks.Cloaks;
import org.saturnclient.saturnclient.config.ConfigManager; import org.saturnclient.saturnclient.config.ConfigManager;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.Property;
import org.saturnclient.saturnclient.cosmetics.Hats;
import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks;
import org.saturnclient.saturnclient.event.KeyInputHandler; import org.saturnclient.saturnclient.event.KeyInputHandler;
import org.saturnclient.saturnmods.ModManager; import org.saturnclient.saturnmods.ModManager;
import org.saturnclient.ui.SaturnAnimation; import org.saturnclient.ui.SaturnAnimation;
@@ -61,6 +62,7 @@ public class SaturnClient implements ModInitializer {
KeyInputHandler.register(); KeyInputHandler.register();
if (SaturnSocket.authenticate()) { if (SaturnSocket.authenticate()) {
Cloaks.initialize(); Cloaks.initialize();
Hats.initialize();
LOGGER.info(MOD_ID + " initialization complete"); LOGGER.info(MOD_ID + " initialization complete");
} else { } else {
LOGGER.error("Failed to authenticate with the server"); LOGGER.error("Failed to authenticate with the server");
@@ -2,8 +2,10 @@ package org.saturnclient.saturnclient.auth;
public class SaturnPlayer { public class SaturnPlayer {
public String cloak = ""; public String cloak = "";
public String hat = "";
public SaturnPlayer(String cloak) { public SaturnPlayer(String cloak, String hat) {
this.cloak = cloak; this.cloak = cloak;
this.hat = hat;
} }
} }
@@ -7,7 +7,7 @@ import java.util.Map;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.cloaks.Cloaks; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks;
public class SaturnSocket { public class SaturnSocket {
@@ -42,8 +42,7 @@ public class SaturnSocket {
// Establish a persistent connection // Establish a persistent connection
socket = new Socket(server, port); socket = new Socket(server, port);
reader = new BufferedReader( reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()) new InputStreamReader(socket.getInputStream()));
);
writer = new PrintWriter(socket.getOutputStream(), true); writer = new PrintWriter(socket.getOutputStream(), true);
// Send authentication request // Send authentication request
@@ -56,21 +55,14 @@ public class SaturnSocket {
uuid = parser.getString("uuid"); uuid = parser.getString("uuid");
String cloak = parser.getString("cloak"); String cloak = parser.getString("cloak");
String hat = parser.getString("hat");
for (String availableCloak : parser.getArray("cloaks")) { for (String availableCloak : parser.getArray("cloaks")) {
SaturnClient.LOGGER.info("Available cloak: " + availableCloak); SaturnClient.LOGGER.info("Available cloak: " + availableCloak);
Cloaks.availableCloaks.add(availableCloak); Cloaks.availableCloaks.add(availableCloak);
} }
players.put(uuid, new SaturnPlayer(cloak)); players.put(uuid, new SaturnPlayer(cloak, hat));
if (cloak != null) {
SaturnClient.LOGGER.info(
"Setting cloak to " + cloak + " for " + uuid
);
MinecraftClient.getInstance()
.execute(() -> Cloaks.setCloak(uuid, cloak));
}
playerNames.put(client.getSession().getUsername(), uuid); playerNames.put(client.getSession().getUsername(), uuid);
@@ -1,5 +1,7 @@
package org.saturnclient.saturnclient.cosmetics; package org.saturnclient.saturnclient.cosmetics;
import org.saturnclient.saturnclient.auth.SaturnSocket;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumerProvider;
@@ -10,13 +12,15 @@ import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.component.DataComponentTypes; 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.ItemStack;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.item.ModelTransformationMode; import net.minecraft.item.ModelTransformationMode;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public class CustomHeadFeatureRenderer extends FeatureRenderer<PlayerEntityRenderState, PlayerEntityModel> { public class HatFeatureRenderer extends FeatureRenderer<PlayerEntityRenderState, PlayerEntityModel> {
public CustomHeadFeatureRenderer(FeatureRendererContext<PlayerEntityRenderState, PlayerEntityModel> context) { public HatFeatureRenderer(FeatureRendererContext<PlayerEntityRenderState, PlayerEntityModel> context) {
super(context); super(context);
} }
@@ -24,29 +28,29 @@ public class CustomHeadFeatureRenderer extends FeatureRenderer<PlayerEntityRende
public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light,
PlayerEntityRenderState state, float limbAngle, float limbDistance) { PlayerEntityRenderState state, float limbAngle, float limbDistance) {
ItemStack headItem = state.equippedHeadStack; ItemStack headItem = state.equippedHeadStack;
if (headItem.isEmpty()) { String uuid = SaturnSocket.playerNames.get(state.name);
if (headItem.isEmpty() && uuid != null) {
String hat = SaturnSocket.players.get(uuid).hat;
if (hat.isEmpty()) {
return;
}
matrices.push(); matrices.push();
// Apply the head's rotations to align with the player's head orientation
this.getContextModel().head.rotate(matrices); this.getContextModel().head.rotate(matrices);
// Scale the item to fit properly
matrices.scale(0.5f, .5f, 0.5f);
// Position the item properly
matrices.translate(0.0f, -0.8f, 0.0f);
// Rotate the item 180 degrees around the X-axis to fix the upside-down issue
matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(180.0f)); matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(180.0f));
matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Y.rotationDegrees(180.0f));
matrices.translate(0.0f, 0.5f, 0.0f);
// Create an ItemStack for the custom head item
ItemStack customHat = new ItemStack(Items.STICK); ItemStack customHat = new ItemStack(Items.STICK);
customHat.set(DataComponentTypes.ITEM_MODEL, Identifier.of("saturnclient:hat")); customHat.set(DataComponentTypes.ITEM_MODEL,
Identifier.of("saturnclient:hat_" + hat));
customHat.set(DataComponentTypes.EQUIPPABLE,
EquippableComponent.builder(EquipmentSlot.HEAD).build());
// Get the ItemRenderer instance
ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
// Render the item as headwear
itemRenderer.renderItem( itemRenderer.renderItem(
customHat, customHat,
ModelTransformationMode.HEAD, ModelTransformationMode.HEAD,
@@ -54,11 +58,9 @@ public class CustomHeadFeatureRenderer extends FeatureRenderer<PlayerEntityRende
OverlayTexture.DEFAULT_UV, OverlayTexture.DEFAULT_UV,
matrices, matrices,
vertexConsumers, vertexConsumers,
null, // World can be null for entity rendering null,
0 // Seed for randomness, not needed here 0);
);
// Pop the matrix stack to restore previous transformations
matrices.pop(); matrices.pop();
} }
} }
@@ -0,0 +1,12 @@
package org.saturnclient.saturnclient.cosmetics;
import java.util.ArrayList;
import java.util.List;
public class Hats {
public static List<String> availableHats = new ArrayList<>();
public static void initialize() {
availableHats.add(0, "");
}
}
@@ -1,11 +1,11 @@
package org.saturnclient.saturnclient.cloaks; package org.saturnclient.saturnclient.cosmetics.cloaks;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.auth.SaturnSocket; import org.saturnclient.saturnclient.auth.SaturnSocket;
import org.saturnclient.saturnclient.cosmetics.cloaks.utils.AnimatedCloakData;
import org.saturnclient.saturnclient.cosmetics.cloaks.utils.IdentifierUtils;
import org.saturnclient.saturnclient.auth.SaturnPlayer; import org.saturnclient.saturnclient.auth.SaturnPlayer;
import org.saturnclient.saturnclient.cloaks.utils.AnimatedCloakData;
import org.saturnclient.saturnclient.cloaks.utils.IdentifierUtils;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@@ -55,7 +55,7 @@ public class Cloaks {
public static void setCloakSilent(String uuid, String cloakName) { public static void setCloakSilent(String uuid, String cloakName) {
SaturnPlayer player = SaturnSocket.players.get(uuid); SaturnPlayer player = SaturnSocket.players.get(uuid);
if (player == null) { if (player == null) {
SaturnSocket.players.put(uuid, new SaturnPlayer(cloakName)); SaturnSocket.players.put(uuid, new SaturnPlayer(cloakName, null));
} else { } else {
player.cloak = cloakName; player.cloak = cloakName;
} }
@@ -1,4 +1,4 @@
package org.saturnclient.saturnclient.cloaks; package org.saturnclient.saturnclient.cosmetics.cloaks;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@@ -1,4 +1,4 @@
package org.saturnclient.saturnclient.cloaks.utils; package org.saturnclient.saturnclient.cosmetics.cloaks.utils;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -1,4 +1,4 @@
package org.saturnclient.saturnclient.cloaks.utils; package org.saturnclient.saturnclient.cosmetics.cloaks.utils;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImage;
@@ -1,4 +1,4 @@
package org.saturnclient.saturnclient.cloaks.utils; package org.saturnclient.saturnclient.cosmetics.cloaks.utils;
import java.util.Random; import java.util.Random;
@@ -3,7 +3,7 @@ package org.saturnclient.saturnclient.menus;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.auth.SaturnSocket; import org.saturnclient.saturnclient.auth.SaturnSocket;
import org.saturnclient.saturnclient.cloaks.Cloaks; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks;
import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnUi;
import org.saturnclient.ui.Textures; import org.saturnclient.ui.Textures;
import org.saturnclient.ui.widgets.SaturnClickableSprite; import org.saturnclient.ui.widgets.SaturnClickableSprite;
@@ -6,7 +6,7 @@ import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.util.SkinTextures; import net.minecraft.client.util.SkinTextures;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import org.saturnclient.saturnclient.cloaks.Cloaks; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks;
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;
@@ -7,7 +7,7 @@ import net.minecraft.client.render.entity.model.PlayerEntityModel;
import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import org.saturnclient.saturnclient.cosmetics.CustomHeadFeatureRenderer; import org.saturnclient.saturnclient.cosmetics.HatFeatureRenderer;
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;
@@ -23,6 +23,6 @@ public abstract class PlayerEntityRendererMixin
@Inject(method = "<init>", at = @At("TAIL")) @Inject(method = "<init>", at = @At("TAIL"))
private void addCustomFeatureRenderer(EntityRendererFactory.Context context, boolean slim, CallbackInfo ci) { private void addCustomFeatureRenderer(EntityRendererFactory.Context context, boolean slim, CallbackInfo ci) {
this.addFeature(new CustomHeadFeatureRenderer(this)); this.addFeature(new HatFeatureRenderer(this));
} }
} }
@@ -1,6 +0,0 @@
{
"model": {
"type": "minecraft:model",
"model": "saturnclient:item/hat"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "saturnclient:item/halo"
}
}
@@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "saturnclient:item/halo"
}
}
@@ -0,0 +1,240 @@
{
"credit": "Made with Blockbench",
"textures": {
"1": "saturnclient:item/halo"
},
"elements": [
{
"name": "hexadecagon",
"from": [7.40326, 10, 5],
"to": [8.59674, 11, 6],
"rotation": { "angle": -45, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 5],
"to": [8.59674, 11, 6],
"rotation": { "angle": -22.5, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 5],
"to": [8.59674, 11, 6],
"rotation": { "angle": 0, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 5],
"to": [8.59674, 11, 6],
"rotation": { "angle": 22.5, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 5],
"to": [8.59674, 11, 6],
"rotation": { "angle": 45, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 10],
"to": [8.59674, 11, 11],
"rotation": { "angle": -45, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 10],
"to": [8.59674, 11, 11],
"rotation": { "angle": -22.5, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 10],
"to": [8.59674, 11, 11],
"rotation": { "angle": 0, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 10],
"to": [8.59674, 11, 11],
"rotation": { "angle": 22.5, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [7.40326, 10, 10],
"to": [8.59674, 11, 11],
"rotation": { "angle": 45, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [5, 10, 7.40326],
"to": [6, 11, 8.59674],
"rotation": { "angle": -22.5, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [5, 10, 7.40326],
"to": [6, 11, 8.59674],
"rotation": { "angle": 0, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [5, 10, 7.40326],
"to": [6, 11, 8.59674],
"rotation": { "angle": 22.5, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [10, 10, 7.40326],
"to": [11, 11, 8.59674],
"rotation": { "angle": -22.5, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [10, 10, 7.40326],
"to": [11, 11, 8.59674],
"rotation": { "angle": 0, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
},
{
"name": "hexadecagon",
"from": [10, 10, 7.40326],
"to": [11, 11, 8.59674],
"rotation": { "angle": 22.5, "axis": "y", "origin": [8, 11, 8] },
"faces": {
"north": { "uv": [0, 0, 1, 1], "texture": "#1" },
"east": { "uv": [0, 0, 1, 1], "texture": "#1" },
"south": { "uv": [0, 0, 1, 1], "texture": "#1" },
"west": { "uv": [0, 0, 1, 1], "texture": "#1" },
"up": { "uv": [0, 0, 1, 1], "texture": "#1" },
"down": { "uv": [0, 0, 1, 1], "texture": "#1" }
}
}
],
"groups": [
{
"name": "hexadecagon",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
}
]
}
@@ -1,42 +0,0 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "saturnclient:item/hat",
"particle": "saturnclient:item/hat"
},
"elements": [
{
"from": [3, 0, 3],
"to": [13, 1, 13],
"rotation": {"angle": 0, "axis": "x", "origin": [4, 0, 4]},
"faces": {
"north": {"uv": [8, 0, 16, 1], "texture": "#0"},
"east": {"uv": [8, 1, 16, 2], "texture": "#0"},
"south": {"uv": [8, 2, 16, 3], "texture": "#0"},
"west": {"uv": [8, 3, 16, 4], "texture": "#0"},
"up": {"uv": [8, 8, 0, 0], "texture": "#0"},
"down": {"uv": [8, 8, 0, 16], "texture": "#0"}
}
},
{
"from": [4, 1, 4],
"to": [12, 8, 12],
"rotation": {"angle": 0, "axis": "x", "origin": [4, 1, 4]},
"faces": {
"north": {"uv": [8, 0, 16, 1], "texture": "#0"},
"east": {"uv": [8, 1, 16, 2], "texture": "#0"},
"south": {"uv": [8, 2, 16, 3], "texture": "#0"},
"west": {"uv": [8, 3, 16, 4], "texture": "#0"},
"up": {"uv": [8, 8, 0, 0], "texture": "#0"},
"down": {"uv": [8, 8, 0, 16], "texture": "#0"}
}
}
],
"display": {
"head": {
"translation": [0, 18.25, 0],
"scale": [1.5, 1.5, 1.5]
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B