You've already forked AstralRinth
forked from didirus/AstralRinth
Merge commit 'bc90c27e27df60f95a1fdc3572fb0bd5aa4fd102' into feature-clean
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "theseus"
|
||||
version = "0.10.1"
|
||||
version = "1.0.0-local" # The actual version is set by the theseus-build workflow on tagging
|
||||
authors = ["Jai A <jaiagr+gpg@pm.me>"]
|
||||
edition.workspace = true
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.modrinth.theseus;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.AccessibleObject;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.Arrays;
|
||||
@@ -76,14 +77,14 @@ public final class MinecraftLaunch {
|
||||
|
||||
Object thisObject = null;
|
||||
if (!Modifier.isStatic(mainMethod.getModifiers())) {
|
||||
thisObject = mainClass.getDeclaredConstructor().newInstance();
|
||||
thisObject = forceAccessible(mainClass.getDeclaredConstructor()).newInstance();
|
||||
}
|
||||
|
||||
final Object[] parameters = mainMethod.getParameterCount() > 0 ? new Object[] {args} : new Object[] {};
|
||||
|
||||
mainMethod.invoke(thisObject, parameters);
|
||||
} else {
|
||||
findSimpleMainMethod(mainClass).invoke(null, new Object[] {args});
|
||||
forceAccessible(findSimpleMainMethod(mainClass)).invoke(null, new Object[] {args});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,4 +116,14 @@ public final class MinecraftLaunch {
|
||||
private static Method findSimpleMainMethod(Class<?> mainClass) throws NoSuchMethodException {
|
||||
return mainClass.getMethod("main", String[].class);
|
||||
}
|
||||
|
||||
private static <T extends AccessibleObject> T forceAccessible(T object) throws ReflectiveOperationException {
|
||||
try {
|
||||
final Method setAccessible0 = AccessibleObject.class.getDeclaredMethod("setAccessible0", boolean.class);
|
||||
setAccessible0.setAccessible(true);
|
||||
setAccessible0.invoke(object, true);
|
||||
} catch (NoSuchMethodException e) {
|
||||
}
|
||||
return object;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -622,6 +622,12 @@ pub async fn launch_minecraft(
|
||||
.into_iter(),
|
||||
);
|
||||
|
||||
// The java launcher requires access to java.lang.reflect in order to force access in to
|
||||
// whatever module the main class is in
|
||||
if java_version.parsed_version >= 9 {
|
||||
command.arg("--add-opens=java.base/java.lang.reflect=ALL-UNNAMED");
|
||||
}
|
||||
|
||||
// The java launcher code requires internal JDK code in Java 25+ in order to support JEP 512
|
||||
if java_version.parsed_version >= 25 {
|
||||
command.arg("--add-opens=jdk.internal/jdk.internal.misc=ALL-UNNAMED");
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
extends: ['custom/library'],
|
||||
ignorePatterns: ['**/*.scss', '**/*.svg', 'node_modules/', 'dist/'],
|
||||
ignorePatterns: ['**/*.scss', '**/*.svg', 'node_modules/', 'dist/', '**/*.gltf'],
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
|
||||
5
packages/assets/icons.d.ts
vendored
5
packages/assets/icons.d.ts
vendored
@@ -9,3 +9,8 @@ declare module '*.webp' {
|
||||
const src: string
|
||||
export default src
|
||||
}
|
||||
|
||||
declare module '*?url' {
|
||||
const src: string
|
||||
export default src
|
||||
}
|
||||
|
||||
@@ -97,4 +97,8 @@ export const MicrosoftIcon = _MicrosoftIcon
|
||||
export const PirateShipIcon = _PirateShipIcon
|
||||
export const AstralRinthLogo = _AstralRinthLogo
|
||||
|
||||
export { default as CapeModel } from './models/cape.gltf?url'
|
||||
export { default as ClassicPlayerModel } from './models/classic-player.gltf?url'
|
||||
export { default as SlimPlayerModel } from './models/slim-player.gltf?url'
|
||||
|
||||
export * from './generated-icons'
|
||||
|
||||
92
packages/assets/models/cape.gltf
Normal file
92
packages/assets/models/cape.gltf
Normal file
@@ -0,0 +1,92 @@
|
||||
{
|
||||
"asset": { "version": "2.0", "generator": "Blockbench 4.12.4 glTF exporter" },
|
||||
"scenes": [{ "nodes": [1], "name": "blockbench_export" }],
|
||||
"scene": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"rotation": [0, 0, 0.19509032201612825, 0.9807852804032304],
|
||||
"translation": [0.15625, 1, 0],
|
||||
"name": "Cape",
|
||||
"mesh": 0
|
||||
},
|
||||
{ "children": [0] }
|
||||
],
|
||||
"bufferViews": [
|
||||
{ "buffer": 0, "byteOffset": 0, "byteLength": 288, "target": 34962, "byteStride": 12 },
|
||||
{ "buffer": 0, "byteOffset": 288, "byteLength": 288, "target": 34962, "byteStride": 12 },
|
||||
{ "buffer": 0, "byteOffset": 576, "byteLength": 192, "target": 34962, "byteStride": 8 },
|
||||
{ "buffer": 0, "byteOffset": 768, "byteLength": 72, "target": 34963 }
|
||||
],
|
||||
"buffers": [
|
||||
{
|
||||
"byteLength": 840,
|
||||
"uri": "data:application/octet-stream;base64,AAAAPQAAAAAAAKA+AAAAPQAAAAAAAKC+AAAAPQAAgL8AAKA+AAAAPQAAgL8AAKC+AAAAvQAAAAAAAKC+AAAAvQAAAAAAAKA+AAAAvQAAgL8AAKC+AAAAvQAAgL8AAKA+AAAAvQAAAAAAAKC+AAAAPQAAAAAAAKC+AAAAvQAAAAAAAKA+AAAAPQAAAAAAAKA+AAAAvQAAgL8AAKA+AAAAPQAAgL8AAKA+AAAAvQAAgL8AAKC+AAAAPQAAgL8AAKC+AAAAvQAAAAAAAKA+AAAAPQAAAAAAAKA+AAAAvQAAgL8AAKA+AAAAPQAAgL8AAKA+AAAAPQAAAAAAAKC+AAAAvQAAAAAAAKC+AAAAPQAAgL8AAKC+AAAAvQAAgL8AAKC+AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AACAPAAAgD0AADA+AACAPQAAgDwAAAg/AAAwPgAACD8AAEA+AACAPQAAsD4AAIA9AABAPgAACD8AALA+AAAIPwAAgDwAAAA9AACAPAAAgD0AADA+AAAAPQAAMD4AAIA9AAAwPgAAAD0AAKg+AAAAPQAAMD4AAAAAAACoPgAAAAAAAEA+AACAPQAAMD4AAIA9AABAPgAACD8AADA+AAAIPwAAAAAAAIA9AACAPAAAgD0AAAAAAAAIPwAAgDwAAAg/AAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUA"
|
||||
}
|
||||
],
|
||||
"accessors": [
|
||||
{
|
||||
"bufferView": 0,
|
||||
"componentType": 5126,
|
||||
"count": 24,
|
||||
"max": [0.03125, 0, 0.3125],
|
||||
"min": [-0.03125, -1, -0.3125],
|
||||
"type": "VEC3"
|
||||
},
|
||||
{
|
||||
"bufferView": 1,
|
||||
"componentType": 5126,
|
||||
"count": 24,
|
||||
"max": [1, 1, 1],
|
||||
"min": [-1, -1, -1],
|
||||
"type": "VEC3"
|
||||
},
|
||||
{
|
||||
"bufferView": 2,
|
||||
"componentType": 5126,
|
||||
"count": 24,
|
||||
"max": [0.34375, 0.53125],
|
||||
"min": [0, 0],
|
||||
"type": "VEC2"
|
||||
},
|
||||
{
|
||||
"bufferView": 3,
|
||||
"componentType": 5123,
|
||||
"count": 36,
|
||||
"max": [23],
|
||||
"min": [0],
|
||||
"type": "SCALAR"
|
||||
}
|
||||
],
|
||||
"materials": [
|
||||
{
|
||||
"pbrMetallicRoughness": {
|
||||
"metallicFactor": 0,
|
||||
"roughnessFactor": 1,
|
||||
"baseColorTexture": { "index": 0 }
|
||||
},
|
||||
"alphaMode": "MASK",
|
||||
"alphaCutoff": 0.05,
|
||||
"doubleSided": true
|
||||
}
|
||||
],
|
||||
"textures": [{ "sampler": 0, "source": 0, "name": "cape.png" }],
|
||||
"samplers": [{ "magFilter": 9728, "minFilter": 9728, "wrapS": 33071, "wrapT": 33071 }],
|
||||
"images": [
|
||||
{
|
||||
"mimeType": "image/png",
|
||||
"uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAABCRJREFUaEPtlktoE1EUhm/sIzFpYsBgHyn2oRZt0C5ESxWFYutKNyKIWBBR6kpBd3Ur2J0FRdCiuKmIIG4qLnzgQqTUXSlVqdoXTU0lljRpYtOHI/8dznBnOm1mphMwJWeTzJ0795zznf/cex2MMXam2S/ht38siJ8V1lgd5mOBARerc3rZnmK37rwvCyk2nE6wezMRh+4EncH9B1ql+fkU64rPsaBz5bqh4T7Daxn1Kc5zVNeEePJIci0Aq71bzenY6JChwAnA0OBHQ/OtJLnWNwqAy61R1tO3k891ueRKoDKwtqbv7MGbgCnfRgHQoqG9hyX4hc/yiho+/HNqVPFtdj2jwTpQgd/RKT7/0ZUku/o4qAJw50KYXbzr4e+3BioYzc3kwGzAUCLWFw2+UBiCb3bNTDHiPQeAP3CGNmg/6VcSBpDu3hhvDQpOCwABwrQKsRIsqYAChy/EQAXwlPiZ3a3igNPkXIyTjr8o5L7PPdzGf59c+sV/faeWeIIIAHPJ8M3kc7l1K09LKghWAIgqoPZ7djPFTlxb4D6yAgBOQfntrUVWVeRk44tplXJorOVGkVIJTBCTpw9ECFYBIEkyMfmsAXh3u1qi5MlxbbGX/x1ZSCjBAAwgfPr6h49R5UVavk0FXC2wju5p07s6iqEF0PtqSlEf+bKzDRwdgaDU7AkoySJ5Oo/D6ZRq/H0yyuJ/lxkSheG/FgCNm7kL0BoEAG32sqtY1YIHd2/mGzTMVgD3y2slqjgW9xY6ma9AThAARIMiBtOpjADwTWc0bEkB+FZsSTxTW0KBsGPXx0yvrUpEeHAAQIM7wBJLcu8DwHaP/H8i6VSND6SiSjBlRW4WWUypVIBbIgzjVgB0tpdKqLReS0KVPTMTfH0ra2cEgAmAAEd+l1z52LybqwBQYAQAyZPh6gtDW4jjuC4fHx8wXSm0JDbeI95SRYHiFZlUaWVtPQiKAugl5E8ASAUYiy8vc0C474uGasPE5PHc4g0wK/f4obom6UNimol7kTZwQLANwOuqBokqDEeQf4lfvvnNxZJcBTBAGZplWQcQ3tcgwY9oWlXinRW4ugoAgNAWWe6ocn1QvgyRTUb4RZFVljlY/3hSBYCqb6cCZo8ekuATVRZPI/gQW8FWAI1VHganVgDQUajdA6y2gAgAcZFBjTBSpG0AcAqc3VVmCMDTbxGWZvIRCaMNkJ7pFMCzVQD4liCQ8kRFUlvaBkCvL+wYw2ZmNUgCgLajFhRPJlv3ADuS1VtjPQCk823S574ffN/x1dQqy8dHR5SN2Spcbaymz2mjwNYDAD4IQn3TDpVLQIAqNjwAANRrAdoI/3sAOF7Xe1khCNQGVH1bL0JGJb1R52VtD8gVYHkAuVKpbMWZV0C2yObKunkF5EqlshVnXgHZIpsr6/4DlbxcPydnT74AAAAASUVORK5CYII="
|
||||
}
|
||||
],
|
||||
"meshes": [
|
||||
{
|
||||
"primitives": [
|
||||
{
|
||||
"mode": 4,
|
||||
"attributes": { "POSITION": 0, "NORMAL": 1, "TEXCOORD_0": 2 },
|
||||
"indices": 3,
|
||||
"material": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
850
packages/assets/models/classic-player.gltf
Normal file
850
packages/assets/models/classic-player.gltf
Normal file
File diff suppressed because one or more lines are too long
852
packages/assets/models/slim-player.gltf
Normal file
852
packages/assets/models/slim-player.gltf
Normal file
File diff suppressed because one or more lines are too long
23
packages/blog/articles/skins-now-in-modrinth-app.md
Normal file
23
packages/blog/articles/skins-now-in-modrinth-app.md
Normal file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
title: 'Skins — Now in Modrinth App!'
|
||||
summary: 'Customize your look, save your favorite skins, and swap them out in a flash, all within Modrinth App.'
|
||||
date: 2025-07-06T16:45:00-07:00
|
||||
---
|
||||
|
||||
We're thrilled to roll out Modrinth App **v0.10** with a beta release of one of our most highly requested features, the **Skins page**. The Skins page allows you to manage all of your Minecraft skins directly within Modrinth App. You can see all your saved custom skins and the default Minecraft skins in one convenient place.
|
||||
|
||||

|
||||
|
||||
Adding a new skin is simple, even Herobrine could do it! When you add or edit a skin, you can **upload** your custom texture file directly from your computer, **choose** between the wide or slim arm style to match your preferred character model, and even **assign** a specific cape to that look for the perfect finishing touch.
|
||||
|
||||
The interface makes it easy to preview your changes in real-time with the animated player model, so you can see exactly how your skin will look in-game before saving it.
|
||||
|
||||

|
||||
|
||||
## Fixes and More!
|
||||
|
||||
Alongside this major new feature, **v0.10** includes a host of improvements and bug fixes to make your experience smoother. We've updated the news feed to use our new system, fixed issues with project descriptions, and tidied up how data is handled. For a full breakdown of all the changes, you can [check out the complete changelog here.](https://modrinth.com/news/changelog?filter=app)
|
||||
|
||||
As the skins feature is in _beta_, we're eager to hear your feedback! **Jump in, give it a try**, and let us know what you think. You can share your thoughts on our [Discord server](https://discord.modrinth.com/) or [start a support chat](https://support.modrinth.com) if you're running into issues.
|
||||
|
||||
Thank you! We can't wait to see your skins in action. Happy customizing!
|
||||
@@ -20,6 +20,7 @@ import { article as new_site_beta } from './new_site_beta'
|
||||
import { article as plugins_resource_packs } from './plugins_resource_packs'
|
||||
import { article as pride_campaign_2025 } from './pride_campaign_2025'
|
||||
import { article as redesign } from './redesign'
|
||||
import { article as skins_now_in_modrinth_app } from './skins_now_in_modrinth_app'
|
||||
import { article as two_years_of_modrinth_history } from './two_years_of_modrinth_history'
|
||||
import { article as two_years_of_modrinth } from './two_years_of_modrinth'
|
||||
import { article as whats_modrinth } from './whats_modrinth'
|
||||
@@ -47,6 +48,7 @@ export const articles = [
|
||||
plugins_resource_packs,
|
||||
pride_campaign_2025,
|
||||
redesign,
|
||||
skins_now_in_modrinth_app,
|
||||
two_years_of_modrinth_history,
|
||||
two_years_of_modrinth,
|
||||
whats_modrinth,
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
// AUTO-GENERATED FILE - DO NOT EDIT
|
||||
export const html = `<p>We're thrilled to roll out Modrinth App <strong>v0.10</strong> with a beta release of one of our most highly requested features, the <strong>Skins page</strong>. The Skins page allows you to manage all of your Minecraft skins directly within Modrinth App. You can see all your saved custom skins and the default Minecraft skins in one convenient place.</p><p><img src="./skins-page.webp" alt="The new skins page, featuring a cute animated player model, your custom skins & default skins."></p><p>Adding a new skin is simple, even Herobrine could do it! When you add or edit a skin, you can <strong>upload</strong> your custom texture file directly from your computer, <strong>choose</strong> between the wide or slim arm style to match your preferred character model, and even <strong>assign</strong> a specific cape to that look for the perfect finishing touch.</p><p>The interface makes it easy to preview your changes in real-time with the animated player model, so you can see exactly how your skin will look in-game before saving it.</p><p><img src="./edit-skin.webp" alt="The edit skin modal that shows when you go to add or edit a skin."></p><h2>Fixes and More!</h2><p>Alongside this major new feature, <strong>v0.10</strong> includes a host of improvements and bug fixes to make your experience smoother. We've updated the news feed to use our new system, fixed issues with project descriptions, and tidied up how data is handled. For a full breakdown of all the changes, you can <a href="https://modrinth.com/news/changelog?filter=app">check out the complete changelog here.</a></p><p>As the skins feature is in <em>beta</em>, we're eager to hear your feedback! <strong>Jump in, give it a try</strong>, and let us know what you think. You can share your thoughts on our <a href="https://discord.modrinth.com/" rel="noopener nofollow ugc">Discord server</a> or <a href="https://support.modrinth.com" rel="noopener nofollow ugc">start a support chat</a> if you're running into issues.</p><p>Thank you! We can't wait to see your skins in action. Happy customizing!</p>`
|
||||
10
packages/blog/compiled/skins_now_in_modrinth_app.ts
Normal file
10
packages/blog/compiled/skins_now_in_modrinth_app.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
// AUTO-GENERATED FILE - DO NOT EDIT
|
||||
export const article = {
|
||||
html: () => import(`./skins_now_in_modrinth_app.content`).then((m) => m.html),
|
||||
title: 'Skins — Now in Modrinth App!',
|
||||
summary:
|
||||
'Customize your look, save your favorite skins, and swap them out in a flash, all within Modrinth App.',
|
||||
date: '2025-07-06T23:45:00.000Z',
|
||||
slug: 'skins-now-in-modrinth-app',
|
||||
thumbnail: true,
|
||||
}
|
||||
BIN
packages/blog/public/skins-now-in-modrinth-app/edit-skin.webp
Normal file
BIN
packages/blog/public/skins-now-in-modrinth-app/edit-skin.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 246 KiB |
BIN
packages/blog/public/skins-now-in-modrinth-app/skins-page.webp
Normal file
BIN
packages/blog/public/skins-now-in-modrinth-app/skins-page.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
BIN
packages/blog/public/skins-now-in-modrinth-app/thumbnail.webp
Normal file
BIN
packages/blog/public/skins-now-in-modrinth-app/thumbnail.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
@@ -121,6 +121,7 @@ import {
|
||||
loadTexture as loadSkinTexture,
|
||||
} from '@modrinth/utils'
|
||||
import { useDynamicFontSize } from '../../composables'
|
||||
import { CapeModel, ClassicPlayerModel, SlimPlayerModel } from '@modrinth/assets'
|
||||
|
||||
interface AnimationConfig {
|
||||
baseAnimation: string
|
||||
@@ -132,9 +133,6 @@ interface AnimationConfig {
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
textureSrc: string
|
||||
slimModelSrc: string
|
||||
wideModelSrc: string
|
||||
capeModelSrc?: string
|
||||
capeSrc?: string
|
||||
variant?: 'SLIM' | 'CLASSIC' | 'UNKNOWN'
|
||||
nametag?: string
|
||||
@@ -149,7 +147,6 @@ const props = withDefaults(
|
||||
antialias: false,
|
||||
scale: 1,
|
||||
fov: 40,
|
||||
capeModelSrc: '',
|
||||
capeSrc: undefined,
|
||||
initialRotation: 15.75,
|
||||
nametag: undefined,
|
||||
@@ -176,7 +173,7 @@ const { fontSize: nametagFontSize } = useDynamicFontSize({
|
||||
})
|
||||
|
||||
const selectedModelSrc = computed(() =>
|
||||
props.variant === 'SLIM' ? props.slimModelSrc : props.wideModelSrc,
|
||||
props.variant === 'SLIM' ? SlimPlayerModel : ClassicPlayerModel,
|
||||
)
|
||||
|
||||
const scene = shallowRef<THREE.Object3D | null>(null)
|
||||
@@ -421,14 +418,9 @@ async function loadModel(src: string) {
|
||||
}
|
||||
}
|
||||
|
||||
async function loadCape(src: string) {
|
||||
if (!src) {
|
||||
capeScene.value = null
|
||||
return
|
||||
}
|
||||
|
||||
async function loadCape() {
|
||||
try {
|
||||
const { scene: loadedCape } = await useGLTF(src)
|
||||
const { scene: loadedCape } = await useGLTF(CapeModel)
|
||||
capeScene.value = markRaw(loadedCape)
|
||||
|
||||
applyCapeTexture(capeScene.value, capeTexture.value, transparentTexture)
|
||||
@@ -581,10 +573,6 @@ watch(capeScene, (newCapeScene) => {
|
||||
})
|
||||
|
||||
watch(selectedModelSrc, (src) => loadModel(src))
|
||||
watch(
|
||||
() => props.capeModelSrc,
|
||||
(src) => src && loadCape(src),
|
||||
)
|
||||
watch(
|
||||
() => props.textureSrc,
|
||||
async (newSrc) => {
|
||||
@@ -599,6 +587,7 @@ watch(
|
||||
watch(
|
||||
() => props.capeSrc,
|
||||
async (newCapeSrc) => {
|
||||
await loadCape()
|
||||
await loadAndApplyCapeTexture(newCapeSrc)
|
||||
},
|
||||
)
|
||||
@@ -631,9 +620,7 @@ onBeforeMount(async () => {
|
||||
await loadAndApplyCapeTexture(props.capeSrc)
|
||||
}
|
||||
|
||||
if (props.capeModelSrc) {
|
||||
await loadCape(props.capeModelSrc)
|
||||
}
|
||||
await loadCape()
|
||||
} catch (error) {
|
||||
console.error('Failed to initialize skin preview:', error)
|
||||
}
|
||||
|
||||
@@ -10,6 +10,30 @@ export type VersionEntry = {
|
||||
}
|
||||
|
||||
const VERSIONS: VersionEntry[] = [
|
||||
{
|
||||
date: `2025-07-07T01:10:00-07:00`,
|
||||
product: 'app',
|
||||
version: `0.10.3`,
|
||||
body: `### Improvements
|
||||
- Added a workaround for Java 8 instances failing to load.
|
||||
|
||||
### Known issues
|
||||
- Java installations will show as 'Failed' when you test them. This is a visual bug, and does not mean the Java installation is not working.`,
|
||||
},
|
||||
{
|
||||
date: `2025-07-06T16:30:00-07:00`,
|
||||
product: 'app',
|
||||
version: `0.10.2`,
|
||||
body: `### Improvements
|
||||
- Added additional default skins from free official Minecraft skin packs.
|
||||
- Fixed some parts of the player model on Skins page rendering incorrectly.
|
||||
- Fixed a number of issues with skin images not loading on macOS.
|
||||
- Fixed old Forge versions not loading properly.
|
||||
- Fixed a typo in Appearance settings for hiding Skins page nametag.
|
||||
|
||||
### Known issues
|
||||
- Java installations will show as 'Failed' when you test them. This is a visual bug, and does not mean the Java installation is not working.`,
|
||||
},
|
||||
{
|
||||
date: `2025-07-05T12:00:00-07:00`,
|
||||
product: 'app',
|
||||
@@ -25,7 +49,7 @@ const VERSIONS: VersionEntry[] = [
|
||||
date: `2025-07-04T12:00:00-07:00`,
|
||||
product: 'app',
|
||||
version: `0.10.0`,
|
||||
body: `**Note: This update was pulled due to issues.**
|
||||
body: `**Note: This update is no longer available to download due to issues, you should use v0.10.1**
|
||||
|
||||
### Added
|
||||
- Added Skins page as a beta feature. There may be some minor bugs with it, but we'd love to get user feedback on this feature as it's been one of our most highly requested features.
|
||||
|
||||
Reference in New Issue
Block a user