all our food keeps blowing up

This commit is contained in:
Boblet 2025-12-11 16:34:57 +01:00
parent ec0613b9cf
commit 1e3e5f38d4
12 changed files with 118 additions and 20 deletions

View File

@ -107,7 +107,7 @@ dependencies {
implementation "li.cil.oc:OpenComputers:MC1.7.10-1.5.+:api"
compileOnly "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:dev"
implementation "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:dev"
}
processResources {

View File

@ -4,11 +4,21 @@
* Used extensively in 528 mode
* Replaces recipes for micro chips, controllers and upgrades
* All recipes only have a chance to be completed, broken items yielded otherwise need to be recycled
* Can do precise recipes, but it very unreliable. Many recipes have a high chance of outputting a broken version of the made item
* Broken items can be recycled in the precision assembler, returning some of the ingredients
* Annihilator
* Destroys items and fluids and keeps track of how much has been destroyed
* In 528 mode, destroying quantities of certain items yield unique progression relevant blueprints
## Changed
* Changed the way 528 mode works
* May of the old tantalium requirements no longer exist since the assembler rework
* Some important recipes have been moved to the precision assembler
* Many key "milestone" recipes now require 528 mode exclusive blueprints
* 528 exclusive blueprints are obtained from annihilating large quantities of certain items
* AE2 blocks, by default, will detonate when interacted with
* Synergizes with expensive mode, many recycling probabilities of the precision assembler are massively lowered with expensive mode enabled, increasing effective cost massively
* :)
* New fusion reactor and particle accelerator parts now have OpenComputers compat
* Irradiation recipe config now has the `fusionOnly` flag, preventing the recipe from being done in the RBMK irradiation channel
* Removed legacy fusion reactor parts from the creative inventory
@ -41,9 +51,10 @@
* Steel barrels and 256k tanks no longer use tar in their recipes (except in expensive mode)
* Solidifying biogas into compressed biomass now yields 4x more, making the biogas route twice as efficient as simply compressing biomass
* Finally removed the long deprecated ambience radiation generator and geothermal generator
* Nerfed the ballistic jackets, as they are comically cheap and made some zombies impossible to kill in early game
## Fixed
* Fixed gamebreaking issue causing crashes and world corruption where the multi detonator had its tooltip misspelled
* Fixed panzerschreck equip animation not speeding up with the sawed off mod
* Fixed FENSU not keeping its charge when broken
* Removed skeletonizer reloading from `/ntmreload` as it wasn't usable for end users and just caused error messages on servers
* Removed skeletonizer reloading from `/ntmreload` as it wasn't usable for end users and just caused error messages on servers

View File

@ -50,6 +50,7 @@ public class GeneralConfig {
public static boolean enable528BosniaSimulator = true;
public static boolean enable528NetherBurn = true;
public static boolean enable528PressurizedRecipes = true;
public static boolean enable528ExplosiveEnergistics = true;
public static int coltanRate = 2;
public static boolean enableLBSM = false;
@ -132,6 +133,7 @@ public class GeneralConfig {
enable528BosniaSimulator = CommonConfig.createConfigBool(config, CATEGORY_528, "X528_enableBosniaSimulator", "Enables anti tank mines spawning all over the world.", true);
enable528NetherBurn = CommonConfig.createConfigBool(config, CATEGORY_528, "X528_enable528NetherBurn", "Whether players burn in the nether", true);
enable528PressurizedRecipes = CommonConfig.createConfigBool(config, CATEGORY_528, "X528_enable528PressurizedRecipes", "Sets some recipes to require pressurized input fluid", true);
enable528ExplosiveEnergistics = CommonConfig.createConfigBool(config, CATEGORY_528, "X528_enable528ExplosiveEnergistics", "Renders AE2 unusable.", true);
coltanRate = CommonConfig.createConfigInt(config, CATEGORY_528, "X528_oreColtanFrequency", "Determines how many coltan ore veins are to be expected in a chunk. These values do not affect the frequency in deposits, and only apply if random coltan spanwing is enabled.", 2);
final String CATEGORY_LBSM = CommonConfig.CATEGORY_LBSM;
@ -167,6 +169,7 @@ public class GeneralConfig {
enable528BosniaSimulator = false;
enable528NetherBurn = false;
enable528PressurizedRecipes = false;
enable528ExplosiveEnergistics = false;
}
}
}

View File

@ -0,0 +1,16 @@
package com.hbm.handler.nei;
import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.recipes.AnnihilatorRecipes;
public class AnnihilatorHandler extends NEIUniversalHandler {
public AnnihilatorHandler() {
super("Annihilator", ModBlocks.machine_annihilator, AnnihilatorRecipes.getRecipes());
}
@Override
public String getKey() {
return "ntmAnnihilating";
}
}

View File

