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
+473 -172

No files matched your search

@@ -31,7 +31,7 @@ public final class AntarchySettings {
private static double waspHealth = 16.0D; private static double waspHealth = 16.0D;
private static double waspAttackDamage = 4.0D; private static double waspAttackDamage = 4.0D;
private static double waspMovementSpeed = 0.39D; 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 bomberAttackDamage = 4.0D;
private static double bomberExplosionDamage = 8.0D; private static double bomberExplosionDamage = 8.0D;
private static double bomberExplosionRadius = 4.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_HURT = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> MOLEVORE_ATTACK = (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> 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; public static Supplier<SoundEvent> DUCT_TAPE_USE = (Supplier<SoundEvent>) UNBOUND;
private AntarchySoundEvents() { private AntarchySoundEvents() {
@@ -235,6 +238,9 @@ public final class AntarchySoundEvents {
Supplier<SoundEvent> molevoreHurt, Supplier<SoundEvent> molevoreHurt,
Supplier<SoundEvent> molevoreAttack, Supplier<SoundEvent> molevoreAttack,
Supplier<SoundEvent> molevoreDig, Supplier<SoundEvent> molevoreDig,
Supplier<SoundEvent> bomberWalk,
Supplier<SoundEvent> bomberKnock,
Supplier<SoundEvent> bomberExplode,
Supplier<SoundEvent> ductTapeUse Supplier<SoundEvent> ductTapeUse
) { ) {
SQUIDZOOKA_FIRE = squidzookaFire; SQUIDZOOKA_FIRE = squidzookaFire;
@@ -347,6 +353,9 @@ public final class AntarchySoundEvents {
MOLEVORE_HURT = molevoreHurt; MOLEVORE_HURT = molevoreHurt;
MOLEVORE_ATTACK = molevoreAttack; MOLEVORE_ATTACK = molevoreAttack;
MOLEVORE_DIG = molevoreDig; MOLEVORE_DIG = molevoreDig;
BOMBER_WALK = bomberWalk;
BOMBER_KNOCK = bomberKnock;
BOMBER_EXPLODE = bomberExplode;
DUCT_TAPE_USE = ductTapeUse; DUCT_TAPE_USE = ductTapeUse;
} }
} }
@@ -24,7 +24,6 @@ public class UpwardFallingBlockRenderer extends EntityRenderer<UpwardFallingBloc
if (blockState.isAir()) return; if (blockState.isAir()) return;
poseStack.pushPose(); poseStack.pushPose();
// Center the block model on the entity origin
poseStack.translate(-0.5, 0.0, -0.5); poseStack.translate(-0.5, 0.0, -0.5);
Minecraft.getInstance().getBlockRenderer().renderSingleBlock( Minecraft.getInstance().getBlockRenderer().renderSingleBlock(
blockState, poseStack, bufferSource, light, OverlayTexture.NO_OVERLAY blockState, poseStack, bufferSource, light, OverlayTexture.NO_OVERLAY
@@ -1,14 +1,20 @@
package com.craisinlord.antarchy.content.entity; package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchySoundEvents;
import java.util.Objects; import java.util.Objects;
import net.minecraft.core.BlockPos; 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.tags.DamageTypeTags;
import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.Difficulty; import net.minecraft.world.Difficulty;
import net.minecraft.world.DifficultyInstance; 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.AnimationState;
import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.animation.PlayState;
import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.animation.RawAnimation;
import software.bernie.geckolib.animation.keyframe.event.builtin.AutoPlayingSoundKeyframeHandler;
import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.util.GeckoLibUtil;
public class BomberEntity extends Monster implements GeoEntity { 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 = private static final EntityDataAccessor<Integer> FUSE_TICKS_DATA =
SynchedEntityData.defineId(BomberEntity.class, EntityDataSerializers.INT); SynchedEntityData.defineId(BomberEntity.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Boolean> DETONATING_DATA = private static final EntityDataAccessor<Boolean> DETONATING_DATA =
SynchedEntityData.defineId(BomberEntity.class, EntityDataSerializers.BOOLEAN); 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 EXPLODE_ANIM_START_TICKS = 25;
private static final int FLASH_INTERVAL_TICKS = 5; 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); Objects.requireNonNull(this.getAttribute(Attributes.MAX_HEALTH)).setBaseValue(maxHealth);
this.setHealth((float) maxHealth); this.setHealth((float) maxHealth);
Objects.requireNonNull(this.getAttribute(Attributes.ATTACK_DAMAGE)).setBaseValue(attackDamage); 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 @Override
@@ -135,16 +145,6 @@ public class BomberEntity extends Monster implements GeoEntity {
public boolean hurt(DamageSource source, float amount) { public boolean hurt(DamageSource source, float amount) {
if (source.is(DamageTypeTags.IS_FIRE) || source.is(DamageTypeTags.IS_EXPLOSION)) { if (source.is(DamageTypeTags.IS_FIRE) || source.is(DamageTypeTags.IS_EXPLOSION)) {
this.primeFuse(); 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(); Entity directEntity = source.getDirectEntity();
@@ -155,6 +155,11 @@ public class BomberEntity extends Monster implements GeoEntity {
return super.hurt(source, amount); return super.hurt(source, amount);
} }
@Override
protected SoundEvent getHurtSound(DamageSource damageSource) {
return AntarchySoundEvents.BOMBER_KNOCK.get();
}
@Override @Override
public InteractionResult mobInteract(Player player, InteractionHand hand) { public InteractionResult mobInteract(Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand); ItemStack stack = player.getItemInHand(hand);
@@ -185,7 +190,10 @@ public class BomberEntity extends Monster implements GeoEntity {
@Override @Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { 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 @Override
@@ -198,10 +206,6 @@ public class BomberEntity extends Monster implements GeoEntity {
super.tick(); super.tick();
if (!this.level().isClientSide && this.detonating) { if (!this.level().isClientSide && this.detonating) {
this.getNavigation().stop();
this.setDeltaMovement(0.0D, 0.0D, 0.0D);
this.hasImpulse = false;
if (this.fuseTicks > 0) { if (this.fuseTicks > 0) {
this.fuseTicks--; this.fuseTicks--;
this.entityData.set(FUSE_TICKS_DATA, 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; && (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) { if (this.isDetonating() && this.getFuseTicks() <= EXPLODE_ANIM_START_TICKS) {
return state.setAndContinue(EXPLODE_ANIM); return state.setAndContinue(EXPLODE_ANIM);
} }
return state.setAndContinue(state.isMoving() ? WALK_ANIM : IDLE_ANIM); return PlayState.STOP;
} }
private void primeFuse() { private void primeFuse() {
@@ -244,10 +256,7 @@ public class BomberEntity extends Monster implements GeoEntity {
this.fuseTicks = DEFAULT_FUSE_TICKS; this.fuseTicks = DEFAULT_FUSE_TICKS;
this.entityData.set(DETONATING_DATA, true); this.entityData.set(DETONATING_DATA, true);
this.entityData.set(FUSE_TICKS_DATA, this.fuseTicks); this.entityData.set(FUSE_TICKS_DATA, this.fuseTicks);
this.getNavigation().stop(); this.playSound(AntarchySoundEvents.BOMBER_EXPLODE.get(), 1.0F, 1.0F);
this.setDeltaMovement(Vec3.ZERO);
this.hasImpulse = false;
this.playSound(SoundEvents.TNT_PRIMED, 1.0F, 0.9F + this.random.nextFloat() * 0.2F);
} }
private void detonate() { private void detonate() {
@@ -260,7 +269,21 @@ public class BomberEntity extends Monster implements GeoEntity {
double y = this.getY(0.0625D); double y = this.getY(0.0625D);
double z = this.getZ(); double z = this.getZ();
float radius = (float) AntarchySettings.bomberExplosionRadius(); 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(); double extraDamage = AntarchySettings.bomberExplosionDamage();
if (extraDamage > 0.0D) { if (extraDamage > 0.0D) {
@@ -283,6 +306,10 @@ public class BomberEntity extends Monster implements GeoEntity {
this.discard(); this.discard();
} }
private boolean isMovingForAnimation() {
return this.getDeltaMovement().horizontalDistanceSqr() > 1.0E-4D || this.getNavigation().isInProgress();
}
private final class BomberAttackGoal extends MeleeAttackGoal { private final class BomberAttackGoal extends MeleeAttackGoal {
private BomberAttackGoal() { private BomberAttackGoal() {
super(BomberEntity.this, 1.1D, true); super(BomberEntity.this, 1.1D, true);
@@ -290,12 +317,12 @@ public class BomberEntity extends Monster implements GeoEntity {
@Override @Override
public boolean canUse() { public boolean canUse() {
return !BomberEntity.this.detonating && super.canUse(); return super.canUse();
} }
@Override @Override
public boolean canContinueToUse() { public boolean canContinueToUse() {
return !BomberEntity.this.detonating && super.canContinueToUse(); return super.canContinueToUse();
} }
} }
} }
@@ -1,5 +1,6 @@
package com.craisinlord.antarchy.content.entity.ant; package com.craisinlord.antarchy.content.entity.ant;
import com.craisinlord.antarchy.config.AntarchySettings;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Set; import java.util.Set;
import net.minecraft.core.BlockPos; 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.item.ItemStack;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -161,17 +163,26 @@ public final class AntTeleportHelper {
@Nullable @Nullable
private static Vec3 tryFindSafeDismount(ServerPlayer player, ServerLevel destination, BlockPos candidate) { private static Vec3 tryFindSafeDismount(ServerPlayer player, ServerLevel destination, BlockPos candidate) {
Vec3 safePos = DismountHelper.findSafeDismountLocation(player.getType(), destination, candidate, true); Vec3 safePos = DismountHelper.findSafeDismountLocation(player.getType(), destination, candidate, true);
if (safePos != null) { if (safePos != null && isValidArrivalPosition(destination, safePos)) {
return safePos; return safePos;
} }
for (Direction direction : Direction.Plane.HORIZONTAL) { for (Direction direction : Direction.Plane.HORIZONTAL) {
safePos = DismountHelper.findSafeDismountLocation(player.getType(), destination, candidate.relative(direction), true); safePos = DismountHelper.findSafeDismountLocation(player.getType(), destination, candidate.relative(direction), true);
if (safePos != null) { if (safePos != null && isValidArrivalPosition(destination, safePos)) {
return safePos; return safePos;
} }
} }
return null; 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; package com.craisinlord.antarchy.content.fluid;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.AntarchyObjects; import com.craisinlord.antarchy.content.AntarchyObjects;
import net.minecraft.core.BlockPos; 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.MobEffectInstance;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity; 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.LiquidBlock;
import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState; 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.level.material.FlowingFluid;
import net.minecraft.world.phys.Vec3;
public class BileLiquidBlock extends LiquidBlock { 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 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) { public BileLiquidBlock(FlowingFluid fluid, BlockBehaviour.Properties properties) {
super(fluid, properties); super(fluid, properties);
@@ -36,7 +40,10 @@ public class BileLiquidBlock extends LiquidBlock {
return; 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.WorldGenLevel;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks; 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.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; 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_RADIUS = 8;
private static final int SEARCH_ATTEMPTS = 20; private static final int SEARCH_ATTEMPTS = 20;
private static final int VERTICAL_SCAN = 10; 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.02f;
private static final float OOZE_CHANCE = 0.22f;
public CavarynBileCystFeature(Codec<NoneFeatureConfiguration> codec) { public CavarynBileCystFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec); super(codec);
@@ -38,7 +36,7 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) { public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
Block bileVeinBlock = getBlock(BILE_VEIN_ID); Block bileVeinBlock = getBlock(BILE_VEIN_ID);
Block bileBlock = getBlock(BILE_ID); Block bileBlock = getBlock(BILE_ID);
if (bileVeinBlock == null || !(bileBlock instanceof LiquidBlock)) { if (bileVeinBlock == null || bileBlock == null) {
return false; return false;
} }
@@ -53,8 +51,6 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
return placeCyst(level, center, bileVeinBlock, bileBlock, random); 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) { private static BlockPos findCenter(WorldGenLevel level, BlockPos origin, RandomSource random) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) { for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
@@ -68,7 +64,6 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
continue; continue;
} }
// Need at least one open neighbor (at cave surface)
Direction openDir = null; Direction openDir = null;
for (Direction dir : Direction.values()) { for (Direction dir : Direction.values()) {
if (level.getBlockState(mutable.relative(dir)).canBeReplaced()) { if (level.getBlockState(mutable.relative(dir)).canBeReplaced()) {
@@ -80,7 +75,6 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
continue; continue;
} }
// Step 1-2 blocks away from the opening so the cyst sits inside the wall
int depth = 1 + random.nextInt(2); int depth = 1 + random.nextInt(2);
BlockPos candidate = mutable.immutable().relative(openDir.getOpposite(), depth); BlockPos candidate = mutable.immutable().relative(openDir.getOpposite(), depth);
if (isSolid(level.getBlockState(candidate))) { 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) { 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 rx = 1.5 + random.nextDouble() * 12.0;
double ry = 1.5 + random.nextDouble() * 12.0; double ry = 1.5 + random.nextDouble() * 12.0;
double rz = 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); int stretchAxis = random.nextInt(3);
if (stretchAxis == 0) rx *= 1.3 + random.nextDouble() * 0.7; if (stretchAxis == 0) rx *= 1.3 + random.nextDouble() * 0.7;
else if (stretchAxis == 1) ry *= 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; 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 f1x = 0.6 + random.nextDouble() * 1.2;
double f1z = 0.6 + random.nextDouble() * 1.2; double f1z = 0.6 + random.nextDouble() * 1.2;
double f2y = 0.7 + random.nextDouble() * 1.0; double f2y = 0.7 + random.nextDouble() * 1.0;
double f2x = 0.5 + random.nextDouble() * 0.9; double f2x = 0.5 + random.nextDouble() * 0.9;
double f3z = 0.8 + random.nextDouble() * 1.1; double f3z = 0.8 + random.nextDouble() * 1.1;
double f3y = 0.5 + random.nextDouble() * 0.8; 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; int maxR = (int) Math.ceil(Math.max(Math.max(rx, ry), rz)) + 2;
List<BlockPos> placed = new ArrayList<>(); List<BlockPos> placed = new ArrayList<>();
@@ -122,7 +113,6 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
(dy * dy) / (ry * ry) + (dy * dy) / (ry * ry) +
(dz * dz) / (rz * rz)); (dz * dz) / (rz * rz));
// Multi-frequency sine interference — gives lumpy, non-spherical surface
double wobble = wobbleAmp * ( double wobble = wobbleAmp * (
0.4 * Math.sin(dx * f1x + dz * f1z) + 0.4 * Math.sin(dx * f1x + dz * f1z) +
0.35 * Math.cos(dy * f2y + dx * f2x) + 0.35 * Math.cos(dy * f2y + dx * f2x) +
@@ -140,12 +130,8 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
} }
if (distorted < 0.7) { if (distorted < 0.7) {
// Interior — fill with bile liquid level.setBlock(pos, Blocks.AIR.defaultBlockState(), 2);
BlockState bileState = bileBlock.defaultBlockState();
level.setBlock(pos, bileState, 2);
scheduleFluidTick(level, pos, bileState);
} else { } else {
// Outer shell — bile vein blocks
level.setBlock(pos, veinBlock.defaultBlockState(), 2); level.setBlock(pos, veinBlock.defaultBlockState(), 2);
placed.add(pos.immutable()); placed.add(pos.immutable());
} }
@@ -157,12 +143,10 @@ public final class CavarynBileCystFeature extends Feature<NoneFeatureConfigurati
return false; return false;
} }
// 30% chance this cyst oozes at all
if (random.nextFloat() >= 0.30f) { if (random.nextFloat() >= 0.30f) {
return true; return true;
} }
// Ooze bile out of exposed faces — "popped pimple" seep
for (BlockPos cystPos : placed) { for (BlockPos cystPos : placed) {
for (Direction dir : Direction.values()) { for (Direction dir : Direction.values()) {
BlockPos adj = cystPos.relative(dir); 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 SEARCH_ATTEMPTS = 24;
private static final int VERTICAL_SCAN = 12; private static final int VERTICAL_SCAN = 12;
private static final float BRANCH_CHANCE = 0.12f; 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) { public CavarynBileVeinFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec); super(codec);
@@ -53,7 +53,6 @@ public final class CavarynBileVeinFeature extends Feature<NoneFeatureConfigurati
return growVeinNetwork(level, start, bileVeinBlock, bileBlock, random); 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) { private static BlockPos findStart(WorldGenLevel level, BlockPos origin, RandomSource random) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) { for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
@@ -116,7 +115,6 @@ public final class CavarynBileVeinFeature extends Feature<NoneFeatureConfigurati
BlockState state = level.getBlockState(current); BlockState state = level.getBlockState(current);
if (!isVeinCandidate(state)) { if (!isVeinCandidate(state)) {
// Try to redirect
BlockPos redirect = findSolidNeighbor(current, dir, visited, level, random); BlockPos redirect = findSolidNeighbor(current, dir, visited, level, random);
if (redirect == null) { if (redirect == null) {
break; break;
@@ -190,7 +188,7 @@ public final class CavarynBileVeinFeature extends Feature<NoneFeatureConfigurati
if (!isVeinCandidate(candidateState)) { if (!isVeinCandidate(candidateState)) {
continue; continue;
} }
if (isEnclosed(level, candidate) || random.nextFloat() < 0.05f) { if (isEnclosed(level, candidate) || random.nextFloat() < 0.01f) {
BlockState bileState = bileBlock.defaultBlockState(); BlockState bileState = bileBlock.defaultBlockState();
level.setBlock(candidate, bileState, 2); level.setBlock(candidate, bileState, 2);
scheduleFluidTick(level, candidate, bileState); scheduleFluidTick(level, candidate, bileState);
@@ -136,7 +136,6 @@ public final class CavarynEggPatchFeature extends Feature<NoneFeatureConfigurati
continue; continue;
} }
// Replace the floor block with amber moss so eggs hatch faster
if (amberMossBlock != null) { if (amberMossBlock != null) {
BlockPos floorPos = eggPos.below(); BlockPos floorPos = eggPos.below();
BlockState floorState = level.getBlockState(floorPos); 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> { public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfiguration> {
private static final ResourceLocation AMBER_LICHEN_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "amber_lichen"); 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_RADIUS = 8;
private static final int SEARCH_ATTEMPTS = 28; private static final int SEARCH_ATTEMPTS = 28;
private static final int VERTICAL_SCAN = 10; private static final int VERTICAL_SCAN = 10;
@@ -34,8 +33,7 @@ public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfig
WorldGenLevel level = context.level(); WorldGenLevel level = context.level();
RandomSource random = context.random(); RandomSource random = context.random();
Block amberLichenBlock = getBlock(AMBER_LICHEN_ID); Block amberLichenBlock = getBlock(AMBER_LICHEN_ID);
Block glowLichenBlock = getBlock(GLOW_LICHEN_ID); if (amberLichenBlock == null) {
if (amberLichenBlock == null || glowLichenBlock == null) {
return false; return false;
} }
@@ -49,7 +47,7 @@ public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfig
return false; return false;
} }
placeLichenFringe(level, placedPatch, anchor.supportDirection(), amberLichenBlock, glowLichenBlock, random); placeLichenFringe(level, placedPatch, anchor.supportDirection(), amberLichenBlock, random);
return true; return true;
} }
@@ -115,7 +113,6 @@ public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfig
List<BlockPos> patchPositions, List<BlockPos> patchPositions,
Direction supportDirection, Direction supportDirection,
Block amberLichenBlock, Block amberLichenBlock,
Block glowLichenBlock,
RandomSource random RandomSource random
) { ) {
for (BlockPos patchPos : patchPositions) { for (BlockPos patchPos : patchPositions) {
@@ -132,7 +129,7 @@ public final class CavarynWallAmberMossFeature extends Feature<NoneFeatureConfig
continue; continue;
} }
BlockState state = createLichenState(random.nextFloat() < 0.65F ? amberLichenBlock : glowLichenBlock, supportDirection); BlockState state = createLichenState(amberLichenBlock, supportDirection);
if (!state.canSurvive(level, targetPos)) { if (!state.canSurvive(level, targetPos)) {
continue; continue;
} }
@@ -61,7 +61,6 @@ public class CoralSpikeFeature extends Feature<NoneFeatureConfiguration> {
int baseRadius = 2 + random.nextInt(2); // 2–3 wide at base int baseRadius = 2 + random.nextInt(2); // 2–3 wide at base
int totalHeight = 20 + random.nextInt(15); // 20–34 blocks tall 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 curveAngle = random.nextDouble() * Math.PI * 2;
double curveDX = Math.cos(curveAngle); double curveDX = Math.cos(curveAngle);
double curveDZ = Math.sin(curveAngle); double curveDZ = Math.sin(curveAngle);
@@ -96,7 +95,6 @@ public class CoralSpikeFeature extends Feature<NoneFeatureConfiguration> {
level.setBlock(pos, coral.block().defaultBlockState(), 2); level.setBlock(pos, coral.block().defaultBlockState(), 2);
placed = true; placed = true;
// Coral plants growing off the top of outer-surface blocks
if (dist >= radius - 0.6 && radius > 0) { if (dist >= radius - 0.6 && radius > 0) {
BlockPos above = pos.above(); BlockPos above = pos.above();
if (canReplace(level.getBlockState(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) { if (dist >= radius - 0.5) {
for (Direction dir : Direction.Plane.HORIZONTAL) { for (Direction dir : Direction.Plane.HORIZONTAL) {
if (random.nextFloat() >= 0.4f) continue; 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. // 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 // Transition-zone columns (-0.80 to -0.85) are treated as land to avoid
// ocean biome appearing over above-sea-level terrain. // 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 @Override
public Holder<Biome> getNoiseBiome(int x, int y, int z, Climate.Sampler sampler) { 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. // Use continentalness (XZ-only noise) to classify the column.
// Ocean columns get the ocean biome at every Y so structures, particles, // Ocean columns get the ocean biome at every Y so structures, particles,
// and ambient effects work correctly above the water surface. // 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); Climate.TargetPoint target = sampler.sample(x, this.seaLevelQuartY, z);
if (target.continentalness() < OCEAN_CONTINENTALNESS_THRESHOLD) { 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); 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 // MultiNoise can return a land biome at sea-level depth — force ocean if so
if (isOceanBiome(seaLevelBiome)) return seaLevelBiome; if (isOceanBiome(seaLevelBiome)) return seaLevelBiome;
return oceanHolder != null ? oceanHolder : seaLevelBiome; return oceanHolder != null ? oceanHolder : seaLevelBiome;
} }
// Land column at or below sea level: force ocean for any biome not allowed there. // Land column in the shallow-underwater zone: force ocean for surface biomes that
// +1 quart above seaLevelQuartY so blocks 76-83 (around the waterline) are all caught. // ended up below sea level (e.g. meadow in a depression). Only applies within
if (y <= this.seaLevelQuartY + 1 && oceanHolder != null && !allowedBelowSeaLevel(biome)) { // 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; return oceanHolder;
} }
@@ -66,7 +66,6 @@ public class FallenOuranwoodFeature extends Feature<NoneFeatureConfiguration> {
float dmg = damage[step]; float dmg = damage[step];
// Full gap sections — log has completely rotted through here
if (dmg > 0.78f) continue; if (dmg > 0.78f) continue;
int surfaceY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, bx, bz); 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; boolean isShell = dist >= outerRadius - 0.5;
// Hollow interior: always skip center when hollow
if (hollow && dist < outerRadius - 0.5) continue; 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 && !isShell) continue;
if (dmg > 0.55f && random.nextFloat() < (dmg - 0.55f) * 3.5f) 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; if (isShell && random.nextFloat() < dmg * 0.4f) continue;
int px = axis == Direction.Axis.X ? bx : bx + dp; 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; if (!canReplace(level.getBlockState(pos))) continue;
// Block material mix: mostly mossy log, some fresh log patches, some moss
float r = random.nextFloat(); float r = random.nextFloat();
BlockState toPlace; BlockState toPlace;
if (r < 0.08f) { if (r < 0.08f) {
toPlace = Blocks.MOSS_BLOCK.defaultBlockState(); toPlace = Blocks.MOSS_BLOCK.defaultBlockState();
} else if (r < 0.22f) { } else if (r < 0.22f) {
toPlace = freshLogState; // fresher wood, less decayed patch toPlace = freshLogState;
} else if (r < 0.32f) { } else if (r < 0.32f) {
toPlace = woodState; toPlace = woodState;
} else { } 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); int mossCount = 20 + random.nextInt(25);
for (int i = 0; i < mossCount; i++) { for (int i = 0; i < mossCount; i++) {
int mx = origin.getX() + random.nextInt(length + 6) - 3; 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 capBlock = isRed ? Blocks.RED_MUSHROOM_BLOCK : Blocks.BROWN_MUSHROOM_BLOCK;
Block smallMushroom = isRed ? Blocks.RED_MUSHROOM : Blocks.BROWN_MUSHROOM; Block smallMushroom = isRed ? Blocks.RED_MUSHROOM : Blocks.BROWN_MUSHROOM;
// 1-in-3 chance of a large mushroom (~3x the small variant) int stemSize = random.nextBoolean() ? 2 : 3;
boolean isLarge = random.nextInt(3) == 0; 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 leanAngle = random.nextDouble() * Math.PI * 2;
double leanDX = Math.cos(leanAngle); double leanDX = Math.cos(leanAngle);
double leanDZ = Math.sin(leanAngle); double leanDZ = Math.sin(leanAngle);
double maxLean = isLarge double maxLean = 2.0 + random.nextDouble() * 3.5;
? (6.0 + random.nextDouble() * 10.0) // large: 6–16 block lean
: (2.0 + random.nextDouble() * 3.5); // small: 2–5.5 block lean
int baseY = origin.getY(); int baseY = origin.getY();
int stemOffset = stemSize == 2 ? 0 : -1; // center 3x3 on origin 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() BlockState stemPore = Blocks.MUSHROOM_STEM.defaultBlockState()
.setValue(HugeMushroomBlock.NORTH, false) .setValue(HugeMushroomBlock.NORTH, false)
.setValue(HugeMushroomBlock.SOUTH, false) .setValue(HugeMushroomBlock.SOUTH, false)
@@ -63,7 +56,6 @@ public class FungalMushroomFeature extends Feature<NoneFeatureConfiguration> {
.setValue(HugeMushroomBlock.UP, false) .setValue(HugeMushroomBlock.UP, false)
.setValue(HugeMushroomBlock.DOWN, false); .setValue(HugeMushroomBlock.DOWN, false);
// Place leaning stem
for (int dy = 0; dy < stemHeight; dy++) { for (int dy = 0; dy < stemHeight; dy++) {
double leanProgress = (double) dy / stemHeight; double leanProgress = (double) dy / stemHeight;
int leanX = (int) Math.round(leanDX * maxLean * leanProgress); 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 dx = 0; dx < stemSize; dx++) {
for (int dz = 0; dz < stemSize; dz++) { for (int dz = 0; dz < stemSize; dz++) {
BlockPos pos = new BlockPos( int wx = origin.getX() + stemOffset + dx + leanX;
origin.getX() + stemOffset + dx + leanX, int wz = origin.getZ() + stemOffset + dz + leanZ;
baseY + dy, BlockPos pos = new BlockPos(wx, baseY + dy, wz);
origin.getZ() + stemOffset + dz + leanZ); if (!canReplace(level.getBlockState(pos))) continue;
if (canReplace(level.getBlockState(pos))) { boolean isEdge = (dx == 0 || dx == stemSize - 1 || dz == 0 || dz == stemSize - 1);
// Outer ring shows bark, interior is pores BlockState stemState = isEdge ? stemSide : stemPore;
boolean isEdge = (dx == 0 || dx == stemSize - 1 || dz == 0 || dz == stemSize - 1); level.setBlock(pos, stemState, 2);
level.setBlock(pos, isEdge ? stemSide : stemPore, 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 capCenterX = origin.getX() + (stemSize == 2 ? 0.5 : 0) + leanDX * maxLean;
double capCenterZ = origin.getZ() + (stemSize == 2 ? 0.5 : 0) + leanDZ * maxLean; double capCenterZ = origin.getZ() + (stemSize == 2 ? 0.5 : 0) + leanDZ * maxLean;
int capTopY = baseY + stemHeight; int capTopY = baseY + stemHeight;
int baseCapRadius = isLarge int baseCapRadius = stemSize + 2 + random.nextInt(2);
? (stemSize + 7 + random.nextInt(6)) // large: ~11–18 at base
: (stemSize + 2 + random.nextInt(2)); // small: 4–6 at base
// 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; int jitterRange = baseCapRadius + 4;
float[][] jitter = new float[jitterRange * 2 + 1][jitterRange * 2 + 1]; float[][] jitter = new float[jitterRange * 2 + 1][jitterRange * 2 + 1];
for (float[] row : jitter) { for (float[] row : jitter) {
for (int j = 0; j < row.length; j++) { 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 = 12 + random.nextInt(12);
int myceliumCount = isLarge ? (25 + random.nextInt(25)) : (12 + random.nextInt(12));
for (int i = 0; i < myceliumCount; i++) { 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 mx = origin.getX() + random.nextInt(radius * 2 + 1) - radius;
int mz = origin.getZ() + 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; 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 = 5 + random.nextInt(8);
int smallCount = isLarge ? (10 + random.nextInt(15)) : (5 + random.nextInt(8));
for (int i = 0; i < smallCount; i++) { 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 sx = origin.getX() + random.nextInt(radius * 2 + 1) - radius;
int sz = origin.getZ() + 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); 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) { private void spawnGuaranteedCocoon(WorldGenLevel level, BlockPos origin, OuranwoodTreeConfiguration config, RandomSource random) {
if (!(level.getLevel() instanceof ServerLevel serverLevel)) return; 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); Direction dir = Direction.Plane.HORIZONTAL.getRandomDirection(random);
int branchY = 10 + random.nextInt(8); int branchY = 10 + random.nextInt(8);
int branchLength = 4 + random.nextInt(3); // 4–6 logs out from the trunk 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++) { for (int i = 1; i <= branchLength; i++) {
BlockPos p = origin.above(branchY).relative(dir, i); BlockPos p = origin.above(branchY).relative(dir, i);
setBlock(level, p, config.trunkProvider().getState(random, p)); setBlock(level, p, config.trunkProvider().getState(random, p));
} }
BlockPos anchor = origin.above(branchY).relative(dir, branchLength); BlockPos anchor = origin.above(branchY).relative(dir, branchLength);
// Clear everything below the anchor and spawn the cocooned brutalfly
BrutalflyCocoonFeature.clearCocoonVolume(level, anchor); BrutalflyCocoonFeature.clearCocoonVolume(level, anchor);
BrutalflyEntity brutalfly = AntarchyObjects.BRUTALFLY.get().create(serverLevel); BrutalflyEntity brutalfly = AntarchyObjects.BRUTALFLY.get().create(serverLevel);
if (brutalfly == null) return; if (brutalfly == null) return;
@@ -553,8 +553,6 @@ public class OuranwoodTreeFeature extends Feature<OuranwoodTreeConfiguration> {
return; 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 // The tick is scheduled here on the WorldGenLevel because onPlace() is never
// called during world generation, so the block cannot self-schedule. // called during world generation, so the block cannot self-schedule.
int squirrelCount = 1 + random.nextInt(3); 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; BlockPos topSoilPos = null;
for (int y = maxY; y >= minY; y--) { for (int y = maxY; y >= minY; y--) {
BlockPos pos = new BlockPos(worldX, y, worldZ); BlockPos pos = new BlockPos(worldX, y, worldZ);
@@ -13,9 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List; import java.util.List;
@Mixin(SplashManager.class) @Mixin(SplashManager.class)
/*
* Adds Antarchy splash text without replacing vanilla handling.
*/
public abstract class SplashManagerMixin { public abstract class SplashManagerMixin {
@Shadow @Shadow
@Final @Final
@@ -35,5 +32,6 @@ public abstract class SplashManagerMixin {
this.splashes.add("Rainbow sugar yummy"); this.splashes.add("Rainbow sugar yummy");
this.splashes.add("Now with inverted gravity!"); this.splashes.add("Now with inverted gravity!");
this.splashes.add("Everything we need is already here"); this.splashes.add("Everything we need is already here");
this.splashes.add("Rub some bacon on it!");
} }
} }
@@ -1,7 +1,6 @@
{ {
"required": true, "required": true,
"package": "com.craisinlord.antarchy.mixins", "package": "com.craisinlord.antarchy.mixins",
"refmap": "antarchy.refmap.json",
"plugin": "com.craisinlord.antarchy.mixins.AntarchyMixinPlugin", "plugin": "com.craisinlord.antarchy.mixins.AntarchyMixinPlugin",
"compatibilityLevel": "JAVA_21", "compatibilityLevel": "JAVA_21",
"mixins": [ "mixins": [
@@ -64,6 +64,11 @@
"walk": { "walk": {
"loop": true, "loop": true,
"animation_length": 0.5, "animation_length": 0.5,
"sound_effects": {
"0.0": {
"effect": "antarchy:bomber_walk|0.9|1.0"
}
},
"bones": { "bones": {
"root": { "root": {
"rotation": { "rotation": {
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/broodstone"
}
}
}
@@ -35,6 +35,7 @@
"block.antarchy.infested_coarse_dirt": "Infested Coarse Dirt", "block.antarchy.infested_coarse_dirt": "Infested Coarse Dirt",
"block.antarchy.nyxite": "Nyxite", "block.antarchy.nyxite": "Nyxite",
"block.antarchy.myrmite": "Myrmite", "block.antarchy.myrmite": "Myrmite",
"block.antarchy.broodstone": "Broodstone",
"block.antarchy.polished_nyxite": "Polished Nyxite", "block.antarchy.polished_nyxite": "Polished Nyxite",
"block.antarchy.chiseled_nyxite": "Chiseled Nyxite", "block.antarchy.chiseled_nyxite": "Chiseled Nyxite",
"block.antarchy.nyxite_bricks": "Nyxite Bricks", "block.antarchy.nyxite_bricks": "Nyxite Bricks",
@@ -279,6 +280,7 @@
"item.antarchy.chiten_block": "Chiten Block", "item.antarchy.chiten_block": "Chiten Block",
"item.antarchy.chiten_spike": "Chiten Spike", "item.antarchy.chiten_spike": "Chiten Spike",
"item.antarchy.myrmite": "Myrmite", "item.antarchy.myrmite": "Myrmite",
"item.antarchy.broodstone": "Broodstone",
"item.antarchy.torchflower_bush": "Torchflower Bush", "item.antarchy.torchflower_bush": "Torchflower Bush",
"block.antarchy.torchflower_bush": "Torchflower Bush", "block.antarchy.torchflower_bush": "Torchflower Bush",
"item.antarchy.mud_pie": "Mud Pie", "item.antarchy.mud_pie": "Mud Pie",
@@ -647,6 +649,9 @@
"subtitles.antarchy.basilisk_hiss": "Basilisk hisses", "subtitles.antarchy.basilisk_hiss": "Basilisk hisses",
"subtitles.antarchy.basilisk_hurt": "Basilisk hurts", "subtitles.antarchy.basilisk_hurt": "Basilisk hurts",
"subtitles.antarchy.basilisk_death": "Basilisk dies", "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.inversion": "Potion of Inversion",
"item.minecraft.potion.effect.long_inversion": "Potion of Inversion", "item.minecraft.potion.effect.long_inversion": "Potion of Inversion",
"item.minecraft.splash_potion.effect.inversion": "Splash 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": { "thoraxis_nightmare_wastes_ambient": {
"subtitle": "subtitles.antarchy.thoraxis_nightmare_wastes_ambient", "subtitle": "subtitles.antarchy.thoraxis_nightmare_wastes_ambient",
"sounds": [ "sounds": [
Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

@@ -4,8 +4,33 @@
"type": "minecraft:noise", "type": "minecraft:noise",
"settings": "antarchy:cavaryn", "settings": "antarchy:cavaryn",
"biome_source": { "biome_source": {
"type": "minecraft:fixed", "type": "minecraft:multi_noise",
"biome": "antarchy:cavaryn" "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", "type": "antarchy:elythia_biome_source",
"moleworm_caves_max_y": 30, "moleworm_caves_max_y": 30,
"surface_biome_sample_y": 160, "surface_biome_sample_y": 160,
"ocean_max_y": 75, "ocean_max_y": 67,
"sea_level": 70,
"biomes": [ "biomes": [
{ {
"biome": "antarchy:moleworm_caves", "biome": "antarchy:moleworm_caves",
@@ -9,7 +9,7 @@
"logical_height": 192, "logical_height": 192,
"infiniburn": "#minecraft:infiniburn_overworld", "infiniburn": "#minecraft:infiniburn_overworld",
"effects": "minecraft:overworld", "effects": "minecraft:overworld",
"ambient_light": 0.0, "ambient_light": 0.01,
"piglin_safe": false, "piglin_safe": false,
"has_raids": false, "has_raids": false,
"monster_spawn_light_level": 0, "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": [ "values": [
"#minecraft:moss_replaceable", "#minecraft:moss_replaceable",
"antarchy:myrmite", "antarchy:myrmite",
"antarchy:broodstone",
"antarchy:amber_moss_block" "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_veins",
"antarchy:cavaryn_bile_cysts",
"antarchy:cavaryn_wall_amber_moss", "antarchy:cavaryn_wall_amber_moss",
"antarchy:cavaryn_creepvine",
"antarchy:cavaryn_chiten_spikes", "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, "creature_spawn_probability": 0.06,
"spawners": { "spawners": {
@@ -57,7 +57,7 @@
], ],
[] []
], ],
"creature_spawn_probability": 0.04, "creature_spawn_probability": 0.15,
"spawners": { "spawners": {
"monster": [ "monster": [
{ "type": "antarchy:missile_squid", "weight": 12, "minCount": 1, "maxCount": 3 }, { "type": "antarchy:missile_squid", "weight": 12, "minCount": 1, "maxCount": 3 },
@@ -6,8 +6,8 @@
"type": "minecraft:y_clamped_gradient", "type": "minecraft:y_clamped_gradient",
"from_y": -64, "from_y": -64,
"to_y": 220, "to_y": 220,
"from_value": 2.1, "from_value": 1.75,
"to_value": -1.78 "to_value": -2.05
}, },
"argument2": { "argument2": {
"type": "minecraft:add", "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", "type": "minecraft:condition",
"if_true": { "if_true": {
@@ -1,5 +1,5 @@
{ {
"sea_level": 78, "sea_level": 70,
"disable_mob_generation": false, "disable_mob_generation": false,
"aquifers_enabled": true, "aquifers_enabled": true,
"ore_veins_enabled": false, "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": [ "placement": [
{ {
"type": "minecraft:count", "type": "minecraft:count",
"count": 3 "count": 1
}, },
{ {
"type": "minecraft:in_square" "type": "minecraft:in_square"
@@ -3,7 +3,7 @@
"placement": [ "placement": [
{ {
"type": "minecraft:count", "type": "minecraft:count",
"count": 5 "count": 2
}, },
{ {
"type": "minecraft:in_square" "type": "minecraft:in_square"
@@ -0,0 +1,5 @@
{
"values": [
"antarchy:broodstone"
]
}
@@ -37,6 +37,7 @@
"antarchy:nyxite_brick_slab", "antarchy:nyxite_brick_slab",
"antarchy:nyxite_brick_wall", "antarchy:nyxite_brick_wall",
"antarchy:myrmite", "antarchy:myrmite",
"antarchy:broodstone",
"antarchy:bile_vein", "antarchy:bile_vein",
"antarchy:chiten_block", "antarchy:chiten_block",
"antarchy:chiten_spike", "antarchy:chiten_spike",
@@ -39,6 +39,11 @@ public final class AntarchyFabric implements ModInitializer {
BloodCrystalShardItem.SYNC_BLOODGLASS = BloodglassManager::syncBloodglass; BloodCrystalShardItem.SYNC_BLOODGLASS = BloodglassManager::syncBloodglass;
} }
private static final TagKey<net.minecraft.world.level.biome.Biome> CAVARYN_BIOMES = TagKey.create(
Registries.BIOME,
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "is_cavaryn")
);
private static void registerWorldgenFeatures() { private static void registerWorldgenFeatures() {
BiomeModifications.addFeature( BiomeModifications.addFeature(
BiomeSelectors.tag(SHELLSTONE_BIOMES), BiomeSelectors.tag(SHELLSTONE_BIOMES),
@@ -389,6 +389,9 @@ public final class AntarchyFabricContent {
public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_HURT = registerSoundEvent("molevore_hurt"); public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_HURT = registerSoundEvent("molevore_hurt");
public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_ATTACK = registerSoundEvent("molevore_attack"); public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_ATTACK = registerSoundEvent("molevore_attack");
public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_DIG = registerSoundEvent("molevore_dig"); public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_DIG = registerSoundEvent("molevore_dig");
public static final DeferredHolder<SoundEvent, SoundEvent> BOMBER_WALK = registerSoundEvent("bomber_walk");
public static final DeferredHolder<SoundEvent, SoundEvent> BOMBER_KNOCK = registerSoundEvent("bomber_knock");
public static final DeferredHolder<SoundEvent, SoundEvent> BOMBER_EXPLODE = registerSoundEvent("bomber_explode");
public static final DeferredHolder<SoundEvent, SoundEvent> DUCT_TAPE_USE = registerSoundEvent("duct_tape_use"); public static final DeferredHolder<SoundEvent, SoundEvent> DUCT_TAPE_USE = registerSoundEvent("duct_tape_use");
public static final DeferredHolder<SoundEvent, SoundEvent> POTENT_NYXITE_HYPNOTIC_GAS = registerSoundEvent("potent_nyxite_hypnotic_gas"); public static final DeferredHolder<SoundEvent, SoundEvent> POTENT_NYXITE_HYPNOTIC_GAS = registerSoundEvent("potent_nyxite_hypnotic_gas");
public static final DeferredHolder<SoundEvent, SoundEvent> POTENT_NYXITE_GEYSER_ERUPTION_START = registerSoundEvent("potent_nyxite_geyser_eruption_start"); public static final DeferredHolder<SoundEvent, SoundEvent> POTENT_NYXITE_GEYSER_ERUPTION_START = registerSoundEvent("potent_nyxite_geyser_eruption_start");
@@ -602,6 +605,8 @@ public final class AntarchyFabricContent {
)); ));
public static final DeferredBlock<Block> MYRMITE = BLOCKS.register("myrmite", public static final DeferredBlock<Block> MYRMITE = BLOCKS.register("myrmite",
() -> new Block(nyxiteProperties())); () -> new Block(nyxiteProperties()));
public static final DeferredBlock<Block> BROODSTONE = BLOCKS.register("broodstone",
() -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.DEEPSLATE).requiresCorrectToolForDrops()));
public static final DeferredBlock<RotatedPillarBlock> CHITEN_BLOCK = BLOCKS.register("chiten_block", public static final DeferredBlock<RotatedPillarBlock> CHITEN_BLOCK = BLOCKS.register("chiten_block",
() -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.BONE_BLOCK).requiresCorrectToolForDrops())); () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.BONE_BLOCK).requiresCorrectToolForDrops()));
public static final DeferredBlock<UmbralMossBlock> UMBRAL_MOSS_BLOCK = BLOCKS.register("umbral_moss_block", public static final DeferredBlock<UmbralMossBlock> UMBRAL_MOSS_BLOCK = BLOCKS.register("umbral_moss_block",
@@ -613,7 +618,7 @@ public final class AntarchyFabricContent {
public static final DeferredBlock<UmbralMossCarpetBlock> AMBER_MOSS_CARPET = BLOCKS.register("amber_moss_carpet", public static final DeferredBlock<UmbralMossCarpetBlock> AMBER_MOSS_CARPET = BLOCKS.register("amber_moss_carpet",
() -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_CARPET).noOcclusion())); () -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_CARPET).noOcclusion()));
public static final DeferredBlock<GlowLichenBlock> AMBER_LICHEN = BLOCKS.register("amber_lichen", public static final DeferredBlock<GlowLichenBlock> AMBER_LICHEN = BLOCKS.register("amber_lichen",
() -> new GlowLichenBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.GLOW_LICHEN).lightLevel(state -> 1))); () -> new GlowLichenBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.GLOW_LICHEN).lightLevel(state -> 4)));
public static final DeferredBlock<Block> BILE_VEIN = BLOCKS.register("bile_vein", public static final DeferredBlock<Block> BILE_VEIN = BLOCKS.register("bile_vein",
() -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.NETHERRACK))); () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.NETHERRACK)));
public static final DeferredBlock<VineBlock> CREEPVINE = BLOCKS.register("creepvine", public static final DeferredBlock<VineBlock> CREEPVINE = BLOCKS.register("creepvine",
@@ -1192,6 +1197,7 @@ public final class AntarchyFabricContent {
public static final DeferredItem<net.minecraft.world.item.BlockItem> INFESTED_COARSE_DIRT_ITEM = ITEMS.registerSimpleBlockItem(INFESTED_COARSE_DIRT); public static final DeferredItem<net.minecraft.world.item.BlockItem> INFESTED_COARSE_DIRT_ITEM = ITEMS.registerSimpleBlockItem(INFESTED_COARSE_DIRT);
public static final DeferredItem<net.minecraft.world.item.BlockItem> NYXITE_ITEM = ITEMS.registerSimpleBlockItem(NYXITE); public static final DeferredItem<net.minecraft.world.item.BlockItem> NYXITE_ITEM = ITEMS.registerSimpleBlockItem(NYXITE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> MYRMITE_ITEM = ITEMS.registerSimpleBlockItem(MYRMITE); public static final DeferredItem<net.minecraft.world.item.BlockItem> MYRMITE_ITEM = ITEMS.registerSimpleBlockItem(MYRMITE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> BROODSTONE_ITEM = ITEMS.registerSimpleBlockItem(BROODSTONE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> POLISHED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(POLISHED_NYXITE); public static final DeferredItem<net.minecraft.world.item.BlockItem> POLISHED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(POLISHED_NYXITE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> CHISELED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(CHISELED_NYXITE); public static final DeferredItem<net.minecraft.world.item.BlockItem> CHISELED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(CHISELED_NYXITE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> NYXITE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(NYXITE_BRICKS); public static final DeferredItem<net.minecraft.world.item.BlockItem> NYXITE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(NYXITE_BRICKS);
@@ -1686,7 +1692,7 @@ public final class AntarchyFabricContent {
public static final DeferredItem<DeferredSpawnEggItem> RAINBOW_ANT_SPAWN_EGG = ITEMS.register("rainbow_ant_spawn_egg", public static final DeferredItem<DeferredSpawnEggItem> RAINBOW_ANT_SPAWN_EGG = ITEMS.register("rainbow_ant_spawn_egg",
() -> new DeferredSpawnEggItem(RAINBOW_ANT, 0x56D4F0, 0xF66DBB, new Item.Properties())); () -> new DeferredSpawnEggItem(RAINBOW_ANT, 0x56D4F0, 0xF66DBB, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg", public static final DeferredItem<DeferredSpawnEggItem> TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg",
() -> new DeferredSpawnEggItem(TERMITE, 0xE8DFC0, 0x5C3C1A, new Item.Properties())); () -> new DeferredSpawnEggItem(TERMITE, 0xD4B96A, 0xFF6B1A, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg", public static final DeferredItem<DeferredSpawnEggItem> MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg",
() -> new DeferredSpawnEggItem(MOLEWORM, 0x7A6150, 0xD2B8A3, new Item.Properties())); () -> new DeferredSpawnEggItem(MOLEWORM, 0x7A6150, 0xD2B8A3, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg", public static final DeferredItem<DeferredSpawnEggItem> MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg",
@@ -1994,7 +2000,7 @@ public final class AntarchyFabricContent {
case "blood_crystal_block", "budding_blood_crystal", case "blood_crystal_block", "budding_blood_crystal",
"small_blood_crystal_bud", "medium_blood_crystal_bud", "small_blood_crystal_bud", "medium_blood_crystal_bud",
"large_blood_crystal_bud", "blood_crystal_cluster" -> 7; "large_blood_crystal_bud", "blood_crystal_cluster" -> 7;
case "myrmite", "chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet" -> 8; case "myrmite", "broodstone", "chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet" -> 8;
case "uranium_ore", "deepslate_uranium_ore", "titanium_ore", "deepslate_titanium_ore", case "uranium_ore", "deepslate_uranium_ore", "titanium_ore", "deepslate_titanium_ore",
"uranium_block", "titanium_block", "raw_uranium_block", "raw_titanium_block", "uranium_block", "titanium_block", "raw_uranium_block", "raw_titanium_block",
"cut_uranium", "cut_titanium", "cut_uranium_slab", "cut_titanium_slab", "cut_uranium", "cut_titanium", "cut_uranium_slab", "cut_titanium_slab",
@@ -2411,6 +2417,9 @@ public final class AntarchyFabricContent {
MOLEVORE_HURT, MOLEVORE_HURT,
MOLEVORE_ATTACK, MOLEVORE_ATTACK,
MOLEVORE_DIG, MOLEVORE_DIG,
BOMBER_WALK,
BOMBER_KNOCK,
BOMBER_EXPLODE,
DUCT_TAPE_USE DUCT_TAPE_USE
); );
@@ -1,6 +1,6 @@
package com.craisinlord.antarchy.fabric.mixin.client; package com.craisinlord.antarchy.fabric.mixin.client;
import com.craisinlord.antarchy.content.block.PotentNyxiteBlock; import com.craisinlord.antarchy.content.fluid.BileLiquidBlock;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.shaders.FogShape; import com.mojang.blaze3d.shaders.FogShape;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
@@ -16,34 +16,34 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(FogRenderer.class) @Mixin(FogRenderer.class)
public abstract class AntiwaterFogMixin { public abstract class AntiwaterFogMixin {
// @Inject(method = "setupColor", at = @At("TAIL")) @Inject(method = "setupColor", at = @At("TAIL"))
// private static void antarchy$overrideAntiwaterColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, CallbackInfo ci) { private static void antarchy$overrideBileColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, CallbackInfo ci) {
// if (!antarchy$isInAntiwater(camera)) { if (!antarchy$isInBile(camera)) {
// return; return;
// } }
//
// RenderSystem.clearColor(0.52F, 0.06F, 0.06F, 0.0F); RenderSystem.clearColor(0.38F, 0.42F, 0.10F, 0.0F);
// } }
//
// @Inject(method = "setupFog", at = @At("TAIL")) @Inject(method = "setupFog", at = @At("TAIL"))
// private static void antarchy$overrideAntiwaterFog(Camera camera, FogRenderer.FogMode mode, float renderDistance, boolean thickFog, float partialTick, CallbackInfo ci) { private static void antarchy$overrideBileFog(Camera camera, FogRenderer.FogMode mode, float renderDistance, boolean thickFog, float partialTick, CallbackInfo ci) {
// if (!antarchy$isInAntiwater(camera)) { if (!antarchy$isInBile(camera)) {
// return; return;
// } }
//
// RenderSystem.setShaderFogStart(0.5F); RenderSystem.setShaderFogStart(0.25F);
// RenderSystem.setShaderFogEnd(Math.min(renderDistance, 12.0F)); RenderSystem.setShaderFogEnd(Math.min(renderDistance, 4.0F));
// RenderSystem.setShaderFogShape(FogShape.CYLINDER); RenderSystem.setShaderFogShape(FogShape.CYLINDER);
// } }
//
// private static boolean antarchy$isInAntiwater(Camera camera) { private static boolean antarchy$isInBile(Camera camera) {
// Entity entity = camera.getEntity(); Entity entity = camera.getEntity();
// if (entity == null || entity.level() == null) { if (entity == null || entity.level() == null) {
// return false; return false;
// } }
//
// BlockPos pos = BlockPos.containing(camera.getPosition()); BlockPos pos = BlockPos.containing(camera.getPosition());
// FluidState fluidState = entity.level().getFluidState(pos); FluidState fluidState = entity.level().getFluidState(pos);
// return PotentNyxiteBlock.isAntiwater(fluidState); return BileLiquidBlock.isBile(fluidState);
// } }
} }
@@ -134,6 +134,9 @@ public class AntarchyNeoforge {
AntarchyNeoforgeSounds.MOLEVORE_HURT, AntarchyNeoforgeSounds.MOLEVORE_HURT,
AntarchyNeoforgeSounds.MOLEVORE_ATTACK, AntarchyNeoforgeSounds.MOLEVORE_ATTACK,
AntarchyNeoforgeSounds.MOLEVORE_DIG, AntarchyNeoforgeSounds.MOLEVORE_DIG,
AntarchyNeoforgeSounds.BOMBER_WALK,
AntarchyNeoforgeSounds.BOMBER_KNOCK,
AntarchyNeoforgeSounds.BOMBER_EXPLODE,
AntarchyNeoforgeSounds.DUCT_TAPE_USE AntarchyNeoforgeSounds.DUCT_TAPE_USE
); );
bindCommonObjects(); bindCommonObjects();
@@ -318,6 +318,18 @@ public final class AntarchyNeoForgeClient {
public int getTintColor(FluidState state, BlockAndTintGetter getter, net.minecraft.core.BlockPos pos) { public int getTintColor(FluidState state, BlockAndTintGetter getter, net.minecraft.core.BlockPos pos) {
return 0xFFFFFFFF; return 0xFFFFFFFF;
} }
@Override
public Vector3f modifyFogColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, Vector3f fluidFogColor) {
return new Vector3f(0.38F, 0.42F, 0.10F);
}
@Override
public void modifyFogRender(Camera camera, net.minecraft.client.renderer.FogRenderer.FogMode mode, float renderDistance, float partialTick, float nearDistance, float farDistance, FogShape shape) {
RenderSystem.setShaderFogStart(0.25F);
RenderSystem.setShaderFogEnd(Math.min(farDistance, 4.0F));
RenderSystem.setShaderFogShape(FogShape.CYLINDER);
}
}, AntarchyNeoForgeFluidTypes.BILE_TYPE.get()); }, AntarchyNeoForgeFluidTypes.BILE_TYPE.get());
event.registerFluidType(new IClientFluidTypeExtensions() { event.registerFluidType(new IClientFluidTypeExtensions() {
@@ -46,7 +46,6 @@ public final class MogglesClientRenderer {
Vec3 dir = end.subtract(eye).normalize(); Vec3 dir = end.subtract(eye).normalize();
// Place up to 5 particles spaced evenly between 1.5 m ahead and the target.
int steps = Math.min(5, (int) (totalDist / 1.5)); int steps = Math.min(5, (int) (totalDist / 1.5));
double spacing = (totalDist - 1.5) / Math.max(steps, 1); double spacing = (totalDist - 1.5) / Math.max(steps, 1);
@@ -183,6 +183,8 @@ public final class AntarchyNeoforgeBlocks {
)); ));
public static final DeferredBlock<Block> MYRMITE = BLOCKS.register("myrmite", public static final DeferredBlock<Block> MYRMITE = BLOCKS.register("myrmite",
() -> new Block(nyxiteProperties())); () -> new Block(nyxiteProperties()));
public static final DeferredBlock<Block> BROODSTONE = BLOCKS.register("broodstone",
() -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.DEEPSLATE).requiresCorrectToolForDrops()));
public static final DeferredBlock<RotatedPillarBlock> CHITEN_BLOCK = BLOCKS.register("chiten_block", public static final DeferredBlock<RotatedPillarBlock> CHITEN_BLOCK = BLOCKS.register("chiten_block",
() -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.BONE_BLOCK).requiresCorrectToolForDrops())); () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.BONE_BLOCK).requiresCorrectToolForDrops()));
public static final DeferredBlock<UmbralMossBlock> UMBRAL_MOSS_BLOCK = BLOCKS.register("umbral_moss_block", public static final DeferredBlock<UmbralMossBlock> UMBRAL_MOSS_BLOCK = BLOCKS.register("umbral_moss_block",
@@ -194,7 +196,7 @@ public final class AntarchyNeoforgeBlocks {
public static final DeferredBlock<UmbralMossCarpetBlock> AMBER_MOSS_CARPET = BLOCKS.register("amber_moss_carpet", public static final DeferredBlock<UmbralMossCarpetBlock> AMBER_MOSS_CARPET = BLOCKS.register("amber_moss_carpet",
() -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_CARPET).noOcclusion())); () -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_CARPET).noOcclusion()));
public static final DeferredBlock<GlowLichenBlock> AMBER_LICHEN = BLOCKS.register("amber_lichen", public static final DeferredBlock<GlowLichenBlock> AMBER_LICHEN = BLOCKS.register("amber_lichen",
() -> new GlowLichenBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.GLOW_LICHEN).lightLevel(state -> 1))); () -> new GlowLichenBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.GLOW_LICHEN).lightLevel(state -> 4)));
public static final DeferredBlock<Block> BILE_VEIN = BLOCKS.register("bile_vein", public static final DeferredBlock<Block> BILE_VEIN = BLOCKS.register("bile_vein",
() -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.NETHERRACK))); () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.NETHERRACK)));
public static final DeferredBlock<VineBlock> CREEPVINE = BLOCKS.register("creepvine", public static final DeferredBlock<VineBlock> CREEPVINE = BLOCKS.register("creepvine",
@@ -245,6 +245,7 @@ public class AntarchyNeoforgeCreativeModeTabs {
event.accept(AntarchyNeoforgeItems.MEDIUM_BLOOD_CRYSTAL_BUD_ITEM.get()); event.accept(AntarchyNeoforgeItems.MEDIUM_BLOOD_CRYSTAL_BUD_ITEM.get());
event.accept(AntarchyNeoforgeItems.LARGE_BLOOD_CRYSTAL_BUD_ITEM.get()); event.accept(AntarchyNeoforgeItems.LARGE_BLOOD_CRYSTAL_BUD_ITEM.get());
event.accept(AntarchyNeoforgeItems.MYRMITE_ITEM.get()); event.accept(AntarchyNeoforgeItems.MYRMITE_ITEM.get());
event.accept(AntarchyNeoforgeItems.BROODSTONE_ITEM.get());
event.accept(AntarchyNeoforgeItems.BILE_VEIN_ITEM.get()); event.accept(AntarchyNeoforgeItems.BILE_VEIN_ITEM.get());
event.accept(AntarchyNeoforgeItems.CHITEN_BLOCK_ITEM.get()); event.accept(AntarchyNeoforgeItems.CHITEN_BLOCK_ITEM.get());
event.accept(AntarchyNeoforgeItems.CHITEN_SPIKE_ITEM.get()); event.accept(AntarchyNeoforgeItems.CHITEN_SPIKE_ITEM.get());
@@ -380,7 +381,7 @@ public class AntarchyNeoforgeCreativeModeTabs {
// 8 - Blood crystal blocks (not the shard ingredient) // 8 - Blood crystal blocks (not the shard ingredient)
case "blood_crystal_block", "small_blood_crystal_bud", "medium_blood_crystal_bud", case "blood_crystal_block", "small_blood_crystal_bud", "medium_blood_crystal_bud",
"large_blood_crystal_bud", "budding_blood_crystal", "blood_crystal_cluster", "large_blood_crystal_bud", "budding_blood_crystal", "blood_crystal_cluster",
"myrmite", "chiten_block", "amber_moss_block", "amber_moss_carpet" -> 8; "myrmite", "broodstone", "chiten_block", "amber_moss_block", "amber_moss_carpet" -> 8;
// 9 - Ouranwood leaves // 9 - Ouranwood leaves
case "ouranwood_leaves" -> 9; case "ouranwood_leaves" -> 9;
@@ -230,6 +230,7 @@ public final class AntarchyNeoforgeItems {
public static final DeferredItem<net.minecraft.world.item.BlockItem> INFESTED_COARSE_DIRT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.INFESTED_COARSE_DIRT); public static final DeferredItem<net.minecraft.world.item.BlockItem> INFESTED_COARSE_DIRT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.INFESTED_COARSE_DIRT);
public static final DeferredItem<net.minecraft.world.item.BlockItem> NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.NYXITE); public static final DeferredItem<net.minecraft.world.item.BlockItem> NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.NYXITE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> MYRMITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.MYRMITE); public static final DeferredItem<net.minecraft.world.item.BlockItem> MYRMITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.MYRMITE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> BROODSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.BROODSTONE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> POLISHED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.POLISHED_NYXITE); public static final DeferredItem<net.minecraft.world.item.BlockItem> POLISHED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.POLISHED_NYXITE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> CHISELED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.CHISELED_NYXITE); public static final DeferredItem<net.minecraft.world.item.BlockItem> CHISELED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.CHISELED_NYXITE);
public static final DeferredItem<net.minecraft.world.item.BlockItem> NYXITE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.NYXITE_BRICKS); public static final DeferredItem<net.minecraft.world.item.BlockItem> NYXITE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.NYXITE_BRICKS);
@@ -507,7 +508,7 @@ public final class AntarchyNeoforgeItems {
public static final DeferredItem<DeferredSpawnEggItem> RAINBOW_ANT_SPAWN_EGG = ITEMS.register("rainbow_ant_spawn_egg", public static final DeferredItem<DeferredSpawnEggItem> RAINBOW_ANT_SPAWN_EGG = ITEMS.register("rainbow_ant_spawn_egg",
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.RAINBOW_ANT, 0x56D4F0, 0xF66DBB, new Item.Properties())); () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.RAINBOW_ANT, 0x56D4F0, 0xF66DBB, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg", public static final DeferredItem<DeferredSpawnEggItem> TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg",
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.TERMITE, 0xE8DFC0, 0x5C3C1A, new Item.Properties())); () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.TERMITE, 0xD4B96A, 0xFF6B1A, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg", public static final DeferredItem<DeferredSpawnEggItem> MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg",
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEWORM, 0x7A6150, 0xD2B8A3, new Item.Properties())); () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEWORM, 0x7A6150, 0xD2B8A3, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg", public static final DeferredItem<DeferredSpawnEggItem> MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg",
@@ -121,6 +121,9 @@ public final class AntarchyNeoforgeSounds {
public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_HURT = registerSoundEvent("molevore_hurt"); public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_HURT = registerSoundEvent("molevore_hurt");
public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_ATTACK = registerSoundEvent("molevore_attack"); public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_ATTACK = registerSoundEvent("molevore_attack");
public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_DIG = registerSoundEvent("molevore_dig"); public static final DeferredHolder<SoundEvent, SoundEvent> MOLEVORE_DIG = registerSoundEvent("molevore_dig");
public static final DeferredHolder<SoundEvent, SoundEvent> BOMBER_WALK = registerSoundEvent("bomber_walk");
public static final DeferredHolder<SoundEvent, SoundEvent> BOMBER_KNOCK = registerSoundEvent("bomber_knock");
public static final DeferredHolder<SoundEvent, SoundEvent> BOMBER_EXPLODE = registerSoundEvent("bomber_explode");
public static final DeferredHolder<SoundEvent, SoundEvent> DUCT_TAPE_USE = registerSoundEvent("duct_tape_use"); public static final DeferredHolder<SoundEvent, SoundEvent> DUCT_TAPE_USE = registerSoundEvent("duct_tape_use");
public static final DeferredHolder<SoundEvent, SoundEvent> POTENT_NYXITE_HYPNOTIC_GAS = registerSoundEvent("potent_nyxite_hypnotic_gas"); public static final DeferredHolder<SoundEvent, SoundEvent> POTENT_NYXITE_HYPNOTIC_GAS = registerSoundEvent("potent_nyxite_hypnotic_gas");
public static final DeferredHolder<SoundEvent, SoundEvent> POTENT_NYXITE_GEYSER_ERUPTION_START = registerSoundEvent("potent_nyxite_geyser_eruption_start"); public static final DeferredHolder<SoundEvent, SoundEvent> POTENT_NYXITE_GEYSER_ERUPTION_START = registerSoundEvent("potent_nyxite_geyser_eruption_start");
@@ -0,0 +1,8 @@
{
"type": "neoforge:remove_features",
"biomes": "#antarchy:is_cavaryn",
"features": [
"minecraft:glow_lichen"
],
"step": "vegetal_decoration"
}