From 7328e3085d86812e6b523e51b4a98e1291f838f5 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Fri, 19 Aug 2022 16:24:48 +0200 Subject: Perfect OC --- .../multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java') 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 77f51ddc38..a410c87a24 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 @@ -419,7 +419,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber this.mEUt /= 4; this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 5000)}; } else { - calculateOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); + calculatePerfectOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 120)}; } if (this.mEUt > 0) this.mEUt = -this.mEUt; -- cgit From fd750e06f2e7c4d74121fb6784b9196b3f988f37 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 00:40:40 +0200 Subject: Default animations to enabled. --- .../multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java') 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 11204e800c..ec3d54186f 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 @@ -153,7 +153,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber private boolean isInRitualMode = false; private int mCasing = 0; private byte mGlassTier = 0; - private boolean mAnimationEnabled = false; + private boolean mAnimationEnabled = true; private EntityRenderer entityRenderer = null; private boolean renderEntity = false; @@ -170,7 +170,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber public void loadNBTData(NBTTagCompound aNBT) { super.loadNBTData(aNBT); isInRitualMode = aNBT.getBoolean("isInRitualMode"); - mAnimationEnabled = aNBT.getBoolean("mAnimationEnabled"); + mAnimationEnabled = !aNBT.hasKey("mAnimationEnabled") || aNBT.getBoolean("mAnimationEnabled"); mGlassTier = aNBT.getByte("mGlassTier"); } -- cgit From 6dbbff6804894bc69033df91d1344d8d523c178b Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 00:42:41 +0200 Subject: Return when not enough essence in ritual --- .../multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/main/java') 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 ec3d54186f..197d83af29 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 @@ -368,7 +368,10 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber } if (tileAltar == null) return; - if (currentEssence < effect.getCostPerRefresh() * 100) SoulNetworkHandler.causeNauseaToPlayer(owner); + if (currentEssence < effect.getCostPerRefresh() * 100) { + SoulNetworkHandler.causeNauseaToPlayer(owner); + return; + } ((IBloodAltar) tileAltar) .sacrificialDaggerCall( -- cgit From 525cc9553de2be9b0f14c6c646d69808abecb02d Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 01:32:59 +0200 Subject: Basic looting implementation --- .../java/kubatech/loaders/MobRecipeLoader.java | 16 ++++++++++++-- ...MetaTileEntity_ExtremeExterminationChamber.java | 25 ++++++++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/kubatech/loaders/MobRecipeLoader.java b/src/main/java/kubatech/loaders/MobRecipeLoader.java index 1374c94d75..eeb37ba2fb 100644 --- a/src/main/java/kubatech/loaders/MobRecipeLoader.java +++ b/src/main/java/kubatech/loaders/MobRecipeLoader.java @@ -207,13 +207,25 @@ public class MobRecipeLoader { entity = e; } - public ItemStack[] generateOutputs(Random rnd, GT_MetaTileEntity_ExtremeExterminationChamber MTE) { + public ItemStack[] generateOutputs( + Random rnd, GT_MetaTileEntity_ExtremeExterminationChamber MTE, int lootinglevel) { MTE.mEUt = mEUt; MTE.mMaxProgresstime = mDuration; ArrayList stacks = new ArrayList<>(mOutputs.size()); for (MobDrop o : mOutputs) { - if (o.chance == 10000 || rnd.nextInt(10000) < o.chance) { + int chance = o.chance; + int amount = o.stack.stackSize; + if (o.lootable && lootinglevel > 0) { + chance += lootinglevel * 5000; + if (chance > 10000) { + int div = (int) Math.ceil(chance / 10000d); + amount *= div; + chance /= div; + } + } + if (chance == 10000 || rnd.nextInt(10000) < chance) { ItemStack s = o.stack.copy(); + s.stackSize = amount; if (o.enchantable != null) EnchantmentHelper.addRandomEnchantment(rnd, s, o.enchantable); if (o.damages != null) { int rChance = rnd.nextInt(mMaxDamageChance); 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 197d83af29..03bc9f7cdc 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 @@ -49,6 +49,7 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_Utility; @@ -64,6 +65,8 @@ import kubatech.client.effect.EntityRenderer; import kubatech.loaders.MobRecipeLoader; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -71,6 +74,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.StatCollector; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -126,6 +130,10 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber GT_MetaTileEntity_ExtremeExterminationChamber::addOutputToMachineList, CASING_INDEX, 1), + ofHatchAdder( + GT_MetaTileEntity_ExtremeExterminationChamber::addInputToMachineList, + CASING_INDEX, + 1), ofHatchAdder( GT_MetaTileEntity_ExtremeExterminationChamber::addEnergyInputToMachineList, CASING_INDEX, @@ -188,6 +196,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber .addInfo("Spawns and Exterminates monsters for you") .addInfo("Base energy usage: 2,000 EU/t") .addInfo("Recipe time is based on mob health") + .addInfo("You have to put weapon in ULV Input Bus") .addInfo("Also produces 120 Liquid XP per operation") .addInfo("If the mob spawns infernal") .addInfo("it will drain 8 times more power") @@ -204,6 +213,8 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber .addStructureInfo("The glass tier limits the Energy Input tier") .addOtherStructurePart("Steel Frame Box", "All vertical corners (except top and bottom)") .addOutputBus("Any casing", 1) + .addOtherStructurePart( + "1x ULV " + StatCollector.translateToLocal("GT5U.MBTT.InputBus"), "Any casing", 1) .addOutputHatch("Any casing", 1) .addEnergyHatch("Any casing", 1) .addMaintenanceHatch("Any casing", 1) @@ -417,7 +428,13 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber if (!recipe.isPeacefulAllowed && this.getBaseMetaTileEntity().getWorld().difficultySetting == EnumDifficulty.PEACEFUL) return false; - this.mOutputItems = recipe.generateOutputs(rand, this); + GT_MetaTileEntity_Hatch_InputBus inputbus = this.mInputBusses.get(0); + if (inputbus == null || !isValidMetaTileEntity(inputbus)) return false; + ItemStack lootingholder = inputbus.getStackInSlot(0); + if (lootingholder == null || !Enchantment.looting.canApply(lootingholder)) return false; + + this.mOutputItems = recipe.generateOutputs( + rand, this, EnchantmentHelper.getEnchantmentLevel(Enchantment.looting.effectId, lootingholder)); if (isInRitualMode && isRitualValid()) { this.mMaxProgresstime = 400; @@ -474,7 +491,11 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { mGlassTier = 0; if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 6, 0)) return false; - if (mCasing < 10 || mMaintenanceHatches.size() != 1 || mEnergyHatches.size() == 0) return false; + if (mCasing < 10 + || mMaintenanceHatches.size() != 1 + || mEnergyHatches.size() == 0 + || mInputBusses.size() != 1 + || mInputBusses.get(0).mTier != 0) return false; if (mGlassTier < 8) for (GT_MetaTileEntity_Hatch_Energy hatch : mEnergyHatches) if (hatch.mTier > mGlassTier) return false; if (isInRitualMode) connectToRitual(); -- cgit From 831f61807e824b4660175da986a3d0deec04c40c Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 03:16:43 +0200 Subject: Time is based on the weapon inserted --- .../java/kubatech/loaders/MobRecipeLoader.java | 15 ++++--- ...MetaTileEntity_ExtremeExterminationChamber.java | 46 ++++++++++++++++++---- 2 files changed, 48 insertions(+), 13 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/kubatech/loaders/MobRecipeLoader.java b/src/main/java/kubatech/loaders/MobRecipeLoader.java index eeb37ba2fb..25ed2780da 100644 --- a/src/main/java/kubatech/loaders/MobRecipeLoader.java +++ b/src/main/java/kubatech/loaders/MobRecipeLoader.java @@ -113,6 +113,7 @@ public class MobRecipeLoader { public static droplist infernaldrops; public final boolean isPeacefulAllowed; public final EntityLiving entity; + public final float maxEntityHealth; @SuppressWarnings("unchecked") public MobRecipe copy() { @@ -123,7 +124,8 @@ public class MobRecipeLoader { infernalityAllowed, alwaysinfernal, isPeacefulAllowed, - entity); + entity, + maxEntityHealth); } private MobRecipe( @@ -133,7 +135,8 @@ public class MobRecipeLoader { boolean infernalityAllowed, boolean alwaysinfernal, boolean isPeacefulAllowed, - EntityLiving entity) { + EntityLiving entity, + float maxEntityHealth) { this.mOutputs = mOutputs; this.mDuration = mDuration; this.mMaxDamageChance = mMaxDamageChance; @@ -141,6 +144,7 @@ public class MobRecipeLoader { this.alwaysinfernal = alwaysinfernal; this.isPeacefulAllowed = isPeacefulAllowed; this.entity = entity; + this.maxEntityHealth = maxEntityHealth; } @SuppressWarnings("unchecked") @@ -203,14 +207,15 @@ public class MobRecipeLoader { } mMaxDamageChance = maxdamagechance; // Powered spawner with octadic capacitor spawns ~22/min ~= 0.366/sec ~= 2.72s/spawn ~= 54.54t/spawn - mDuration = 55 + 10 + (((int) e.getMaxHealth() / 5) * 10); + maxEntityHealth = e.getMaxHealth(); + mDuration = 55 + (int) (maxEntityHealth * 10); entity = e; } public ItemStack[] generateOutputs( - Random rnd, GT_MetaTileEntity_ExtremeExterminationChamber MTE, int lootinglevel) { + Random rnd, GT_MetaTileEntity_ExtremeExterminationChamber MTE, double attackDamage, int lootinglevel) { MTE.mEUt = mEUt; - MTE.mMaxProgresstime = mDuration; + MTE.mMaxProgresstime = Math.min(55, (int) ((maxEntityHealth / attackDamage) * 10d)); ArrayList stacks = new ArrayList<>(mOutputs.size()); for (MobDrop o : mOutputs) { int chance = o.chance; 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 03bc9f7cdc..6eda8055be 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 @@ -34,6 +34,7 @@ import WayofTime.alchemicalWizardry.api.tile.IBloodAltar; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectWellOfSuffering; import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass; +import com.google.common.collect.Multimap; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.StructureDefinition; import cpw.mods.fml.common.eventhandler.EventPriority; @@ -67,6 +68,9 @@ import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -428,20 +432,45 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber if (!recipe.isPeacefulAllowed && this.getBaseMetaTileEntity().getWorld().difficultySetting == EnumDifficulty.PEACEFUL) return false; - GT_MetaTileEntity_Hatch_InputBus inputbus = this.mInputBusses.get(0); - if (inputbus == null || !isValidMetaTileEntity(inputbus)) return false; - ItemStack lootingholder = inputbus.getStackInSlot(0); - if (lootingholder == null || !Enchantment.looting.canApply(lootingholder)) return false; - - this.mOutputItems = recipe.generateOutputs( - rand, this, EnchantmentHelper.getEnchantmentLevel(Enchantment.looting.effectId, lootingholder)); - if (isInRitualMode && isRitualValid()) { this.mMaxProgresstime = 400; this.mEUt /= 4; this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 5000)}; + this.mOutputItems = recipe.generateOutputs(rand, this, 3, 0); } else { + GT_MetaTileEntity_Hatch_InputBus inputbus = this.mInputBusses.get(0); + if (inputbus == null || !isValidMetaTileEntity(inputbus)) return false; + ItemStack lootingholder = inputbus.getStackInSlot(0); + if (lootingholder == null || !Enchantment.looting.canApply(lootingholder)) return false; + double attackDamage = 3; + + try { + //noinspection unchecked + attackDamage += ((Multimap) lootingholder.getAttributeModifiers()) + .get(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName()).stream() + .mapToDouble(attr -> attr.getAmount() + + (double) EnchantmentHelper.func_152377_a( + lootingholder, EnumCreatureAttribute.UNDEFINED)) + .sum(); + } catch (Exception ex) { + ex.printStackTrace(); + } + + this.mOutputItems = recipe.generateOutputs( + rand, + this, + attackDamage, + EnchantmentHelper.getEnchantmentLevel(Enchantment.looting.effectId, lootingholder)); + int eut = this.mEUt; calculatePerfectOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); + if (lootingholder.isItemStackDamageable()) { + do { + if (lootingholder.attemptDamageItem(1, rand)) { + inputbus.setInventorySlotContents(0, null); + break; + } + } while ((eut <<= 2) < this.mEUt); + } this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 120)}; } if (this.mEUt > 0) this.mEUt = -this.mEUt; @@ -454,6 +483,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber if (mAnimationEnabled) mobPacket.addData(mobType); mobPacket.sendToAllAround(16); + this.updateSlots(); return true; } -- cgit From 46bc982475752c7987bf9c3489cab78ec02b7f93 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 16:09:24 +0200 Subject: Weapon is optional --- src/main/java/kubatech/api/utils/ItemID.java | 78 ++++++++++++++++++++++ ...MetaTileEntity_ExtremeExterminationChamber.java | 69 ++++++++++++------- 2 files changed, 124 insertions(+), 23 deletions(-) create mode 100644 src/main/java/kubatech/api/utils/ItemID.java (limited to 'src/main/java') diff --git a/src/main/java/kubatech/api/utils/ItemID.java b/src/main/java/kubatech/api/utils/ItemID.java new file mode 100644 index 0000000000..199af7ebd0 --- /dev/null +++ b/src/main/java/kubatech/api/utils/ItemID.java @@ -0,0 +1,78 @@ +package kubatech.api.utils; + +import java.util.Objects; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemID { + private final Item item; + private final int count; + private final int meta; + private final NBTTagCompound tag; + private final boolean ignorecount; + private final boolean ignoremeta; + private final boolean ignorenbt; + + public static ItemID create(ItemStack stack) { + return new ItemID(stack, true, true, true, true); // ignore count by default + } + + public static ItemID create(ItemStack stack, boolean ignorecount) { + return new ItemID(stack, ignorecount, false, false, true); + } + + public static ItemID create(ItemStack stack, boolean ignorecount, boolean ignoremeta) { + return new ItemID(stack, ignorecount, ignoremeta, false, true); + } + + public static ItemID create(ItemStack stack, boolean ignorecount, boolean ignoremeta, boolean ignorenbt) { + return new ItemID(stack, ignorecount, ignoremeta, ignorenbt, true); + } + + public static ItemID create_NoCopy(ItemStack stack) { + return new ItemID(stack, true, false, false, false); // ignore count by default + } + + public static ItemID create_NoCopy(ItemStack stack, boolean ignorecount) { + return new ItemID(stack, ignorecount, false, false, false); + } + + public static ItemID create_NoCopy(ItemStack stack, boolean ignorecount, boolean ignoremeta) { + return new ItemID(stack, ignorecount, ignoremeta, false, false); + } + + public static ItemID create_NoCopy(ItemStack stack, boolean ignorecount, boolean ignoremeta, boolean ignorenbt) { + return new ItemID(stack, ignorecount, ignoremeta, ignorenbt, false); + } + + private ItemID(ItemStack stack, boolean ignorecount, boolean ignoremeta, boolean ignorenbt, boolean createcopy) { + this.ignorecount = ignorecount; + this.ignoremeta = ignoremeta; + this.ignorenbt = ignorenbt; + item = stack.getItem(); + count = ignorecount ? 0 : stack.stackSize; + meta = ignoremeta ? 0 : stack.getItemDamage(); + tag = ignorenbt ? null : (createcopy ? (NBTTagCompound) stack.stackTagCompound.copy() : stack.stackTagCompound); + } + + @Override + public int hashCode() { + return Objects.hash(item, count, meta, tag); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (obj == this) return true; + if (obj instanceof ItemID) return obj.hashCode() == this.hashCode(); + if (obj instanceof ItemStack) { + if (!item.equals(((ItemStack) obj).getItem())) return false; + if (!ignorecount) if (count != ((ItemStack) obj).stackSize) return false; + if (!ignoremeta) if (meta != ((ItemStack) obj).getItemDamage()) return false; + if (!ignorenbt) if (!tag.equals(((ItemStack) obj).stackTagCompound)) return false; + return true; + } + return false; + } +} 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 6eda8055be..394500b0bb 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 @@ -61,6 +61,7 @@ import kubatech.api.LoaderReference; 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; @@ -199,8 +200,8 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber .addInfo(Author) .addInfo("Spawns and Exterminates monsters for you") .addInfo("Base energy usage: 2,000 EU/t") - .addInfo("Recipe time is based on mob health") - .addInfo("You have to put weapon in ULV Input Bus") + .addInfo("Recipe time is based on mob health and the weapon") + .addInfo("You have to put a weapon in ULV Input Bus (optional)") .addInfo("Also produces 120 Liquid XP per operation") .addInfo("If the mob spawns infernal") .addInfo("it will drain 8 times more power") @@ -216,6 +217,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber .addOtherStructurePart("Borosilicate Glass", "All walls without corners") .addStructureInfo("The glass tier limits the Energy Input tier") .addOtherStructurePart("Steel Frame Box", "All vertical corners (except top and bottom)") + .addOtherStructurePart("Diamond spikes", "Inside second layer") .addOutputBus("Any casing", 1) .addOtherStructurePart( "1x ULV " + StatCollector.translateToLocal("GT5U.MBTT.InputBus"), "Any casing", 1) @@ -415,6 +417,15 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber private CustomTileEntityPacket mobPacket = null; + private static class WeaponCache { + ItemStack stack = null; + ItemID id = null; + int looting = 0; + double attackdamage = 0; + } + + private final WeaponCache weaponCache = new WeaponCache(); + @Override public boolean checkRecipe(ItemStack aStack) { if (getBaseMetaTileEntity().isClientSide()) return false; @@ -438,34 +449,46 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 5000)}; this.mOutputItems = recipe.generateOutputs(rand, this, 3, 0); } else { + double attackDamage = 9d; // damage from spikes GT_MetaTileEntity_Hatch_InputBus inputbus = this.mInputBusses.get(0); - if (inputbus == null || !isValidMetaTileEntity(inputbus)) return false; - ItemStack lootingholder = inputbus.getStackInSlot(0); - if (lootingholder == null || !Enchantment.looting.canApply(lootingholder)) return false; - double attackDamage = 3; - - try { - //noinspection unchecked - attackDamage += ((Multimap) lootingholder.getAttributeModifiers()) - .get(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName()).stream() - .mapToDouble(attr -> attr.getAmount() - + (double) EnchantmentHelper.func_152377_a( - lootingholder, EnumCreatureAttribute.UNDEFINED)) - .sum(); - } catch (Exception ex) { - ex.printStackTrace(); + if (inputbus == null || !isValidMetaTileEntity(inputbus)) { + weaponCache.stack = null; + return false; + } + weaponCheck: + { + ItemStack lootingholder = inputbus.getStackInSlot(0); + if (weaponCache.id.equals(lootingholder)) break weaponCheck; + if (lootingholder == null || !Enchantment.looting.canApply(lootingholder)) { + weaponCache.stack = null; + break weaponCheck; + } + try { + //noinspection unchecked + weaponCache.attackdamage = ((Multimap) + lootingholder.getAttributeModifiers()) + .get(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName()).stream() + .mapToDouble(attr -> attr.getAmount() + + (double) EnchantmentHelper.func_152377_a( + lootingholder, EnumCreatureAttribute.UNDEFINED)) + .sum(); + } catch (Exception ex) { + ex.printStackTrace(); + } + weaponCache.stack = lootingholder; + weaponCache.looting = + EnchantmentHelper.getEnchantmentLevel(Enchantment.looting.effectId, lootingholder); + weaponCache.id = ItemID.create_NoCopy(lootingholder, true, true); } + if (weaponCache.stack != null) attackDamage += weaponCache.attackdamage; this.mOutputItems = recipe.generateOutputs( - rand, - this, - attackDamage, - EnchantmentHelper.getEnchantmentLevel(Enchantment.looting.effectId, lootingholder)); + rand, this, attackDamage, weaponCache.stack != null ? weaponCache.looting : 0); int eut = this.mEUt; calculatePerfectOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); - if (lootingholder.isItemStackDamageable()) { + if (weaponCache.stack != null && weaponCache.stack.isItemStackDamageable()) { do { - if (lootingholder.attemptDamageItem(1, rand)) { + if (weaponCache.stack.attemptDamageItem(1, rand)) { inputbus.setInventorySlotContents(0, null); break; } -- cgit From c528d22fbed544ef99acaee8c8ed9e57ec72b3f6 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 16:20:56 +0200 Subject: Fix --- .../multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/java') 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 394500b0bb..ee33bb9457 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 @@ -455,10 +455,10 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber weaponCache.stack = null; return false; } + ItemStack lootingholder = inputbus.getStackInSlot(0); weaponCheck: { - ItemStack lootingholder = inputbus.getStackInSlot(0); - if (weaponCache.id.equals(lootingholder)) break weaponCheck; + if (weaponCache.stack != null && weaponCache.id.equals(lootingholder)) break weaponCheck; if (lootingholder == null || !Enchantment.looting.canApply(lootingholder)) { weaponCache.stack = null; break weaponCheck; @@ -486,9 +486,9 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber rand, this, attackDamage, weaponCache.stack != null ? weaponCache.looting : 0); int eut = this.mEUt; calculatePerfectOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); - if (weaponCache.stack != null && weaponCache.stack.isItemStackDamageable()) { + if (weaponCache.stack != null && lootingholder.isItemStackDamageable()) { do { - if (weaponCache.stack.attemptDamageItem(1, rand)) { + if (lootingholder.attemptDamageItem(1, rand)) { inputbus.setInventorySlotContents(0, null); break; } -- cgit From 18a90ad539ab1c1e2f3cf5297e9965a6e4db4e26 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 16:37:59 +0200 Subject: Add info in tricorder --- ...MetaTileEntity_ExtremeExterminationChamber.java | 40 +++++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) (limited to 'src/main/java') 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 ee33bb9457..d9cdef04f3 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 @@ -54,6 +54,8 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_Utility; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Random; import kubatech.Tags; @@ -79,6 +81,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; @@ -418,7 +421,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber private CustomTileEntityPacket mobPacket = null; private static class WeaponCache { - ItemStack stack = null; + boolean isValid = false; ItemID id = null; int looting = 0; double attackdamage = 0; @@ -452,15 +455,15 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber double attackDamage = 9d; // damage from spikes GT_MetaTileEntity_Hatch_InputBus inputbus = this.mInputBusses.get(0); if (inputbus == null || !isValidMetaTileEntity(inputbus)) { - weaponCache.stack = null; + weaponCache.isValid = false; return false; } ItemStack lootingholder = inputbus.getStackInSlot(0); weaponCheck: { - if (weaponCache.stack != null && weaponCache.id.equals(lootingholder)) break weaponCheck; + if (weaponCache.isValid && weaponCache.id.equals(lootingholder)) break weaponCheck; if (lootingholder == null || !Enchantment.looting.canApply(lootingholder)) { - weaponCache.stack = null; + weaponCache.isValid = false; break weaponCheck; } try { @@ -475,18 +478,18 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber } catch (Exception ex) { ex.printStackTrace(); } - weaponCache.stack = lootingholder; + weaponCache.isValid = true; weaponCache.looting = EnchantmentHelper.getEnchantmentLevel(Enchantment.looting.effectId, lootingholder); weaponCache.id = ItemID.create_NoCopy(lootingholder, true, true); } - if (weaponCache.stack != null) attackDamage += weaponCache.attackdamage; + if (weaponCache.isValid) attackDamage += weaponCache.attackdamage; - this.mOutputItems = recipe.generateOutputs( - rand, this, attackDamage, weaponCache.stack != null ? weaponCache.looting : 0); + this.mOutputItems = + recipe.generateOutputs(rand, this, attackDamage, weaponCache.isValid ? weaponCache.looting : 0); int eut = this.mEUt; calculatePerfectOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); - if (weaponCache.stack != null && lootingholder.isItemStackDamageable()) { + if (weaponCache.isValid && lootingholder.isItemStackDamageable()) { do { if (lootingholder.attemptDamageItem(1, rand)) { inputbus.setInventorySlotContents(0, null); @@ -555,6 +558,25 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber return true; } + @Override + public String[] getInfoData() { + ArrayList info = new ArrayList<>(Arrays.asList(super.getInfoData())); + info.add("Animations: " + EnumChatFormatting.YELLOW + (mAnimationEnabled ? "Enabled" : "Disabled")); + info.add("Is in ritual mode: " + EnumChatFormatting.YELLOW + (isInRitualMode ? "Yes" : "No")); + if (isInRitualMode) + info.add("Is connected to ritual: " + + (isRitualValid() ? EnumChatFormatting.GREEN + "Yes" : EnumChatFormatting.RED + "No")); + else { + info.add("Inserted weapon: " + EnumChatFormatting.YELLOW + (weaponCache.isValid ? "Yes" : "No")); + if (weaponCache.isValid) { + info.add("Weapon attack damage: " + EnumChatFormatting.YELLOW + weaponCache.attackdamage); + info.add("Weapon looting level: " + EnumChatFormatting.YELLOW + weaponCache.looting); + info.add("Total attack damage: " + EnumChatFormatting.YELLOW + (9 + weaponCache.attackdamage)); + } else info.add("Total attack damage: " + EnumChatFormatting.YELLOW + 9); + } + return info.toArray(new String[0]); + } + @Override public int getMaxEfficiency(ItemStack aStack) { return 10000; -- cgit From e33e4dec48db3b0b030bec94fe4ccb29c72b2222 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 17:32:23 +0200 Subject: Fix --- src/main/java/kubatech/loaders/MobRecipeLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java') diff --git a/src/main/java/kubatech/loaders/MobRecipeLoader.java b/src/main/java/kubatech/loaders/MobRecipeLoader.java index 25ed2780da..adece13f23 100644 --- a/src/main/java/kubatech/loaders/MobRecipeLoader.java +++ b/src/main/java/kubatech/loaders/MobRecipeLoader.java @@ -215,7 +215,7 @@ public class MobRecipeLoader { public ItemStack[] generateOutputs( Random rnd, GT_MetaTileEntity_ExtremeExterminationChamber MTE, double attackDamage, int lootinglevel) { MTE.mEUt = mEUt; - MTE.mMaxProgresstime = Math.min(55, (int) ((maxEntityHealth / attackDamage) * 10d)); + MTE.mMaxProgresstime = Math.max(55, (int) ((maxEntityHealth / attackDamage) * 10d)); ArrayList stacks = new ArrayList<>(mOutputs.size()); for (MobDrop o : mOutputs) { int chance = o.chance; -- cgit From 8c79919b93247ca26d76ed2e7566891ff8c2d06b Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 17:37:57 +0200 Subject: Fix NPE --- src/main/java/kubatech/api/utils/ItemID.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/main/java') diff --git a/src/main/java/kubatech/api/utils/ItemID.java b/src/main/java/kubatech/api/utils/ItemID.java index 199af7ebd0..932c45a0f9 100644 --- a/src/main/java/kubatech/api/utils/ItemID.java +++ b/src/main/java/kubatech/api/utils/ItemID.java @@ -70,7 +70,10 @@ public class ItemID { if (!item.equals(((ItemStack) obj).getItem())) return false; if (!ignorecount) if (count != ((ItemStack) obj).stackSize) return false; if (!ignoremeta) if (meta != ((ItemStack) obj).getItemDamage()) return false; - if (!ignorenbt) if (!tag.equals(((ItemStack) obj).stackTagCompound)) return false; + if (!ignorenbt) { + if (tag == null) return ((ItemStack) obj).stackTagCompound == null; + if (!tag.equals(((ItemStack) obj).stackTagCompound)) return false; + } return true; } return false; -- cgit From a044de89aff971bb9523de492598d90982f2f429 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Tue, 23 Aug 2022 17:44:14 +0200 Subject: Input bus is optional --- .../multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/main/java') 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 d9cdef04f3..270fd7ff9e 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 @@ -453,7 +453,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber this.mOutputItems = recipe.generateOutputs(rand, this, 3, 0); } else { double attackDamage = 9d; // damage from spikes - GT_MetaTileEntity_Hatch_InputBus inputbus = this.mInputBusses.get(0); + GT_MetaTileEntity_Hatch_InputBus inputbus = this.mInputBusses.size() == 0 ? null : this.mInputBusses.get(0); if (inputbus == null || !isValidMetaTileEntity(inputbus)) { weaponCache.isValid = false; return false; @@ -550,8 +550,8 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber if (mCasing < 10 || mMaintenanceHatches.size() != 1 || mEnergyHatches.size() == 0 - || mInputBusses.size() != 1 - || mInputBusses.get(0).mTier != 0) return false; + || !(mInputBusses.size() == 0 || (mInputBusses.size() == 1 && mInputBusses.get(0).mTier == 0))) + return false; if (mGlassTier < 8) for (GT_MetaTileEntity_Hatch_Energy hatch : mEnergyHatches) if (hatch.mTier > mGlassTier) return false; if (isInRitualMode) connectToRitual(); -- cgit