diff options
author | Raven Szewczyk <git@eigenraven.me> | 2024-05-25 14:42:41 +0100 |
---|---|---|
committer | Raven Szewczyk <git@eigenraven.me> | 2024-05-25 14:42:41 +0100 |
commit | 8aa595f083b5c3e43246119fca5f4263f81e851b (patch) | |
tree | 157d2b528e4b4ea0321022ebfee398f559a9e121 /src/main/java/kubatech/mixin | |
parent | 14a97a5a177399cd8df7f246856c08fcda441afd (diff) | |
download | GT5-Unofficial-8aa595f083b5c3e43246119fca5f4263f81e851b.tar.gz GT5-Unofficial-8aa595f083b5c3e43246119fca5f4263f81e851b.tar.bz2 GT5-Unofficial-8aa595f083b5c3e43246119fca5f4263f81e851b.zip |
Migrate kubatech source code
Diffstat (limited to 'src/main/java/kubatech/mixin')
8 files changed, 343 insertions, 0 deletions
diff --git a/src/main/java/kubatech/mixin/Mixin.java b/src/main/java/kubatech/mixin/Mixin.java new file mode 100644 index 0000000000..52f7671faa --- /dev/null +++ b/src/main/java/kubatech/mixin/Mixin.java @@ -0,0 +1,50 @@ +package kubatech.mixin; + +import static kubatech.mixin.TargetedMod.VANILLA; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +import cpw.mods.fml.relauncher.FMLLaunchHandler; + +public enum Mixin { + + // Minecraft + WorldMixin("minecraft.WorldMixin", VANILLA), + StringTranslateMixin("minecraft.StringTranslateMixin", VANILLA), + LanguageRegistryMixin("minecraft.LanguageRegistryMixin", VANILLA), + LocaleMixin("minecraft.LocaleMixin", Side.CLIENT, VANILLA), + + ; + + public final String mixinClass; + public final List<TargetedMod> targetedMods; + private final Side side; + + Mixin(String mixinClass, Side side, TargetedMod... targetedMods) { + this.mixinClass = mixinClass; + this.targetedMods = Arrays.asList(targetedMods); + this.side = side; + } + + Mixin(String mixinClass, TargetedMod... targetedMods) { + this.mixinClass = mixinClass; + this.targetedMods = Arrays.asList(targetedMods); + this.side = Side.BOTH; + } + + public boolean shouldLoad(List<TargetedMod> loadedMods) { + return (side == Side.BOTH || side == Side.SERVER && FMLLaunchHandler.side() + .isServer() + || side == Side.CLIENT && FMLLaunchHandler.side() + .isClient()) + && new HashSet<>(loadedMods).containsAll(targetedMods); + } + + enum Side { + BOTH, + CLIENT, + SERVER + } +} diff --git a/src/main/java/kubatech/mixin/MixinPlugin.java b/src/main/java/kubatech/mixin/MixinPlugin.java new file mode 100644 index 0000000000..cdbc0ddf60 --- /dev/null +++ b/src/main/java/kubatech/mixin/MixinPlugin.java @@ -0,0 +1,114 @@ +package kubatech.mixin; + +import static java.nio.file.Files.walk; +import static kubatech.mixin.TargetedMod.VANILLA; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import net.minecraft.launchwrapper.Launch; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.lib.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import com.gtnewhorizon.gtnhmixins.MinecraftURLClassPath; + +import kubatech.Tags; + +@SuppressWarnings("unused") +public class MixinPlugin implements IMixinConfigPlugin { + + private static final Logger LOG = LogManager.getLogger(Tags.MODID + " mixins"); + private static final Path MODS_DIRECTORY_PATH = new File(Launch.minecraftHome, "mods/").toPath(); + + @Override + public void onLoad(String mixinPackage) {} + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return false; + } + + @Override + public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {} + + @Override + public List<String> getMixins() { + final boolean isDevelopmentEnvironment = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + + List<TargetedMod> loadedMods = Arrays.stream(TargetedMod.values()) + .filter(mod -> mod == VANILLA || (mod.loadInDevelopment && isDevelopmentEnvironment) || loadJarOf(mod)) + .collect(Collectors.toList()); + + for (TargetedMod mod : TargetedMod.values()) { + if (loadedMods.contains(mod)) { + LOG.info("Found " + mod.modName + "! Integrating now..."); + } else { + LOG.info("Could not find " + mod.modName + "! Skipping integration...."); + } + } + + List<String> mixins = new ArrayList<>(); + for (Mixin mixin : Mixin.values()) { + if (mixin.shouldLoad(loadedMods)) { + mixins.add(mixin.mixinClass); + LOG.debug("Loading mixin: " + mixin.mixinClass); + } + } + return mixins; + } + + private boolean loadJarOf(final TargetedMod mod) { + try { + File jar = findJarOf(mod); + if (jar == null) { + LOG.info("Jar not found for " + mod); + return false; + } + + LOG.info("Attempting to add " + jar + " to the URL Class Path"); + if (!jar.exists()) { + throw new FileNotFoundException(jar.toString()); + } + MinecraftURLClassPath.addJar(jar); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public static File findJarOf(final TargetedMod mod) { + try (Stream<Path> stream = walk(MODS_DIRECTORY_PATH)) { + return stream.filter(mod::isMatchingJar) + .map(Path::toFile) + .findFirst() + .orElse(null); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} +} diff --git a/src/main/java/kubatech/mixin/MixinsVariablesHelper.java b/src/main/java/kubatech/mixin/MixinsVariablesHelper.java new file mode 100644 index 0000000000..1875be6efc --- /dev/null +++ b/src/main/java/kubatech/mixin/MixinsVariablesHelper.java @@ -0,0 +1,6 @@ +package kubatech.mixin; + +public class MixinsVariablesHelper { + + public static String currentlyTranslating = null; +} diff --git a/src/main/java/kubatech/mixin/TargetedMod.java b/src/main/java/kubatech/mixin/TargetedMod.java new file mode 100644 index 0000000000..65717c7e12 --- /dev/null +++ b/src/main/java/kubatech/mixin/TargetedMod.java @@ -0,0 +1,43 @@ +package kubatech.mixin; + +import java.nio.file.Path; + +import com.google.common.io.Files; + +public enum TargetedMod { + + VANILLA("Minecraft", "unused", true), + + ; + + public final String modName; + public final String jarNamePrefixLowercase; + public final boolean loadInDevelopment; + + TargetedMod(String modName, String jarNamePrefix, boolean loadInDevelopment) { + this.modName = modName; + this.jarNamePrefixLowercase = jarNamePrefix.toLowerCase(); + this.loadInDevelopment = loadInDevelopment; + } + + @SuppressWarnings("UnstableApiUsage") + public boolean isMatchingJar(Path path) { + final String pathString = path.toString(); + final String nameLowerCase = Files.getNameWithoutExtension(pathString) + .toLowerCase(); + final String fileExtension = Files.getFileExtension(pathString); + + return nameLowerCase.startsWith(jarNamePrefixLowercase) && "jar".equals(fileExtension); + } + + @Override + public String toString() { + return "TargetedMod{" + "modName='" + + modName + + '\'' + + ", jarNamePrefixLowercase='" + + jarNamePrefixLowercase + + '\'' + + '}'; + } +} diff --git a/src/main/java/kubatech/mixin/mixins/minecraft/LanguageRegistryMixin.java b/src/main/java/kubatech/mixin/mixins/minecraft/LanguageRegistryMixin.java new file mode 100644 index 0000000000..02546dd258 --- /dev/null +++ b/src/main/java/kubatech/mixin/mixins/minecraft/LanguageRegistryMixin.java @@ -0,0 +1,27 @@ +package kubatech.mixin.mixins.minecraft; + +import static kubatech.mixin.MixinsVariablesHelper.currentlyTranslating; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.registry.LanguageRegistry; +import cpw.mods.fml.relauncher.Side; + +@SuppressWarnings("unused") +@Mixin(value = LanguageRegistry.class) +public class LanguageRegistryMixin { + + @Inject(method = "loadLanguagesFor", at = @At(value = "HEAD"), remap = false, require = 1) + private void kubatech$loadLanguagesForHEAD(ModContainer container, Side side, CallbackInfo callbackInfo) { + currentlyTranslating = container.getModId(); + } + + @Inject(method = "loadLanguagesFor", at = @At(value = "RETURN"), remap = false, require = 1) + private void kubatech$loadLanguagesForRETURN(ModContainer container, Side side, CallbackInfo callbackInfo) { + currentlyTranslating = null; + } +} diff --git a/src/main/java/kubatech/mixin/mixins/minecraft/LocaleMixin.java b/src/main/java/kubatech/mixin/mixins/minecraft/LocaleMixin.java new file mode 100644 index 0000000000..e903a3e139 --- /dev/null +++ b/src/main/java/kubatech/mixin/mixins/minecraft/LocaleMixin.java @@ -0,0 +1,47 @@ +package kubatech.mixin.mixins.minecraft; + +import static kubatech.mixin.MixinsVariablesHelper.currentlyTranslating; + +import java.util.regex.Matcher; + +import net.minecraft.client.resources.Locale; +import net.minecraft.util.ResourceLocation; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; + +import kubatech.Tags; + +@SuppressWarnings("unused") +@Mixin(value = Locale.class) +public class LocaleMixin { + + @ModifyArg( + method = "loadLocaleDataFiles", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/resources/IResourceManager;getAllResources(Lnet/minecraft/util/ResourceLocation;)Ljava/util/List;"), + index = 0, + require = 1) + private ResourceLocation kubatech$loadLocaleDataFiles(ResourceLocation resourceLocation) { + currentlyTranslating = resourceLocation.getResourceDomain(); + return resourceLocation; + } + + @Redirect( + method = "loadLocaleData(Ljava/io/InputStream;)V", + at = @At( + value = "INVOKE", + target = "Ljava/util/regex/Matcher;replaceAll(Ljava/lang/String;)Ljava/lang/String;", + remap = false), + require = 1) + private String kubatech$replaceAll(Matcher matcher, String replace) { + if (currentlyTranslating != null && currentlyTranslating.equals(Tags.MODID) && matcher.find()) { + return matcher.replaceFirst(matcher.group()); + } + return matcher.replaceAll(replace); + } + +} diff --git a/src/main/java/kubatech/mixin/mixins/minecraft/StringTranslateMixin.java b/src/main/java/kubatech/mixin/mixins/minecraft/StringTranslateMixin.java new file mode 100644 index 0000000000..6a0bc4af62 --- /dev/null +++ b/src/main/java/kubatech/mixin/mixins/minecraft/StringTranslateMixin.java @@ -0,0 +1,33 @@ +package kubatech.mixin.mixins.minecraft; + +import static kubatech.mixin.MixinsVariablesHelper.currentlyTranslating; + +import java.util.regex.Matcher; + +import net.minecraft.util.StringTranslate; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import kubatech.Tags; + +@SuppressWarnings("unused") +@Mixin(value = StringTranslate.class) +public class StringTranslateMixin { + + @Redirect( + method = "parseLangFile", + at = @At( + value = "INVOKE", + target = "Ljava/util/regex/Matcher;replaceAll(Ljava/lang/String;)Ljava/lang/String;", + remap = false), + remap = false, + require = 1) + private static String kubatech$replaceAll(Matcher matcher, String replace) { + if (currentlyTranslating != null && currentlyTranslating.equals(Tags.MODID) && matcher.find()) { + return matcher.replaceFirst(matcher.group()); + } + return matcher.replaceAll(replace); + } +} diff --git a/src/main/java/kubatech/mixin/mixins/minecraft/WorldMixin.java b/src/main/java/kubatech/mixin/mixins/minecraft/WorldMixin.java new file mode 100644 index 0000000000..42c71cadbd --- /dev/null +++ b/src/main/java/kubatech/mixin/mixins/minecraft/WorldMixin.java @@ -0,0 +1,23 @@ +package kubatech.mixin.mixins.minecraft; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; + +import kubatech.loaders.BlockLoader; + +@SuppressWarnings("unused") +@Mixin(value = World.class) +public class WorldMixin { + + @SuppressWarnings("ConstantConditions") + @ModifyReturnValue(method = "getBlock", at = @At("RETURN"), require = 1) + private Block kubatech$getBlockDetector(Block block, int x, int y, int z) { + if (block == BlockLoader.kubaBlock) BlockLoader.kubaBlock.setLastBlockAccess((World) (Object) this, x, y, z); + return block; + } +} |