@ -3,7 +3,6 @@ package com.hbm.inventory.gui;
import java.util.Arrays;
import java.util.Locale;
import org.apache.commons.lang3.math.NumberUtils;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
@ -93,9 +92,8 @@ public class GUIMachineAnnihilator extends GuiInfoContainer {
protected void keyTyped(char c, int i) {
if(this.pool.textboxKeyTyped(c, i)) {
String text = this.pool.getText();
int num = NumberUtils.toInt(this.pool.getText());
NBTTagCompound data = new NBTTagCompound();
data.setInteger("threshold", num);
data.setString("pool", text);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, annihilator.xCoord, annihilator.yCoord, annihilator.zCoord));
return;
}

View File

@ -5,6 +5,7 @@ import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map.Entry;
import static com.hbm.inventory.OreDictManager.*;
@ -14,6 +15,7 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonWriter;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.RecipesCommon.OreDictStack;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.recipes.loader.GenericRecipes;
@ -21,6 +23,7 @@ import com.hbm.inventory.recipes.loader.SerializableRecipe;
import com.hbm.items.ModItems;
import com.hbm.items.machine.IItemFluidIdentifier;
import com.hbm.items.machine.ItemBlueprints;
import com.hbm.items.machine.ItemFluidIcon;
import com.hbm.items.machine.ItemCircuit.EnumCircuitType;
import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo;
import com.hbm.util.ItemStackUtil;
@ -28,6 +31,7 @@ import com.hbm.util.Tuple.Pair;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
public class AnnihilatorRecipes extends SerializableRecipe {
@ -75,6 +79,38 @@ public class AnnihilatorRecipes extends SerializableRecipe {
@Override public String getFileName() { return "hbmAnnihilator.json"; }
@Override public Object getRecipeObject() { return recipes; }
@Override public void deleteRecipes() { recipes.clear(); }
public static HashMap getRecipes() {
HashMap<Object, Object> recipes = new HashMap();
for(Entry<Object, AnnihilatorRecipe> entry : AnnihilatorRecipes.recipes.entrySet()) {
for(Pair<BigInteger, ItemStack> milestone : entry.getValue().milestones) {
Object input = new ItemStack[1];
if(entry.getKey() instanceof Item) input = new ItemStack((Item) entry.getKey());
if(entry.getKey() instanceof ComparableStack) input = ((ComparableStack) entry.getKey()).toStack();
if(entry.getKey() instanceof FluidType) input = ItemFluidIcon.make((FluidType) entry.getKey(), 0);
if(entry.getKey() instanceof String) input = new OreDictStack((String) entry.getKey()).extractForNEI();
if(input == null) continue;
if(input instanceof ItemStack) {
ItemStackUtil.addTooltipToStack((ItemStack) input, EnumChatFormatting.RED + String.format(Locale.US, "%,d", milestone.getKey()));
}
if(input instanceof List) {
List<ItemStack> list = (List<ItemStack>) input;
for(ItemStack stack : list) ItemStackUtil.addTooltipToStack(stack, EnumChatFormatting.RED + String.format(Locale.US, "%,d", milestone.getKey()));
input = list.toArray(new ItemStack[0]);
}
recipes.put(input, milestone.getValue());
}
}
return recipes;
}
/**
* If prevAmount is null, a payout is guaranteed if the currentAmount matches or exceeds the requirement.

View File

@ -120,7 +120,7 @@ public class PrecAssRecipes extends GenericRecipes<GenericRecipe> {
new OreDictStack(BIGMT.ingot(), 16),
new ComparableStack(ModItems.ingot_cft, 8),
new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD)),
new ItemStack(ModItems.upgrade_overdrive_1), 10, GeneralConfig.enableExpensiveMode ? 10 : 50);
new ItemStack(ModItems.upgrade_overdrive_2), 10, GeneralConfig.enableExpensiveMode ? 10 : 50);
registerPair(new GenericRecipe("precass.upgrade_overdive_iii").setup(1_200, 100_000)
.inputItems(new ComparableStack(ModItems.upgrade_overdrive_2, 1),
new ComparableStack(ModItems.upgrade_speed_3, 1),
@ -128,14 +128,7 @@ public class PrecAssRecipes extends GenericRecipes<GenericRecipe> {
new OreDictStack(ANY_BISMOIDBRONZE.ingot(), 16),
new ComparableStack(ModItems.ingot_cft, 16),
new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID)),
new ItemStack(ModItems.upgrade_overdrive_1), 5, GeneralConfig.enableExpensiveMode ? 10 : 50);
this.register(new GenericRecipe("ass.overdrive1").setup(200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_1, 1))
.inputItems(new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED)));
this.register(new GenericRecipe("ass.overdrive2").setup(600, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_2, 1))
.inputItems(new ComparableStack(ModItems.upgrade_overdrive_1, 1), new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD)));
this.register(new GenericRecipe("ass.overdrive3").setup(1_200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_3, 1))
.inputItems(new ComparableStack(ModItems.upgrade_overdrive_2, 1), new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(ANY_BISMOIDBRONZE.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID)));
new ItemStack(ModItems.upgrade_overdrive_3), 5, GeneralConfig.enableExpensiveMode ? 10 : 50);
}
int min = 1_200;

View File

@ -51,6 +51,7 @@ public class ItemFluidIcon extends Item {
}
public static ItemStack addQuantity(ItemStack stack, int i) {
if(i <= 0) return stack;
if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound();
stack.getTagCompound().setInteger("fill", i);
return stack;

View File

@ -13,6 +13,10 @@ import com.hbm.entity.mob.*;
import com.hbm.entity.projectile.EntityBulletBaseMK4;
import com.hbm.entity.projectile.EntityBurningFOEQ;
import com.hbm.entity.train.EntityRailCarBase;
import com.hbm.explosion.vanillant.ExplosionVNT;
import com.hbm.explosion.vanillant.standard.EntityProcessorCrossSmooth;
import com.hbm.explosion.vanillant.standard.ExplosionEffectWeapon;
import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard;
import com.hbm.extprop.HbmLivingProps;
import com.hbm.extprop.HbmPlayerProps;
import com.hbm.handler.ArmorModHandler;
@ -1177,12 +1181,30 @@ public class ModEventHandler {
}
@SubscribeEvent
public void onClickSign(PlayerInteractEvent event) {
public void onClickBlock(PlayerInteractEvent event) {
int x = event.x;
int y = event.z;
int z = event.y;
int y = event.y;
int z = event.z;
World world = event.world;
if(GeneralConfig.enable528ExplosiveEnergistics && !world.isRemote && event.action == Action.RIGHT_CLICK_BLOCK) {
Block b = world.getBlock(x, y, z);
String name = Block.blockRegistry.getNameForObject(b);
if(name != null && name.startsWith("appliedenergistics2")) {
world.func_147480_a(x, y, z, false);
ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 5, null);
vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, 20).setupPiercing(5, 0.2F));
vnt.setPlayerProcessor(new PlayerProcessorStandard());
vnt.setSFX(new ExplosionEffectWeapon(10, 2.5F, 1F));
vnt.explode();
event.setCanceled(true);
}
}
x = event.x;
y = event.z;
z = event.y;
if(!world.isRemote && event.action == Action.RIGHT_CLICK_BLOCK && world.getTileEntity(x, y, z) instanceof TileEntitySign) {

View File

@ -15,6 +15,7 @@ public class NEIRegistry {
if(!handlers.isEmpty()) return handlers;
handlers.add(new AnnihilatorHandler());
handlers.add(new AnvilRecipeHandler());
handlers.add(new SmithingRecipeHandler());
handlers.add(new PressRecipeHandler());

View File

@ -2,6 +2,7 @@ package com.hbm.tileentity.machine;
import java.math.BigInteger;
import com.hbm.interfaces.IControlReceiver;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.container.ContainerMachineAnnihilator;
import com.hbm.inventory.fluid.FluidType;
@ -30,7 +31,7 @@ import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityMachineAnnihilator extends TileEntityMachineBase implements IFluidStandardReceiverMK2, IGUIProvider {
public class TileEntityMachineAnnihilator extends TileEntityMachineBase implements IFluidStandardReceiverMK2, IControlReceiver, IGUIProvider {
public String pool = "Recycling";
public int timer;
@ -214,6 +215,22 @@ public class TileEntityMachineAnnihilator extends TileEntityMachineBase implemen
@Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachineAnnihilator(player.inventory, this); }
@Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineAnnihilator(player.inventory, this); }
@Override
public boolean hasPermission(EntityPlayer player) {
return this.isUseableByPlayer(player);
}
@Override
public void receiveControl(NBTTagCompound data) {
if(data.hasKey("pool")) {
String pool = data.getString("pool");
if(pool != null && !pool.isEmpty()) {
this.pool = pool;
this.markChanged();
}
}
}
AxisAlignedBB bb = null;
@Override

View File

@ -122,9 +122,9 @@ public class DamageResistanceHandler {
entityStats.put(EntityCreeper.class, new ResistanceStats().addCategory(CATEGORY_EXPLOSION, 2F, 0.25F));
itemStats.put(ModItems.jackt, new ResistanceStats()
.addCategory(CATEGORY_PHYSICAL, 5F, 0.5F));
.addCategory(CATEGORY_PHYSICAL, 1F, 0.25F));
itemStats.put(ModItems.jackt2, new ResistanceStats()
.addCategory(CATEGORY_PHYSICAL, 5F, 0.5F));
.addCategory(CATEGORY_PHYSICAL, 3F, 0.35F));
registerSet(ModItems.steel_helmet, ModItems.steel_plate, ModItems.steel_legs, ModItems.steel_boots, new ResistanceStats());
registerSet(ModItems.titanium_helmet, ModItems.titanium_plate, ModItems.titanium_legs, ModItems.titanium_boots, new ResistanceStats());