fixed game dev not working

various fabric issues
added archives to loot tables
This commit is contained in:
craisinlord committed 2026-09-19 01:01:13 -05:00
1 parent f5b589b6ba
commit c6b47b496a
102 files changed
+926 -139

No files matched your search

@@ -240,7 +240,7 @@ public final class AntarchySettings {
private static double royalGuardianSwordStormJumpRange = 9.0D;
private static double royalAssailantBattleAxeAttackDamage = 151.0D;
private static double royalAssailantBattleAxeAttackSpeed = -2.9D;
private static double royalWeaponAttackReachBonus = 1.0D;
private static double royalWeaponAttackReachBonus = 3.2D;
private static double royalWeaponAttackKnockbackBonus = 1.0D;
private static int royalWeaponDurability = 4608;
private static int royalWeaponEnchantability = 30;
@@ -3,6 +3,7 @@ package com.craisinlord.antarchy.content.block;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.block.entity.RoyalEggBlockEntity;
import com.craisinlord.antarchy.content.entity.royal.RoyalMountEntity;
import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisUndersideManager;
import java.util.UUID;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@@ -18,6 +19,7 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.entity.item.FallingBlockEntity;
import net.minecraft.world.level.LevelAccessor;
@@ -30,6 +32,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.phys.shapes.CollisionContext;
@@ -39,6 +42,7 @@ import org.jetbrains.annotations.Nullable;
public abstract class RoyalEggBlock extends BaseEntityBlock {
public static final IntegerProperty HATCH = BlockStateProperties.HATCH;
public static final BooleanProperty INVERTED = BooleanProperty.create("inverted");
private static final int MAX_HATCH = 2;
private static final int FALL_DELAY = 2;
@@ -49,16 +53,23 @@ public abstract class RoyalEggBlock extends BaseEntityBlock {
Block.box(5.0D, 14.0D, 5.0D, 11.0D, 15.0D, 11.0D),
Block.box(6.0D, 15.0D, 6.0D, 10.0D, 16.0D, 10.0D));
private static final VoxelShape INVERTED_SHAPE = Shapes.or(
Block.box(3.0D, 3.0D, 3.0D, 13.0D, 16.0D, 13.0D),
Block.box(2.0D, 5.0D, 2.0D, 14.0D, 15.0D, 14.0D),
Block.box(4.0D, 2.0D, 4.0D, 12.0D, 3.0D, 12.0D),
Block.box(5.0D, 1.0D, 5.0D, 11.0D, 2.0D, 11.0D),
Block.box(6.0D, 0.0D, 6.0D, 10.0D, 1.0D, 10.0D));
protected RoyalEggBlock(Properties properties) {
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(HATCH, 0));
this.registerDefaultState(this.stateDefinition.any().setValue(HATCH, 0).setValue(INVERTED, false));
}
protected abstract EntityType<? extends RoyalMountEntity> mountType();
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(HATCH);
builder.add(HATCH, INVERTED);
}
@Override
@@ -68,7 +79,16 @@ public abstract class RoyalEggBlock extends BaseEntityBlock {
@Override
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
return SHAPE;
return state.getValue(INVERTED) ? INVERTED_SHAPE : SHAPE;
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
return this.defaultBlockState().setValue(INVERTED, isInvertedGravityAt(context.getLevel(), context.getClickedPos()));
}
private static boolean isInvertedGravityAt(Level level, BlockPos pos) {
return ThoraxisUndersideManager.isThoraxis(level) && pos.getY() < ThoraxisUndersideManager.GRAVITY_FLIP_Y;
}
@Nullable
@@ -105,7 +125,8 @@ public abstract class RoyalEggBlock extends BaseEntityBlock {
UUID placer = source == null ? null : source.getPlacerUuid();
int hatch = state.getValue(HATCH);
level.setBlock(pos, Blocks.AIR.defaultBlockState(), 2);
level.setBlock(target, state.setValue(HATCH, Math.max(0, hatch - 1)), 2);
level.setBlock(target, state.setValue(HATCH, Math.max(0, hatch - 1))
.setValue(INVERTED, isInvertedGravityAt(level, target)), 2);
if (level.getBlockEntity(target) instanceof RoyalEggBlockEntity moved) {
moved.setPlacerUuid(placer);
}
@@ -129,6 +150,12 @@ public abstract class RoyalEggBlock extends BaseEntityBlock {
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
boolean inverted = state.getValue(INVERTED);
if (inverted) {
tickInvertedFall(state, level, pos);
return;
}
if (!FallingBlock.isFree(level.getBlockState(pos.below())) || pos.getY() < level.getMinBuildHeight()) {
return;
}
@@ -141,6 +168,26 @@ public abstract class RoyalEggBlock extends BaseEntityBlock {
}
}
/**
* Vanilla FallingBlockEntity always falls in world-down direction, so an
* unsupported egg placed with inverted underside gravity is stepped
* upward toward its support instead of being handed to that entity.
*/
private void tickInvertedFall(BlockState state, ServerLevel level, BlockPos pos) {
BlockPos above = pos.above();
if (!FallingBlock.isFree(level.getBlockState(above)) || above.getY() > level.getMaxBuildHeight()) {
return;
}
UUID placer = level.getBlockEntity(pos) instanceof RoyalEggBlockEntity egg ? egg.getPlacerUuid() : null;
level.removeBlock(pos, false);
level.setBlock(above, state, Block.UPDATE_ALL);
if (level.getBlockEntity(above) instanceof RoyalEggBlockEntity moved) {
moved.setPlacerUuid(placer);
}
level.scheduleTick(above, this, FALL_DELAY);
}
@Override
protected boolean isRandomlyTicking(BlockState state) {
return true;
@@ -0,0 +1,15 @@
package com.craisinlord.antarchy.content.client;
import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity;
import com.craisinlord.antos.api.client.archive.ArchiveEntityPreviewRegistry;
import net.minecraft.resources.ResourceLocation;
public final class AntarchyArchivePreviews {
private AntarchyArchivePreviews() {}
public static void register() {
ArchiveEntityPreviewRegistry.register(ResourceLocation.fromNamespaceAndPath("antarchy", "nightmare"), entity -> {
if (entity instanceof NightmareEntity nightmare) nightmare.setArchivePreviewFlying();
});
}
}
@@ -0,0 +1,128 @@
package com.craisinlord.antarchy.content.client;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchySoundEvents;
import com.craisinlord.antarchy.content.entity.HoverboardEntity;
import com.craisinlord.antarchy.mixins.LivingEntityJumpingAccessor;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance;
import net.minecraft.client.resources.sounds.SoundInstance;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.Entity;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public final class HoverboardSoundSystem {
private static final float MIN_PITCH = 0.75F;
private static final float MAX_PITCH = 1.6F;
private static final float MIN_VOLUME = 0.45F;
private static final float MAX_VOLUME = 0.8F;
private static final Map<Integer, IdleLoopSound> ACTIVE = new HashMap<>();
private HoverboardSoundSystem() {
}
public static void tick() {
Minecraft mc = Minecraft.getInstance();
if (mc.level == null) {
stopAll(mc);
return;
}
if (mc.isPaused()) {
return;
}
Set<Integer> activeIds = new HashSet<>();
for (Entity entity : mc.level.entitiesForRendering()) {
if (!(entity instanceof HoverboardEntity hoverboard) || !hoverboard.isVehicle()) {
continue;
}
int id = hoverboard.getId();
activeIds.add(id);
IdleLoopSound sound = ACTIVE.get(id);
if (sound == null || !mc.getSoundManager().isActive(sound)) {
sound = new IdleLoopSound(hoverboard);
ACTIVE.put(id, sound);
mc.getSoundManager().play(sound);
}
}
ACTIVE.entrySet().removeIf(entry -> {
if (activeIds.contains(entry.getKey())) {
return false;
}
mc.getSoundManager().stop(entry.getValue());
return true;
});
}
private static void stopAll(Minecraft mc) {
ACTIVE.values().forEach(mc.getSoundManager()::stop);
ACTIVE.clear();
}
private static final class IdleLoopSound extends AbstractTickableSoundInstance {
private final HoverboardEntity hoverboard;
private double lastX;
private double lastZ;
private IdleLoopSound(HoverboardEntity hoverboard) {
super(AntarchySoundEvents.HOVERBOARD_IDLE.get(), SoundSource.NEUTRAL, RandomSource.create());
this.hoverboard = hoverboard;
this.looping = true;
this.delay = 0;
this.relative = false;
this.attenuation = SoundInstance.Attenuation.LINEAR;
this.volume = MIN_VOLUME;
this.pitch = MIN_PITCH;
this.x = hoverboard.getX();
this.y = hoverboard.getY();
this.z = hoverboard.getZ();
this.lastX = this.x;
this.lastZ = this.z;
}
@Override
public void tick() {
if (this.hoverboard.isRemoved() || !this.hoverboard.isVehicle()) {
this.stop();
return;
}
double dx = this.hoverboard.getX() - this.lastX;
double dz = this.hoverboard.getZ() - this.lastZ;
double speed = Math.sqrt(dx * dx + dz * dz);
this.lastX = this.hoverboard.getX();
this.lastZ = this.hoverboard.getZ();
this.x = this.hoverboard.getX();
this.y = this.hoverboard.getY();
this.z = this.hoverboard.getZ();
double maxSpeed = Math.max(AntarchySettings.hoverboardMaxSpeed(), 0.0001D);
float speedRatio = (float) Mth.clamp(speed / maxSpeed, 0.0D, 1.0D);
boolean jumping = false;
Entity passenger = this.hoverboard.getControllingPassenger();
if (passenger instanceof net.minecraft.world.entity.player.Player player) {
jumping = ((LivingEntityJumpingAccessor) player).antarchy$isJumping();
}
boolean movingUpward = this.hoverboard.getDeltaMovement().y > 0.02D;
float liftRatio = jumping || movingUpward ? 1.0F : 0.0F;
this.volume = Mth.lerp(speedRatio, MIN_VOLUME, MAX_VOLUME);
this.pitch = Mth.lerp(speedRatio, MIN_PITCH, MAX_PITCH)
+ Mth.lerp(liftRatio, 0.0F, 0.2F);
}
@Override
public boolean canStartSilent() {
return true;
}
}
}
@@ -23,12 +23,6 @@ public final class AntarchyComputerGames {
AntarchyGameNetworking.requestBasiliskState(pos);
return new GameSession(() -> { if (!loaded.get()) loaded.set(loadScores(pos, AntarchyGamePayload.BASILISK_STATE, program::setStoredScores)); program.tick(); }, program::render, key -> loaded.get() && program.keyPressed(key), ignored -> false);
}));
registerIfMissing(game("antman", "ANTMAN.EXE", pos -> {
AntmanProgram program = new AntmanProgram(true, 0, 0, score -> AntarchyGameNetworking.saveAntmanScore(pos, score));
var loaded = new java.util.concurrent.atomic.AtomicBoolean();
AntarchyGameNetworking.requestAntmanState(pos);
return new GameSession(() -> { if (!loaded.get()) loaded.set(loadScores(pos, AntarchyGamePayload.ANTMAN_STATE, program::setStoredScores)); program.tick(); }, program::render, key -> loaded.get() && program.keyPressed(key), ignored -> false);
}));
}
private static void registerIfMissing(ComputerGame game) {
@@ -28,11 +28,12 @@ public final class RoyalIndicatorRenderer {
crownPoints(lines, pose, radius, spin, 1.0F, 0.80F, 0.22F, 0.95F);
}
if (judged) {
float markY = commanded ? -0.13F : 0.0F;
float markY = commanded ? -0.13F : 0.08F;
poseStack.translate(0.0D, markY, 0.0D);
pose = poseStack.last();
brackets(lines, pose, radius * 1.18F, -spin * 1.7F);
ring(lines, pose, radius * 0.73F, -spin * 0.7F, 1.0F, 0.91F, 0.48F, 0.85F, 24);
judgmentFlare(lines, pose, radius * 0.82F, spin);
}
poseStack.popPose();
}
@@ -79,6 +80,18 @@ public final class RoyalIndicatorRenderer {
}
}
private static void judgmentFlare(VertexConsumer out, PoseStack.Pose pose, float radius, float rotation) {
// The old mark was almost edge-on from normal gameplay camera angles. Add a vertical,
// unmistakable judgment sigil while keeping the rotating ring as its core.
for (int i = 0; i < 4; i++) {
double angle = rotation + Math.PI * 0.5D * i;
float x = (float) Math.cos(angle) * radius;
float z = (float) Math.sin(angle) * radius;
line(out, pose, x, -0.16F, z, 0.0F, 0.22F, 0.0F, 1.0F, 0.68F, 0.08F, 1.0F);
line(out, pose, 0.0F, 0.22F, 0.0F, -x, -0.16F, -z, 1.0F, 0.91F, 0.35F, 0.95F);
}
}
private static void line(VertexConsumer out, PoseStack.Pose pose,
float x1, float y1, float z1, float x2, float y2, float z2,
float r, float g, float b, float a) {
@@ -0,0 +1,35 @@
package com.craisinlord.antarchy.content.dispenser;
import com.craisinlord.antarchy.content.item.BugSprayItem;
import net.minecraft.core.Direction;
import net.minecraft.core.Position;
import net.minecraft.core.dispenser.BlockSource;
import net.minecraft.core.dispenser.DefaultDispenseItemBehavior;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.phys.Vec3;
public final class BugSprayDispenseBehavior extends DefaultDispenseItemBehavior {
@Override
protected ItemStack execute(BlockSource source, ItemStack stack) {
if (!(source.level() instanceof ServerLevel level)) return stack;
Direction direction = source.state().getValue(DispenserBlock.FACING);
Position position = DispenserBlock.getDispensePosition(source);
Vec3 origin = new Vec3(position.x(), position.y(), position.z());
Vec3 facing = new Vec3(direction.getStepX(), direction.getStepY(), direction.getStepZ());
BugSprayItem.spray(level, origin, facing, origin, net.minecraft.sounds.SoundSource.BLOCKS, source.pos());
stack.setDamageValue(stack.getDamageValue() + 1);
if (stack.getDamageValue() >= stack.getMaxDamage()) {
stack.shrink(1);
}
return stack;
}
@Override
protected void playSound(BlockSource source) {
source.level().levelEvent(1002, source.pos(), 0);
}
}
@@ -96,7 +96,7 @@ public class BomberEntity extends Monster implements GeoEntity {
}
public static boolean canSpawn(EntityType<BomberEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
@@ -153,7 +153,7 @@ public class ButterflyEntity extends Animal implements FlyingAnimal, GeoEntity {
}
public static boolean canSpawn(EntityType<ButterflyEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
@@ -149,7 +149,7 @@ public class CaterpillarEntity extends Animal implements GeoEntity {
}
public static boolean canSpawn(EntityType<CaterpillarEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
@@ -84,7 +84,7 @@ public class CrawlingBlightEntity extends Monster implements GeoEntity {
}
public static boolean canSpawn(EntityType<CrawlingBlightEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
BlockPos belowPos = pos.below();
@@ -235,6 +235,7 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG
|| spawnReason == MobSpawnType.SPAWNER
|| spawnReason == MobSpawnType.TRIAL_SPAWNER
|| spawnReason == MobSpawnType.COMMAND) {
return true;
}
@@ -218,7 +218,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
}
public static boolean canSpawn(EntityType<HerculesBeetleEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
boolean floorSpawn = level.getBlockState(pos.below()).isFaceSturdy(level, pos.below(), Direction.UP)
@@ -70,7 +70,7 @@ public class HoverboardEntity extends PathfinderMob implements GeoEntity {
@Override
public boolean canBeAffected(MobEffectInstance effectInstance) {
return false;
return effectInstance.getEffect().value() instanceof com.craisinlord.antarchy.content.effect.InvertedMobEffect;
}
public static AttributeSupplier.Builder createAttributes() {
@@ -98,7 +98,7 @@ public class JerryEntity extends Monster implements GeoEntity {
}
public static boolean canSpawn(EntityType<JerryEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, net.minecraft.core.BlockPos pos, net.minecraft.util.RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
return level.getDifficulty() != Difficulty.PEACEFUL
@@ -213,7 +213,7 @@ public class ReverieEntity extends PathfinderMob implements FlyingAnimal, GeoEnt
}
public static boolean canSpawn(EntityType<ReverieEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
@@ -110,7 +110,7 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
}
public static boolean canSpawn(EntityType<RollyPollyEntity> entityType, net.minecraft.world.level.ServerLevelAccessor level, net.minecraft.world.entity.MobSpawnType spawnReason, BlockPos pos, net.minecraft.util.RandomSource random) {
if (spawnReason == net.minecraft.world.entity.MobSpawnType.SPAWN_EGG || spawnReason == net.minecraft.world.entity.MobSpawnType.SPAWNER || spawnReason == net.minecraft.world.entity.MobSpawnType.COMMAND) {
if (spawnReason == net.minecraft.world.entity.MobSpawnType.SPAWN_EGG || spawnReason == net.minecraft.world.entity.MobSpawnType.SPAWNER || spawnReason == net.minecraft.world.entity.MobSpawnType.TRIAL_SPAWNER || spawnReason == net.minecraft.world.entity.MobSpawnType.COMMAND) {
return true;
}
@@ -159,6 +159,10 @@ public class ScorpionEntity extends Monster implements GeoEntity {
this.attackCooldownTicks--;
}
if (this.attackAnimTicks > 0) {
if (!this.isAlive()) {
this.resetAttackState();
return;
}
if (!this.level().isClientSide) {
this.tickAttackWindup();
}
@@ -70,7 +70,7 @@ public class SkulkingFrightEntity extends Monster implements GeoEntity {
}
public static boolean canSpawn(EntityType<SkulkingFrightEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
BlockPos belowPos = pos.below();
@@ -87,7 +87,7 @@ public class SpitBugEntity extends Monster implements GeoEntity {
}
public static boolean canSpawn(EntityType<SpitBugEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
return level.getDifficulty() != Difficulty.PEACEFUL
@@ -135,7 +135,7 @@ public class SpringbugEntity extends Monster implements GeoEntity {
}
public static boolean canSpawn(EntityType<SpringbugEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
return level.getDifficulty() != Difficulty.PEACEFUL
@@ -70,7 +70,7 @@ public class StinkBugEntity extends Animal implements GeoEntity {
}
public static boolean canSpawn(EntityType<StinkBugEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
BlockPos belowPos = pos.below();
@@ -97,7 +97,7 @@ public class WaspEntity extends Monster implements GeoEntity, FlyingAnimal {
}
public static boolean canSpawn(EntityType<WaspEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
@@ -40,6 +40,8 @@ public final class AntTeleportHelper {
private static final double COMPANION_FOLLOW_RADIUS = 16.0D;
private static final int ARRIVAL_SEARCH_RADIUS = 24;
private static final int ARRIVAL_VERTICAL_SEARCH = 24;
private static final int EXPANDED_ARRIVAL_SEARCH_RADIUS = 48;
private static final int EXPANDED_ARRIVAL_VERTICAL_SEARCH = 48;
private AntTeleportHelper() {
}
@@ -270,10 +272,21 @@ public final class AntTeleportHelper {
@Nullable
private static Vec3 findSafeArrivalPosition(ServerPlayer player, ServerLevel destination, BlockPos preferredPos) {
loadArrivalSearchArea(destination, preferredPos);
loadArrivalSearchArea(destination, preferredPos, ARRIVAL_SEARCH_RADIUS);
int[] yRange = getDimensionYRange(destination);
if (yRange != null) {
return findSafeArrivalPositionInYRange(player, destination, preferredPos, yRange[0], yRange[1]);
Vec3 safePos = findSafeArrivalPositionInYRange(
player, destination, preferredPos, yRange[0], yRange[1], ARRIVAL_SEARCH_RADIUS, ARRIVAL_VERTICAL_SEARCH);
if (safePos != null) {
return safePos;
}
// The bounded search can fail near rough or sparsely-generated terrain.
// Retry once with a wider radius before giving up.
loadArrivalSearchArea(destination, preferredPos, EXPANDED_ARRIVAL_SEARCH_RADIUS);
return findSafeArrivalPositionInYRange(
player, destination, preferredPos, yRange[0], yRange[1],
EXPANDED_ARRIVAL_SEARCH_RADIUS, EXPANDED_ARRIVAL_VERTICAL_SEARCH);
}
Set<BlockPos> candidates = new LinkedHashSet<>();
@@ -318,9 +331,9 @@ public final class AntTeleportHelper {
* bounded area up front so unloaded terrain is not mistaken for an unsafe
* destination and rejected prematurely.
*/
private static void loadArrivalSearchArea(ServerLevel destination, BlockPos preferredPos) {
private static void loadArrivalSearchArea(ServerLevel destination, BlockPos preferredPos, int searchRadius) {
ChunkPos center = new ChunkPos(preferredPos);
int chunkRadius = (ARRIVAL_SEARCH_RADIUS >> 4) + 1;
int chunkRadius = (searchRadius >> 4) + 1;
for (int chunkX = center.x - chunkRadius; chunkX <= center.x + chunkRadius; chunkX++) {
for (int chunkZ = center.z - chunkRadius; chunkZ <= center.z + chunkRadius; chunkZ++) {
destination.getChunk(chunkX, chunkZ);
@@ -347,10 +360,10 @@ public final class AntTeleportHelper {
}
@Nullable
private static Vec3 findSafeArrivalPositionInYRange(ServerPlayer player, ServerLevel destination, BlockPos preferredPos, int minY, int maxY) {
private static Vec3 findSafeArrivalPositionInYRange(ServerPlayer player, ServerLevel destination, BlockPos preferredPos, int minY, int maxY, int searchRadius, int verticalSearch) {
Set<BlockPos> surfaceCandidates = new LinkedHashSet<>();
boolean elythia = destination.dimension() == PermanentPortalType.ELYTHIA.primaryDimension();
for (int radius = 0; radius <= ARRIVAL_SEARCH_RADIUS; radius++) {
for (int radius = 0; radius <= searchRadius; radius++) {
for (int xOff = -radius; xOff <= radius; xOff++) {
for (int zOff = -radius; zOff <= radius; zOff++) {
if (radius > 0 && Math.abs(xOff) != radius && Math.abs(zOff) != radius) {
@@ -372,7 +385,7 @@ public final class AntTeleportHelper {
addArrivalCandidate(surfaceCandidates, destination.getHeightmapPos(Heightmap.Types.WORLD_SURFACE, column));
}
for (int yOffset = 1; yOffset <= ARRIVAL_VERTICAL_SEARCH; yOffset++) {
for (int yOffset = 1; yOffset <= verticalSearch; yOffset++) {
surfaceCandidates.add(surface.above(yOffset));
if (!elythia) {
surfaceCandidates.add(surface.below(yOffset));
@@ -404,7 +417,7 @@ public final class AntTeleportHelper {
// Heightmaps can be stale or unsuitable around structures, so retain a
// bounded exhaustive search as a final generated-terrain attempt in
// dimensions whose configured arrival ranges intentionally allow it.
for (int radius = 0; radius <= ARRIVAL_SEARCH_RADIUS; radius++) {
for (int radius = 0; radius <= searchRadius; radius++) {
for (int xOff = -radius; xOff <= radius; xOff++) {
for (int zOff = -radius; zOff <= radius; zOff++) {
if (radius > 0 && Math.abs(xOff) != radius && Math.abs(zOff) != radius) {
@@ -204,7 +204,7 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
}
public static boolean canSpawn(EntityType<FlyingSquirrelEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.TRIAL_SPAWNER || spawnReason == MobSpawnType.COMMAND) {
return true;
}
@@ -119,6 +119,7 @@ public class KingEntity extends RoyalBossEntity {
private static final int CLOSE_QUARTERS_APPROACH_TICKS = 120;
private static final int CLOSE_QUARTERS_EXIT_GRACE_TICKS = 40;
private static final int DECREE_RESPONSE_GRACE_TICKS = 30;
private static final int DECREE_ANNOUNCEMENT_TICKS = 40;
private static final int PROJECTILE_PRESSURE_MAX = 60;
private static final int PROJECTILE_PRESSURE_PER_HIT = 10;
private static final int GROUND_ASSAULT_TICKS = 200;
@@ -149,6 +150,7 @@ public class KingEntity extends RoyalBossEntity {
private int treePatrolFailures;
private int decreeCooldownTicks;
private int activeDecreeTicks;
private int decreeAnnouncementTicks;
private int decreeResponseGraceTicks;
private int stompCooldownTicks;
private int wingGustCooldownTicks;
@@ -1366,6 +1368,7 @@ public class KingEntity extends RoyalBossEntity {
this.endDecree(this.getTarget());
this.activeDecree = decree;
this.activeDecreeTicks = 300;
this.decreeAnnouncementTicks = DECREE_ANNOUNCEMENT_TICKS;
this.decreeResponseGraceTicks = DECREE_RESPONSE_GRACE_TICKS;
this.decreeCooldownTicks = 0;
this.closeQuartersEntered.clear();
@@ -1879,6 +1882,7 @@ public class KingEntity extends RoyalBossEntity {
}
this.activeDecree = null;
this.activeDecreeTicks = 0;
this.decreeAnnouncementTicks = 0;
this.decreeRetreatPressure = false;
return;
}
@@ -1892,6 +1896,7 @@ public class KingEntity extends RoyalBossEntity {
return;
}
this.activeDecreeTicks = 300;
this.decreeAnnouncementTicks = DECREE_ANNOUNCEMENT_TICKS;
this.decreeResponseGraceTicks = DECREE_RESPONSE_GRACE_TICKS;
this.activeDecree = this.pickDecree(target);
this.decreeRetreatPressure = false;
@@ -1905,6 +1910,10 @@ public class KingEntity extends RoyalBossEntity {
this.broadcastActiveDecree(level);
}
this.broadcastActiveDecree(level);
if (this.decreeAnnouncementTicks > 0) {
this.decreeAnnouncementTicks--;
return;
}
boolean hasCompletableParticipants = false;
boolean everyParticipantComplete = true;
for (ServerPlayer participant : participants) {
@@ -2024,6 +2033,7 @@ public class KingEntity extends RoyalBossEntity {
}
this.activeDecree = null;
this.activeDecreeTicks = 0;
this.decreeAnnouncementTicks = 0;
this.decreeResponseGraceTicks = 0;
this.decreeRetreatPressure = false;
this.closeQuartersEntered.clear();
@@ -131,6 +131,7 @@ public class StratosharkEntity extends Monster implements GeoEntity {
return false;
}
if (spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.SPAWN_EGG
|| spawnReason == MobSpawnType.TRIAL_SPAWNER
|| spawnReason == MobSpawnType.COMMAND || spawnReason == MobSpawnType.BUCKET) {
return true;
}
@@ -54,7 +54,10 @@ public class HoverboardItem extends Item {
HoverboardEntity hoverboard = new HoverboardEntity(this.entityType, level);
Vec3 spawnPos = hitResult.getLocation();
hoverboard.moveTo(spawnPos.x, spawnPos.y, spawnPos.z, player.getYRot(), 0.0F);
boolean invertedPlacement = com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisUndersideManager.isThoraxis(level)
&& spawnPos.y < com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisUndersideManager.GRAVITY_FLIP_Y;
double spawnY = invertedPlacement ? spawnPos.y - hoverboard.getBbHeight() : spawnPos.y;
hoverboard.moveTo(spawnPos.x, spawnY, spawnPos.z, player.getYRot(), 0.0F);
hoverboard.setColor(this.color);
if (!level.noCollision(hoverboard, hoverboard.getBoundingBox())) {
return InteractionResultHolder.fail(stack);
@@ -3,6 +3,7 @@ package com.craisinlord.antarchy.content.item;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.item.royal.RoyalGearHelper;
import java.util.List;
import net.minecraft.ChatFormatting;
import net.minecraft.core.Holder;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
@@ -74,9 +75,10 @@ public class RoyalGuardianArmorItem extends ArmorItem {
case BOOTS -> "boots";
};
tooltipComponents.add(Component.translatable("tooltip.antarchy.royal_guardian_" + slotName + ".judgment",
Math.round(judgmentBonus() * 100.0D)));
Math.round(judgmentBonus() * 100.0D)).withStyle(ChatFormatting.LIGHT_PURPLE));
if (this.armorType == Type.CHESTPLATE) {
tooltipComponents.add(Component.translatable("tooltip.antarchy.royal_guardian_chestplate.boundary"));
tooltipComponents.add(Component.translatable("tooltip.antarchy.royal_guardian_chestplate.boundary")
.withStyle(ChatFormatting.AQUA));
}
super.appendHoverText(stack, context, tooltipComponents, tooltipFlag);
}
@@ -54,7 +54,7 @@ public class RoyalGuardianShieldItem extends ShieldItem {
@Override
public void appendHoverText(ItemStack stack, Item.TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
tooltipComponents.add(Component.translatable("tooltip.antarchy.royal_guardian_shield.command")
.withStyle(ChatFormatting.GOLD));
.withStyle(ChatFormatting.AQUA));
super.appendHoverText(stack, context, tooltipComponents, tooltipFlag);
}
@@ -108,7 +108,7 @@ public class RoyalGuardianSwordItem extends SwordItem implements GeoItem {
Mode mode = getMode(stack);
tooltipComponents.add(Component.translatable("tooltip.antarchy.royal_guardian_sword.mode",
Component.translatable(mode.translationKey)).withStyle(ChatFormatting.GOLD));
tooltipComponents.add(Component.translatable(mode.tooltipKey).withStyle(ChatFormatting.GRAY));
tooltipComponents.add(Component.translatable(mode.tooltipKey).withStyle(ChatFormatting.LIGHT_PURPLE));
tooltipComponents.add(Component.translatable("tooltip.antarchy.royal_guardian_sword.controls",
AntarchySettings.royalGuardianSwordElementalCooldownTicks() / 20.0D).withStyle(ChatFormatting.DARK_GRAY));
super.appendHoverText(stack, context, tooltipComponents, tooltipFlag);
@@ -3,7 +3,7 @@ package com.craisinlord.antarchy.content.worldgen.thoraxis;
import net.minecraft.util.RandomSource;
public final class QueenTrailGrid {
public static final int SPACING = 1_536;
public static final int SPACING = 1_500;
private static final int JITTER_MARGIN = 256;
private QueenTrailGrid() {
@@ -0,0 +1,11 @@
package com.craisinlord.antarchy.content.worldgen.thoraxis;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
public record ThoraxisTransitionThroatConfiguration(boolean large) implements FeatureConfiguration {
public static final Codec<ThoraxisTransitionThroatConfiguration> CODEC = RecordCodecBuilder.create(instance -> instance.group(
Codec.BOOL.fieldOf("large").forGetter(ThoraxisTransitionThroatConfiguration::large)
).apply(instance, ThoraxisTransitionThroatConfiguration::new));
}
@@ -6,17 +6,22 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
public final class ThoraxisTransitionThroatFeature extends Feature<NoneFeatureConfiguration> {
public final class ThoraxisTransitionThroatFeature extends Feature<ThoraxisTransitionThroatConfiguration> {
public ThoraxisTransitionThroatFeature() {
super(NoneFeatureConfiguration.CODEC);
super(ThoraxisTransitionThroatConfiguration.CODEC);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
public boolean place(FeaturePlaceContext<ThoraxisTransitionThroatConfiguration> context) {
WorldGenLevel level = context.level();
BlockPos origin = context.origin();
boolean large = context.config().large();
int searchRadius = large ? 18 : 9;
double baseRadius = large ? 10.0D : 5.0D;
double radiusVariance = large ? 5.0D : 2.5D;
double layerOffsetScale = large ? 4.0D : 2.0D;
BlockPos center = new BlockPos(origin.getX(), ThoraxisUndersideManager.GRAVITY_FLIP_Y, origin.getZ());
int upperSurface = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, center.getX(), center.getZ()) - 1;
int undersideSurface = findUndersideSurface(level, center);
@@ -26,13 +31,13 @@ public final class ThoraxisTransitionThroatFeature extends Feature<NoneFeatureCo
long seed = context.random().nextLong();
for (int y = undersideSurface; y <= upperSurface; y++) {
int layerOffsetX = noise(seed, Math.floorDiv(y, 5), 17) * 2;
int layerOffsetZ = noise(seed, Math.floorDiv(y, 5), 31) * 2;
double radiusX = 5.0D + noise01(seed, Math.floorDiv(y, 11), 43) * 2.5D;
double radiusZ = 5.0D + noise01(seed, Math.floorDiv(y, 13), 59) * 2.5D;
int layerOffsetX = (int) (noise(seed, Math.floorDiv(y, 5), 17) * layerOffsetScale);
int layerOffsetZ = (int) (noise(seed, Math.floorDiv(y, 5), 31) * layerOffsetScale);
double radiusX = baseRadius + noise01(seed, Math.floorDiv(y, 11), 43) * radiusVariance;
double radiusZ = baseRadius + noise01(seed, Math.floorDiv(y, 13), 59) * radiusVariance;
for (int x = -9; x <= 9; x++) {
for (int z = -9; z <= 9; z++) {
for (int x = -searchRadius; x <= searchRadius; x++) {
for (int z = -searchRadius; z <= searchRadius; z++) {
double dx = x - layerOffsetX;
double dz = z - layerOffsetZ;
double distance = Math.sqrt((dx * dx) / (radiusX * radiusX) + (dz * dz) / (radiusZ * radiusZ));
@@ -17,6 +17,7 @@ import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.item.ItemEntity;
@@ -43,9 +44,13 @@ public final class ThoraxisUndersideManager {
private static final int ENTER_UNDERSIDE_Y = GRAVITY_FLIP_Y - 4;
private static final int EXIT_UNDERSIDE_Y = GRAVITY_FLIP_Y + 4;
private static final int FLIP_COOLDOWN_TICKS = 40;
private static final int CROSSING_TIMEOUT_TICKS = 50;
private static final int CROSSING_TIMEOUT_TICKS = 100;
private static final int SETTLE_TIMEOUT_TICKS = 70;
private static final double MIN_CROSSING_SPEED = 0.48D;
private static final int RECENT_UNDERSIDE_WINDOW_TICKS = 40;
private static final int UNDERSIDE_ENTRY_BORDER_Y = GRAVITY_FLIP_Y - 7;
private static final int FRESH_ENTRY_DELAY_TICKS = 20;
private static final int ENTRY_SLOW_FALL_DURATION_TICKS = 300;
private static final Map<ServerLevel, TrackingState> STATES = new WeakHashMap<>();
private ThoraxisUndersideManager() {
@@ -144,6 +149,7 @@ public final class ThoraxisUndersideManager {
tracking.entities.removeIf(entity -> !entity.isAlive() || entity.isRemoved());
tracking.forcedItems.removeIf(entity -> !entity.isAlive() || entity.isRemoved());
tracking.lastFlipTick.entrySet().removeIf(entry -> now - entry.getValue() > FLIP_COOLDOWN_TICKS * 4L);
tracking.lastUndersideExitTick.entrySet().removeIf(entry -> now - entry.getValue() > RECENT_UNDERSIDE_WINDOW_TICKS * 4L);
double elapsedMs = (System.nanoTime() - startNanos) / 1_000_000.0D;
if (elapsedMs >= SLOW_TICK_WARN_MS && now - tracking.lastDiagnosticTick >= DIAGNOSTIC_INTERVAL_TICKS) {
@@ -161,6 +167,7 @@ public final class ThoraxisUndersideManager {
private final Set<Entity> forcedItems = Collections.newSetFromMap(new IdentityHashMap<>());
private final Map<UUID, Long> lastFlipTick = new java.util.HashMap<>();
private final Map<UUID, PlayerCrossing> playerCrossings = new java.util.HashMap<>();
private final Map<UUID, Long> lastUndersideExitTick = new java.util.HashMap<>();
private long lastDiagnosticTick = Long.MIN_VALUE / 2L;
private DiscoveryStats discover(ServerLevel level) {
@@ -190,6 +197,7 @@ public final class ThoraxisUndersideManager {
forcedItems.clear();
lastFlipTick.clear();
playerCrossings.clear();
lastUndersideExitTick.clear();
}
}
@@ -206,19 +214,18 @@ public final class ThoraxisUndersideManager {
continue;
}
if (isCrossingGravityBoundary(player) && flipReady(tracking, player.getUUID(), now)) {
if (isCrossingGravityBoundary(player)) {
boolean toUnderside = AntarchyGravityApi.getGravityDirection(player) == AntarchyGravityDirection.DOWN;
if (!toUnderside) {
refreshInvertedEffect(player);
} else {
player.addEffect(new MobEffectInstance(MobEffects.SLOW_FALLING, ENTRY_SLOW_FALL_DURATION_TICKS, 0, false, true, true));
}
tracking.playerCrossings.put(player.getUUID(), new PlayerCrossing(toUnderside));
continue;
}
MobEffectInstance effect = player.getEffect(AntarchyObjects.INVERTED_EFFECT.get());
if (player.getY() < ENTER_UNDERSIDE_Y) {
refreshInvertedEffect(player);
} else if (effect != null && isUndersideEffect(effect) && player.getY() < EXIT_UNDERSIDE_Y) {
if (AntarchyGravityApi.isGravityInverted(player) && player.getY() < EXIT_UNDERSIDE_Y) {
refreshInvertedEffect(player);
}
}
@@ -237,10 +244,23 @@ public final class ThoraxisUndersideManager {
}
AABB bounds = player.getBoundingBox();
boolean clear = crossing.toUnderside ? bounds.maxY < GRAVITY_FLIP_Y : bounds.minY > EXIT_UNDERSIDE_Y;
boolean clear;
if (crossing.toUnderside) {
if (bounds.maxY >= UNDERSIDE_ENTRY_BORDER_Y) {
return;
}
Long lastExit = tracking.lastUndersideExitTick.get(player.getUUID());
boolean recentlyUnderside = lastExit != null && now - lastExit < RECENT_UNDERSIDE_WINDOW_TICKS;
clear = recentlyUnderside || crossing.ticks >= FRESH_ENTRY_DELAY_TICKS;
} else {
clear = bounds.minY > EXIT_UNDERSIDE_Y;
}
if (!clear) {
return;
}
if (!flipReady(tracking, player.getUUID(), now)) {
return;
}
AntarchyGravityDirection destination = crossing.toUnderside
? AntarchyGravityDirection.UP
@@ -259,6 +279,7 @@ public final class ThoraxisUndersideManager {
refreshInvertedEffect(player);
} else {
player.removeEffect(AntarchyObjects.INVERTED_EFFECT.get());
tracking.lastUndersideExitTick.put(player.getUUID(), now);
}
return;
}
@@ -276,7 +297,7 @@ public final class ThoraxisUndersideManager {
AABB swept = player.getBoundingBox().expandTowards(velocity.scale(-1.0D)).inflate(0.08D);
AntarchyGravityDirection direction = AntarchyGravityApi.getGravityDirection(player);
return direction == AntarchyGravityDirection.DOWN
? swept.minY < GRAVITY_FLIP_Y && swept.maxY >= GRAVITY_FLIP_Y && velocity.y <= -MIN_CROSSING_SPEED
? swept.minY < UNDERSIDE_ENTRY_BORDER_Y && swept.maxY >= UNDERSIDE_ENTRY_BORDER_Y && velocity.y <= -MIN_CROSSING_SPEED
: swept.minY <= GRAVITY_FLIP_Y && swept.maxY > GRAVITY_FLIP_Y && velocity.y >= MIN_CROSSING_SPEED;
}
@@ -338,16 +359,10 @@ public final class ThoraxisUndersideManager {
return level.dimension().location().equals(THORAXIS_DIMENSION);
}
/** True only while an entity is physically below Thoraxis' gravity boundary. */
public static boolean isInUnderside(Entity entity) {
return isThoraxis(entity.level()) && entity.getY() < GRAVITY_FLIP_Y;
}
/**
* Projectiles perform their own movement in world coordinates, so they must
* not retain an inverted entity-local movement frame. Underside gravity is
* reversed separately when gravitational acceleration is applied.
*/
public static void normalizeProjectileGravityFrame(Projectile projectile) {
boolean stateMismatch = AntarchyGravityApi.getGravityDirection(projectile) != AntarchyGravityDirection.DOWN
|| AntarchyGravityApi.isGravityForced(projectile);
@@ -365,7 +380,6 @@ public final class ThoraxisUndersideManager {
return isThoraxis(entity.level()) && entity.getY() >= EXIT_UNDERSIDE_Y;
}
/** True while an entity is in the region where the underside gravity rule applies. */
public static boolean shouldInvertInUnderside(Entity entity) {
return AntarchyGravityApi.isGravityInverted(entity)
&& isInUnderside(entity);
@@ -0,0 +1,39 @@
package com.craisinlord.antarchy.mixins.time;
import com.craisinlord.antarchy.content.effect.ContractedMobEffect;
import com.craisinlord.antarchy.content.effect.DilatedMobEffect;
import com.craisinlord.antarchy.content.effect.RoyalEffectHooks;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(Player.class)
public abstract class TemporalMiningSpeedMixin {
@Inject(method = "getDestroySpeed", at = @At("RETURN"), cancellable = true)
private void antarchy$applyTemporalMiningSpeed(
net.minecraft.world.level.block.state.BlockState state,
CallbackInfoReturnable<Float> cir) {
Player player = (Player) (Object) this;
double rate = 1.0D;
if (RoyalEffectHooks.dilatedHolder() != null) {
MobEffectInstance dilation = player.getEffect(RoyalEffectHooks.dilatedHolder());
if (dilation != null) {
rate = Math.min(rate, DilatedMobEffect.rateForAmplifier(dilation.getAmplifier()));
}
}
if (RoyalEffectHooks.contractedHolder() != null) {
MobEffectInstance contraction = player.getEffect(RoyalEffectHooks.contractedHolder());
if (contraction != null) {
rate = Math.max(rate, ContractedMobEffect.rateForAmplifier(contraction.getAmplifier()));
}
}
if (rate != 1.0D) {
cir.setReturnValue((float) (cir.getReturnValue() * rate));
}
}
}
@@ -116,6 +116,7 @@
"time.LivingEntityAttackCooldownTimeDilationMixin",
"time.PlayerCooldownTimeDilationMixin",
"time.LivingEntityFoodUseTimeDilationMixin",
"time.TemporalMiningSpeedMixin",
"time.LivingEntityChronosphereEquipmentMixin",
"time.LookControlTimeDilationMixin",
"time.MeleeAttackGoalTimeDilationMixin",
@@ -1,13 +1,25 @@
{
"variants": {
"hatch=0": {
"hatch=0,inverted=false": {
"model": "antarchy:block/prince_egg"
},
"hatch=1": {
"hatch=1,inverted=false": {
"model": "antarchy:block/prince_egg"
},
"hatch=2": {
"hatch=2,inverted=false": {
"model": "antarchy:block/prince_egg"
},
"hatch=0,inverted=true": {
"model": "antarchy:block/prince_egg",
"x": 180
},
"hatch=1,inverted=true": {
"model": "antarchy:block/prince_egg",
"x": 180
},
"hatch=2,inverted=true": {
"model": "antarchy:block/prince_egg",
"x": 180
}
}
}
@@ -1,13 +1,25 @@
{
"variants": {
"hatch=0": {
"hatch=0,inverted=false": {
"model": "antarchy:block/princess_egg"
},
"hatch=1": {
"hatch=1,inverted=false": {
"model": "antarchy:block/princess_egg"
},
"hatch=2": {
"hatch=2,inverted=false": {
"model": "antarchy:block/princess_egg"
},
"hatch=0,inverted=true": {
"model": "antarchy:block/princess_egg",
"x": 180
},
"hatch=1,inverted=true": {
"model": "antarchy:block/princess_egg",
"x": 180
},
"hatch=2,inverted=true": {
"model": "antarchy:block/princess_egg",
"x": 180
}
}
}
@@ -1467,9 +1467,11 @@
,"enchantment.antarchy.feather_rising": "Feather Rising"
,"enchantment.antarchy.chronosphere": "Chronosphere"
,"entity.minecraft.villager.antarchy.computer_scientist": "Game Developer"
,"entity.minecraft.villager.computer_scientist": "Game Developer"
,"block.antarchy.ant_trap": "Ant Trap"
,"item.antarchy.bug_spray": "Bug Spray"
,"entity.minecraft.villager.antarchy.pest_control": "Pest Control"
,"entity.minecraft.villager.pest_control": "Pest Control"
,"guide.antarchy.category.general": "GENERAL"
,"guide.antarchy.category.elythia": "ELYTHIA"
,"guide.antarchy.category.thoraxis": "THORAXIS"
@@ -1490,64 +1492,104 @@
,"guide.antarchy.disk.vortex.title": "VORTEX"
,"guide.antarchy.entry.introduction.title": "SYSTEM INITIALIZED"
,"guide.antarchy.entry.introduction.subtitle": "A machine for remembering what should have stayed forgotten."
,"guide.antarchy.entry.introduction.description": "Insert recovered floppy disks to expand this archive. The machine remembers. The machine does not forgive."
,"guide.antarchy.entry.introduction.description": "Insert recovered floppy disks to expand this archive."
,"guide.antarchy.entry.toreterror.title": "Toreterror"
,"guide.antarchy.entry.toreterror_arena.subtitle": "Elythia Ocean boss"
,"guide.antarchy.entry.toreterror_arena.description": "The nearest Toreterror Arena within search range is listed below. It is always placed in an Elythia Ocean."
,"guide.antarchy.entry.toreterror_arena.description": "This archive can trace the nearest Toreterror Arena for you, always somewhere in an Elythia Ocean."
,"guide.antarchy.entry.toreterror_arena.description2": "Toreterror is an ancient turtle that fights with a water cannon at range and a long spinning charge up close, ricocheting off obstacles until it connects."
,"guide.antarchy.entry.elythia.title": "Elythia"
,"guide.antarchy.entry.elythia.subtitle": "Dimension and portal access record"
,"guide.antarchy.entry.elythia.description": "Elythia is reached through an Elythia portal made with a valid frame. A sacrificed Brown Ant activates the portal. The dimension contains oceans, meadows, forests, coral spikes, and other surface biomes."
,"guide.antarchy.entry.elythia.description": "Right-click a Brown Ant to teleport there directly, or sacrifice one inside a Mossy Ouranwood frame to light a permanent, reusable portal."
,"guide.antarchy.entry.elythia.description2": "Cloud Sea only forms high in the sky, and only in about one in five regions up there. Elythia Ocean is where Toreterror Arenas are found."
,"guide.antarchy.entry.flying_squirrel.title": "Flying Squirrel"
,"guide.antarchy.entry.flying_squirrel.subtitle": "Elythia companion record"
,"guide.antarchy.entry.flying_squirrel.description": "You wanna get nuts? Let’s get nuts. Flying squirrels like nuts, trees, and making a dramatic exit. Feed one to befriend it, then give it plenty of canopy to climb through. If you tell it to, it will perch on top of your head. If it falls, do not panic. It may be gliding. If you fall, you have my permission to panic."
,"guide.antarchy.entry.flying_squirrel.description": "You wanna get nuts? Let’s get nuts."
,"guide.antarchy.entry.flying_squirrel.description2": "Flying squirrels like nuts, trees, and dramatic exits. Feed one to befriend it, then give it plenty of canopy to climb through."
,"guide.antarchy.entry.flying_squirrel.description3": "It may perch on top of your head. This is adorable, but it does make looking upward needlessly complicated."
,"guide.antarchy.entry.flying_squirrel.description4": "If it falls, do not panic. It may be gliding. If you fall, you have my permission to panic."
,"guide.antarchy.disk.glimmer.title": "GLIMMER FIELD GUIDE"
,"guide.antarchy.entry.glimmer.title": "Glimmer"
,"guide.antarchy.entry.glimmer.subtitle": "Bottled companion and variant record"
,"guide.antarchy.entry.glimmer.description": "Glimmers are common around Elythia's Glimmering Pools, and rarely appear after dark in Ouranwood Forest, the Elythia Meadow, and the Peach Forest. A wild one caught in daylight away from a pool fades out."
,"guide.antarchy.entry.glimmer.description2": "Feed a wild Glimmer a Spirit Apple to tame it. An empty-handed right-click cycles it between following, wandering, and sitting."
,"guide.antarchy.entry.glimmer.description3": "A tamed Glimmer can be bottled: right-click it with an empty glass bottle to capture it, cooldowns and all. Right-click the bottle again anywhere to release it."
,"guide.antarchy.entry.glimmer.description4": "Variant depends on where it was born. Glimmering Pools produce Frogs, Ouranwood Deer, and Apple Cows. Ouranwood Forest produces Frogs and Deer. The Elythia Meadow produces Apple Cows, and the Peach Forest produces Elkas. The Ant variant is not tied to any habitat; it only appears on a random roll."
,"guide.antarchy.entry.glimmer.description5": "Apple Cow: hunger drains 25 percent slower, and it grants a burst of Saturation and Regeneration when your food runs low. Ouranwood Deer: Speed I, and it knocks back hostile mobs you sprint into."
,"guide.antarchy.entry.glimmer.description6": "Frog: Jump Boost I, and it can devour a nearby hostile mob, growing bigger and stronger for a while. Ant: slightly longer attack reach, and a solid hit on something large grants a burst of Strength II."
,"guide.antarchy.entry.glimmer.description7": "Elka: Bloodglass Ward II. When one of those ward hearts breaks, it shatters into a shockwave around you."
,"guide.antarchy.entry.cavaryn.title": "Cavaryn"
,"guide.antarchy.entry.cavaryn.subtitle": "Dimension and portal access record"
,"guide.antarchy.entry.cavaryn.description": "Cavaryn is reached through a Cavaryn portal made with a valid frame. A sacrificed Termite activates the portal. The dimension is a deep network of caves, including Glowcap, Biowart, Moleworm, Wormy, and Brooding Tunnel regions."
,"guide.antarchy.entry.cavaryn.description": "Right-click a Termite to teleport there directly, or sacrifice one inside a Myrmite frame to light a permanent, reusable portal."
,"guide.antarchy.entry.cavaryn.description2": "Staying in one spot, killing hostiles, or breaking eggs raises local mob attention. Push it far enough and a swarm finds you; moving on lets an area cool down."
,"guide.antarchy.entry.cavaryn.description3": "Glowcap, Biowart, Moleworm, Wormy, and Brooding Tunnel regions escalate differently, so which biome you are in matters as much as how long you have been there."
,"guide.antarchy.entry.thoraxis.title": "Thoraxis"
,"guide.antarchy.entry.thoraxis.subtitle": "Dimension and portal access record"
,"guide.antarchy.entry.thoraxis.description": "Thoraxis is reached through a Thoraxis portal made with a valid frame. A sacrificed Red Ant activates the portal. Its vertical progression includes Dream Dunes, Umbral Hills, Lucid Pools, and Nadir Forest."
,"guide.antarchy.entry.thoraxis.description": "Right-click a Red Ant to teleport there directly, or sacrifice one inside a Nyxite frame to light a permanent, reusable portal."
,"guide.antarchy.entry.thoraxis.description2": "Do not assume Nether rules: beds fail, respawn anchors work, the sky never lightens, and gravity flips once you cross far enough below center."
,"guide.antarchy.entry.thoraxis.description3": "Bluestone runs like Redstone's mirror image: the same wiring, but reacting the opposite way. The Vortex Lens shows it best: Redstone pulls, Bluestone pushes. Antimetal blocks reverse gravity locally and have their own rail system."
,"guide.antarchy.entry.thoraxis.description4": "Vertical progression runs Dream Dunes, Umbral Hills, Lucid Pools, and Nadir Forest, though height is a tendency, not a guaranteed layer."
,"guide.antarchy.entry.thoraxis.description5": "Dimensional tears spawn in linked pairs. Step through one and you're pulled to its twin, with your gravity flipped for a while after."
,"guide.antarchy.entry.temporal_fields.title": "Temporal Manipulation"
,"guide.antarchy.entry.temporal_fields.subtitle": "Time dilation, contraction, and Chronosphere reference"
,"guide.antarchy.entry.temporal_fields.description": "Time Dilation and Time Contraction alter the rate of affected entities. The Chronosphere enchantment creates a player-centered field at 35 percent rate; higher levels expand its radius."
,"guide.antarchy.entry.temporal_fields.description": "Time Dilation and Time Contraction change how fast affected entities experience the world."
,"guide.antarchy.entry.temporal_fields.description2": "A worn Chronosphere creates a permanent field around you at 35 percent speed. Field radius is 1.5 blocks at level 1, 2.5 at level 2, and 3.5 at level 3+; entities are affected out to twice that radius."
,"guide.antarchy.entry.temporal_fields.description3": "The effect reaches living entities, projectiles, and dropped items, and anything fired from inside a field keeps that field's speed. Overlapping fields do not stack; the slower or faster rule wins. Kings and Queens are immune to it."
,"guide.antarchy.entry.bloodglass.title": "Bloodglass"
,"guide.antarchy.entry.bloodglass.subtitle": "Reactive protection system"
,"guide.antarchy.entry.bloodglass.description": "Blood Crystal armor grants Bloodglass Hearts that block an incoming hit, shatter, and recharge. Blood Crystal Apples grant temporary Bloodglass Ward, and the Katana provides launch, dash, and crimson-trail mobility."
,"guide.antarchy.entry.bloodglass.description": "Blood Crystal armor grants Bloodglass Hearts that absorb one hit, shatter, and recharge."
,"guide.antarchy.entry.bloodglass.description2": "Each equipped piece adds one heart, and every heart recharges on its own 30-second timer. A Blood Crystal Apple grants two temporary charges lasting 2 minutes, on top of the armor's hearts."
,"guide.antarchy.entry.bloodglass.description3": "The Katana has a longer reach than it looks, a brief hit-immunity window right after each dash, and a short cooldown before it can dash again."
,"guide.antarchy.entry.vortex.title": "Vortex"
,"guide.antarchy.entry.vortex.subtitle": "Vortex Lens and Eye of the Storm reference"
,"guide.antarchy.entry.vortex.description": "Redstone power pulls entities into a Vortex Lens beam while Bluestone power blasts them away. The Eye of the Storm launches an updraft and can hurl a homing tornado that carries foes."
,"guide.antarchy.entry.vortex.description": "The Vortex Lens pulls or pushes depending on signal: Redstone pulls, Bluestone pushes."
,"guide.antarchy.entry.vortex.description2": "Signal strength scales its size: a 1.5 to 10-block pull radius, with height from 3 to 20 blocks. It deals no damage on its own."
,"guide.antarchy.entry.vortex.description3": "The Eye of the Storm launches an updraft and a homing tornado on its own trigger, unlike the Lens's signal-controlled field."
,"guide.antarchy.entry.nightmare.title": "Nightmare"
,"guide.antarchy.entry.nightmare.subtitle": "Thoraxis hostile entity record"
,"guide.antarchy.entry.nightmare.description": "A hostile entity recorded in the deepest Thoraxis regions. The recovered model is presented in monochrome archive mode."
,"guide.antarchy.entry.nightmare.description": "Recorded in the deepest Thoraxis regions."
,"guide.antarchy.entry.nightmare.description2": "Its attacks hit harder the lower your health is, so a bad fight gets worse fast."
,"guide.antarchy.entry.nightmare.description3": "Past half health it takes to the air and opens a pair of portals, stepping through one to teleport behind you and strike. Watch both portals, not just the one it disappears into."
,"guide.antarchy.entry.high_fructose_corn_syrup.title": "High Fructose Corn Syrup"
,"guide.antarchy.entry.high_fructose_corn_syrup.subtitle": "Nutritional and operational notes"
,"guide.antarchy.entry.high_fructose_corn_syrup.description": "A sweet substance of uncertain strategic value. Doctoral enthusiasm surrounding it is statistically suspicious."
,"guide.antarchy.entry.high_fructose_corn_syrup.subtitle": "Field notes on a suspiciously popular bottle"
,"guide.antarchy.entry.high_fructose_corn_syrup.description": "Brew it by adding Corn, found wild or grown as a crop, to a Water Bottle."
,"guide.antarchy.entry.high_fructose_corn_syrup.description2": "Drunk on its own, it causes four seconds of Nausea. A doctor would not recommend it."
,"guide.antarchy.entry.high_fructose_corn_syrup.description3": "Used on any food in a crafting grid, it Americanizes it: extra nutrition, extra saturation, and a burst of Regeneration."
,"guide.antarchy.entry.rainbow_ant.title": "Rainbow Ant"
,"guide.antarchy.entry.rainbow_ant.subtitle": "Entity record"
,"guide.antarchy.entry.rainbow_ant.description": "When given an activation reagent, a Rainbow Ant can open a portal to its assigned dimension."
,"guide.antarchy.entry.rainbow_ant.description": "Feed a Rainbow Ant Rainbow Sugar to assign it a destination, then interact with it again to travel there. The destination is stored on that ant, so keep it alive."
,"guide.antarchy.entry.easter_bunny.title": "Easter Bunny"
,"guide.antarchy.entry.easter_bunny.subtitle": "Entity record"
,"guide.antarchy.entry.easter_bunny.description": "Easter Bunnies periodically lay random spawn eggs."
,"guide.antarchy.entry.easter_bunny.description": "The Easter Bunny lays spawn eggs for all sorts of creatures! Life is like an easter egg, you never know what you're gonna get."
,"guide.antarchy.entry.easter_bunny.description2": "Feed them carrots, golden carrots, or dandelions."
,"guide.antarchy.entry.duplicator_tree.title": "Duplicator Tree"
,"guide.antarchy.entry.duplicator_tree.subtitle": "Block record"
,"guide.antarchy.entry.duplicator_tree.description": "Duplicator Trees copy nearby eligible blocks into open spaces around them."
,"guide.antarchy.entry.duplicator_tree.description": "A mature Duplicator Tree copies a nearby solid block into an empty, supported space next to it."
,"guide.antarchy.entry.duplicator_tree.description2": "Fluids, block entities, and other Duplicator Tree blocks will not copy, and duplication happens occasionally, not on a fixed timer."
,"guide.antarchy.disk.kraken.title": "KRAKEN SIGHTING NOTES"
,"guide.antarchy.entry.kraken.title": "Kraken"
,"guide.antarchy.entry.kraken.subtitle": "Overworld aquatic encounter"
,"guide.antarchy.entry.kraken.description": "Search open Overworld waters; the Kraken can only spawn in water. Some encounters require Bad Omen."
,"guide.antarchy.entry.kraken.description": "Kill a Squid while under Bad Omen to summon a Kraken where it died. Higher Bad Omen levels raise the odds."
,"guide.antarchy.entry.kraken.description2": "It only spawns in open water, so pick your fight where it can actually surface."
,"guide.antarchy.disk.king.title": "KING'S TREE FIELD NOTES"
,"guide.antarchy.entry.king.title": "King"
,"guide.antarchy.entry.king.subtitle": "Elythia royal entity record"
,"guide.antarchy.entry.king.description": "Seek the massive King's Tree in Elythia. The King spawns near its center and patrols the surrounding area."
,"guide.antarchy.entry.king.description": "Find the massive King's Tree in Elythia. The King spawns and patrols near it."
,"guide.antarchy.entry.king.description2": "Mid-fight he issues a decree, such as KNEEL, COME NO CLOSER, or SHOW NO MERCY. Obey quickly."
,"guide.antarchy.entry.king.description3": "Breaking a decree halves your hearts for 30 seconds and calls down his judgment."
,"guide.antarchy.disk.queen.title": "QUEEN HAVOC TRAIL NOTES"
,"guide.antarchy.entry.queen.title": "Queen"
,"guide.antarchy.entry.queen.subtitle": "Thoraxis royal entity record"
,"guide.antarchy.entry.queen.description": "Follow a Queen Havoc Trail through Thoraxis's underside to its chamber; the Queen appears when you approach."
,"guide.antarchy.entry.queen.description": "Follow a Queen Havoc Trail through Thoraxis's underside to find her chamber."
,"guide.antarchy.entry.queen.description2": "She fights with gravity: a ground stomp with an expanding shockwave, black holes that pull you toward their center, and a crushing field that pins you along the current gravity direction."
,"guide.antarchy.entry.queen.description3": "In her final phase she also casts her own time dilation field, slowing anyone caught inside it."
,"guide.antarchy.entry.prince.title": "Prince"
,"guide.antarchy.entry.prince.subtitle": "Royal mount record"
,"guide.antarchy.entry.prince.description": "Prince Eggs hatch into small Princes that grow when fed golden items; they can be tamed, saddled to fly, fire elemental bolts, and command nearby hostile mobs."
,"guide.antarchy.entry.prince.description": "Prince Eggs hatch into small Princes that grow when fed golden items."
,"guide.antarchy.entry.prince.description2": "A grown Prince can be tamed and saddled for flight, fires elemental bolts at your enemies, and can command nearby hostile mobs. Feed responsibly; you are raising a small flying warlord."
,"guide.antarchy.entry.princess.title": "Princess"
,"guide.antarchy.entry.princess.subtitle": "Royal mount record"
,"guide.antarchy.entry.princess.description": "Princess Eggs hatch into small Princesses that grow when fed golden items; they can be tamed, saddled to fly, fire elemental bolts, and create time-dilation fields around enemies."
,"guide.antarchy.entry.princess.description": "Princess Eggs hatch into small Princesses that grow when fed golden items."
,"guide.antarchy.entry.princess.description2": "A grown Princess can be tamed and saddled for flight, fires elemental bolts, and creates time-dilation fields around enemies."
,"subtitles.antarchy.hoverboard_mount": "Hoverboard starts"
,"subtitles.antarchy.hoverboard_dismount": "Hoverboard stops"
,"subtitles.antarchy.hoverboard_idle": "Hoverboard hums"
@@ -4,9 +4,7 @@
"kill_horde_common": {
"conditions": {
"entity": {
"type": {
"tag": "antarchy:horde_common"
}
"type": "#antarchy:horde_common"
},
"player": [
{
@@ -1,5 +0,0 @@
{
"category": "antarchy:general",
"title": "guide.antarchy.disk.antman_game.title",
"entries": []
}
@@ -0,0 +1,5 @@
{
"category": "antarchy:elythia",
"title": "guide.antarchy.disk.glimmer.title",
"entries": ["antarchy:glimmer"]
}
@@ -3,6 +3,6 @@
"category": "thoraxis",
"title": "guide.antarchy.entry.bloodglass.title",
"subtitle": "guide.antarchy.entry.bloodglass.subtitle",
"description": ["guide.antarchy.entry.bloodglass.description"],
"description": ["guide.antarchy.entry.bloodglass.description", "guide.antarchy.entry.bloodglass.description2", "guide.antarchy.entry.bloodglass.description3"],
"cover_item": "antarchy:blood_crystal_shard"
}
@@ -3,7 +3,7 @@
"category": "cavaryn",
"title": "guide.antarchy.entry.cavaryn.title",
"subtitle": "guide.antarchy.entry.cavaryn.subtitle",
"description": ["guide.antarchy.entry.cavaryn.description"],
"description": ["guide.antarchy.entry.cavaryn.description", "guide.antarchy.entry.cavaryn.description2", "guide.antarchy.entry.cavaryn.description3"],
"cover_entity": "antarchy:termite",
"rotation": 45,
"dimension": "antarchy:cavaryn"
@@ -3,6 +3,6 @@
"category": "general",
"title": "guide.antarchy.entry.duplicator_tree.title",
"subtitle": "guide.antarchy.entry.duplicator_tree.subtitle",
"description": ["guide.antarchy.entry.duplicator_tree.description"],
"description": ["guide.antarchy.entry.duplicator_tree.description", "guide.antarchy.entry.duplicator_tree.description2"],
"cover_item": "antarchy:duplicator_log"
}
@@ -3,7 +3,7 @@
"category": "general",
"title": "guide.antarchy.entry.easter_bunny.title",
"subtitle": "guide.antarchy.entry.easter_bunny.subtitle",
"description": ["guide.antarchy.entry.easter_bunny.description"],
"description": ["guide.antarchy.entry.easter_bunny.description", "guide.antarchy.entry.easter_bunny.description2"],
"entity": "antarchy:easter_bunny",
"cover_entity": "antarchy:easter_bunny",
"rotation": 45
@@ -3,7 +3,7 @@
"category": "elythia",
"title": "guide.antarchy.entry.elythia.title",
"subtitle": "guide.antarchy.entry.elythia.subtitle",
"description": ["guide.antarchy.entry.elythia.description"],
"description": ["guide.antarchy.entry.elythia.description", "guide.antarchy.entry.elythia.description2"],
"cover_entity": "antarchy:brown_ant",
"rotation": 45,
"dimension": "antarchy:elythia"
@@ -3,7 +3,7 @@
"category": "elythia",
"title": "guide.antarchy.entry.flying_squirrel.title",
"subtitle": "guide.antarchy.entry.flying_squirrel.subtitle",
"description": ["guide.antarchy.entry.flying_squirrel.description"],
"description": ["guide.antarchy.entry.flying_squirrel.description", "guide.antarchy.entry.flying_squirrel.description2", "guide.antarchy.entry.flying_squirrel.description3", "guide.antarchy.entry.flying_squirrel.description4"],
"entity": "antarchy:flying_squirrel",
"rotation": 45,
"render_scale": 0.8
@@ -0,0 +1,10 @@
{
"type": "mob",
"category": "elythia",
"title": "guide.antarchy.entry.glimmer.title",
"subtitle": "guide.antarchy.entry.glimmer.subtitle",
"description": ["guide.antarchy.entry.glimmer.description", "guide.antarchy.entry.glimmer.description2", "guide.antarchy.entry.glimmer.description3", "guide.antarchy.entry.glimmer.description4", "guide.antarchy.entry.glimmer.description5", "guide.antarchy.entry.glimmer.description6", "guide.antarchy.entry.glimmer.description7"],
"entity": "antarchy:glimmer",
"rotation": 45,
"render_scale": 0.8
}
@@ -3,6 +3,6 @@
"category": "general",
"title": "guide.antarchy.entry.high_fructose_corn_syrup.title",
"subtitle": "guide.antarchy.entry.high_fructose_corn_syrup.subtitle",
"description": ["guide.antarchy.entry.high_fructose_corn_syrup.description"],
"description": ["guide.antarchy.entry.high_fructose_corn_syrup.description", "guide.antarchy.entry.high_fructose_corn_syrup.description2", "guide.antarchy.entry.high_fructose_corn_syrup.description3"],
"cover_item": "antarchy:high_fructose_corn_syrup"
}
@@ -3,7 +3,7 @@
"category": "elythia",
"title": "guide.antarchy.entry.king.title",
"subtitle": "guide.antarchy.entry.king.subtitle",
"description": ["guide.antarchy.entry.king.description"],
"description": ["guide.antarchy.entry.king.description", "guide.antarchy.entry.king.description2", "guide.antarchy.entry.king.description3"],
"entity": "antarchy:king",
"cover_entity": "antarchy:king",
"rotation": 45,
@@ -3,7 +3,7 @@
"category": "general",
"title": "guide.antarchy.entry.kraken.title",
"subtitle": "guide.antarchy.entry.kraken.subtitle",
"description": ["guide.antarchy.entry.kraken.description"],
"description": ["guide.antarchy.entry.kraken.description", "guide.antarchy.entry.kraken.description2"],
"entity": "antarchy:kraken",
"cover_entity": "antarchy:kraken",
"render_scale": 0.5
@@ -3,6 +3,6 @@
"category": "thoraxis",
"title": "guide.antarchy.entry.nightmare.title",
"subtitle": "guide.antarchy.entry.nightmare.subtitle",
"description": ["guide.antarchy.entry.nightmare.description"],
"description": ["guide.antarchy.entry.nightmare.description", "guide.antarchy.entry.nightmare.description2", "guide.antarchy.entry.nightmare.description3"],
"entity": "antarchy:nightmare"
}
@@ -3,7 +3,7 @@
"category": "elythia",
"title": "guide.antarchy.entry.prince.title",
"subtitle": "guide.antarchy.entry.prince.subtitle",
"description": ["guide.antarchy.entry.prince.description"],
"description": ["guide.antarchy.entry.prince.description", "guide.antarchy.entry.prince.description2"],
"entity": "antarchy:prince",
"cover_entity": "antarchy:prince",
"rotation": 45
@@ -3,7 +3,7 @@
"category": "thoraxis",
"title": "guide.antarchy.entry.princess.title",
"subtitle": "guide.antarchy.entry.princess.subtitle",
"description": ["guide.antarchy.entry.princess.description"],
"description": ["guide.antarchy.entry.princess.description", "guide.antarchy.entry.princess.description2"],
"entity": "antarchy:princess",
"cover_entity": "antarchy:princess",
"rotation": 45
@@ -3,7 +3,7 @@
"category": "thoraxis",
"title": "guide.antarchy.entry.queen.title",
"subtitle": "guide.antarchy.entry.queen.subtitle",
"description": ["guide.antarchy.entry.queen.description"],
"description": ["guide.antarchy.entry.queen.description", "guide.antarchy.entry.queen.description2", "guide.antarchy.entry.queen.description3"],
"entity": "antarchy:queen",
"cover_entity": "antarchy:queen",
"rotation": 45,
@@ -3,6 +3,6 @@
"category": "thoraxis",
"title": "guide.antarchy.entry.temporal_fields.title",
"subtitle": "guide.antarchy.entry.temporal_fields.subtitle",
"description": ["guide.antarchy.entry.temporal_fields.description"],
"description": ["guide.antarchy.entry.temporal_fields.description", "guide.antarchy.entry.temporal_fields.description2", "guide.antarchy.entry.temporal_fields.description3"],
"cover_potion": "antarchy:time_dilation"
}
@@ -3,7 +3,7 @@
"category": "thoraxis",
"title": "guide.antarchy.entry.thoraxis.title",
"subtitle": "guide.antarchy.entry.thoraxis.subtitle",
"description": ["guide.antarchy.entry.thoraxis.description"],
"description": ["guide.antarchy.entry.thoraxis.description", "guide.antarchy.entry.thoraxis.description2", "guide.antarchy.entry.thoraxis.description3", "guide.antarchy.entry.thoraxis.description4", "guide.antarchy.entry.thoraxis.description5"],
"cover_entity": "antarchy:red_ant",
"rotation": 45,
"dimension": "antarchy:thoraxis"
@@ -3,7 +3,7 @@
"category": "elythia",
"title": "guide.antarchy.entry.toreterror.title",
"subtitle": "guide.antarchy.entry.toreterror_arena.subtitle",
"description": ["guide.antarchy.entry.toreterror_arena.description"],
"description": ["guide.antarchy.entry.toreterror_arena.description", "guide.antarchy.entry.toreterror_arena.description2"],
"entity": "antarchy:toreterror",
"structure": "antarchy:toreterror_arena",
"structure_tag": "antarchy:toreterror_arena_locator",
@@ -3,7 +3,7 @@
"category": "thoraxis",
"title": "guide.antarchy.entry.vortex.title",
"subtitle": "guide.antarchy.entry.vortex.subtitle",
"description": ["guide.antarchy.entry.vortex.description"],
"description": ["guide.antarchy.entry.vortex.description", "guide.antarchy.entry.vortex.description2", "guide.antarchy.entry.vortex.description3"],
"cover_entity": "antarchy:vortex",
"render_scale": 0.8
}
@@ -1,5 +1,5 @@
{
"ultrawarm": true,
"ultrawarm": false,
"natural": false,
"coordinate_scale": 64.0,
"bed_works": false,
@@ -0,0 +1,15 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"entries": [
{
"type": "minecraft:item",
"name": "antarchy:ant_trap"
}
]
}
],
"random_sequence": "antarchy:blocks/ant_trap"
}
@@ -148,6 +148,32 @@
}
}
]
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 4,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 4,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:glimmer"
}
}
]
}
],
"rolls": {
@@ -47,6 +47,32 @@
}
]
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 3,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 3,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:glimmer"
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:diamond",
@@ -192,6 +192,19 @@
],
"name": "antarchy:titanium_nugget",
"weight": 4
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 5,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -93,6 +93,19 @@
],
"name": "minecraft:diamond",
"weight": 12
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 6,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -8,5 +8,9 @@
{"type":"minecraft:item","name":"antarchy:blood_crystal_apple","weight":20,"functions":[{"function":"minecraft:set_count","count":{"type":"minecraft:uniform","min":1,"max":3}}]},
{"type":"minecraft:item","name":"antarchy:lucid_pearl","weight":4},{"type":"minecraft:item","name":"minecraft:golden_apple","weight":5},
{"type":"minecraft:item","name":"minecraft:potion","weight":8,"functions":[{"function":"minecraft:set_potion","id":"antarchy:inversion"}]},{"type":"minecraft:item","name":"minecraft:tipped_arrow","weight":8,"functions":[{"function":"minecraft:set_count","count":{"type":"minecraft:uniform","min":4,"max":12}},{"function":"minecraft:set_potion","id":"antarchy:inversion"}]},
{"type":"minecraft:item","name":"minecraft:book","weight":10,"functions":[{"function":"minecraft:enchant_randomly","options":["minecraft:mending","minecraft:unbreaking","minecraft:protection","minecraft:efficiency"]}]}
{"type":"minecraft:item","name":"minecraft:book","weight":10,"functions":[{"function":"minecraft:enchant_randomly","options":["minecraft:mending","minecraft:unbreaking","minecraft:protection","minecraft:efficiency"]}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":4,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:thoraxis"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":3,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:temporal_fields"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":3,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:bloodglass"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":3,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:vortex"}}]}
]}],"random_sequence":"antarchy:chests/queen_castle/generic"}
@@ -8,5 +8,9 @@
{"type":"minecraft:item","name":"antarchy:potent_nyxite","weight":4},{"type":"minecraft:item","name":"minecraft:enchanted_golden_apple","weight":2},
{"type":"minecraft:item","name":"minecraft:book","weight":14,"functions":[{"function":"minecraft:enchant_randomly","options":["minecraft:mending","minecraft:unbreaking","minecraft:protection","minecraft:efficiency","minecraft:fortune"]}]},
{"type":"minecraft:item","name":"minecraft:potion","weight":8,"functions":[{"function":"minecraft:set_potion","id":"antarchy:inversion"}]},{"type":"minecraft:item","name":"minecraft:tipped_arrow","weight":8,"functions":[{"function":"minecraft:set_count","count":{"type":"minecraft:uniform","min":6,"max":16}},{"function":"minecraft:set_potion","id":"antarchy:inversion"}]},
{"type":"minecraft:item","name":"antarchy:titanium_ingot","weight":1},{"type":"minecraft:item","name":"antarchy:uranium_ingot","weight":1}
{"type":"minecraft:item","name":"antarchy:titanium_ingot","weight":1},{"type":"minecraft:item","name":"antarchy:uranium_ingot","weight":1},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":3,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:thoraxis"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":2,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:temporal_fields"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":2,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:bloodglass"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":2,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:vortex"}}]}
]}],"random_sequence":"antarchy:chests/queen_castle/treasure"}
@@ -224,6 +224,19 @@
}
}
]
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 5,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -227,6 +227,19 @@
}
}
]
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 5,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -212,6 +212,19 @@
}
}
]
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 5,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -163,6 +163,19 @@
"type": "minecraft:item",
"name": "minecraft:golden_apple",
"weight": 3
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 5,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -158,6 +158,19 @@
"type": "minecraft:item",
"name": "minecraft:golden_apple",
"weight": 4
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 5,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -118,6 +118,19 @@
"type": "minecraft:item",
"name": "antarchy:fallen_king_crown",
"weight": 2
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 5,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -154,6 +154,19 @@
}
}
]
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 4,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:cavaryn"
}
}
]
}
]
}
@@ -436,6 +436,19 @@
"type": "minecraft:item",
"name": "antarchy:mud_pie",
"weight": 4
},
{
"type": "minecraft:item",
"name": "antos:floppy_disk",
"weight": 4,
"functions": [
{
"function": "minecraft:set_components",
"components": {
"antos:floppy_disk": "antarchy:elythia"
}
}
]
}
],
"rolls": {
@@ -10,5 +10,9 @@
{"type":"minecraft:item","name":"minecraft:tipped_arrow","weight":7,"functions":[{"function":"minecraft:set_count","count":{"type":"minecraft:uniform","min":4,"max":10}},{"function":"minecraft:set_potion","id":"antarchy:inversion"}]},
{"type":"minecraft:item","name":"minecraft:potion","weight":6,"functions":[{"function":"minecraft:set_potion","id":"antarchy:time_contraction"}]},
{"type":"minecraft:item","name":"minecraft:potion","weight":6,"functions":[{"function":"minecraft:set_potion","id":"antarchy:time_dilation"}]},
{"type":"minecraft:item","name":"antarchy:titanium_ingot","weight":1},{"type":"minecraft:item","name":"antarchy:uranium_ingot","weight":1}
{"type":"minecraft:item","name":"antarchy:titanium_ingot","weight":1},{"type":"minecraft:item","name":"antarchy:uranium_ingot","weight":1},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":3,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:thoraxis"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":2,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:temporal_fields"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":2,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:bloodglass"}}]},
{"type":"minecraft:item","name":"antos:floppy_disk","weight":2,"functions":[{"function":"minecraft:set_components","components":{"antos:floppy_disk":"antarchy:vortex"}}]}
]}],"random_sequence":"antarchy:chests/underside_ruins/treasure"}
@@ -0,0 +1,19 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"IGI",
" I "
],
"key": {
"I": {
"item": "minecraft:iron_nugget"
},
"G": {
"item": "antarchy:flytrap_goo"
}
},
"result": {
"id": "antarchy:bug_spray",
"count": 1
}
}
@@ -51,6 +51,7 @@
"antarchy:bluestone_ore",
"antarchy:thoraxis_ichor_lake",
"antarchy:thoraxis_transition_throat",
"antarchy:thoraxis_transition_throat_large",
"antarchy:dimensional_tears"
],
[],
@@ -1,4 +1,6 @@
{
"type": "antarchy:thoraxis_transition_throat",
"config": {}
"config": {
"large": false
}
}
@@ -0,0 +1,6 @@
{
"type": "antarchy:thoraxis_transition_throat",
"config": {
"large": true
}
}
@@ -0,0 +1,24 @@
{
"feature": "antarchy:thoraxis_transition_throat_large",
"placement": [
{
"type": "minecraft:rarity_filter",
"chance": 640
},
{
"type": "minecraft:in_square"
},
{
"type": "minecraft:height_range",
"height": {
"type": "minecraft:constant",
"value": {
"absolute": 0
}
}
},
{
"type": "minecraft:biome"
}
]
}
@@ -6,7 +6,7 @@
"allowed_terrain_height_range": 14,
"valid_biome_radius_check": 1,
"biomes": "#antarchy:has_structure/tigers_eye_shrine_biomes",
"step": "surface_structures",
"step": "underground_structures",
"enhanced_terrain_adaptation": {
"type": "integrated_api:none"
},
@@ -26,7 +26,7 @@
"max_roof_search_distance": 256,
"min_roof_thickness": 3,
"min_open_space_below": 16,
"ceiling_offset": 0,
"ceiling_offset": -1,
"spawn_overrides": {},
"liquid_settings": "ignore_waterlogging"
}
@@ -26,7 +26,7 @@
"max_roof_search_distance": 256,
"min_roof_thickness": 3,
"min_open_space_below": 16,
"ceiling_offset": 0,
"ceiling_offset": -1,
"spawn_overrides": {},
"liquid_settings": "ignore_waterlogging"
}
@@ -9,6 +9,6 @@
"salt": 149275031,
"spacing": 24,
"separation": 16,
"type": "integrated_api:advanced_random_spread"
"type": "minecraft:random_spread"
}
}
@@ -1 +1 @@
{"replace":false,"values":["antarchy:pest_control"]}
{"replace":false,"values":["antarchy:pest_control","antarchy:computer"]}
@@ -0,0 +1,7 @@
{
"amplitudes": [
1.0,
1.0
],
"firstOctave": -7
}
@@ -0,0 +1,7 @@
{
"amplitudes": [
1.0,
1.0
],
"firstOctave": -7
}