Skip to content

Commit

Permalink
implement json loading for more versions
Browse files Browse the repository at this point in the history
  • Loading branch information
moehreag committed Jan 28, 2024
1 parent 865f6f2 commit 069d818
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 3 deletions.
7 changes: 7 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@ def setUpJar(project) {
project.version = "${project.rootProject.root_version}"
project.group = "${project.rootProject.root_maven_group}"

project.repositories {
maven {
name = 'Quilt'
url = 'https://maven.quiltmc.org/repository/release'
}
}

project.dependencies {
// dummy mc dependency to keep loom happy
minecraft "com.mojang:minecraft:${project.rootProject.minecraft_version}"
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
org.gradle.jvmargs = -Xmx6G
fabric.loom.multiProjectOptimisation=true

loader_version = 0.14.23
loader_version = 0.15.6
log4j_version = 2.19.0
quilt_parsers_version = 0.2.1

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package net.ornithemc.osl.resource.loader.impl.mixin.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.client.resource.Resource;
import net.minecraft.client.resource.language.TranslationStorage;
import net.minecraft.client.resource.manager.ResourceManager;
import net.minecraft.resource.Identifier;
import org.quiltmc.parsers.json.JsonReader;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;

@Mixin(TranslationStorage.class)
public abstract class TranslationStorageMixin {

@Shadow
Map<String, String> translations;

@WrapOperation(
method = "load(Lnet/minecraft/client/resource/manager/ResourceManager;Ljava/util/List;)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/resource/language/TranslationStorage;load(Ljava/util/List;)V"
)
)
private void osl$resource_loader$loadJsonFiles(TranslationStorage instance, List<Resource> resources, Operation<Void> original,
@Local(ordinal = 0) String languageCode, @Local(ordinal = 1) String originalPath,
@Local(ordinal = 2) String namespace, @Local(argsOnly = true) ResourceManager manager){
String[] paths = new String[]{originalPath, String.format("lang/%s.json", languageCode),
String.format("lang/%s.json", languageCode.toLowerCase(Locale.ROOT)),
String.format("lang/%s.lang", languageCode.toLowerCase(Locale.ROOT))};
for (String s : paths){
try {
original.call(instance, manager.getResources(new Identifier(namespace, s)));
} catch (IOException ignored) {
}
}
}

@WrapOperation(
method = "load(Ljava/util/List;)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/resource/language/TranslationStorage;load(Ljava/io/InputStream;)V"
)
)
private void osl$resource_loader$loadJsonFiles$2(TranslationStorage instance, InputStream is, Operation<Void> original, @Local Resource resource){
if (resource.getLocation().getPath().endsWith(".json")){
loadJson(is);
} else {
original.call(instance, is);
}
}

@Unique
private void loadJson(InputStream stream) {
if (stream == null) {
return;
}
JsonReader reader = JsonReader.json(new InputStreamReader(stream));

Map<String, String> entries = new HashMap<>();
try {
reader.beginObject();
while (reader.hasNext()) {
entries.put(reader.nextName(), reader.nextString());
}
reader.endObject();
} catch (IOException ignored) {
}
translations.putAll(entries);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
],
"client": [
"client.CustomResourcePackInvoker",
"client.MinecraftMixin"
"client.MinecraftMixin",
"client.TranslationStorageMixin"
],
"server": [
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package net.ornithemc.osl.resource.loader.impl.mixin.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.List;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.client.resource.language.TranslationStorage;
import net.minecraft.client.resource.manager.ResourceManager;
import net.minecraft.resource.Identifier;
import net.minecraft.resource.Resource;
import org.quiltmc.parsers.json.JsonReader;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;

@Mixin(TranslationStorage.class)
public abstract class TranslationStorageMixin {

@Final
@Shadow
protected Map<String, String> translations;

@WrapOperation(
method = "load(Lnet/minecraft/client/resource/manager/ResourceManager;Ljava/util/List;)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/resource/language/TranslationStorage;load(Ljava/util/List;)V"
)
)
private void osl$resource_loader$loadJsonFiles(TranslationStorage instance, List<Resource> resources, Operation<Void> original,
@Local(ordinal = 0) String languageCode, @Local(ordinal = 1) String originalPath,
@Local(ordinal = 2) String namespace, @Local(argsOnly = true) ResourceManager manager){
String[] paths = new String[]{originalPath, String.format("lang/%s.json", languageCode),
String.format("lang/%s.json", languageCode.toLowerCase(Locale.ROOT)),
String.format("lang/%s.lang", languageCode.toLowerCase(Locale.ROOT))};
for (String s : paths){
try {
original.call(instance, manager.getResources(new Identifier(namespace, s)));
} catch (IOException ignored) {
}
}
}

@WrapOperation(
method = "load(Ljava/util/List;)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/resource/language/TranslationStorage;load(Ljava/io/InputStream;)V"
)
)
private void osl$resource_loader$loadJsonFiles$2(TranslationStorage instance, InputStream is, Operation<Void> original, @Local Resource resource){
if (resource.getLocation().getPath().endsWith(".json")){
loadJson(is);
} else {
original.call(instance, is);
}
}

@Unique
private void loadJson(InputStream stream) {
if (stream == null) {
return;
}
JsonReader reader = JsonReader.json(new InputStreamReader(stream));

Map<String, String> entries = new HashMap<>();
try {
reader.beginObject();
while (reader.hasNext()) {
entries.put(reader.nextName(), reader.nextString());
}
reader.endObject();
} catch (IOException ignored) {
}
translations.putAll(entries);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
],
"client": [
"client.MinecraftMixin",
"client.ResourcePacksMixin"
"client.ResourcePacksMixin",
"client.TranslationStorageMixin"
],
"server": [
],
Expand Down

0 comments on commit 069d818

Please sign in to comment.