uh oh, the ZUNpet is kicking in

This commit is contained in:
HbmMods 2026-08-09 18:11:38 +02:00
parent 88d5926c2e
commit f23fdda794
8 changed files with 91 additions and 10 deletions

View File

@ -6,3 +6,19 @@
* While the byproduct chances are rather low and the recipe times are slow, the mills are easily scalable due to their low cost * While the byproduct chances are rather low and the recipe times are slow, the mills are easily scalable due to their low cost
* Comes with convenient stacking frame * Comes with convenient stacking frame
* Ideal for skyblock/seablock type challenge runs, as it can be configured to serve as an Ex Nihilo substitute * Ideal for skyblock/seablock type challenge runs, as it can be configured to serve as an Ex Nihilo substitute
* Can also perform the sand and colloid to clay recipe of the acidizer, but at a lower efficiency
## Changed
* Updated russian localization
* The cargo elevator can now be controlled using RoR, allowing the platform to stop at certain heights
* Updated the pepperbox textures
* The wood now looks more like wood and less like plastic
* The bronze parts now have more depth
* Conveyor items being deleted due to cramming can now be configured with the server config `CONVEYOR_CRAM_MAX`, the default still being 25
* Conveyor belts being destroyed due to item cramming can now be configured with the server config `CONVEYOR_CRAM_EXPLODE`, it is still on by default
* Conveyor items will no longer break any belts, even with the config enabled, if the conveyor item entities have existed for less than one cram check cycle
* This means that items that have piled up due to chunk loading should now safely self-destruct without breaking conveyor lines
## Fixed
* Fixed pollution detector localization not working, showing only error messages instead of the pollution type names
* Fixed un-clamped gaussian random use on the wideband detector satellite, causing uncommon detections with inaccuracy exceeding the intended amount

View File

