diff options
-rw-r--r-- | src/main/java/kubatech/api/helpers/EnderIOHelper.java | 20 | ||||
-rw-r--r-- | src/main/java/kubatech/api/helpers/InfernalHelper.java (renamed from src/main/java/kubatech/api/utils/InfernalHelper.java) | 2 | ||||
-rw-r--r-- | src/main/java/kubatech/api/helpers/ReflectionHelper.java | 105 | ||||
-rw-r--r-- | src/main/java/kubatech/api/utils/ReflectionHelper.java | 59 | ||||
-rw-r--r-- | src/main/java/kubatech/config/OverridesConfig.java | 2 | ||||
-rw-r--r-- | src/main/java/kubatech/loaders/MobRecipeLoader.java | 31 | ||||
-rw-r--r-- | src/main/java/kubatech/nei/Mob_Handler.java | 32 | ||||
-rw-r--r-- | src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java | 2 | ||||
-rw-r--r-- | src/main/resources/assets/kubatech/lang/en_US.lang | 1 |
9 files changed, 170 insertions, 84 deletions
diff --git a/src/main/java/kubatech/api/helpers/EnderIOHelper.java b/src/main/java/kubatech/api/helpers/EnderIOHelper.java new file mode 100644 index 0000000000..b6c01c9741 --- /dev/null +++ b/src/main/java/kubatech/api/helpers/EnderIOHelper.java @@ -0,0 +1,20 @@ +package kubatech.api.helpers; + +import crazypants.enderio.EnderIO; +import kubatech.api.LoaderReference; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.boss.IBossDisplayData; + +public class EnderIOHelper { + public static boolean canEntityBeCapturedWithSoulVial(Entity entity, String entityID) { + if (!LoaderReference.EnderIO) return true; + if (ReflectionHelper.<Boolean>callMethod(EnderIO.itemSoulVessel, "isBlackListed", false, entityID)) + return false; + return crazypants.enderio.config.Config.soulVesselCapturesBosses || !(entity instanceof IBossDisplayData); + } + + public static boolean canEntityBeCapturedWithSoulVial(Entity entity) { + return canEntityBeCapturedWithSoulVial(entity, EntityList.getEntityString(entity)); + } +} diff --git a/src/main/java/kubatech/api/utils/InfernalHelper.java b/src/main/java/kubatech/api/helpers/InfernalHelper.java index 4bd48274f3..1eadb42a8f 100644 --- a/src/main/java/kubatech/api/utils/InfernalHelper.java +++ b/src/main/java/kubatech/api/helpers/InfernalHelper.java @@ -17,7 +17,7 @@ * */ -package kubatech.api.utils; +package kubatech.api.helpers; import atomicstryker.infernalmobs.common.InfernalMobsCore; import atomicstryker.infernalmobs.common.mods.api.ModifierLoader; diff --git a/src/main/java/kubatech/api/helpers/ReflectionHelper.java b/src/main/java/kubatech/api/helpers/ReflectionHelper.java new file mode 100644 index 0000000000..1d7449afc4 --- /dev/null +++ b/src/main/java/kubatech/api/helpers/ReflectionHelper.java @@ -0,0 +1,105 @@ +/* + * KubaTech - Gregtech Addon + * Copyright (C) 2022 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/>. + * + */ + +package kubatech.api.helpers; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; + +public class ReflectionHelper { + private static class _FieldsMethods { + HashMap<String, Field> fields = new HashMap<>(); + HashMap<String, Method> methods = new HashMap<>(); + } + + private static final HashMap<String, _FieldsMethods> classes = new HashMap<>(); + + @SuppressWarnings("unchecked") + public static <T> T getField(Object obj, String fieldName, T defaultvalue) { + Class<?> cl = obj.getClass(); + String clName = cl.getName(); + HashMap<String, Field> classmap = classes.computeIfAbsent(clName, s -> new _FieldsMethods()).fields; + try { + if (classmap.containsKey(fieldName)) { + Field f = classmap.get(fieldName); + if (f == null) return defaultvalue; + return (T) f.get(obj); + } + boolean exceptionDetected = false; + Field f = null; + do { + try { + f = cl.getDeclaredField(fieldName); + f.setAccessible(true); + } catch (Exception ex) { + exceptionDetected = true; + cl = cl.getSuperclass(); + } + } while (exceptionDetected && !cl.equals(Object.class)); + classmap.put(fieldName, f); + if (f == null) return defaultvalue; + return (T) f.get(obj); + } catch (Exception ex) { + return defaultvalue; + } + } + + public static <T> T getField(Object obj, String fieldName) { + return getField(obj, fieldName, null); + } + + @SuppressWarnings("unchecked") + public static <T> T callMethod(Object obj, String methodName, T defaultValue, Object... args) { + Class<?> cl = obj.getClass(); + String clName = cl.getName(); + HashMap<String, Method> classmap = classes.computeIfAbsent(clName, s -> new _FieldsMethods()).methods; + StringBuilder builder = new StringBuilder(methodName); + Class<?>[] argsTypes = new Class<?>[args.length]; + for (int i = 0; i < args.length; i++) { + Class<?> arg = args[i].getClass(); + builder.append(";").append(arg.getSimpleName()); + argsTypes[i] = arg; + } + String methodNameUnique = builder.toString(); + try { + if (classmap.containsKey(methodNameUnique)) { + Method m = classmap.get(methodNameUnique); + if (m == null) return defaultValue; + return (T) m.invoke(obj, args); + } + boolean exceptionDetected = false; + Method m = null; + do { + try { + m = cl.getDeclaredMethod(methodName, argsTypes); + m.setAccessible(true); + } catch (Exception ex) { + exceptionDetected = true; + cl = cl.getSuperclass(); + } + } while (exceptionDetected && !cl.equals(Object.class)); + classmap.put(methodNameUnique, m); + if (m == null) return defaultValue; + return (T) m.invoke(obj, args); + } catch (Exception ex) { + return defaultValue; + } + } +} diff --git a/src/main/java/kubatech/api/utils/ReflectionHelper.java b/src/main/java/kubatech/api/utils/ReflectionHelper.java deleted file mode 100644 index 48d07c6eee..0000000000 --- a/src/main/java/kubatech/api/utils/ReflectionHelper.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * KubaTech - Gregtech Addon - * Copyright (C) 2022 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/>. - * - */ - -package kubatech.api.utils; - -import java.lang.reflect.Field; -import java.util.HashMap; - -public class ReflectionHelper { - private static final HashMap<String, HashMap<String, Field>> fields = new HashMap<>(); - - @SuppressWarnings("unchecked") - public static <T> T getField(Object obj, String fieldName, T defaultvalue) { - Class<?> cl = obj.getClass(); - String clName = cl.getName(); - HashMap<String, Field> classmap = fields.computeIfAbsent(clName, s -> new HashMap<>()); - try { - if (classmap.containsKey(fieldName)) { - return (T) classmap.get(fieldName).get(obj); - } - boolean exceptionDetected = false; - Field f = null; - do { - try { - f = cl.getDeclaredField(fieldName); - f.setAccessible(true); - } catch (Exception ex) { - exceptionDetected = true; - cl = cl.getSuperclass(); - } - } while (exceptionDetected && !cl.equals(Object.class)); - if (f == null) return defaultvalue; - classmap.put(fieldName, f); - return (T) f.get(obj); - } catch (Exception ex) { - return defaultvalue; - } - } - - public static <T> T getField(Object obj, String fieldName) { - return getField(obj, fieldName, null); - } -} diff --git a/src/main/java/kubatech/config/OverridesConfig.java b/src/main/java/kubatech/config/OverridesConfig.java index 7d149fef81..4e740e6188 100644 --- a/src/main/java/kubatech/config/OverridesConfig.java +++ b/src/main/java/kubatech/config/OverridesConfig.java @@ -38,9 +38,9 @@ import java.util.Map; import kubatech.Tags; import kubatech.api.ConstructableItemStack; import kubatech.api.LoaderReference; +import kubatech.api.helpers.ReflectionHelper; import kubatech.api.mobhandler.MobDrop; import kubatech.api.utils.GSONUtils; -import kubatech.api.utils.ReflectionHelper; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; import net.minecraft.init.Items; diff --git a/src/main/java/kubatech/loaders/MobRecipeLoader.java b/src/main/java/kubatech/loaders/MobRecipeLoader.java index 62b7d819f2..dc9a19fb28 100644 --- a/src/main/java/kubatech/loaders/MobRecipeLoader.java +++ b/src/main/java/kubatech/loaders/MobRecipeLoader.java @@ -44,10 +44,11 @@ import java.util.*; import java.util.stream.Collectors; import kubatech.Tags; import kubatech.api.LoaderReference; +import kubatech.api.helpers.EnderIOHelper; +import kubatech.api.helpers.InfernalHelper; import kubatech.api.mobhandler.MobDrop; import kubatech.api.network.LoadConfigPacket; import kubatech.api.utils.GSONUtils; -import kubatech.api.utils.InfernalHelper; import kubatech.api.utils.ModUtils; import kubatech.config.Config; import kubatech.config.OverridesConfig; @@ -117,6 +118,7 @@ public class MobRecipeLoader { public final boolean isPeacefulAllowed; public final EntityLiving entity; public final float maxEntityHealth; + public final boolean isUsable; @SuppressWarnings("unchecked") public MobRecipe copy() { @@ -128,7 +130,8 @@ public class MobRecipeLoader { alwaysinfernal, isPeacefulAllowed, entity, - maxEntityHealth); + maxEntityHealth, + isUsable); } private MobRecipe( @@ -139,7 +142,8 @@ public class MobRecipeLoader { boolean alwaysinfernal, boolean isPeacefulAllowed, EntityLiving entity, - float maxEntityHealth) { + float maxEntityHealth, + boolean isUsable) { this.mOutputs = mOutputs; this.mDuration = mDuration; this.mMaxDamageChance = mMaxDamageChance; @@ -148,10 +152,15 @@ public class MobRecipeLoader { this.isPeacefulAllowed = isPeacefulAllowed; this.entity = entity; this.maxEntityHealth = maxEntityHealth; + this.isUsable = isUsable; + } + + public static MobRecipe generateMobRecipe(EntityLiving e, String entityID, ArrayList<MobDrop> outputs) { + return new MobRecipe(e, entityID, outputs); } @SuppressWarnings("unchecked") - public MobRecipe(EntityLiving e, ArrayList<MobDrop> outputs) { + private MobRecipe(EntityLiving e, String entityID, ArrayList<MobDrop> outputs) { if (infernaldrops == null && LoaderReference.InfernalMobs) { infernaldrops = new droplist(); LOG.info("Generating Infernal drops"); @@ -212,6 +221,7 @@ public class MobRecipeLoader { maxEntityHealth = e.getMaxHealth(); mDuration = Math.max(MOB_SPAWN_INTERVAL, (int) ((maxEntityHealth / DIAMOND_SPIKES_DAMAGE) * 10d)); entity = e; + isUsable = EnderIOHelper.canEntityBeCapturedWithSoulVial(e, entityID); } public void refresh() { @@ -632,17 +642,20 @@ public class MobRecipeLoader { for (Map.Entry<String, ArrayList<MobDrop>> entry : s.moblist.entrySet()) { try { EntityLiving e; - if (entry.getKey().equals("witherSkeleton") + String mobName = entry.getKey(); + if (mobName.equals("witherSkeleton") && !EntityList.stringToClassMapping.containsKey("witherSkeleton")) { e = new EntitySkeleton(f); ((EntitySkeleton) e).setSkeletonType(1); } else - e = (EntityLiving) ((Class<?>) EntityList.stringToClassMapping.get(entry.getKey())) + e = (EntityLiving) ((Class<?>) EntityList.stringToClassMapping.get(mobName)) .getConstructor(new Class[] {World.class}) .newInstance(new Object[] {f}); ArrayList<MobDrop> drops = entry.getValue(); drops.forEach(MobDrop::reconstructStack); - GeneralMobList.put(entry.getKey(), new GeneralMappedMob(e, new MobRecipe(e, drops), drops)); + GeneralMobList.put( + mobName, + new GeneralMappedMob(e, MobRecipe.generateMobRecipe(e, mobName, drops), drops)); } catch (Exception ignored) { } } @@ -1001,7 +1014,7 @@ public class MobRecipeLoader { if (drops.isEmpty() && raredrops.isEmpty() && additionaldrops.isEmpty()) { ArrayList<MobDrop> arr = new ArrayList<>(); - GeneralMobList.put(k, new GeneralMappedMob(e, new MobRecipe(e, arr), arr)); + GeneralMobList.put(k, new GeneralMappedMob(e, MobRecipe.generateMobRecipe(e, k, arr), arr)); LOG.info("Mapped " + k); return; } @@ -1099,7 +1112,7 @@ public class MobRecipeLoader { false)); } - GeneralMobList.put(k, new GeneralMappedMob(e, new MobRecipe(e, moboutputs), moboutputs)); + GeneralMobList.put(k, new GeneralMappedMob(e, MobRecipe.generateMobRecipe(e, k, moboutputs), moboutputs)); LOG.info("Mapped " + k); }); diff --git a/src/main/java/kubatech/nei/Mob_Handler.java b/src/main/java/kubatech/nei/Mob_Handler.java index a870c07a24..31a0f6d8b8 100644 --- a/src/main/java/kubatech/nei/Mob_Handler.java +++ b/src/main/java/kubatech/nei/Mob_Handler.java @@ -38,9 +38,9 @@ import java.util.Objects; import java.util.Random; import kubatech.Tags; import kubatech.api.LoaderReference; +import kubatech.api.helpers.InfernalHelper; import kubatech.api.mobhandler.MobDrop; import kubatech.api.utils.FastRandom; -import kubatech.api.utils.InfernalHelper; import kubatech.api.utils.MobUtils; import kubatech.api.utils.ModUtils; import kubatech.config.Config; @@ -82,6 +82,7 @@ public class Mob_Handler extends TemplateRecipeHandler { INFERNAL_CANNOT, INFERNAL_CAN, INFERNAL_ALWAYS, + CANNOT_USE_VIAL, CHANCE, AVERAGE_REMINDER, MOD, @@ -350,18 +351,23 @@ public class Mob_Handler extends TemplateRecipeHandler { MobRecipeLoader.MobRecipe MBRecipe = GT_MetaTileEntity_ExtremeExterminationChamber.MobNameToRecipeMap.get(currentrecipe.mobname); if (MBRecipe != null) { - GuiDraw.drawString( - GT_Utility.trans("153", "Usage: ") + GT_Utility.formatNumbers(MBRecipe.mEUt) + " EU/t", - x, - y += yshift, - 0xFF555555, - false); - GuiDraw.drawString( - GT_Utility.trans("158", "Time: ") + GT_Utility.formatNumbers(MBRecipe.mDuration / 20d) + " secs", - x, - y += yshift, - 0xFF555555, - false); + if (MBRecipe.isUsable) { + GuiDraw.drawString( + GT_Utility.trans("153", "Usage: ") + GT_Utility.formatNumbers(MBRecipe.mEUt) + " EU/t", + x, + y += yshift, + 0xFF555555, + false); + GuiDraw.drawString( + GT_Utility.trans("158", "Time: ") + GT_Utility.formatNumbers(MBRecipe.mDuration / 20d) + + " secs", + x, + y += yshift, + 0xFF555555, + false); + } else { + GuiDraw.drawString(CANNOT_USE_VIAL.get(), x, y += yshift, 0xFF555555, false); + } } x = 6; diff --git a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java index 267b1a6ef3..7e64f81c5c 100644 --- a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java +++ b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java @@ -60,11 +60,11 @@ import java.util.HashMap; import java.util.Random; import kubatech.Tags; import kubatech.api.LoaderReference; +import kubatech.api.helpers.ReflectionHelper; import kubatech.api.network.CustomTileEntityPacket; import kubatech.api.tileentity.CustomTileEntityPacketHandler; import kubatech.api.utils.FastRandom; import kubatech.api.utils.ItemID; -import kubatech.api.utils.ReflectionHelper; import kubatech.client.effect.EntityRenderer; import kubatech.loaders.MobRecipeLoader; import net.minecraft.block.Block; diff --git a/src/main/resources/assets/kubatech/lang/en_US.lang b/src/main/resources/assets/kubatech/lang/en_US.lang index 6d1b176ff2..f501587cdf 100644 --- a/src/main/resources/assets/kubatech/lang/en_US.lang +++ b/src/main/resources/assets/kubatech/lang/en_US.lang @@ -10,6 +10,7 @@ mobhandler.infernal_can=Can spawn infernal mobhandler.infernal_always=Always spawns infernal mobhandler.mod=Mod: mobhandler.max_health=Max health: +mobhandler.cannot_use_vial=Can't be in soul vial mobhandler.chance=Chance: mobhandler.average_reminder=§7§oPlease remember that these are average drops. mobhandler.lootable=Looting is applied |