From f23fdda79489309b68380bd4c0ca0d08bd9b387c Mon Sep 17 00:00:00 2001 From: HbmMods Date: Sun, 9 Aug 2026 18:11:38 +0200 Subject: [PATCH] uh oh, the ZUNpet is kicking in --- changelog | 18 ++++++- .../java/com/hbm/config/ServerConfig.java | 4 ++ .../item/EntityMovingConveyorObject.java | 7 ++- .../inventory/recipes/RockMillRecipes.java | 13 +++-- src/main/java/com/hbm/main/ClientProxy.java | 4 +- .../satellites/SatelliteDetector.java | 5 +- .../machine/TileEntityMachineRockMill.java | 50 +++++++++++++++++- .../hbm/textures/models/weapons/pepperbox.png | Bin 2729 -> 5003 bytes 8 files changed, 91 insertions(+), 10 deletions(-) diff --git a/changelog b/changelog index ce18603a4..c594e4738 100644 --- a/changelog +++ b/changelog @@ -5,4 +5,20 @@ * Mainly intended to serve as an easy way to automate/bulk craft certain elements in earlygame before BOP * 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 - * Ideal for skyblock/seablock type challenge runs, as it can be configured to serve as an Ex Nihilo substitute \ No newline at end of file + * 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 \ No newline at end of file diff --git a/src/main/java/com/hbm/config/ServerConfig.java b/src/main/java/com/hbm/config/ServerConfig.java index 90d5b94c7..c82e09763 100644 --- a/src/main/java/com/hbm/config/ServerConfig.java +++ b/src/main/java/com/hbm/config/ServerConfig.java @@ -23,6 +23,8 @@ public class ServerConfig extends RunningConfig { public static ConfigWrapper ENABLE_MKU = new ConfigWrapper(true); public static ConfigWrapper STRUCTURE_DEBUG = new ConfigWrapper(false); public static ConfigWrapper AUTOCAL_MAX_CLOCK = new ConfigWrapper(20); + public static ConfigWrapper CONVEYOR_CRAM_MAX = new ConfigWrapper(25); + public static ConfigWrapper CONVEYOR_CRAM_EXPLODE = new ConfigWrapper(true); private static void initDefaults() { 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("STRUCTURE_DEBUG", STRUCTURE_DEBUG); 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. */ diff --git a/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java b/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java index a2175a581..1afd6f9aa 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingConveyorObject.java @@ -2,6 +2,7 @@ package com.hbm.entity.item; import java.util.List; +import com.hbm.config.ServerConfig; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.standard.ExplosionEffectTiny; import com.hbm.lib.Library; @@ -84,7 +85,7 @@ public abstract class EntityMovingConveyorObject extends Entity { // cram check every 20s if((ticksExisted + this.getEntityId()) % 400 == 0) { List 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(); ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY + 0.125, posZ, 1, this); vnt.setSFX(new ExplosionEffectTiny()); @@ -92,7 +93,9 @@ public abstract class EntityMovingConveyorObject extends Entity { int x = (int) Math.floor(posX); int y = (int) Math.floor(posY); 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); } } diff --git a/src/main/java/com/hbm/inventory/recipes/RockMillRecipes.java b/src/main/java/com/hbm/inventory/recipes/RockMillRecipes.java index 73c0e8e3d..5d7c5edfc 100644 --- a/src/main/java/com/hbm/inventory/recipes/RockMillRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/RockMillRecipes.java @@ -39,6 +39,7 @@ public class RockMillRecipes extends GenericRecipes { this.register(new GenericRecipe("rock.cobble").setup(duraShort, consumption).setNameWrapper("rock.crushing") .inputItems(new OreDictStack(KEY_COBBLESTONE)) .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputFluids(new FluidStack(Fluids.COLLOID, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.gravel), 95), new ChanceOutput(new ItemStack(ModItems.powder_quartz), 5) @@ -47,6 +48,7 @@ public class RockMillRecipes extends GenericRecipes { this.register(new GenericRecipe("rock.gravel").setup(duraShort, consumption).setNameWrapper("rock.crushing") .inputItems(new ComparableStack(Blocks.gravel)) .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputFluids(new FluidStack(Fluids.COLLOID, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.sand), 75), new ChanceOutput(new ItemStack(Items.flint), 20), @@ -56,6 +58,7 @@ public class RockMillRecipes extends GenericRecipes { this.register(new GenericRecipe("rock.sand").setup(duraShort, consumption).setNameWrapper("rock.crushing") .inputItems(new OreDictStack(KEY_SAND)) .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputFluids(new FluidStack(Fluids.COLLOID, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(ModItems.dust), 90), new ChanceOutput(new ItemStack(ModItems.powder_calcium), 5), @@ -65,6 +68,7 @@ public class RockMillRecipes extends GenericRecipes { this.register(new GenericRecipe("rock.netherrack").setup(duraShort, consumption).setNameWrapper("rock.crushing") .inputItems(new ComparableStack(Blocks.netherrack)) .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputFluids(new FluidStack(Fluids.LAVA, 100)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.gravel), 50), new ChanceOutput(new ItemStack(Blocks.soul_sand), 25), @@ -75,6 +79,7 @@ public class RockMillRecipes extends GenericRecipes { this.register(new GenericRecipe("rock.soulsand").setup(duraShort, consumption).setNameWrapper("rock.crushing") .inputItems(new ComparableStack(Blocks.soul_sand)) .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputFluids(new FluidStack(Fluids.LAVA, 100)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.sand), 50), new ChanceOutput(new ItemStack(ModItems.powder_fire), 25), @@ -86,6 +91,7 @@ public class RockMillRecipes extends GenericRecipes { this.register(new GenericRecipe("rock.schist").setup(duraLong, consumption).setNameWrapper("rock.crushing") .inputItems(new ComparableStack(ModBlocks.stone_gneiss)) .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputFluids(new FluidStack(Fluids.COLLOID, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.gravel), 50), new ChanceOutput(new ItemStack(Blocks.sand), 10), @@ -98,6 +104,7 @@ public class RockMillRecipes extends GenericRecipes { this.register(new GenericRecipe("rock.hematite").setup(duraLong, consumption).setNameWrapper("rock.crushing") .inputItems(new OreDictStack(HEMATITE.ore())) .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputFluids(new FluidStack(Fluids.COLLOID, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.gravel), 65), new ChanceOutput(new ItemStack(ModItems.powder_iron), 25), @@ -107,6 +114,7 @@ public class RockMillRecipes extends GenericRecipes { this.register(new GenericRecipe("rock.bauxite").setup(duraLong, consumption).setNameWrapper("rock.crushing") .inputItems(new OreDictStack(BAUXITE.ore())) .inputFluids(new FluidStack(Fluids.WATER, 250)) + .outputFluids(new FluidStack(Fluids.COLLOID, 250)) .outputItems(new ChanceOutputMulti( new ChanceOutput(new ItemStack(Blocks.gravel), 25), new ChanceOutput(new ItemStack(Items.clay_ball), 25), @@ -115,9 +123,8 @@ public class RockMillRecipes extends GenericRecipes { )).setIconToFirstIngredient().setGroup(groupCrush, INSTANCE)); this.register(new GenericRecipe("rock.clay").setup(duraLong, consumption) - .inputItems(new OreDictStack(KEY_SAND), - new ComparableStack(ModItems.dust)) - .inputFluids(new FluidStack(Fluids.WATER, 1_000)) + .inputItems(new OreDictStack(KEY_SAND, 2)) + .inputFluids(new FluidStack(Fluids.COLLOID, 2_500)) .outputItems(new ItemStack(Items.clay_ball, 4))); } } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 746ba9f50..7b7aea644 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -1257,8 +1257,10 @@ public class ClientProxy extends ServerProxy { if("blockdust".equals(data.getString("mode"))) { 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"); + fx.setRBGColorF(0.8F, 0.8F, 0.8F); } if("colordust".equals(data.getString("mode"))) { diff --git a/src/main/java/com/hbm/saveddata/satellites/SatelliteDetector.java b/src/main/java/com/hbm/saveddata/satellites/SatelliteDetector.java index f2e08578a..3c90de4d6 100644 --- a/src/main/java/com/hbm/saveddata/satellites/SatelliteDetector.java +++ b/src/main/java/com/hbm/saveddata/satellites/SatelliteDetector.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import api.hbm.redstoneoverradio.IRORInteractive; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class SatelliteDetector extends SatelliteBase { @@ -98,8 +99,8 @@ public class SatelliteDetector extends SatelliteBase { intensity == BurstIntensity.MEDIUM ? INACCURACY_MEDIUM : INARRCURACY_HIGH; - this.x += world.rand.nextGaussian() * inaccuracy; - this.z += world.rand.nextGaussian() * inaccuracy; + this.x += MathHelper.clamp_double(world.rand.nextGaussian(), -1, 1) * inaccuracy; + this.z += MathHelper.clamp_double(world.rand.nextGaussian(), -1, 1) * inaccuracy; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRockMill.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRockMill.java index bdb6c735b..161b08762 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRockMill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRockMill.java @@ -8,10 +8,13 @@ import com.hbm.inventory.gui.GUIMachineRockMill; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.items.ModItems; import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; import com.hbm.module.machine.ModuleMachineRockMill; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.BobMathUtil; +import com.hbm.util.Vec3NT; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; 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.SideOnly; import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; @@ -79,7 +85,7 @@ public class TileEntityMachineRockMill extends TileEntityMachineBase implements 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); @@ -92,6 +98,16 @@ public class TileEntityMachineRockMill extends TileEntityMachineBase implements this.rockMillModule.update(1D, 1D, true, slots[1]); this.didProcess = this.rockMillModule.didProcess; 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); @@ -112,6 +128,38 @@ public class TileEntityMachineRockMill extends TileEntityMachineBase implements if(worldObj.getTotalWorldTime() % 20 == 0) { 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); + } } } diff --git a/src/main/resources/assets/hbm/textures/models/weapons/pepperbox.png b/src/main/resources/assets/hbm/textures/models/weapons/pepperbox.png index 2334c4e2c5c9b02fc42b09198f2ecac10a995566..5dc23b12f1ec4cb4d10294ac3b3fc9761d709434 100644 GIT binary patch delta 4997 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 P00000NkvXXu0mjf+{16( delta 2706 zcmV;D3T^d^C#e;XGk*$TNkleTW=q9ml`VGqZcyw|WhCr$s^Q+cin^(rVmr zZJHBf>PsquFZhxm6e6Kj31YxfFhmiBf&}!BVk}h?YtR;hRcOOWlZx9rQj5J9lh}s- zRgKvrIkV1fa+!G^|G1mI+1ZzQc4ua1X7~4jVR!b~nR#Y+=YPB3-|zR#3mU&cdej{t;)%vvANztc2tnE~h>&0qP2r5U zZUYBrEe#0K$ByaKfJQlt zfrJDj;k2t}bbre6=~)J}&tKT>l*90k1Zp251DMLZ^YMVA{a}-MujRYxbNgQg5qmVw z1DjUX$vh|S;X(*+7{J^Iu5-RwyPJcq_JbWR-zoaeojc|5@Gt;ietsVIbN75uZAXtD zjr}jJSS-pyp#T7=R4SO6neo+UDaWKeUcpJZWZ;`m-G70U&XLm9&ED@`nyvN6D}3mb zJv$~mt%JomG#oDM*>-D?@A%jjl#FDN95kkN@8euVSbe{2ne zB^ugOsrFyb7w`K(;76^BbKvAK0>jGzxE%-3`k=Sn#Q|3+qPn~a`ta~DMn*qOE8+!-$|zS*ON0G|FKFf_?C|I+)$GhCpL?h^MUo@L{zuqo?p|X58H2j?$I&_FRAAiGcBbFGQ$Tdvg|Lhr9LPA(pi{xZ* z3D3@__FtuxW3t&kwVHs=1%~K7`uzNSZN`2+H#b)|A7mS$&geuA-^HsqczhEyVIh@D z)!I~&lbxcPmuQ#6kaDc6evMA#P%arY(HJzhkrded4}3)~R4zx|k5I@K#_;^Jzv%df z*MF-ji3;VCf$#nPE)3~fO)!3T;w85CWA_Fw82QYQ()$({7jeV1@c47D*PX4p_FH4M z=YFu4Km6vtfelmRN-a3f7M8y3q>D$t?1vMLbMPi(B?3nwFR}8z=I`|@7Ql+zAmT?& zF#6>H>zDm-vQ(8=5sYu_+(xlJ5efQ2<$p2^<66}HAlkq=t4nx>QBEZY6?DV6hU!8k z>V6Pya92n)U5mI!#GpbWJrjVgap)R@t}Q!@uud&k&0!D&i=NBf5_KO!qo4O}km&bw zN|JT2U1k94MsIdPxn$JDf(CBI6Dq3`HH1)e7(&RF@3lq49va@MTOgr`H&j+t zpja&W%rd?aOh-bdnQLhEKFdQ~7`x1D(NJaV9)rXp=1^I+M+6#|hg8k@$sb>24}D^* zr#K2JArmQoxdGZX`%1 zCnx2lOP8=})hgJJn>TNkBpSVg%Bl&#v;;K9!I!VfB@{!4Zcxc%w98?H$;p!^ne8x! zhlj~wL;#gl6M(Zq0RTV#!zuQ#Lg>&9hfkE)gWI>XUAJ)bMFr{eL=4)9m^72`Z~5f~Al|g1Zjnuw2Gdr(R}X*m`$MMG!(j zhUjowQK?j*X&M+~$mjDt-#$TQ)mT$58TigK8ZD|Fuxo*asmLb zd-o2d_h&L0EG{l0pU>mUl`FotPjn8IRbxW4fnAS2y&h?efoob*H-8aT9z(!?4&%s? z6SaMQWaCl%;MHB8%Sb6PG&F>pH*dne=IWYt8)PP10Pvcx{t#;PeOYzu{B1Qv+2sE z5WWYG?cTiuk8C^&07~ux04`pO9uA+Y8)wTIicC5Q#d|7%N}Uq1pMO8W7uNx!kJ29FLFa-;g7yAtHv?$ zSuPp)`Y+#ylm;-y8>%0j5|+zwikN9yFf9wG&i*g4VnO(a%BuC(nhX8kr(81d(9hqq zBo^E|N1;Mkd4CLh__t|VFonRM|3P9g=ula;hm=bO_CEP;=$r*6769=4E9clpH;o6b z8kP_+Eeob4P&&UrVnOtOSv4+6&~nMZo+sV~odb-sz{7|z!jeVPglP#(U#R*Li;+is0tU*iPjLZWA2Zv)=X$zEawx0@h$;g5kV ztJ-1_Reu%bwp(u@HxUz@Aq$;z;?2O7Rh?B7J9pF1qUncw*4!?)j0;R(NdEm!r>3Tu zeNG9{Jp)lzb>dF)_ChSCFI2H*JOcosRZ6<8kN``4YSyo`u7fiR6L(}$I-eZTa0)}E zQmIvHDwRr|qp)8i)T!k#7Alt$FBX8>e%K<>OMhqa?2~hlQbGy=jWb_UGyJZz*?Kk3 zF_cPSNY}A-ZN94;EJuZx5Rg!G$H10VqX$^H zmVefvnZSqF7x2QFc#DQRd1;3z%`T?n76}?~)}Dbat47Ihe|iZ*VmUnF9Zzn82uGTQ zB%JZODV<7VNZ0X^4R1+QcmmYtHHhvR$g*l2IQICz@a2c!0V(}EjWEKIrS&$+Yot@q zOcOgc4dcY$;_WoLft*EqsMMs0yDZm9nSajDvV#tdjffYzilVx&k(gxs?2G%e>g3s8SIxYG?FC-4TLtLt+s>xQbZx(-)WIeMxfP-Kgvf{gK5FO1=@X zhLWD~f&uMo)b