@ -23,6 +23,8 @@ public class ServerConfig extends RunningConfig {
public static ConfigWrapper<Boolean> ENABLE_MKU = new ConfigWrapper(true); public static ConfigWrapper<Boolean> ENABLE_MKU = new ConfigWrapper(true);
public static ConfigWrapper<Boolean> STRUCTURE_DEBUG = new ConfigWrapper(false); public static ConfigWrapper<Boolean> STRUCTURE_DEBUG = new ConfigWrapper(false);
public static ConfigWrapper<Integer> AUTOCAL_MAX_CLOCK = new ConfigWrapper(20); public static ConfigWrapper<Integer> AUTOCAL_MAX_CLOCK = new ConfigWrapper(20);
public static ConfigWrapper<Integer> CONVEYOR_CRAM_MAX = new ConfigWrapper(25);
public static ConfigWrapper<Boolean> CONVEYOR_CRAM_EXPLODE = new ConfigWrapper(true);
private static void initDefaults() { private static void initDefaults() {
configMap.put("DAMAGE_COMPATIBILITY_MODE", DAMAGE_COMPATIBILITY_MODE); configMap.put("DAMAGE_COMPATIBILITY_MODE", DAMAGE_COMPATIBILITY_MODE);
@ -38,6 +40,8 @@ public class ServerConfig extends RunningConfig {
configMap.put("ENABLE_MKU", ENABLE_MKU); configMap.put("ENABLE_MKU", ENABLE_MKU);
configMap.put("STRUCTURE_DEBUG", STRUCTURE_DEBUG); configMap.put("STRUCTURE_DEBUG", STRUCTURE_DEBUG);
configMap.put("AUTOCAL_MAX_CLOCK", AUTOCAL_MAX_CLOCK); configMap.put("AUTOCAL_MAX_CLOCK", AUTOCAL_MAX_CLOCK);
configMap.put("CONVEYOR_CRAM_MAX", CONVEYOR_CRAM_MAX);
configMap.put("CONVEYOR_CRAM_EXPLODE", CONVEYOR_CRAM_EXPLODE);
} }
/** Initializes defaults, then reads the config file if it exists, then writes the config file. */ /** Initializes defaults, then reads the config file if it exists, then writes the config file. */

View File

@ -2,6 +2,7 @@ package com.hbm.entity.item;
import java.util.List; import java.util.List;
import com.hbm.config.ServerConfig;
import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.ExplosionVNT;
import com.hbm.explosion.vanillant.standard.ExplosionEffectTiny; import com.hbm.explosion.vanillant.standard.ExplosionEffectTiny;
import com.hbm.lib.Library; import com.hbm.lib.Library;
@ -84,7 +85,7 @@ public abstract class EntityMovingConveyorObject extends Entity {
// cram check every 20s // cram check every 20s
if((ticksExisted + this.getEntityId()) % 400 == 0) { if((ticksExisted + this.getEntityId()) % 400 == 0) {
List<EntityMovingConveyorObject> objs = worldObj.getEntitiesWithinAABB(EntityMovingConveyorObject.class, this.boundingBox.expand(0.125, 0.125, 0.125)); List<EntityMovingConveyorObject> objs = worldObj.getEntitiesWithinAABB(EntityMovingConveyorObject.class, this.boundingBox.expand(0.125, 0.125, 0.125));
if(objs.size() >= 25) { if(objs.size() >= ServerConfig.CONVEYOR_CRAM_MAX.get()) {
for(EntityMovingConveyorObject obj : objs) obj.setDead(); for(EntityMovingConveyorObject obj : objs) obj.setDead();
ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY + 0.125, posZ, 1, this); ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY + 0.125, posZ, 1, this);
vnt.setSFX(new ExplosionEffectTiny()); vnt.setSFX(new ExplosionEffectTiny());
@ -92,7 +93,9 @@ public abstract class EntityMovingConveyorObject extends Entity {
int x = (int) Math.floor(posX); int x = (int) Math.floor(posX);
int y = (int) Math.floor(posY); int y = (int) Math.floor(posY);
int z = (int) Math.floor(posZ); int z = (int) Math.floor(posZ);
if(worldObj.getBlock(x, y, z) instanceof IConveyorBelt) worldObj.func_147480_a(x, y, z, false);
if(worldObj.getBlock(x, y, z) instanceof IConveyorBelt && this.ticksExisted > 400 && ServerConfig.CONVEYOR_CRAM_EXPLODE.get())
worldObj.func_147480_a(x, y, z, false);
} }
} }

View File

@ -39,6 +39,7 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("rock.cobble").setup(duraShort, consumption).setNameWrapper("rock.crushing") this.register(new GenericRecipe("rock.cobble").setup(duraShort, consumption).setNameWrapper("rock.crushing")
.inputItems(new OreDictStack(KEY_COBBLESTONE)) .inputItems(new OreDictStack(KEY_COBBLESTONE))
.inputFluids(new FluidStack(Fluids.WATER, 250)) .inputFluids(new FluidStack(Fluids.WATER, 250))
.outputFluids(new FluidStack(Fluids.COLLOID, 250))
.outputItems(new ChanceOutputMulti( .outputItems(new ChanceOutputMulti(
new ChanceOutput(new ItemStack(Blocks.gravel), 95), new ChanceOutput(new ItemStack(Blocks.gravel), 95),
new ChanceOutput(new ItemStack(ModItems.powder_quartz), 5) new ChanceOutput(new ItemStack(ModItems.powder_quartz), 5)
@ -47,6 +48,7 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("rock.gravel").setup(duraShort, consumption).setNameWrapper("rock.crushing") this.register(new GenericRecipe("rock.gravel").setup(duraShort, consumption).setNameWrapper("rock.crushing")
.inputItems(new ComparableStack(Blocks.gravel)) .inputItems(new ComparableStack(Blocks.gravel))
.inputFluids(new FluidStack(Fluids.WATER, 250)) .inputFluids(new FluidStack(Fluids.WATER, 250))
.outputFluids(new FluidStack(Fluids.COLLOID, 250))
.outputItems(new ChanceOutputMulti( .outputItems(new ChanceOutputMulti(
new ChanceOutput(new ItemStack(Blocks.sand), 75), new ChanceOutput(new ItemStack(Blocks.sand), 75),
new ChanceOutput(new ItemStack(Items.flint), 20), new ChanceOutput(new ItemStack(Items.flint), 20),
@ -56,6 +58,7 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("rock.sand").setup(duraShort, consumption).setNameWrapper("rock.crushing") this.register(new GenericRecipe("rock.sand").setup(duraShort, consumption).setNameWrapper("rock.crushing")
.inputItems(new OreDictStack(KEY_SAND)) .inputItems(new OreDictStack(KEY_SAND))
.inputFluids(new FluidStack(Fluids.WATER, 250)) .inputFluids(new FluidStack(Fluids.WATER, 250))
.outputFluids(new FluidStack(Fluids.COLLOID, 250))
.outputItems(new ChanceOutputMulti( .outputItems(new ChanceOutputMulti(
new ChanceOutput(new ItemStack(ModItems.dust), 90), new ChanceOutput(new ItemStack(ModItems.dust), 90),
new ChanceOutput(new ItemStack(ModItems.powder_calcium), 5), new ChanceOutput(new ItemStack(ModItems.powder_calcium), 5),
@ -65,6 +68,7 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("rock.netherrack").setup(duraShort, consumption).setNameWrapper("rock.crushing") this.register(new GenericRecipe("rock.netherrack").setup(duraShort, consumption).setNameWrapper("rock.crushing")
.inputItems(new ComparableStack(Blocks.netherrack)) .inputItems(new ComparableStack(Blocks.netherrack))
.inputFluids(new FluidStack(Fluids.WATER, 250)) .inputFluids(new FluidStack(Fluids.WATER, 250))
.outputFluids(new FluidStack(Fluids.LAVA, 100))
.outputItems(new ChanceOutputMulti( .outputItems(new ChanceOutputMulti(
new ChanceOutput(new ItemStack(Blocks.gravel), 50), new ChanceOutput(new ItemStack(Blocks.gravel), 50),
new ChanceOutput(new ItemStack(Blocks.soul_sand), 25), new ChanceOutput(new ItemStack(Blocks.soul_sand), 25),
@ -75,6 +79,7 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("rock.soulsand").setup(duraShort, consumption).setNameWrapper("rock.crushing") this.register(new GenericRecipe("rock.soulsand").setup(duraShort, consumption).setNameWrapper("rock.crushing")
.inputItems(new ComparableStack(Blocks.soul_sand)) .inputItems(new ComparableStack(Blocks.soul_sand))
.inputFluids(new FluidStack(Fluids.WATER, 250)) .inputFluids(new FluidStack(Fluids.WATER, 250))
.outputFluids(new FluidStack(Fluids.LAVA, 100))
.outputItems(new ChanceOutputMulti( .outputItems(new ChanceOutputMulti(
new ChanceOutput(new ItemStack(Blocks.sand), 50), new ChanceOutput(new ItemStack(Blocks.sand), 50),
new ChanceOutput(new ItemStack(ModItems.powder_fire), 25), new ChanceOutput(new ItemStack(ModItems.powder_fire), 25),
@ -86,6 +91,7 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("rock.schist").setup(duraLong, consumption).setNameWrapper("rock.crushing") this.register(new GenericRecipe("rock.schist").setup(duraLong, consumption).setNameWrapper("rock.crushing")
.inputItems(new ComparableStack(ModBlocks.stone_gneiss)) .inputItems(new ComparableStack(ModBlocks.stone_gneiss))
.inputFluids(new FluidStack(Fluids.WATER, 250)) .inputFluids(new FluidStack(Fluids.WATER, 250))
.outputFluids(new FluidStack(Fluids.COLLOID, 250))
.outputItems(new ChanceOutputMulti( .outputItems(new ChanceOutputMulti(
new ChanceOutput(new ItemStack(Blocks.gravel), 50), new ChanceOutput(new ItemStack(Blocks.gravel), 50),
new ChanceOutput(new ItemStack(Blocks.sand), 10), new ChanceOutput(new ItemStack(Blocks.sand), 10),
@ -98,6 +104,7 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("rock.hematite").setup(duraLong, consumption).setNameWrapper("rock.crushing") this.register(new GenericRecipe("rock.hematite").setup(duraLong, consumption).setNameWrapper("rock.crushing")
.inputItems(new OreDictStack(HEMATITE.ore())) .inputItems(new OreDictStack(HEMATITE.ore()))
.inputFluids(new FluidStack(Fluids.WATER, 250)) .inputFluids(new FluidStack(Fluids.WATER, 250))
.outputFluids(new FluidStack(Fluids.COLLOID, 250))
.outputItems(new ChanceOutputMulti( .outputItems(new ChanceOutputMulti(
new ChanceOutput(new ItemStack(Blocks.gravel), 65), new ChanceOutput(new ItemStack(Blocks.gravel), 65),
new ChanceOutput(new ItemStack(ModItems.powder_iron), 25), new ChanceOutput(new ItemStack(ModItems.powder_iron), 25),
@ -107,6 +114,7 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
this.register(new GenericRecipe("rock.bauxite").setup(duraLong, consumption).setNameWrapper("rock.crushing") this.register(new GenericRecipe("rock.bauxite").setup(duraLong, consumption).setNameWrapper("rock.crushing")
.inputItems(new OreDictStack(BAUXITE.ore())) .inputItems(new OreDictStack(BAUXITE.ore()))
.inputFluids(new FluidStack(Fluids.WATER, 250)) .inputFluids(new FluidStack(Fluids.WATER, 250))
.outputFluids(new FluidStack(Fluids.COLLOID, 250))
.outputItems(new ChanceOutputMulti( .outputItems(new ChanceOutputMulti(
new ChanceOutput(new ItemStack(Blocks.gravel), 25), new ChanceOutput(new ItemStack(Blocks.gravel), 25),
new ChanceOutput(new ItemStack(Items.clay_ball), 25), new ChanceOutput(new ItemStack(Items.clay_ball), 25),
@ -115,9 +123,8 @@ public class RockMillRecipes extends GenericRecipes<GenericRecipe> {
)).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE));
this.register(new GenericRecipe("rock.clay").setup(duraLong, consumption) this.register(new GenericRecipe("rock.clay").setup(duraLong, consumption)
.inputItems(new OreDictStack(KEY_SAND), .inputItems(new OreDictStack(KEY_SAND, 2))
new ComparableStack(ModItems.dust)) .inputFluids(new FluidStack(Fluids.COLLOID, 2_500))
.inputFluids(new FluidStack(Fluids.WATER, 1_000))
.outputItems(new ItemStack(Items.clay_ball, 4))); .outputItems(new ItemStack(Items.clay_ball, 4)));
} }
} }

View File

@ -1257,8 +1257,10 @@ public class ClientProxy extends ServerProxy {
if("blockdust".equals(data.getString("mode"))) { if("blockdust".equals(data.getString("mode"))) {
Block b = Block.getBlockById(data.getInteger("block")); Block b = Block.getBlockById(data.getInteger("block"));
fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, 0); byte meta = data.getByte("meta");
fx = new net.minecraft.client.particle.EntityBlockDustFX(world, x, y, z, mX, mY + 0.2, mZ, b, meta);
ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(20), "particleMaxAge", "field_70547_e"); ReflectionHelper.setPrivateValue(EntityFX.class, fx, 10 + rand.nextInt(20), "particleMaxAge", "field_70547_e");
fx.setRBGColorF(0.8F, 0.8F, 0.8F);
} }
if("colordust".equals(data.getString("mode"))) { if("colordust".equals(data.getString("mode"))) {

View File

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import api.hbm.redstoneoverradio.IRORInteractive; import api.hbm.redstoneoverradio.IRORInteractive;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
public class SatelliteDetector extends SatelliteBase { public class SatelliteDetector extends SatelliteBase {
@ -98,8 +99,8 @@ public class SatelliteDetector extends SatelliteBase {
intensity == BurstIntensity.MEDIUM ? INACCURACY_MEDIUM : intensity == BurstIntensity.MEDIUM ? INACCURACY_MEDIUM :
INARRCURACY_HIGH; INARRCURACY_HIGH;
this.x += world.rand.nextGaussian() * inaccuracy; this.x += MathHelper.clamp_double(world.rand.nextGaussian(), -1, 1) * inaccuracy;
this.z += world.rand.nextGaussian() * inaccuracy; this.z += MathHelper.clamp_double(world.rand.nextGaussian(), -1, 1) * inaccuracy;
} }
} }

View File

@ -8,10 +8,13 @@ import com.hbm.inventory.gui.GUIMachineRockMill;
import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipe;
import com.hbm.items.ModItems; import com.hbm.items.ModItems;
import com.hbm.lib.Library; import com.hbm.lib.Library;
import com.hbm.main.MainRegistry;
import com.hbm.module.machine.ModuleMachineRockMill; import com.hbm.module.machine.ModuleMachineRockMill;
import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.BobMathUtil; import com.hbm.util.BobMathUtil;
import com.hbm.util.Vec3NT;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.energymk2.IBatteryItem; import api.hbm.energymk2.IBatteryItem;
@ -20,8 +23,11 @@ import api.hbm.fluidmk2.IFluidStandardTransceiverMK2;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.Container; import net.minecraft.inventory.Container;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
@ -79,7 +85,7 @@ public class TileEntityMachineRockMill extends TileEntityMachineBase implements
this.maxPower = recipe.power * 100; this.maxPower = recipe.power * 100;
} }
this.maxPower = BobMathUtil.max(this.power, this.maxPower, 1_000_000); this.maxPower = BobMathUtil.max(this.power, this.maxPower, 2_500);
this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); this.power = Library.chargeTEFromItems(slots, 0, power, maxPower);
@ -93,6 +99,16 @@ public class TileEntityMachineRockMill extends TileEntityMachineBase implements
this.didProcess = this.rockMillModule.didProcess; this.didProcess = this.rockMillModule.didProcess;
if(this.rockMillModule.markDirty) this.markDirty(); if(this.rockMillModule.markDirty) this.markDirty();
if(this.didProcess && (worldObj.getTotalWorldTime() + BlockPos.getIdentity(xCoord, yCoord, zCoord)) % 3 == 0) {
String sound = Blocks.stone.stepSound.getStepResourcePath();
if(recipe != null && recipe.getIcon().getItem() instanceof ItemBlock && ((ItemBlock) recipe.getIcon().getItem()).field_150939_a != null) {
sound = ((ItemBlock) recipe.getIcon().getItem()).field_150939_a.stepSound.getStepResourcePath();
}
worldObj.playSoundEffect(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, sound, this.getVolume(1.0F), 0.75F);
}
this.networkPackNT(100); this.networkPackNT(100);
} else { } else {
@ -112,6 +128,38 @@ public class TileEntityMachineRockMill extends TileEntityMachineBase implements
if(worldObj.getTotalWorldTime() % 20 == 0) { if(worldObj.getTotalWorldTime() % 20 == 0) {
frame = !worldObj.getBlock(xCoord, yCoord + 3, zCoord).isAir(worldObj, xCoord, yCoord + 3, zCoord); frame = !worldObj.getBlock(xCoord, yCoord + 3, zCoord).isAir(worldObj, xCoord, yCoord + 3, zCoord);
} }
if(this.didProcess && MainRegistry.proxy.me().getDistanceSq(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5) < 35 * 35) {
GenericRecipe recipe = rockMillModule.getRecipe();
Block block = Blocks.gravel;
int meta = 0;
if(recipe != null) {
if(recipe.getIcon().getItem() instanceof ItemBlock) {
block = Block.getBlockFromItem(recipe.getIcon().getItem());
meta = recipe.getIcon().getItemDamage();
}
}
Vec3NT vec = new Vec3NT(1, 0, 0);
vec.rotateAroundYDeg(worldObj.rand.nextDouble() * 360);
double speed = 0.125D;
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "vanillaExt");
data.setString("mode", "blockdust");
data.setInteger("block", Block.getIdFromBlock(block));
data.setByte("meta", (byte) meta);
data.setDouble("mX", vec.xCoord * speed);
data.setDouble("mY", vec.yCoord * speed - 0.1D);
data.setDouble("mZ", vec.zCoord * speed);
data.setDouble("posX", xCoord + 0.5 + vec.xCoord * 2.25);
data.setDouble("posY", yCoord + 1.5);
data.setDouble("posZ", zCoord + 0.5 + vec.zCoord * 2.25);
MainRegistry.proxy.effectNT(data);
}
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB