Skip to content

Commit 34f1adf

Browse files
committed
修复游戏首次加载时currentLanguageCode未被设置的bug 优化代码
1 parent e87c1b2 commit 34f1adf

File tree

5 files changed

+38
-25
lines changed

5 files changed

+38
-25
lines changed

common/src/main/java/com/wulian/texturelocaleredirector/LangTextureCache.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
public class LangTextureCache {
1010

1111
private static final Map<Identifier, SoftReference<Boolean>> existsCache = new ConcurrentHashMap<>();
12-
private static volatile String currentLanguage = "en_us"; // 默认
12+
private static volatile String currentLanguage = "en_us";
1313

1414
public static Boolean get(Identifier id) {
1515
SoftReference<Boolean> ref = existsCache.get(id);

common/src/main/java/com/wulian/texturelocaleredirector/mixin/LanguageManagerMixin.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,27 @@
22

33
import com.wulian.texturelocaleredirector.LangTextureCache;
44
import net.minecraft.client.resource.language.LanguageManager;
5+
import net.minecraft.client.resource.language.TranslationStorage;
56
import net.minecraft.resource.ResourceManager;
67
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Shadow;
79
import org.spongepowered.asm.mixin.injection.At;
810
import org.spongepowered.asm.mixin.injection.Inject;
911
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1012

13+
import java.util.function.Consumer;
14+
1115
@Mixin(LanguageManager.class)
12-
public class LanguageManagerMixin {
16+
public abstract class LanguageManagerMixin {
17+
18+
@Shadow
19+
private String currentLanguageCode;
20+
21+
@Inject(method = "<init>", at = @At("TAIL"))
22+
private void onInit(String languageCode, Consumer<TranslationStorage> reloadCallback, CallbackInfo ci) {
23+
LangTextureCache.setCurrentLanguage(languageCode);
24+
LangTextureCache.clear();
25+
}
1326

1427
@Inject(method = "setLanguage", at = @At("HEAD"))
1528
private void onSetLanguage(String languageCode, CallbackInfo ci) {
@@ -19,8 +32,7 @@ private void onSetLanguage(String languageCode, CallbackInfo ci) {
1932

2033
@Inject(method = "reload", at = @At("HEAD"))
2134
private void onReload(ResourceManager manager, CallbackInfo ci) {
22-
LangTextureCache.setCurrentLanguage(((LanguageManager)(Object)this).getLanguage());
35+
LangTextureCache.setCurrentLanguage(currentLanguageCode);
2336
LangTextureCache.clear();
2437
}
2538
}
26-

common/src/main/java/com/wulian/texturelocaleredirector/mixin/ftbquests/ChapterImageMixin.java

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,34 @@
55
import dev.ftb.mods.ftblibrary.icon.Icon;
66
import dev.ftb.mods.ftbquests.quest.ChapterImage;
77
import org.spongepowered.asm.mixin.Mixin;
8-
import org.spongepowered.asm.mixin.Shadow;
98
import org.spongepowered.asm.mixin.injection.At;
10-
import org.spongepowered.asm.mixin.injection.Inject;
11-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
9+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
1210

1311
@Mixin(value = ChapterImage.class, remap = false)
1412
public abstract class ChapterImageMixin {
15-
@Shadow private Icon image;
16-
@Inject(method = "setImage(Ldev/ftb/mods/ftblibrary/icon/Icon;)Ldev/ftb/mods/ftbquests/quest/ChapterImage;", at = @At("HEAD"), cancellable = true)
17-
private void injectLocalizedImage(Icon image, CallbackInfoReturnable<ChapterImage> cir) {
13+
14+
@ModifyVariable(
15+
method = "setImage(Ldev/ftb/mods/ftblibrary/icon/Icon;)Ldev/ftb/mods/ftbquests/quest/ChapterImage;",
16+
at = @At("HEAD"),
17+
argsOnly = true
18+
)
19+
private Icon injectLocalizedImage(Icon image) {
1820
String currentLang = LangTextureCache.getCurrentLanguage();
1921
if ("en_us".equals(currentLang)) {
20-
return;
22+
return image;
2123
}
2224

23-
String originalPath = image.toString();
24-
String localizedPath = "textures/" + currentLang + "/" + originalPath.replaceFirst("^textures/", "");
25-
Icon localizedIcon = Icon.getIcon(localizedPath);
25+
String path = image.toString();
26+
if (path.startsWith("textures/")) {
27+
String localizedPath = "textures/" + currentLang + "/" + path.substring(9);
28+
Icon localizedIcon = Icon.getIcon(localizedPath);
2629

27-
if (!localizedIcon.isEmpty()) {
28-
this.image = localizedIcon;
29-
TextureLocaleRedirector.LOGGER.info("Redirected ChapterImage icon {} -> {}", originalPath, localizedPath);
30-
cir.setReturnValue((ChapterImage) (Object) this);
30+
if (!localizedIcon.isEmpty()) {
31+
TextureLocaleRedirector.LOGGER.info("Redirected ChapterImage icon {} -> {}", path, localizedPath);
32+
return localizedIcon;
33+
}
3134
}
35+
36+
return image;
3237
}
3338
}

common/src/main/java/com/wulian/texturelocaleredirector/mixin/ftbquests/FTBQMixinPlugin.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,8 @@ public String getRefMapperConfig() {
2020
@Override
2121
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
2222
if (mixinClassName.endsWith("ChapterImageMixin")) {
23-
try {
24-
Class.forName("dev.ftb.mods.ftbquests.quest.ChapterImage");
25-
return true;
26-
} catch (ClassNotFoundException e) {
27-
return false;
28-
}
23+
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
24+
return classLoader.getResource("dev/ftb/mods/ftbquests/quest/ChapterImage.class") != null;
2925
}
3026
return true;
3127
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ yarn_mappings=1.21.1+build.3
77
yarn_patch=1.21+build.4
88

99
archives_base_name=Texture-Locale-Redirector
10-
mod_version=1.1.0
10+
mod_version=1.2.0
1111
maven_group=com.wulian.texturelocaleredirector
1212

1313
forge_version=52.1.3

0 commit comments

Comments
 (0)