diff options
| author | Jakub <53441451+kuba6000@users.noreply.github.com> | 2022-08-14 15:19:13 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-14 15:19:13 +0200 |
| commit | 6d436a2c6a5d9b51070b8399c4fdb196603a8e82 (patch) | |
| tree | 0ac08abe69626ad89e25eb9b0c7aadb7e5243dac /src/main/java/kubatech/mixin | |
| parent | d8d8a462a25a29a9640f6c038ced50a570255e6e (diff) | |
| download | GT5-Unofficial-6d436a2c6a5d9b51070b8399c4fdb196603a8e82.tar.gz GT5-Unofficial-6d436a2c6a5d9b51070b8399c4fdb196603a8e82.tar.bz2 GT5-Unofficial-6d436a2c6a5d9b51070b8399c4fdb196603a8e82.zip | |
Add "Mob Drops" NEI page + Extreme Extermination Chamber (#1)
* First commit
* Mixins
* Merge the same items with diffrent damage
* Faster random in NEI
* More accuracy ?
* Update ClientProxy.java
* Renaming
* Update buildscript
* Use reserved MTE ID's
* EEC work
* Rework NEI page
* Fix inaccurate chances
* Basic equipment spawn
* Add config options
* Translations
* Add infernal drops
* Witchery fix
* Forestry fixes
* More fixes
* Default blacklist
* NEI sorting
* Comment out testing deps
* Clientsided check
* Blood Magic support
* LoaderReference
* Check if peacefull is allowed
* Add some XP output
* Add recipe
* Send Server config to Client
* Add command to reload config
* Translations
* Process MT additions
Diffstat (limited to 'src/main/java/kubatech/mixin')
| -rw-r--r-- | src/main/java/kubatech/mixin/Mixin.java | 42 | ||||
| -rw-r--r-- | src/main/java/kubatech/mixin/MixinPlugin.java | 110 | ||||
| -rw-r--r-- | src/main/java/kubatech/mixin/TargetedMod.java | 35 | ||||
| -rw-r--r-- | src/main/java/kubatech/mixin/mixins/minecraft/EnchantmentHelperMixin.java | 40 |
4 files changed, 227 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..49332457ca --- /dev/null +++ b/src/main/java/kubatech/mixin/Mixin.java @@ -0,0 +1,42 @@ +package kubatech.mixin; + +import static kubatech.mixin.TargetedMod.*; + +import cpw.mods.fml.relauncher.FMLLaunchHandler; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +public enum Mixin { + // Minecraft + EnchantmentHelperMixin("minecraft.EnchantmentHelperMixin", 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..66bbf9ccef --- /dev/null +++ b/src/main/java/kubatech/mixin/MixinPlugin.java @@ -0,0 +1,110 @@ +package kubatech.mixin; + +import static java.nio.file.Files.walk; +import static kubatech.mixin.TargetedMod.*; + +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 kubatech.Tags; +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 ru.timeconqueror.spongemixins.MinecraftURLClassPath; + +@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/TargetedMod.java b/src/main/java/kubatech/mixin/TargetedMod.java new file mode 100644 index 0000000000..c65fadbde2 --- /dev/null +++ b/src/main/java/kubatech/mixin/TargetedMod.java @@ -0,0 +1,35 @@ +package kubatech.mixin; + +import com.google.common.io.Files; +import java.nio.file.Path; + +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/EnchantmentHelperMixin.java b/src/main/java/kubatech/mixin/mixins/minecraft/EnchantmentHelperMixin.java new file mode 100644 index 0000000000..e07c0d335a --- /dev/null +++ b/src/main/java/kubatech/mixin/mixins/minecraft/EnchantmentHelperMixin.java @@ -0,0 +1,40 @@ +package kubatech.mixin.mixins.minecraft; + +import static kubatech.loaders.MobRecipeLoader.randomEnchantmentDetectedString; + +import java.util.Random; +import kubatech.api.utils.FastRandom; +import kubatech.loaders.MobRecipeLoader; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagInt; +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.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@SuppressWarnings("unused") +@Mixin(value = EnchantmentHelper.class) +public class EnchantmentHelperMixin { + + private static final Random rnd = new FastRandom(); + + @Inject(method = "addRandomEnchantment", at = @At("HEAD"), require = 1) + private static void addRandomEnchantmentDetector( + Random random, + ItemStack itemStack, + int enchantabilityLevel, + CallbackInfoReturnable<ItemStack> callbackInfoReturnable) { + if (MobRecipeLoader.isInGenerationProcess && random instanceof MobRecipeLoader.fakeRand) { + itemStack.setTagInfo(randomEnchantmentDetectedString, new NBTTagInt(enchantabilityLevel)); + } + } + + @ModifyVariable(method = "addRandomEnchantment", at = @At("HEAD"), ordinal = 0, argsOnly = true, require = 1) + private static Random addRandomEnchantmentModifier(Random random) { + if (!MobRecipeLoader.isInGenerationProcess) return random; + if (random instanceof MobRecipeLoader.fakeRand) return rnd; + return random; + } +} |
