BOMBER sounds, cavaryn tweaks, other random bs

This commit is contained in:
craisinlord committed 2026-06-28 09:49:18 -05:00
1 parent aad8a1e1c5
commit ca77d1b480
65 files changed
+474 -173

No files matched your search

@@ -31,7 +31,7 @@ public final class AntarchySettings {
private static double waspHealth = 16.0D;
private static double waspAttackDamage = 4.0D;
private static double waspMovementSpeed = 0.39D;
private static double bomberHealth = 10.0D;
private static double bomberHealth = 15.0D;
private static double bomberAttackDamage = 4.0D;
private static double bomberExplosionDamage = 8.0D;
private static double bomberExplosionRadius = 4.0D;
@@ -119,6 +119,9 @@ public final class AntarchySoundEvents {
public static Supplier<SoundEvent> MOLEVORE_HURT = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> MOLEVORE_ATTACK = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> MOLEVORE_DIG = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> BOMBER_WALK = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> BOMBER_KNOCK = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> BOMBER_EXPLODE = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> DUCT_TAPE_USE = (Supplier<SoundEvent>) UNBOUND;
private AntarchySoundEvents() {
@@ -235,6 +238,9 @@ public final class AntarchySoundEvents {
Supplier<SoundEvent> molevoreHurt,
Supplier<SoundEvent> molevoreAttack,
Supplier<SoundEvent> molevoreDig,
Supplier<SoundEvent> bomberWalk,
Supplier<SoundEvent> bomberKnock,
Supplier<SoundEvent> bomberExplode,
Supplier<SoundEvent> ductTapeUse
) {
SQUIDZOOKA_FIRE = squidzookaFire;
@@ -347,6 +353,9 @@ public final class AntarchySoundEvents {
MOLEVORE_HURT = molevoreHurt;
MOLEVORE_ATTACK = molevoreAttack;
MOLEVORE_DIG = molevoreDig;
BOMBER_WALK = bomberWalk;
BOMBER_KNOCK = bomberKnock;
BOMBER_EXPLODE = bomberExplode;
DUCT_TAPE_USE = ductTapeUse;
}
}
@@ -24,7 +24,6 @@ public class UpwardFallingBlockRenderer extends EntityRenderer<UpwardFallingBloc
if (blockState.isAir()) return;
poseStack.pushPose();
// Center the block model on the entity origin
poseStack.translate(-0.5, 0.0, -0.5);
Minecraft.getInstance().getBlockRenderer().renderSingleBlock(
blockState, poseStack, bufferSource, light, OverlayTexture.NO_OVERLAY
@@ -1,14 +1,20 @@
package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchySoundEvents;
import java.util.Objects;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.tags.DamageTypeTags;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.RandomSource;
import net.minecraft.world.Difficulty;
import net.minecraft.world.DifficultyInstance;
@@ -48,15 +54,17 @@ import software.bernie.geckolib.animation.AnimationController;
import software.bernie.geckolib.animation.AnimationState;
import software.bernie.geckolib.animation.PlayState;
import software.bernie.geckolib.animation.RawAnimation;
import software.bernie.geckolib.animation.keyframe.event.builtin.AutoPlayingSoundKeyframeHandler;
import software.bernie.geckolib.util.GeckoLibUtil;
public class BomberEntity extends Monster implements GeoEntity {
private static final ResourceLocation INTENTIONALLY_EMPTY_SOUND_ID = ResourceLocation.withDefaultNamespace("intentionally_empty");
private static final EntityDataAccessor<Integer> FUSE_TICKS_DATA =
SynchedEntityData.defineId(BomberEntity.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Boolean> DETONATING_DATA =
SynchedEntityData.defineId(BomberEntity.class, EntityDataSerializers.BOOLEAN);
private static final int DEFAULT_FUSE_TICKS = 80;
private static final int DEFAULT_FUSE_TICKS = 120;
private static final int EXPLODE_ANIM_START_TICKS = 25;
private static final int FLASH_INTERVAL_TICKS = 5;
@@ -117,7 +125,9 @@ public class BomberEntity extends Monster implements GeoEntity {
Objects.requireNonNull(this.getAttribute(Attributes.MAX_HEALTH)).setBaseValue(maxHealth);
this.setHealth((float) maxHealth);
Objects.requireNonNull(this.getAttribute(Attributes.ATTACK_DAMAGE)).setBaseValue(attackDamage);
return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData);
SpawnGroupData spawnData = super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData);
this.primeFuse();
return spawnData;
}
@Override
@@ -135,16 +145,6 @@ public class BomberEntity extends Monster implements GeoEntity {
public boolean hurt(DamageSource source, float amount) {
if (source.is(DamageTypeTags.IS_FIRE) || source.is(DamageTypeTags.IS_EXPLOSION)) {
this.primeFuse();
return false;
}
if (this.detonating) {
Entity attacker = source.getDirectEntity();
if (attacker != null) {
Vec3 knockDir = this.position().subtract(attacker.position()).normalize();
this.push(knockDir.x * 0.5, 0.2, knockDir.z * 0.5);
this.hurtMarked = true;
}
return false;
}
Entity directEntity = source.getDirectEntity();
@@ -155,6 +155,11 @@ public class BomberEntity extends Monster implements GeoEntity {
return super.hurt(source, amount);
}
@Override
protected SoundEvent getHurtSound(DamageSource damageSource) {
return AntarchySoundEvents.BOMBER_KNOCK.get();
}
@Override
public InteractionResult mobInteract(Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
@@ -185,7 +190,10 @@ public class BomberEntity extends Monster implements GeoEntity {
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController));
controllers.add(new AnimationController<>(this, "movement_controller", 0, this::movementAnimController)
.setSoundKeyframeHandler(new AutoPlayingSoundKeyframeHandler<>()));
controllers.add(new AnimationController<>(this, "explode_controller", 0, this::explodeAnimController)
.setSoundKeyframeHandler(new AutoPlayingSoundKeyframeHandler<>()));
}
@Override
@@ -198,10 +206,6 @@ public class BomberEntity extends Monster implements GeoEntity {
super.tick();
if (!this.level().isClientSide && this.detonating) {
this.getNavigation().stop();
this.setDeltaMovement(0.0D, 0.0D, 0.0D);
this.hasImpulse = false;
if (this.fuseTicks > 0) {
this.fuseTicks--;
this.entityData.set(FUSE_TICKS_DATA, this.fuseTicks);
@@ -227,12 +231,20 @@ public class BomberEntity extends Monster implements GeoEntity {
&& (this.getFuseTicks() / FLASH_INTERVAL_TICKS) % 2 == 0;
}
private PlayState mainAnimController(AnimationState<BomberEntity> state) {
private PlayState movementAnimController(AnimationState<BomberEntity> state) {
if (this.isDetonating() && this.getFuseTicks() <= EXPLODE_ANIM_START_TICKS) {
return PlayState.STOP;
}
return state.setAndContinue(this.isMovingForAnimation() ? WALK_ANIM : IDLE_ANIM);
}
private PlayState explodeAnimController(AnimationState<BomberEntity> state) {
if (this.isDetonating() && this.getFuseTicks() <= EXPLODE_ANIM_START_TICKS) {
return state.setAndContinue(EXPLODE_ANIM);
}
return state.setAndContinue(state.isMoving() ? WALK_ANIM : IDLE_ANIM);
return PlayState.STOP;
}
private void primeFuse() {
@@ -244,10 +256,7 @@ public class BomberEntity extends Monster implements GeoEntity {
this.fuseTicks = DEFAULT_FUSE_TICKS;
this.entityData.set(DETONATING_DATA, true);
this.entityData.set(FUSE_TICKS_DATA, this.fuseTicks);
this.getNavigation().stop();
this.setDeltaMovement(Vec3.ZERO);
this.hasImpulse = false;
this.playSound(SoundEvents.TNT_PRIMED, 1.0F, 0.9F + this.random.nextFloat() * 0.2F);
this.playSound(AntarchySoundEvents.BOMBER_EXPLODE.get(), 1.0F, 1.0F);
}
private void detonate() {
@@ -260,7 +269,21 @@ public class BomberEntity extends Monster implements GeoEntity {
double y = this.getY(0.0625D);
double z = this.getZ();
float radius = (float) AntarchySettings.bomberExplosionRadius();
serverLevel.explode(this, x, y, z, radius, ExplosionInteraction.TNT);
serverLevel.playSound(null, x, y, z, SoundEvents.GENERIC_EXPLODE.value(), SoundSource.HOSTILE, 0.55F, 1.0F);
serverLevel.explode(
this,
null,
null,
x,
y,
z,
radius,
false,
ExplosionInteraction.TNT,
ParticleTypes.EXPLOSION_EMITTER,
ParticleTypes.EXPLOSION,
BuiltInRegistries.SOUND_EVENT.getHolder(INTENTIONALLY_EMPTY_SOUND_ID).orElseThrow()
);
double extraDamage = AntarchySettings.bomberExplosionDamage();
if (extraDamage > 0.0D) {
@@ -283,6 +306,10 @@ public class BomberEntity extends Monster implements GeoEntity {
this.discard();
}
private boolean isMovingForAnimation() {
return this.getDeltaMovement().horizontalDistanceSqr() > 1.0E-4D || this.getNavigation().isInProgress();
}
private final class BomberAttackGoal extends MeleeAttackGoal {
private BomberAttackGoal() {
super(BomberEntity.this, 1.1D, true);
@@ -290,12 +317,12 @@ public class BomberEntity extends Monster implements GeoEntity {
@Override
public boolean canUse() {
return !BomberEntity.this.detonating && super.canUse();
return super.canUse();
}
@Override
public boolean canContinueToUse() {
return !BomberEntity.this.detonating && super.canContinueToUse();
return super.canContinueToUse();
}
}
}
@@ -1,5 +1,6 @@
package com.craisinlord.antarchy.content.entity.ant;
import com.craisinlord.antarchy.config.AntarchySettings;
import java.util.LinkedHashSet;
import java.util.Set;
import net.minecraft.core.BlockPos;
@@ -16,6 +17,7 @@ import net.minecraft.world.entity.vehicle.DismountHelper;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
@@ -161,17 +163,26 @@ public final class AntTeleportHelper {
@Nullable
private static Vec3 tryFindSafeDismount(ServerPlayer player, ServerLevel destination, BlockPos candidate) {
Vec3 safePos = DismountHelper.findSafeDismountLocation(player.getType(), destination, candidate, true);
if (safePos != null) {
if (safePos != null && isValidArrivalPosition(destination, safePos)) {
return safePos;
}
for (Direction direction : Direction.Plane.HORIZONTAL) {
safePos = DismountHelper.findSafeDismountLocation(player.getType(), destination, candidate.relative(direction), true);
if (safePos != null) {
if (safePos != null && isValidArrivalPosition(destination, safePos)) {
return safePos;
}
}
return null;
}
private static boolean isValidArrivalPosition(ServerLevel destination, Vec3 safePos) {
if (destination.dimension() != AntarchySettings.termiteDestinationDimension()) {
return true;
}
BlockPos standPos = BlockPos.containing(safePos);
return !destination.getBlockState(standPos.below()).is(Blocks.BEDROCK);
}
}
@@ -1,7 +1,10 @@
package com.craisinlord.antarchy.content.fluid;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.AntarchyObjects;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
@@ -11,12 +14,13 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.FlowingFluid;
import net.minecraft.world.phys.Vec3;
public class BileLiquidBlock extends LiquidBlock {
private static final ResourceLocation BILE_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "bile");
private static final ResourceLocation FLOWING_BILE_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "flowing_bile");
private static final int EFFECT_DURATION_TICKS = 100;
private static final Vec3 SLOW_MOVEMENT = new Vec3(0.85D, 0.95D, 0.85D);
public BileLiquidBlock(FlowingFluid fluid, BlockBehaviour.Properties properties) {
super(fluid, properties);
@@ -36,7 +40,10 @@ public class BileLiquidBlock extends LiquidBlock {
return;
}
}
}
entity.makeStuckInBlock(state, SLOW_MOVEMENT);
public static boolean isBile(FluidState fluidState) {
ResourceLocation fluidId = BuiltInRegistries.FLUID.getKey(fluidState.getType());
return BILE_ID.equals(fluidId) || FLOWING_BILE_ID.equals(fluidId);
}
}
@@ -14,7 +14,6 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
@@ -27,8 +26,7 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
private static final int SEARCH_RADIUS = 8;
private static final int SEARCH_ATTEMPTS = 20;
private static final int VERTICAL_SCAN = 10;
// Chance that each exposed vein face oozes bile liquid outward into the cave
private static final float OOZE_CHANCE = 0.22f;
private static final float OOZE_CHANCE = 0.02f;
public CavarynBileCystFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
@@ -38,7 +36,7 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
Block bileVeinBlock = getBlock(BILE_VEIN_ID);
Block bileBlock = getBlock(BILE_ID);
if (bileVeinBlock == null || !(bileBlock instanceof LiquidBlock)) {
if (bileVeinBlock == null || bileBlock == null) {
return false;
}
@@ -53,8 +51,6 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
return placeCyst(level, center, bileVeinBlock, bileBlock, random);
}
// Find a solid block adjacent to cave air, then step 1-2 blocks deeper into the wall
// so the cyst is embedded rather than sitting right on the surface.
private static BlockPos findCenter(WorldGenLevel level, BlockPos origin, RandomSource random) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
@@ -68,7 +64,6 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
continue;
}
// Need at least one open neighbor (at cave surface)
Direction openDir = null;
for (Direction dir : Direction.values()) {
if (level.getBlockState(mutable.relative(dir)).canBeReplaced()) {
@@ -80,7 +75,6 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
continue;
}
// Step 1-2 blocks away from the opening so the cyst sits inside the wall
int depth = 1 + random.nextInt(2);
BlockPos candidate = mutable.immutable().relative(openDir.getOpposite(), depth);
if (isSolid(level.getBlockState(candidate))) {
@@ -91,25 +85,22 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
}
private boolean placeCyst(WorldGenLevel level, BlockPos center, Block veinBlock, Block bileBlock, RandomSource random) {
// Per-axis radii: 1.5–13.5 so the cyst diameter ranges roughly 3–27
double rx = 1.5 + random.nextDouble() * 12.0;
double ry = 1.5 + random.nextDouble() * 12.0;
double rz = 1.5 + random.nextDouble() * 12.0;
// Random stretch: pick one axis and scale it up 1.3–2x for elongated cysts
int stretchAxis = random.nextInt(3);
if (stretchAxis == 0) rx *= 1.3 + random.nextDouble() * 0.7;
else if (stretchAxis == 1) ry *= 1.3 + random.nextDouble() * 0.7;
else rz *= 1.3 + random.nextDouble() * 0.7;
// Independent sine frequencies per wobble term — drives the lumpy distortion
double f1x = 0.6 + random.nextDouble() * 1.2;
double f1z = 0.6 + random.nextDouble() * 1.2;
double f2y = 0.7 + random.nextDouble() * 1.0;
double f2x = 0.5 + random.nextDouble() * 0.9;
double f3z = 0.8 + random.nextDouble() * 1.1;
double f3y = 0.5 + random.nextDouble() * 0.8;
double wobbleAmp = 0.15 + random.nextDouble() * 0.2; // surface roughness
double wobbleAmp = 0.15 + random.nextDouble() * 0.2;
int maxR = (int) Math.ceil(Math.max(Math.max(rx, ry), rz)) + 2;
List<BlockPos> placed = new ArrayList<>();
@@ -122,7 +113,6 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
(dy * dy) / (ry * ry) +
(dz * dz) / (rz * rz));
// Multi-frequency sine interference — gives lumpy, non-spherical surface
double wobble = wobbleAmp * (
0.4 * Math.sin(dx * f1x + dz * f1z) +
0.35 * Math.cos(dy * f2y + dx * f2x) +
@@ -140,12 +130,8 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
}
if (distorted < 0.7) {
// Interior — fill with bile liquid
BlockState bileState = bileBlock.defaultBlockState();
level.setBlock(pos, bileState, 2);
scheduleFluidTick(level, pos, bileState);
level.setBlock(pos, Blocks.AIR.defaultBlockState(), 2);
} else {
// Outer shell — bile vein blocks
level.setBlock(pos, veinBlock.defaultBlockState(), 2);
placed.add(pos.immutable());
}
@@ -157,12 +143,10 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
return false;
}
// 30% chance this cyst oozes at all
if (random.nextFloat() >= 0.30f) {
return true;
}
// Ooze bile out of exposed faces — "popped pimple" seep
for (BlockPos cystPos : placed) {
for (Direction dir : Direction.values()) {
BlockPos adj = cystPos.relative(dir);
@@ -28,7 +28,7 @@ public final class CavarynBileVeinFeature extends Feature<NoneFeatureConfigurati
private static final int SEARCH_ATTEMPTS = 24;
private static final int VERTICAL_SCAN = 12;
private static final float BRANCH_CHANCE = 0.12f;
private static final float LIQUID_POCKET_CHANCE = 0.04f;
private static final float LIQUID_POCKET_CHANCE = 0.008f;
public CavarynBileVeinFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
@@ -53,7 +53,6 @@ public final class CavarynBileVeinFeature extends Feature<NoneFeatureConfigurati
return growVeinNetwork(level, start, bileVeinBlock, bileBlock, random);
}
// Find a solid block that sits at a cave boundary
private static BlockPos findStart(WorldGenLevel level, BlockPos origin, RandomSource random) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
@@ -116,7 +115,6 @@ public final class CavarynBileVeinFeature extends Feature<NoneFeatureConfigurati
BlockState state = level.getBlockState(current);
if (!isVeinCandidate(state)) {
// Try to redirect
BlockPos redirect = findSolidNeighbor(current, dir, visited, level, random);
if (redirect == null) {
break;
@@ -190,7 +188,7 @@ public final class CavarynBileVeinFeature extends Feature<NoneFeatureConfigurati
if (!isVeinCandidate(candidateState)) {
continue;
}
if (isEnclosed(level, candidate) || random.nextFloat() < 0.05f) {
if (isEnclosed(level, candidate) || random.nextFloat() < 0.01f) {
BlockState bileState = bileBlock.defaultBlockState();
level.setBlock(candidate, bileState, 2);
scheduleFluidTick(level, candidate, bileState);
@@ -136,7 +136,6 @@ public final class CavarynEggPatchFeature extends Feature<NoneFeatureConfigurati
continue;
}
// Replace the floor block with amber moss so eggs hatch faster
if (amberMossBlock != null) {
BlockPos floorPos = eggPos.below();
BlockState floorState = level.getBlockState(floorPos);
@@ -20,7 +20,6 @@ import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConf
public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfiguration> {
private static final ResourceLocation AMBER_LICHEN_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "amber_lichen");
private static final ResourceLocation GLOW_LICHEN_ID = ResourceLocation.withDefaultNamespace("glow_lichen");
private static final int SEARCH_RADIUS = 8;
private static final int SEARCH_ATTEMPTS = 28;
private static final int VERTICAL_SCAN = 10;
@@ -34,8 +33,7 @@ public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfig
WorldGenLevel level = context.level();
RandomSource random = context.random();
Block amberLichenBlock = getBlock(AMBER_LICHEN_ID);
Block glowLichenBlock = getBlock(GLOW_LICHEN_ID);
if (amberLichenBlock == null || glowLichenBlock == null) {
if (amberLichenBlock == null) {
return false;
}
@@ -49,7 +47,7 @@ public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfig
return false;
}
placeLichenFringe(level, placedPatch, anchor.supportDirection(), amberLichenBlock, glowLichenBlock, random);
placeLichenFringe(level, placedPatch, anchor.supportDirection(), amberLichenBlock, random);
return true;
}
@@ -115,7 +113,6 @@ public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfig
List<BlockPos> patchPositions,
Direction supportDirection,
Block amberLichenBlock,
Block glowLichenBlock,
RandomSource random
) {
for (BlockPos patchPos : patchPositions) {
@@ -132,7 +129,7 @@ public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfig
continue;
}
BlockState state = createLichenState(random.nextFloat() < 0.65F ? amberLichenBlock : glowLichenBlock, supportDirection);
BlockState state = createLichenState(amberLichenBlock, supportDirection);
if (!state.canSurvive(level, targetPos)) {
continue;
}
@@ -61,7 +61,6 @@ public class CoralSpikeFeature extends Feature<NoneFeatureConfiguration> {
int baseRadius = 2 + random.nextInt(2); // 2–3 wide at base
int totalHeight = 20 + random.nextInt(15); // 20–34 blocks tall
// Curve: lean toward a random horizontal direction, accelerating toward the tip
double curveAngle = random.nextDouble() * Math.PI * 2;
double curveDX = Math.cos(curveAngle);
double curveDZ = Math.sin(curveAngle);
@@ -96,7 +95,6 @@ public class CoralSpikeFeature extends Feature<NoneFeatureConfiguration> {
level.setBlock(pos, coral.block().defaultBlockState(), 2);
placed = true;
// Coral plants growing off the top of outer-surface blocks
if (dist >= radius - 0.6 && radius > 0) {
BlockPos above = pos.above();
if (canReplace(level.getBlockState(above))) {
@@ -110,7 +108,6 @@ public class CoralSpikeFeature extends Feature<NoneFeatureConfiguration> {
}
}
// Wall fans on the outer surface
if (dist >= radius - 0.5) {
for (Direction dir : Direction.Plane.HORIZONTAL) {
if (random.nextFloat() >= 0.4f) continue;
@@ -102,7 +102,7 @@ public class ElythiaBiomeSource extends BiomeSource {
// At continentalness < -0.80 the terrain is reliably below sea level.
// Transition-zone columns (-0.80 to -0.85) are treated as land to avoid
// ocean biome appearing over above-sea-level terrain.
private static final long OCEAN_CONTINENTALNESS_THRESHOLD = Climate.quantizeCoord(-0.80f);
private static final long OCEAN_CONTINENTALNESS_THRESHOLD = Climate.quantizeCoord(-0.87f);
@Override
public Holder<Biome> getNoiseBiome(int x, int y, int z, Climate.Sampler sampler) {
@@ -116,17 +116,21 @@ public class ElythiaBiomeSource extends BiomeSource {
// Use continentalness (XZ-only noise) to classify the column.
// Ocean columns get the ocean biome at every Y so structures, particles,
// and ambient effects work correctly above the water surface.
// Cave biomes are always preserved even in ocean columns.
Climate.TargetPoint target = sampler.sample(x, this.seaLevelQuartY, z);
if (target.continentalness() < OCEAN_CONTINENTALNESS_THRESHOLD) {
if (biome.is(MOLEWORM_CAVES) || biome.is(ELYTHIA_LUSH_CAVES)) return biome;
Holder<Biome> seaLevelBiome = this.delegate.getNoiseBiome(x, this.seaLevelQuartY, z, sampler);
// MultiNoise can return a land biome at sea-level depth — force ocean if so
if (isOceanBiome(seaLevelBiome)) return seaLevelBiome;
return oceanHolder != null ? oceanHolder : seaLevelBiome;
}
// Land column at or below sea level: force ocean for any biome not allowed there.
// +1 quart above seaLevelQuartY so blocks 76-83 (around the waterline) are all caught.
if (y <= this.seaLevelQuartY + 1 && oceanHolder != null && !allowedBelowSeaLevel(biome)) {
// Land column in the shallow-underwater zone: force ocean for surface biomes that
// ended up below sea level (e.g. meadow in a depression). Only applies within
// 6 quarts (~24 blocks) of sea level — deep underground is unaffected.
if (y >= this.seaLevelQuartY - 6 && y <= this.seaLevelQuartY
&& oceanHolder != null && !allowedBelowSeaLevel(biome)) {
return oceanHolder;
}
@@ -66,7 +66,6 @@ public class FallenOuranwoodFeature extends Feature<NoneFeatureConfiguration> {
float dmg = damage[step];
// Full gap sections — log has completely rotted through here
if (dmg > 0.78f) continue;
int surfaceY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, bx, bz);
@@ -79,14 +78,11 @@ public class FallenOuranwoodFeature extends Feature<NoneFeatureConfiguration> {
boolean isShell = dist >= outerRadius - 0.5;
// Hollow interior: always skip center when hollow
if (hollow && dist < outerRadius - 0.5) continue;
// Heavy-damage sections: only keep fragments of the shell
if (dmg > 0.55f && !isShell) continue;
if (dmg > 0.55f && random.nextFloat() < (dmg - 0.55f) * 3.5f) continue;
// All sections: random rot holes punched through the shell
if (isShell && random.nextFloat() < dmg * 0.4f) continue;
int px = axis == Direction.Axis.X ? bx : bx + dp;
@@ -95,13 +91,12 @@ public class FallenOuranwoodFeature extends Feature<NoneFeatureConfiguration> {
if (!canReplace(level.getBlockState(pos))) continue;
// Block material mix: mostly mossy log, some fresh log patches, some moss
float r = random.nextFloat();
BlockState toPlace;
if (r < 0.08f) {
toPlace = Blocks.MOSS_BLOCK.defaultBlockState();
} else if (r < 0.22f) {
toPlace = freshLogState; // fresher wood, less decayed patch
toPlace = freshLogState;
} else if (r < 0.32f) {
toPlace = woodState;
} else {
@@ -114,7 +109,6 @@ public class FallenOuranwoodFeature extends Feature<NoneFeatureConfiguration> {
}
}
// Moss patches scattered along the log's footprint
int mossCount = 20 + random.nextInt(25);
for (int i = 0; i < mossCount; i++) {
int mx = origin.getX() + random.nextInt(length + 6) - 3;
@@ -30,24 +30,17 @@ public class FungalMushroomFeature extends Feature<NoneFeatureConfiguration> {
Block capBlock = isRed ? Blocks.RED_MUSHROOM_BLOCK : Blocks.BROWN_MUSHROOM_BLOCK;
Block smallMushroom = isRed ? Blocks.RED_MUSHROOM : Blocks.BROWN_MUSHROOM;
// 1-in-3 chance of a large mushroom (~3x the small variant)
boolean isLarge = random.nextInt(3) == 0;
int stemSize = random.nextBoolean() ? 2 : 3;
int stemHeight = 6 + random.nextInt(7);
int stemSize = isLarge ? (2 + random.nextInt(3)) : (random.nextBoolean() ? 2 : 3);
int stemHeight = isLarge ? (18 + random.nextInt(19)) : (6 + random.nextInt(7)); // large: 18–36, small: 6–12
// Lean: stem drifts in a random horizontal direction over its height
double leanAngle = random.nextDouble() * Math.PI * 2;
double leanDX = Math.cos(leanAngle);
double leanDZ = Math.sin(leanAngle);
double maxLean = isLarge
? (6.0 + random.nextDouble() * 10.0) // large: 6–16 block lean
: (2.0 + random.nextDouble() * 3.5); // small: 2–5.5 block lean
double maxLean = 2.0 + random.nextDouble() * 3.5;
int baseY = origin.getY();
int stemOffset = stemSize == 2 ? 0 : -1; // center 3x3 on origin
// Pore-only stem state (inner faces; sides visible from outside)
BlockState stemPore = Blocks.MUSHROOM_STEM.defaultBlockState()
.setValue(HugeMushroomBlock.NORTH, false)
.setValue(HugeMushroomBlock.SOUTH, false)
@@ -63,7 +56,6 @@ public class FungalMushroomFeature extends Feature<NoneFeatureConfiguration> {
.setValue(HugeMushroomBlock.UP, false)
.setValue(HugeMushroomBlock.DOWN, false);
// Place leaning stem
for (int dy = 0; dy < stemHeight; dy++) {
double leanProgress = (double) dy / stemHeight;
int leanX = (int) Math.round(leanDX * maxLean * leanProgress);
@@ -71,34 +63,32 @@ public class FungalMushroomFeature extends Feature<NoneFeatureConfiguration> {
for (int dx = 0; dx < stemSize; dx++) {
for (int dz = 0; dz < stemSize; dz++) {
BlockPos pos = new BlockPos(
origin.getX() + stemOffset + dx + leanX,
baseY + dy,
origin.getZ() + stemOffset + dz + leanZ);
if (canReplace(level.getBlockState(pos))) {
// Outer ring shows bark, interior is pores
boolean isEdge = (dx == 0 || dx == stemSize - 1 || dz == 0 || dz == stemSize - 1);
level.setBlock(pos, isEdge ? stemSide : stemPore, 2);
int wx = origin.getX() + stemOffset + dx + leanX;
int wz = origin.getZ() + stemOffset + dz + leanZ;
BlockPos pos = new BlockPos(wx, baseY + dy, wz);
if (!canReplace(level.getBlockState(pos))) continue;
boolean isEdge = (dx == 0 || dx == stemSize - 1 || dz == 0 || dz == stemSize - 1);
BlockState stemState = isEdge ? stemSide : stemPore;
level.setBlock(pos, stemState, 2);
BlockPos below = pos.below();
while (canReplace(level.getBlockState(below)) && below.getY() > level.getMinBuildHeight()) {
level.setBlock(below, stemState, 2);
below = below.below();
}
}
}
}
// Cap: cone-shaped, follows the lean, with irregular per-block radius noise
double capCenterX = origin.getX() + (stemSize == 2 ? 0.5 : 0) + leanDX * maxLean;
double capCenterZ = origin.getZ() + (stemSize == 2 ? 0.5 : 0) + leanDZ * maxLean;
int capTopY = baseY + stemHeight;
int baseCapRadius = isLarge
? (stemSize + 7 + random.nextInt(6)) // large: ~11–18 at base
: (stemSize + 2 + random.nextInt(2)); // small: 4–6 at base
int baseCapRadius = stemSize + 2 + random.nextInt(2);
// Per-position radius jitter table — sampled before the loop for consistency
// Each (dx, dz) slot gets a random ±1.5 bias baked in
int jitterRange = baseCapRadius + 4;
float[][] jitter = new float[jitterRange * 2 + 1][jitterRange * 2 + 1];
for (float[] row : jitter) {
for (int j = 0; j < row.length; j++) {
row[j] = random.nextFloat() * 3.0f - 1.5f; // ±1.5 blocks
row[j] = random.nextFloat() * 1.0f - 0.5f;
}
}
@@ -143,10 +133,9 @@ public class FungalMushroomFeature extends Feature<NoneFeatureConfiguration> {
}
}
// Mycelium patches around base
int myceliumCount = isLarge ? (25 + random.nextInt(25)) : (12 + random.nextInt(12));
int myceliumCount = 12 + random.nextInt(12);
for (int i = 0; i < myceliumCount; i++) {
int radius = isLarge ? (stemSize + 8 + random.nextInt(8)) : (stemSize + 3 + random.nextInt(3));
int radius = stemSize + 3 + random.nextInt(3);
int mx = origin.getX() + random.nextInt(radius * 2 + 1) - radius;
int mz = origin.getZ() + random.nextInt(radius * 2 + 1) - radius;
int my = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, mx, mz) - 1;
@@ -159,10 +148,9 @@ public class FungalMushroomFeature extends Feature<NoneFeatureConfiguration> {
}
}
// Small mushrooms scattered around
int smallCount = isLarge ? (10 + random.nextInt(15)) : (5 + random.nextInt(8));
int smallCount = 5 + random.nextInt(8);
for (int i = 0; i < smallCount; i++) {
int radius = isLarge ? (stemSize + 10 + random.nextInt(10)) : (stemSize + 4 + random.nextInt(4));
int radius = stemSize + 4 + random.nextInt(4);
int sx = origin.getX() + random.nextInt(radius * 2 + 1) - radius;
int sz = origin.getZ() + random.nextInt(radius * 2 + 1) - radius;
int sy = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, sx, sz);
@@ -26,19 +26,16 @@ public class OuranwoodCocoonTreeFeature extends OuranwoodTreeFeature {
private void spawnGuaranteedCocoon(WorldGenLevel level, BlockPos origin, OuranwoodTreeConfiguration config, RandomSource random) {
if (!(level.getLevel() instanceof ServerLevel serverLevel)) return;
// Pick a branch direction and a Y somewhere in the lower-mid trunk
Direction dir = Direction.Plane.HORIZONTAL.getRandomDirection(random);
int branchY = 10 + random.nextInt(8);
int branchLength = 4 + random.nextInt(3); // 4–6 logs out from the trunk
// Place the branch logs, then re-assert the anchor tip so it's always a log
for (int i = 1; i <= branchLength; i++) {
BlockPos p = origin.above(branchY).relative(dir, i);
setBlock(level, p, config.trunkProvider().getState(random, p));
}
BlockPos anchor = origin.above(branchY).relative(dir, branchLength);
// Clear everything below the anchor and spawn the cocooned brutalfly
BrutalflyCocoonFeature.clearCocoonVolume(level, anchor);
BrutalflyEntity brutalfly = AntarchyObjects.BRUTALFLY.get().create(serverLevel);
if (brutalfly == null) return;
@@ -553,8 +553,6 @@ public class OuranwoodTreeFeature extends Feature<OuranwoodTreeConfiguration> {
return;
}
// Place the marker block at the first floor position; it will spawn squirrels and
// convert itself to COARSE_DIRT shortly after the chunk loads.
// The tick is scheduled here on the WorldGenLevel because onPlace() is never
// called during world generation, so the block cannot self-schedule.
int squirrelCount = 1 + random.nextInt(3);
@@ -824,7 +822,6 @@ public class OuranwoodTreeFeature extends Feature<OuranwoodTreeConfiguration> {
}
}
// Set correct surface type on top soil block (from refreshTerrainSurface)
BlockPos topSoilPos = null;
for (int y = maxY; y >= minY; y--) {
BlockPos pos = new BlockPos(worldX, y, worldZ);
@@ -13,9 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List;
@Mixin(SplashManager.class)
/*
* Adds Antarchy splash text without replacing vanilla handling.
*/
public abstract class SplashManagerMixin {
@Shadow
@Final
@@ -35,5 +32,6 @@ public abstract class SplashManagerMixin {
this.splashes.add("Rainbow sugar yummy");
this.splashes.add("Now with inverted gravity!");
this.splashes.add("Everything we need is already here");
this.splashes.add("Rub some bacon on it!");
}
}
@@ -1,7 +1,6 @@
{
"required": true,
"package": "com.craisinlord.antarchy.mixins",
"refmap": "antarchy.refmap.json",
"plugin": "com.craisinlord.antarchy.mixins.AntarchyMixinPlugin",
"compatibilityLevel": "JAVA_21",
"mixins": [
@@ -64,6 +64,11 @@
"walk": {
"loop": true,
"animation_length": 0.5,
"sound_effects": {
"0.0": {
"effect": "antarchy:bomber_walk|0.9|1.0"
}
},
"bones": {
"root": {
"rotation": {
@@ -313,4 +318,4 @@
}
}
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/broodstone"
}
}
}
@@ -35,6 +35,7 @@
"block.antarchy.infested_coarse_dirt": "Infested Coarse Dirt",
"block.antarchy.nyxite": "Nyxite",
"block.antarchy.myrmite": "Myrmite",
"block.antarchy.broodstone": "Broodstone",
"block.antarchy.polished_nyxite": "Polished Nyxite",
"block.antarchy.chiseled_nyxite": "Chiseled Nyxite",
"block.antarchy.nyxite_bricks": "Nyxite Bricks",
@@ -279,6 +280,7 @@
"item.antarchy.chiten_block": "Chiten Block",
"item.antarchy.chiten_spike": "Chiten Spike",
"item.antarchy.myrmite": "Myrmite",
"item.antarchy.broodstone": "Broodstone",
"item.antarchy.torchflower_bush": "Torchflower Bush",
"block.antarchy.torchflower_bush": "Torchflower Bush",
"item.antarchy.mud_pie": "Mud Pie",
@@ -647,6 +649,9 @@
"subtitles.antarchy.basilisk_hiss": "Basilisk hisses",
"subtitles.antarchy.basilisk_hurt": "Basilisk hurts",
"subtitles.antarchy.basilisk_death": "Basilisk dies",
"subtitles.antarchy.bomber_walk": "Bomber walks",
"subtitles.antarchy.bomber_knock": "Bomber gets hit",
"subtitles.antarchy.bomber_explode": "Bomber fuse hisses",
"item.minecraft.potion.effect.inversion": "Potion of Inversion",
"item.minecraft.potion.effect.long_inversion": "Potion of Inversion",
"item.minecraft.splash_potion.effect.inversion": "Splash Potion of Inversion",
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "antarchy:block/broodstone/broodstone"
}
}
@@ -0,0 +1,3 @@
{
"parent": "antarchy:block/broodstone"
}
@@ -418,6 +418,54 @@
}
]
},
"bomber_walk": {
"subtitle": "subtitles.antarchy.bomber_walk",
"sounds": [
{
"name": "antarchy:mob/bomber/walk1"
},
{
"name": "antarchy:mob/bomber/walk2"
},
{
"name": "antarchy:mob/bomber/walk3"
},
{
"name": "antarchy:mob/bomber/walk4"
}
]
},
"bomber_knock": {
"subtitle": "subtitles.antarchy.bomber_knock",
"sounds": [
{
"name": "antarchy:mob/bomber/knock1"
},
{
"name": "antarchy:mob/bomber/knock2"
},
{
"name": "antarchy:mob/bomber/knock3"
},
{
"name": "antarchy:mob/bomber/knock4"
},
{
"name": "antarchy:mob/bomber/knock5"
}
]
},
"bomber_explode": {
"subtitle": "subtitles.antarchy.bomber_explode",
"sounds": [
{
"name": "antarchy:mob/bomber/explode1"
},
{
"name": "antarchy:mob/bomber/explode2"
}
]
},
"thoraxis_nightmare_wastes_ambient": {
"subtitle": "subtitles.antarchy.thoraxis_nightmare_wastes_ambient",
"sounds": [
Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

@@ -4,8 +4,33 @@
"type": "minecraft:noise",
"settings": "antarchy:cavaryn",
"biome_source": {
"type": "minecraft:fixed",
"biome": "antarchy:cavaryn"
"type": "minecraft:multi_noise",
"biomes": [
{
"parameters": {
"temperature": [-1.0, 1.0],
"humidity": [-1.0, 1.0],
"continentalness": [-1.0, 1.0],
"erosion": [-1.0, 1.0],
"weirdness": [-1.0, 1.0],
"depth": [-2.0, 0.7],
"offset": 0.0
},
"biome": "antarchy:cavaryn"
},
{
"parameters": {
"temperature": [-1.0, 1.0],
"humidity": [-1.0, 1.0],
"continentalness": [-1.0, 1.0],
"erosion": [-1.0, 1.0],
"weirdness": [-1.0, 1.0],
"depth": [0.7, 2.0],
"offset": 0.0
},
"biome": "antarchy:brooding_tunnels"
}
]
}
}
}
@@ -7,7 +7,8 @@
"type": "antarchy:elythia_biome_source",
"moleworm_caves_max_y": 30,
"surface_biome_sample_y": 160,
"ocean_max_y": 75,
"ocean_max_y": 67,
"sea_level": 70,
"biomes": [
{
"biome": "antarchy:moleworm_caves",
@@ -9,7 +9,7 @@
"logical_height": 192,
"infiniburn": "#minecraft:infiniburn_overworld",
"effects": "minecraft:overworld",
"ambient_light": 0.0,
"ambient_light": 0.01,
"piglin_safe": false,
"has_raids": false,
"monster_spawn_light_level": 0,
@@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
],
"entries": [
{
"type": "minecraft:item",
"name": "antarchy:broodstone"
}
],
"rolls": 1.0
}
],
"random_sequence": "antarchy:blocks/broodstone"
}
@@ -2,6 +2,7 @@
"values": [
"#minecraft:moss_replaceable",
"antarchy:myrmite",
"antarchy:broodstone",
"antarchy:amber_moss_block"
]
}
@@ -0,0 +1,6 @@
{
"values": [
"antarchy:cavaryn",
"antarchy:brooding_tunnels"
]
}
@@ -0,0 +1,79 @@
{
"has_precipitation": false,
"temperature": 0.45,
"downfall": 0.0,
"effects": {
"fog_color": 655360,
"water_color": 327680,
"water_fog_color": 0,
"sky_color": 262144,
"grass_color": 2763554,
"foliage_color": 2763554,
"mood_sound": {
"sound": "minecraft:ambient.cave",
"tick_delay": 1200000,
"block_search_extent": 8,
"offset": 2.0
},
"particle": {
"probability": 0.003,
"options": {
"type": "antarchy:orange_ash"
}
}
},
"spawn_costs": {},
"carvers": {
"air": [],
"liquid": []
},
"features": [
[],
[],
[],
[],
[],
[],
[],
[],
[
"antarchy:cavaryn_bile_veins",
"antarchy:brooding_tunnels_creepvine",
"antarchy:cavaryn_terror_egg_patch"
],
[
"antarchy:cavaryn_bile_cysts"
]
],
"creature_spawn_probability": 0.06,
"spawners": {
"monster": [
{
"type": "antarchy:creeping_horror",
"weight": 95,
"minCount": 2,
"maxCount": 5
},
{
"type": "antarchy:lurking_terror",
"weight": 95,
"minCount": 2,
"maxCount": 5
}
],
"creature": [
{
"type": "antarchy:stink_bug",
"weight": 10,
"minCount": 1,
"maxCount": 3
}
],
"ambient": [],
"axolotls": [],
"underground_water_creature": [],
"water_creature": [],
"water_ambient": [],
"misc": []
}
}
@@ -38,13 +38,14 @@
[],
[
"antarchy:cavaryn_bile_veins",
"antarchy:cavaryn_bile_cysts",
"antarchy:cavaryn_wall_amber_moss",
"antarchy:cavaryn_creepvine",
"antarchy:cavaryn_chiten_spikes",
"antarchy:cavaryn_terror_egg_patch"
"antarchy:cavaryn_terror_egg_patch",
"antarchy:cavaryn_creepvine"
],
[]
[
"antarchy:cavaryn_bile_cysts"
]
],
"creature_spawn_probability": 0.06,
"spawners": {
@@ -57,7 +57,7 @@
],
[]
],
"creature_spawn_probability": 0.04,
"creature_spawn_probability": 0.15,
"spawners": {
"monster": [
{ "type": "antarchy:missile_squid", "weight": 12, "minCount": 1, "maxCount": 3 },
@@ -6,8 +6,8 @@
"type": "minecraft:y_clamped_gradient",
"from_y": -64,
"to_y": 220,
"from_value": 2.1,
"to_value": -1.78
"from_value": 1.75,
"to_value": -2.05
},
"argument2": {
"type": "minecraft:add",
@@ -169,6 +169,19 @@
}
}
},
{
"type": "minecraft:condition",
"if_true": {
"type": "minecraft:biome",
"biome_is": ["antarchy:brooding_tunnels"]
},
"then_run": {
"type": "minecraft:block",
"result_state": {
"Name": "antarchy:broodstone"
}
}
},
{
"type": "minecraft:condition",
"if_true": {
@@ -1,5 +1,5 @@
{
"sea_level": 78,
"sea_level": 70,
"disable_mob_generation": false,
"aquifers_enabled": true,
"ore_veins_enabled": false,
@@ -0,0 +1,27 @@
{
"feature": "antarchy:cavaryn_creepvine",
"placement": [
{
"type": "minecraft:count",
"count": 22
},
{
"type": "minecraft:in_square"
},
{
"type": "minecraft:height_range",
"height": {
"type": "minecraft:uniform",
"min_inclusive": {
"above_bottom": 12
},
"max_inclusive": {
"below_top": 12
}
}
},
{
"type": "minecraft:biome"
}
]
}
@@ -3,7 +3,7 @@
"placement": [
{
"type": "minecraft:count",
"count": 3
"count": 1
},
{
"type": "minecraft:in_square"
@@ -3,7 +3,7 @@
"placement": [
{
"type": "minecraft:count",
"count": 5
"count": 2
},
{
"type": "minecraft:in_square"
@@ -0,0 +1,5 @@
{
"values": [
"antarchy:broodstone"
]
}
@@ -37,6 +37,7 @@
"antarchy:nyxite_brick_slab",
"antarchy:nyxite_brick_wall",
"antarchy:myrmite",
"antarchy:broodstone",
"antarchy:bile_vein",
"antarchy:chiten_block",
"antarchy:chiten_spike",