aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/kubatech/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/kubatech/api')
-rw-r--r--src/main/java/kubatech/api/helpers/InfernalHelper.java231
-rw-r--r--src/main/java/kubatech/api/helpers/ReflectionHelper.java63
-rw-r--r--src/main/java/kubatech/api/network/CustomTileEntityPacket.java2
-rw-r--r--src/main/java/kubatech/api/utils/ItemUtils.java26
-rw-r--r--src/main/java/kubatech/api/utils/MobUtils.java16
-rw-r--r--src/main/java/kubatech/api/utils/ModUtils.java14
6 files changed, 108 insertions, 244 deletions
diff --git a/src/main/java/kubatech/api/helpers/InfernalHelper.java b/src/main/java/kubatech/api/helpers/InfernalHelper.java
deleted file mode 100644
index e3c0db456b..0000000000
--- a/src/main/java/kubatech/api/helpers/InfernalHelper.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * spotless:off
- * KubaTech - Gregtech Addon
- * Copyright (C) 2022 - 2023 kuba6000
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library. If not, see <https://www.gnu.org/licenses/>.
- * spotless:on
- */
-
-package kubatech.api.helpers;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.item.ItemStack;
-
-import atomicstryker.infernalmobs.common.InfernalMobsCore;
-import atomicstryker.infernalmobs.common.mods.api.ModifierLoader;
-
-@SuppressWarnings("unchecked")
-public class InfernalHelper {
-
- private static Method isClassAllowed = null;
-
- public static boolean isClassAllowed(EntityLivingBase e) {
- try {
- if (isClassAllowed == null) {
- isClassAllowed = InfernalMobsCore.class.getDeclaredMethod("isClassAllowed", EntityLivingBase.class);
- isClassAllowed.setAccessible(true);
- }
- return (boolean) isClassAllowed.invoke(InfernalMobsCore.instance(), e);
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return false;
- }
-
- private static Method checkEntityClassForced = null;
-
- public static boolean checkEntityClassForced(EntityLivingBase e) {
- try {
- if (checkEntityClassForced == null) {
- checkEntityClassForced = InfernalMobsCore.class
- .getDeclaredMethod("checkEntityClassForced", EntityLivingBase.class);
- checkEntityClassForced.setAccessible(true);
- }
- return (boolean) checkEntityClassForced.invoke(InfernalMobsCore.instance(), e);
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return false;
- }
-
- private static Field modifierLoaders = null;
-
- public static ArrayList<ModifierLoader<?>> getModifierLoaders() {
- try {
- if (modifierLoaders == null) {
- modifierLoaders = InfernalMobsCore.class.getDeclaredField("modifierLoaders");
- modifierLoaders.setAccessible(true);
- }
- return (ArrayList<ModifierLoader<?>>) modifierLoaders.get(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return new ArrayList<>();
- }
-
- private static Field eliteRarity;
-
- public static int getEliteRarity() {
- try {
- if (eliteRarity == null) {
- eliteRarity = InfernalMobsCore.class.getDeclaredField("eliteRarity");
- eliteRarity.setAccessible(true);
- }
- return eliteRarity.getInt(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return 15;
- }
-
- private static Field ultraRarity;
-
- public static int getUltraRarity() {
- try {
- if (ultraRarity == null) {
- ultraRarity = InfernalMobsCore.class.getDeclaredField("ultraRarity");
- ultraRarity.setAccessible(true);
- }
- return ultraRarity.getInt(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return 15;
- }
-
- private static Field infernoRarity;
-
- public static int getInfernoRarity() {
- try {
- if (infernoRarity == null) {
- infernoRarity = InfernalMobsCore.class.getDeclaredField("infernoRarity");
- infernoRarity.setAccessible(true);
- }
- return infernoRarity.getInt(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return 15;
- }
-
- private static Field minEliteModifiers;
-
- public static int getMinEliteModifiers() {
- try {
- if (minEliteModifiers == null) {
- minEliteModifiers = InfernalMobsCore.class.getDeclaredField("minEliteModifiers");
- minEliteModifiers.setAccessible(true);
- }
- return minEliteModifiers.getInt(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return 15;
- }
-
- private static Field minUltraModifiers;
-
- public static int getMinUltraModifiers() {
- try {
- if (minUltraModifiers == null) {
- minUltraModifiers = InfernalMobsCore.class.getDeclaredField("minUltraModifiers");
- minUltraModifiers.setAccessible(true);
- }
- return minUltraModifiers.getInt(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return 15;
- }
-
- private static Field minInfernoModifiers;
-
- public static int getMinInfernoModifiers() {
- try {
- if (minInfernoModifiers == null) {
- minInfernoModifiers = InfernalMobsCore.class.getDeclaredField("minInfernoModifiers");
- minInfernoModifiers.setAccessible(true);
- }
- return minInfernoModifiers.getInt(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return 15;
- }
-
- private static Field dimensionBlackList;
-
- public static ArrayList<Integer> getDimensionBlackList() {
- try {
- if (dimensionBlackList == null) {
- dimensionBlackList = InfernalMobsCore.class.getDeclaredField("dimensionBlackList");
- dimensionBlackList.setAccessible(true);
- }
- return (ArrayList<Integer>) dimensionBlackList.get(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return new ArrayList<>();
- }
-
- private static Field dropIdListElite;
-
- public static ArrayList<ItemStack> getDropIdListElite() {
- try {
- if (dropIdListElite == null) {
- dropIdListElite = InfernalMobsCore.class.getDeclaredField("dropIdListElite");
- dropIdListElite.setAccessible(true);
- }
- return (ArrayList<ItemStack>) dropIdListElite.get(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return new ArrayList<>();
- }
-
- private static Field dropIdListUltra;
-
- public static ArrayList<ItemStack> getDropIdListUltra() {
- try {
- if (dropIdListUltra == null) {
- dropIdListUltra = InfernalMobsCore.class.getDeclaredField("dropIdListUltra");
- dropIdListUltra.setAccessible(true);
- }
- return (ArrayList<ItemStack>) dropIdListUltra.get(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return new ArrayList<>();
- }
-
- private static Field dropIdListInfernal;
-
- public static ArrayList<ItemStack> getDropIdListInfernal() {
- try {
- if (dropIdListInfernal == null) {
- dropIdListInfernal = InfernalMobsCore.class.getDeclaredField("dropIdListInfernal");
- dropIdListInfernal.setAccessible(true);
- }
- return (ArrayList<ItemStack>) dropIdListInfernal.get(InfernalMobsCore.instance());
- } catch (Throwable exception) {
- exception.printStackTrace();
- }
- return new ArrayList<>();
- }
-}
diff --git a/src/main/java/kubatech/api/helpers/ReflectionHelper.java b/src/main/java/kubatech/api/helpers/ReflectionHelper.java
index 63fd6bd633..8f2234f052 100644
--- a/src/main/java/kubatech/api/helpers/ReflectionHelper.java
+++ b/src/main/java/kubatech/api/helpers/ReflectionHelper.java
@@ -20,9 +20,23 @@
package kubatech.api.helpers;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.Objects;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+
+import net.minecraft.launchwrapper.Launch;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.tree.ClassNode;
public class ReflectionHelper {
@@ -140,4 +154,53 @@ public class ReflectionHelper {
return defaultValue;
}
}
+
+ /**
+ * Gets all classes in a specific package path, works only for jar files.
+ *
+ * @param packageName The package name
+ * @return The class nodes
+ */
+ public static Collection<ClassNode> getClasses(String packageName) throws IOException, SecurityException {
+ ClassLoader classLoader = Thread.currentThread()
+ .getContextClassLoader();
+ assert classLoader != null;
+ String packagePath = packageName.replace('.', '/');
+ URL resource = classLoader.getResource(packagePath);
+ if (resource == null) throw new FileNotFoundException();
+ if (!resource.getProtocol()
+ .equals("jar")) return Collections.emptySet();
+ String jarPath = resource.getPath();
+
+ try (JarFile jar = new JarFile(jarPath.substring(5, jarPath.indexOf('!')))) {
+ return jar.stream()
+ .filter(
+ j -> !j.isDirectory() && j.getName()
+ .startsWith(packagePath)
+ && j.getName()
+ .endsWith(".class"))
+ .map(j -> {
+ try {
+ String name = j.getName();
+ URL jarResource = Launch.classLoader.getResource(name);
+ if (jarResource == null) return null;
+ byte[] bytes;
+ try (InputStream is = jarResource.openStream()) {
+ bytes = new byte[(int) j.getSize()];
+ if (is.read(bytes) != bytes.length) return null;
+ if (is.available() > 0) return null;
+ }
+
+ ClassNode cn = new ClassNode();
+ ClassReader cr = new ClassReader(bytes);
+ cr.accept(cn, 0);
+
+ return cn;
+ } catch (IOException ignored) {}
+ return null;
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ }
+ }
}
diff --git a/src/main/java/kubatech/api/network/CustomTileEntityPacket.java b/src/main/java/kubatech/api/network/CustomTileEntityPacket.java
index cd65d08d57..67a310ecf5 100644
--- a/src/main/java/kubatech/api/network/CustomTileEntityPacket.java
+++ b/src/main/java/kubatech/api/network/CustomTileEntityPacket.java
@@ -132,7 +132,7 @@ public class CustomTileEntityPacket implements IMessage {
@Override
public IMessage onMessage(CustomTileEntityPacket message, MessageContext ctx) {
- if (!ModUtils.isClientSided) return null;
+ if (!ModUtils.isClientThreaded()) return null;
Minecraft mc = Minecraft.getMinecraft();
if (mc == null) return null;
if (mc.thePlayer == null) return null;
diff --git a/src/main/java/kubatech/api/utils/ItemUtils.java b/src/main/java/kubatech/api/utils/ItemUtils.java
new file mode 100644
index 0000000000..2fc34057c3
--- /dev/null
+++ b/src/main/java/kubatech/api/utils/ItemUtils.java
@@ -0,0 +1,26 @@
+package kubatech.api.utils;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+public class ItemUtils {
+
+ public static NBTTagCompound writeItemStackToNBT(ItemStack stack) {
+ NBTTagCompound compound = new NBTTagCompound();
+
+ stack.writeToNBT(compound);
+ compound.setInteger("IntCount", stack.stackSize);
+
+ return compound;
+ }
+
+ public static ItemStack readItemStackFromNBT(NBTTagCompound compound) {
+ ItemStack stack = ItemStack.loadItemStackFromNBT(compound);
+
+ if (stack == null) return null;
+
+ if (compound.hasKey("IntCount")) stack.stackSize = compound.getInteger("IntCount");
+
+ return stack;
+ }
+}
diff --git a/src/main/java/kubatech/api/utils/MobUtils.java b/src/main/java/kubatech/api/utils/MobUtils.java
index ad48c51cbf..d3ec59757a 100644
--- a/src/main/java/kubatech/api/utils/MobUtils.java
+++ b/src/main/java/kubatech/api/utils/MobUtils.java
@@ -20,8 +20,6 @@
package kubatech.api.utils;
-import java.lang.reflect.Field;
-
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelBox;
import net.minecraft.client.model.ModelRenderer;
@@ -32,11 +30,10 @@ import net.minecraft.entity.EntityLiving;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
+import kubatech.mixin.mixins.minecraft.RendererLivingEntityAccessor;
public class MobUtils {
- private static Field mainmodelfield = null;
-
@SideOnly(Side.CLIENT)
public static float getDesiredScale(EntityLiving e, float desiredHeight) {
return getDesiredScale(getMobHeight(e), desiredHeight);
@@ -50,17 +47,12 @@ public class MobUtils {
@SideOnly(Side.CLIENT)
public static float getMobHeight(EntityLiving e) {
try {
- if (mainmodelfield == null) {
- mainmodelfield = RendererLivingEntity.class
- .getDeclaredField(ModUtils.isDeobfuscatedEnvironment ? "mainModel" : "field_77045_g");
- mainmodelfield.setAccessible(true);
- }
float eheight = e.height;
float ewidth = e.width;
Render r = RenderManager.instance.getEntityRenderObject(e);
- if (r instanceof RendererLivingEntity && mainmodelfield != null) {
- ModelBase mainmodel = (ModelBase) mainmodelfield.get(r);
- for (Object box : mainmodel.boxList) {
+ if (r instanceof RendererLivingEntity) {
+ ModelBase mainModel = ((RendererLivingEntityAccessor) r).getMainModel();
+ for (Object box : mainModel.boxList) {
if (box instanceof ModelRenderer) {
float minY = 999f;
float minX = 999f;
diff --git a/src/main/java/kubatech/api/utils/ModUtils.java b/src/main/java/kubatech/api/utils/ModUtils.java
index cd02d28dba..61352cce9d 100644
--- a/src/main/java/kubatech/api/utils/ModUtils.java
+++ b/src/main/java/kubatech/api/utils/ModUtils.java
@@ -32,6 +32,7 @@ import javax.xml.bind.DatatypeConverter;
import net.minecraft.launchwrapper.Launch;
+import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.ModContainer;
import kubatech.kubatech;
@@ -41,6 +42,19 @@ public class ModUtils {
public static final boolean isDeobfuscatedEnvironment = (boolean) Launch.blackboard
.get("fml.deobfuscatedEnvironment");
public static boolean isClientSided = false;
+
+ public static boolean isClientThreaded() {
+ return FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isClient();
+ }
+
+ @FunctionalInterface
+ public interface TriConsumer<T, U, V> {
+
+ void accept(T t, U u, V v);
+ }
+
private static final HashMap<String, String> classNamesToModIDs = new HashMap<>();
private static final Map.Entry<String, String> emptyEntry = new AbstractMap.SimpleEntry<>("", "");