BOMBER sounds, cavaryn tweaks, other random bs
This commit is contained in:
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;
|
||||
}
|
||||
}
|
||||
-1
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
+13
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
+4
-20
@@ -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);
|
||||
|
||||
+2
-4
@@ -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);
|
||||
|
||||
-1
@@ -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);
|
||||
|
||||
+3
-6
@@ -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;
|
||||
}
|
||||
|
||||
-3
@@ -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;
|
||||
|
||||
+8
-4
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-7
@@ -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;
|
||||
|
||||
+20
-32
@@ -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);
|
||||
|
||||
-3
@@ -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;
|
||||
|
||||
-3
@@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
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 },
|
||||
|
||||
+2
-2
@@ -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,
|
||||
|
||||
+27
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"placement": [
|
||||
{
|
||||
"type": "minecraft:count",
|
||||
"count": 3
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"type": "minecraft:in_square"
|
||||
|
||||
+1
-1
@@ -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",
|
||||
|
||||
Reference in new issue
Block a user