big king and queen dev

This commit is contained in:
craisinlord committed 2026-09-07 21:56:21 -05:00
1 parent d34830a99b
commit 68eba61022
169 files changed
+4897 -1060

No files matched your search

@@ -152,6 +152,8 @@ public final class AntarchyConfigModuleNeoforge {
AntarchySettings.setQueenBeamDamage(AntarchyMobsConfig.queenBeamDamage());
AntarchySettings.setQueenBeamRange(AntarchyMobsConfig.queenBeamRange());
AntarchySettings.setQueenBeamDurationTicks(AntarchyMobsConfig.queenBeamDurationTicks());
AntarchySettings.setQueenBeamWindupTicks(AntarchyMobsConfig.queenBeamWindupTicks());
AntarchySettings.setQueenBeamTravelTicks(AntarchyMobsConfig.queenBeamTravelTicks());
AntarchySettings.setQueenBeamCooldownTicks(AntarchyMobsConfig.queenBeamCooldownTicks());
AntarchySettings.setQueenBeamTracking(AntarchyMobsConfig.queenBeamTracking());
AntarchySettings.setQueenBeamTerrainRadius(AntarchyMobsConfig.queenBeamTerrainRadius());
@@ -159,11 +161,30 @@ public final class AntarchyConfigModuleNeoforge {
AntarchySettings.setKingBeamDamage(AntarchyMobsConfig.kingBeamDamage());
AntarchySettings.setKingBeamRange(AntarchyMobsConfig.kingBeamRange());
AntarchySettings.setKingBeamDurationTicks(AntarchyMobsConfig.kingBeamDurationTicks());
AntarchySettings.setKingBeamWindupTicks(AntarchyMobsConfig.kingBeamWindupTicks());
AntarchySettings.setKingBeamTravelTicks(AntarchyMobsConfig.kingBeamTravelTicks());
AntarchySettings.setKingBeamCooldownTicks(AntarchyMobsConfig.kingBeamCooldownTicks());
AntarchySettings.setKingBeamTracking(AntarchyMobsConfig.kingBeamTracking());
AntarchySettings.setKingBeamTerrainRadius(AntarchyMobsConfig.kingBeamTerrainRadius());
AntarchySettings.setKingBeamTerrainCap(AntarchyMobsConfig.kingBeamTerrainCap());
AntarchySettings.setRoyalDecreeCooldownTicks(AntarchyMobsConfig.royalDecreeCooldownTicks());
AntarchySettings.setQueenBlackHoleRadius(AntarchyMobsConfig.queenBlackHoleRadius());
AntarchySettings.setQueenBlackHoleActiveTicks(AntarchyMobsConfig.queenBlackHoleActiveTicks());
AntarchySettings.setQueenBlackHolePullStrength(AntarchyMobsConfig.queenBlackHolePullStrength());
AntarchySettings.setQueenFinalTimeFieldRadius(AntarchyMobsConfig.queenFinalTimeFieldRadius());
AntarchySettings.setQueenFinalTimeFieldRate(AntarchyMobsConfig.queenFinalTimeFieldRate());
AntarchySettings.setQueenFinalTimeFieldDurationTicks(AntarchyMobsConfig.queenFinalTimeFieldDurationTicks());
AntarchySettings.setQueenFinalTimeFieldCooldownTicks(AntarchyMobsConfig.queenFinalTimeFieldCooldownTicks());
AntarchySettings.setKingFireballDamage(AntarchyMobsConfig.kingFireballDamage());
AntarchySettings.setKingFireballRadius(AntarchyMobsConfig.kingFireballRadius());
AntarchySettings.setKingFireballCooldownTicks(AntarchyMobsConfig.kingFireballCooldownTicks());
AntarchySettings.setKingIceballDamage(AntarchyMobsConfig.kingIceballDamage());
AntarchySettings.setKingIceballRadius(AntarchyMobsConfig.kingIceballRadius());
AntarchySettings.setKingIceballCooldownTicks(AntarchyMobsConfig.kingIceballCooldownTicks());
AntarchySettings.setKingIceSpikeDamage(AntarchyMobsConfig.kingIceSpikeDamage());
AntarchySettings.setKingIceSpikeCooldownTicks(AntarchyMobsConfig.kingIceSpikeCooldownTicks());
AntarchySettings.setKingElementalTerrainCap(AntarchyMobsConfig.kingElementalTerrainCap());
AntarchySettings.setRoyalBossSoundVolume(AntarchyMobsConfig.royalBossSoundVolume());
AntarchySettings.setRoyalEggHatchChance(AntarchyMobsConfig.royalEggHatchChance());
AntarchySettings.setRoyalBoltDamage(AntarchyMobsConfig.royalBoltDamage());
@@ -125,10 +125,17 @@ public final class AntarchyMobsConfig {
private static final ModConfigSpec.DoubleValue ROYAL_BOSS_BITE_DAMAGE_MULTIPLIER;
private static final ModConfigSpec.IntValue ROYAL_BOSS_BITE_COOLDOWN_TICKS;
private static final ModConfigSpec.DoubleValue QUEEN_BEAM_DAMAGE, QUEEN_BEAM_RANGE, QUEEN_BEAM_TRACKING, QUEEN_BEAM_TERRAIN_RADIUS;
private static final ModConfigSpec.IntValue QUEEN_BEAM_DURATION_TICKS, QUEEN_BEAM_COOLDOWN_TICKS, QUEEN_BEAM_TERRAIN_CAP;
private static final ModConfigSpec.IntValue QUEEN_BEAM_DURATION_TICKS, QUEEN_BEAM_WINDUP_TICKS, QUEEN_BEAM_TRAVEL_TICKS, QUEEN_BEAM_COOLDOWN_TICKS, QUEEN_BEAM_TERRAIN_CAP;
private static final ModConfigSpec.DoubleValue KING_BEAM_DAMAGE, KING_BEAM_RANGE, KING_BEAM_TRACKING, KING_BEAM_TERRAIN_RADIUS;
private static final ModConfigSpec.IntValue KING_BEAM_DURATION_TICKS, KING_BEAM_COOLDOWN_TICKS, KING_BEAM_TERRAIN_CAP;
private static final ModConfigSpec.IntValue KING_BEAM_DURATION_TICKS, KING_BEAM_WINDUP_TICKS, KING_BEAM_TRAVEL_TICKS, KING_BEAM_COOLDOWN_TICKS, KING_BEAM_TERRAIN_CAP;
private static final ModConfigSpec.IntValue ROYAL_DECREE_COOLDOWN_TICKS;
private static final ModConfigSpec.DoubleValue QUEEN_BLACK_HOLE_RADIUS, QUEEN_BLACK_HOLE_PULL_STRENGTH,
QUEEN_FINAL_TIME_FIELD_RADIUS, QUEEN_FINAL_TIME_FIELD_RATE;
private static final ModConfigSpec.IntValue QUEEN_BLACK_HOLE_ACTIVE_TICKS,
QUEEN_FINAL_TIME_FIELD_DURATION_TICKS, QUEEN_FINAL_TIME_FIELD_COOLDOWN_TICKS;
private static final ModConfigSpec.DoubleValue ROYAL_BOSS_SOUND_VOLUME;
private static final ModConfigSpec.DoubleValue KING_FIREBALL_DAMAGE, KING_FIREBALL_RADIUS, KING_ICEBALL_DAMAGE, KING_ICEBALL_RADIUS, KING_ICE_SPIKE_DAMAGE;
private static final ModConfigSpec.IntValue KING_FIREBALL_COOLDOWN_TICKS, KING_ICEBALL_COOLDOWN_TICKS, KING_ICE_SPIKE_COOLDOWN_TICKS, KING_ELEMENTAL_TERRAIN_CAP;
// Royal mounts
@@ -579,6 +586,8 @@ public final class AntarchyMobsConfig {
QUEEN_BEAM_DAMAGE = b.defineInRange("queenBeamDamage", 45.0D, 0.0D, 1024.0D);
QUEEN_BEAM_RANGE = b.defineInRange("queenBeamRange", 100.0D, 1.0D, 256.0D);
QUEEN_BEAM_DURATION_TICKS = b.defineInRange("queenBeamDurationTicks", 30, 1, 1200);
QUEEN_BEAM_WINDUP_TICKS = b.comment("Charge time before the Queen beam actually fires.").defineInRange("queenBeamWindupTicks", 20, 0, 1200);
QUEEN_BEAM_TRAVEL_TICKS = b.comment("Time for the Queen beam to extend from its head to its committed range.").defineInRange("queenBeamTravelTicks", 12, 1, 1200);
QUEEN_BEAM_COOLDOWN_TICKS = b.defineInRange("queenBeamCooldownTicks", 90, 1, 2400);
QUEEN_BEAM_TRACKING = b.defineInRange("queenBeamTracking", 0.1D, 0.0D, 1.0D);
QUEEN_BEAM_TERRAIN_RADIUS = b.defineInRange("queenBeamTerrainRadius", 5.0D, 0.0D, 32.0D);
@@ -586,11 +595,30 @@ public final class AntarchyMobsConfig {
KING_BEAM_DAMAGE = b.defineInRange("kingBeamDamage", 50.0D, 0.0D, 1024.0D);
KING_BEAM_RANGE = b.defineInRange("kingBeamRange", 100.0D, 1.0D, 256.0D);
KING_BEAM_DURATION_TICKS = b.defineInRange("kingBeamDurationTicks", 30, 1, 1200);
KING_BEAM_WINDUP_TICKS = b.comment("Charge time before the King beam actually fires.").defineInRange("kingBeamWindupTicks", 20, 0, 1200);
KING_BEAM_TRAVEL_TICKS = b.comment("Time for the King beam to extend from its head to its committed range.").defineInRange("kingBeamTravelTicks", 12, 1, 1200);
KING_BEAM_COOLDOWN_TICKS = b.defineInRange("kingBeamCooldownTicks", 90, 1, 2400);
KING_BEAM_TRACKING = b.defineInRange("kingBeamTracking", 0.1D, 0.0D, 1.0D);
KING_BEAM_TERRAIN_RADIUS = b.defineInRange("kingBeamTerrainRadius", 5.0D, 0.0D, 32.0D);
KING_BEAM_TERRAIN_CAP = b.defineInRange("kingBeamTerrainCap", 192, 0, 4096);
ROYAL_DECREE_COOLDOWN_TICKS = b.comment("Cooldown in ticks between the end of one King decree and the next.").defineInRange("royalDecreeCooldownTicks", 1200, 1, 72000);
QUEEN_BLACK_HOLE_RADIUS = b.defineInRange("queenBlackHoleRadius", 14.0D, 1.0D, 64.0D);
QUEEN_BLACK_HOLE_ACTIVE_TICKS = b.defineInRange("queenBlackHoleActiveTicks", 120, 20, 1200);
QUEEN_BLACK_HOLE_PULL_STRENGTH = b.defineInRange("queenBlackHolePullStrength", 0.16D, 0.0D, 2.0D);
QUEEN_FINAL_TIME_FIELD_RADIUS = b.defineInRange("queenFinalTimeFieldRadius", 20.0D, 1.0D, 64.0D);
QUEEN_FINAL_TIME_FIELD_RATE = b.defineInRange("queenFinalTimeFieldRate", 0.05D, 0.05D, 1.0D);
QUEEN_FINAL_TIME_FIELD_DURATION_TICKS = b.defineInRange("queenFinalTimeFieldDurationTicks", 45, 1, 1200);
QUEEN_FINAL_TIME_FIELD_COOLDOWN_TICKS = b.defineInRange("queenFinalTimeFieldCooldownTicks", 80, 1, 2400);
KING_FIREBALL_DAMAGE = b.defineInRange("kingFireballDamage", 32.0D, 0.0D, 1024.0D);
KING_FIREBALL_RADIUS = b.defineInRange("kingFireballRadius", 4.5D, 0.5D, 32.0D);
KING_FIREBALL_COOLDOWN_TICKS = b.defineInRange("kingFireballCooldownTicks", 150, 1, 2400);
KING_ICEBALL_DAMAGE = b.defineInRange("kingIceballDamage", 18.0D, 0.0D, 1024.0D);
KING_ICEBALL_RADIUS = b.defineInRange("kingIceballRadius", 5.0D, 0.5D, 32.0D);
KING_ICEBALL_COOLDOWN_TICKS = b.defineInRange("kingIceballCooldownTicks", 190, 1, 2400);
KING_ICE_SPIKE_DAMAGE = b.defineInRange("kingIceSpikeDamage", 24.0D, 0.0D, 1024.0D);
KING_ICE_SPIKE_COOLDOWN_TICKS = b.defineInRange("kingIceSpikeCooldownTicks", 240, 1, 2400);
KING_ELEMENTAL_TERRAIN_CAP = b.defineInRange("kingElementalTerrainCap", 256, 0, 4096);
ROYAL_BOSS_SOUND_VOLUME = b.comment("Volume multiplier for large King and Queen presence, movement, and attack sounds.").defineInRange("royalBossSoundVolume", 4.5D, 0.5D, 16.0D);
b.pop();
b.push("royalMounts");
@@ -726,8 +754,8 @@ public final class AntarchyMobsConfig {
b.push("dimensionalTear");
DIMENSIONAL_TEAR_LIFETIME_TICKS = b.comment("Ticks before naturally generated linked Dimensional Tears collapse.").defineInRange("lifetimeTicks", 24000, 1200, 240000);
DIMENSIONAL_TEAR_INVERTED_DURATION_TICKS = b.comment("Ticks of Inverted applied to living entities exiting a Dimensional Tear.").defineInRange("invertedDurationTicks", 2400, 0, 240000);
DIMENSIONAL_TEAR_EMERGENCE_MIN_INTERVAL_TICKS = b.comment("Minimum ticks between Nightmare/Lucid emergence events per tear.").defineInRange("emergenceMinIntervalTicks", 2400, 20, 240000);
DIMENSIONAL_TEAR_EMERGENCE_MAX_INTERVAL_TICKS = b.comment("Maximum ticks between Nightmare/Lucid emergence events per tear.").defineInRange("emergenceMaxIntervalTicks", 7200, 20, 240000);
DIMENSIONAL_TEAR_EMERGENCE_MIN_INTERVAL_TICKS = b.comment("Minimum ticks between Nightmare/Lucid emergence events per tear.").defineInRange("emergenceMinIntervalTicks", 400, 20, 240000);
DIMENSIONAL_TEAR_EMERGENCE_MAX_INTERVAL_TICKS = b.comment("Maximum ticks between Nightmare/Lucid emergence events per tear.").defineInRange("emergenceMaxIntervalTicks", 1200, 20, 240000);
DIMENSIONAL_TEAR_LUCID_EVENT_CHANCE = b.comment("Chance that an emergence event spawns a Lucid instead of a Nightmare.").defineInRange("lucidEventChance", 0.65D, 0.0D, 1.0D);
b.pop();
@@ -787,7 +815,7 @@ public final class AntarchyMobsConfig {
VORTEX_MOVEMENT_SPEED = b.comment("Base movement speed.").defineInRange("movementSpeed", 0.22D, 0.0D, 10.0D);
VORTEX_FLYING_SPEED = b.comment("Base flying speed.").defineInRange("flyingSpeed", 0.35D, 0.0D, 10.0D);
VORTEX_MAX_ACTIVE_VORTEXES = b.comment("Maximum damaging wind vortexes one Vortex mob can maintain at once.").defineInRange("maxActiveVortexes", 3, 0, 32);
WIND_VORTEX_DURATION_TICKS = b.comment("Lifetime in ticks for wind vortexes spawned by Vortex charges or Vortex mobs.").defineInRange("windVortexDurationTicks", 140, 1, 1200);
WIND_VORTEX_DURATION_TICKS = b.comment("Lifetime in ticks for wind vortexes spawned by Vortex charges or Vortex mobs.").defineInRange("windVortexDurationTicks", 240, 1, 1200);
WIND_VORTEX_PULL_STRENGTH = b.comment("How strongly wind vortexes pull entities toward their spiral path.").defineInRange("windVortexPullStrength", 0.32D, 0.0D, 4.0D);
WIND_VORTEX_LAUNCH_STRENGTH = b.comment("Launch velocity multiplier applied when entities exit the top of a wind vortex.").defineInRange("windVortexLaunchStrength", 1.0D, 0.0D, 4.0D);
VORTEX_LENS_MIN_RADIUS = b.comment("Top radius at signal strength 1 for Vortex Lens wind vortexes.").defineInRange("vortexLensMinRadius", 1.5D, 0.1D, 64.0D);
@@ -995,6 +1023,8 @@ public final class AntarchyMobsConfig {
static double queenBeamDamage() { return QUEEN_BEAM_DAMAGE.get(); }
static double queenBeamRange() { return QUEEN_BEAM_RANGE.get(); }
static int queenBeamDurationTicks() { return QUEEN_BEAM_DURATION_TICKS.get(); }
static int queenBeamWindupTicks() { return QUEEN_BEAM_WINDUP_TICKS.get(); }
static int queenBeamTravelTicks() { return QUEEN_BEAM_TRAVEL_TICKS.get(); }
static int queenBeamCooldownTicks() { return QUEEN_BEAM_COOLDOWN_TICKS.get(); }
static double queenBeamTracking() { return QUEEN_BEAM_TRACKING.get(); }
static double queenBeamTerrainRadius() { return QUEEN_BEAM_TERRAIN_RADIUS.get(); }
@@ -1002,11 +1032,30 @@ public final class AntarchyMobsConfig {
static double kingBeamDamage() { return KING_BEAM_DAMAGE.get(); }
static double kingBeamRange() { return KING_BEAM_RANGE.get(); }
static int kingBeamDurationTicks() { return KING_BEAM_DURATION_TICKS.get(); }
static int kingBeamWindupTicks() { return KING_BEAM_WINDUP_TICKS.get(); }
static int kingBeamTravelTicks() { return KING_BEAM_TRAVEL_TICKS.get(); }
static int kingBeamCooldownTicks() { return KING_BEAM_COOLDOWN_TICKS.get(); }
static double kingBeamTracking() { return KING_BEAM_TRACKING.get(); }
static double kingBeamTerrainRadius() { return KING_BEAM_TERRAIN_RADIUS.get(); }
static int kingBeamTerrainCap() { return KING_BEAM_TERRAIN_CAP.get(); }
static int royalDecreeCooldownTicks() { return ROYAL_DECREE_COOLDOWN_TICKS.get(); }
static double queenBlackHoleRadius() { return QUEEN_BLACK_HOLE_RADIUS.get(); }
static int queenBlackHoleActiveTicks() { return QUEEN_BLACK_HOLE_ACTIVE_TICKS.get(); }
static double queenBlackHolePullStrength() { return QUEEN_BLACK_HOLE_PULL_STRENGTH.get(); }
static double queenFinalTimeFieldRadius() { return QUEEN_FINAL_TIME_FIELD_RADIUS.get(); }
static double queenFinalTimeFieldRate() { return QUEEN_FINAL_TIME_FIELD_RATE.get(); }
static int queenFinalTimeFieldDurationTicks() { return QUEEN_FINAL_TIME_FIELD_DURATION_TICKS.get(); }
static int queenFinalTimeFieldCooldownTicks() { return QUEEN_FINAL_TIME_FIELD_COOLDOWN_TICKS.get(); }
static double kingFireballDamage() { return KING_FIREBALL_DAMAGE.get(); }
static double kingFireballRadius() { return KING_FIREBALL_RADIUS.get(); }
static int kingFireballCooldownTicks() { return KING_FIREBALL_COOLDOWN_TICKS.get(); }
static double kingIceballDamage() { return KING_ICEBALL_DAMAGE.get(); }
static double kingIceballRadius() { return KING_ICEBALL_RADIUS.get(); }
static int kingIceballCooldownTicks() { return KING_ICEBALL_COOLDOWN_TICKS.get(); }
static double kingIceSpikeDamage() { return KING_ICE_SPIKE_DAMAGE.get(); }
static int kingIceSpikeCooldownTicks() { return KING_ICE_SPIKE_COOLDOWN_TICKS.get(); }
static int kingElementalTerrainCap() { return KING_ELEMENTAL_TERRAIN_CAP.get(); }
static double royalBossSoundVolume() { return ROYAL_BOSS_SOUND_VOLUME.get(); }
static int royalEggHatchChance() { return ROYAL_EGG_HATCH_CHANCE.get(); }
static double royalBoltDamage() { return ROYAL_BOLT_DAMAGE.get(); }
@@ -221,6 +221,7 @@ public class AntarchyNeoforge {
AntarchyNeoforgeSounds.KING_ROAR,
AntarchyNeoforgeSounds.KING_WING_FLAP,
AntarchyNeoforgeSounds.KING_FLY_LOOP,
AntarchyNeoforgeSounds.QUEEN_FLY_LOOP,
AntarchyNeoforgeSounds.PRINCE_IDLE,
AntarchyNeoforgeSounds.PRINCE_BITE,
AntarchyNeoforgeSounds.PRINCE_SHOOT,
@@ -436,6 +437,8 @@ public class AntarchyNeoforge {
AntarchyObjects.setQueen(() -> AntarchyNeoforgeEntites.QUEEN.get());
AntarchyObjects.setManticore(() -> AntarchyNeoforgeEntites.MANTICORE.get());
AntarchyObjects.setRoyalBolt(() -> AntarchyNeoforgeEntites.ROYAL_BOLT.get());
AntarchyObjects.setRoyalElementalProjectile(() -> AntarchyNeoforgeEntites.ROYAL_ELEMENTAL_PROJECTILE.get());
AntarchyObjects.setRoyalIceSpike(() -> AntarchyNeoforgeEntites.ROYAL_ICE_SPIKE.get());
AntarchyObjects.setPrinceEgg(() -> AntarchyNeoforgeBlocks.PRINCE_EGG.get());
AntarchyObjects.setPrincessEgg(() -> AntarchyNeoforgeBlocks.PRINCESS_EGG.get());
AntarchyObjects.setRoyalEggBlockEntity(() -> AntarchyNeoforgeBlocks.ROYAL_EGG_BLOCK_ENTITY.get());
@@ -150,7 +150,7 @@ public final class AntarchyNeoForgeClient {
event.registerEntityRenderer(AntarchyNeoforgeEntites.VORTEX_CHARGE_PROJECTILE.get(), ThrownItemRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.WIND_VORTEX.get(), WindVortexRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.TIME_DILATION_FIELD.get(), TimeDilationFieldRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.ROYAL_BLACK_HOLE.get(), net.minecraft.client.renderer.entity.NoopRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.ROYAL_BLACK_HOLE.get(), com.craisinlord.antarchy.content.client.renderer.RoyalBlackHoleRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.CRITTER_CAGE_PROJECTILE.get(), ThrownItemRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.WORM_HOOK_PROJECTILE.get(), ThrownItemRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.HUSH_PROJECTILE.get(), HushProjectileRenderer::new);
@@ -176,6 +176,8 @@ public final class AntarchyNeoForgeClient {
event.registerEntityRenderer(AntarchyNeoforgeEntites.KING.get(), com.craisinlord.antarchy.content.client.renderer.RoyalBossRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.QUEEN.get(), com.craisinlord.antarchy.content.client.renderer.RoyalBossRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.ROYAL_BOLT.get(), com.craisinlord.antarchy.content.client.renderer.RoyalBoltRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.ROYAL_ELEMENTAL_PROJECTILE.get(), com.craisinlord.antarchy.content.client.renderer.RoyalElementalProjectileRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.ROYAL_ICE_SPIKE.get(), com.craisinlord.antarchy.content.client.renderer.RoyalIceSpikeRenderer::new);
event.registerEntityRenderer(AntarchyNeoforgeEntites.JERRY.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.JerryRenderer(context)));
event.registerEntityRenderer(AntarchyNeoforgeEntites.JUMPY_BUG.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.JumpyBugRenderer(context)));
event.registerEntityRenderer(AntarchyNeoforgeEntites.SPIT_BUG.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.SpitBugRenderer(context)));
@@ -83,10 +83,24 @@ import net.neoforged.neoforge.fluids.FluidInteractionRegistry;
import net.neoforged.neoforge.network.PacketDistributor;
public final class AntarchyNeoForgeEvents {
private static final long SERVER_HANG_WARN_NANOS = 5_000_000_000L;
private static final long SERVER_IDLE_BUSY_WARN_NANOS = 30_000_000_000L;
private static final long SERVER_HANG_REPEAT_NANOS = 30_000_000_000L;
private static final double OVERHEAD_INVERSION_WARN_MS = 10.0D;
private static final long OVERHEAD_INVERSION_WARN_INTERVAL_TICKS = 100L;
private static volatile boolean serverHangWatchdogStarted;
private static volatile long serverTickStartNanos;
private static volatile long serverTickEndNanos;
private static volatile long serverHangLastDumpNanos;
private static volatile Thread serverTickThread;
private static long lastOverheadInversionWarnTick = Long.MIN_VALUE / 2L;
private AntarchyNeoForgeEvents() {}
public static void register(IEventBus modEventBus) {
modEventBus.addListener(AntarchyNeoForgeEvents::onCommonSetup);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::beginServerTickWatchdog);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::endServerTickWatchdog);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::onMissileSquidDeath);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::onPermanentPortalSacrifice);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::onLivingBreathe);
@@ -151,6 +165,79 @@ public final class AntarchyNeoForgeEvents {
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::onWandererTrades);
}
static void beginServerTickWatchdog(ServerTickEvent.Pre event) {
ensureServerHangWatchdogStarted();
serverTickThread = Thread.currentThread();
serverTickStartNanos = System.nanoTime();
}
static void endServerTickWatchdog(ServerTickEvent.Post event) {
serverTickEndNanos = System.nanoTime();
serverTickStartNanos = 0L;
}
private static synchronized void ensureServerHangWatchdogStarted() {
if (serverHangWatchdogStarted) {
return;
}
serverHangWatchdogStarted = true;
Thread watchdog = new Thread(() -> {
while (true) {
try {
Thread.sleep(2_000L);
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
return;
}
long tickStart = serverTickStartNanos;
long tickEnd = serverTickEndNanos;
Thread tickThread = serverTickThread;
long now = System.nanoTime();
if (tickThread == null || now - serverHangLastDumpNanos < SERVER_HANG_REPEAT_NANOS) {
continue;
}
if (tickStart > 0L && now - tickStart >= SERVER_HANG_WARN_NANOS) {
antarchy$dumpServerThreadWatchdog(
"server thread appears hung",
(now - tickStart) / 1_000_000.0D,
tickThread
);
serverHangLastDumpNanos = now;
continue;
}
Thread.State state = tickThread.getState();
boolean idleBusy = tickStart <= 0L
&& tickEnd > 0L
&& now - tickEnd >= SERVER_IDLE_BUSY_WARN_NANOS
&& state != Thread.State.WAITING
&& state != Thread.State.TIMED_WAITING;
if (idleBusy) {
antarchy$dumpServerThreadWatchdog(
"server thread busy outside active tick",
(now - tickEnd) / 1_000_000.0D,
tickThread
);
serverHangLastDumpNanos = now;
}
}
}, "Antarchy Server Hang Watchdog");
watchdog.setDaemon(true);
watchdog.start();
}
private static void antarchy$dumpServerThreadWatchdog(String message, double elapsedMs, Thread tickThread) {
Antarchy.LOGGER.error(
"[antarchy-watchdog] {} elapsedMs={} thread={} state={}",
message, elapsedMs, tickThread.getName(), tickThread.getState()
);
for (StackTraceElement element : tickThread.getStackTrace()) {
Antarchy.LOGGER.error("[antarchy-watchdog] at {}", element);
}
}
static void onVillagerTrades(VillagerTradesEvent event) {
if (event.getType() == VillagerProfession.FARMER) {
event.getTrades().get(1).add(emeraldForItems(AntarchyObjects.CORN.get(), 20, 16, 2));
@@ -430,6 +517,9 @@ public final class AntarchyNeoForgeEvents {
}
private static final int ANTIMETAL_INVERTED_REFRESH_TICKS = 20;
private static final int ANTIMETAL_INVERTED_REFRESH_THRESHOLD_TICKS = 12;
private static final int ANTIMETAL_PLAYER_SCAN_INTERVAL_TICKS = 2;
private static final int ANTIMETAL_MOB_SCAN_INTERVAL_TICKS = 10;
static void tickOverheadInversion(EntityTickEvent.Post event) {
if (!(event.getEntity() instanceof LivingEntity livingEntity)) {
@@ -441,17 +531,56 @@ public final class AntarchyNeoForgeEvents {
if (livingEntity instanceof Player player && player.isSpectator()) {
return;
}
if (!isDirectlyBelowAntimetal(livingEntity)) {
MobEffectInstance existingInverted = livingEntity.getEffect(AntarchyNeoforgeMisc.INVERTED);
long gameTime = livingEntity.level().getGameTime();
if (!shouldScanOverheadAntimetal(livingEntity, existingInverted, gameTime)) {
return;
}
MobEffectInstance existingInverted = livingEntity.getEffect(AntarchyNeoforgeMisc.INVERTED);
if (existingInverted == null || existingInverted.getDuration() <= 5) {
long startNanos = System.nanoTime();
boolean directlyBelowAntimetal = isDirectlyBelowAntimetal(livingEntity);
double elapsedMs = (System.nanoTime() - startNanos) / 1_000_000.0D;
if (elapsedMs >= OVERHEAD_INVERSION_WARN_MS
&& gameTime - lastOverheadInversionWarnTick >= OVERHEAD_INVERSION_WARN_INTERVAL_TICKS) {
lastOverheadInversionWarnTick = gameTime;
Antarchy.LOGGER.warn(
"[antarchy-gravity] slow overhead antimetal scan targetType={} uuid={} pos=({}, {}, {}) dim={} elapsedMs={} inverted={} forced={} gameTime={}",
livingEntity.getType(), livingEntity.getUUID(), livingEntity.getX(), livingEntity.getY(), livingEntity.getZ(),
livingEntity.level().dimension().location(), elapsedMs,
com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.isGravityInverted(livingEntity),
com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.isGravityForced(livingEntity),
gameTime
);
}
if (!directlyBelowAntimetal) {
return;
}
if (existingInverted == null || existingInverted.getDuration() <= ANTIMETAL_INVERTED_REFRESH_THRESHOLD_TICKS) {
if (livingEntity instanceof Player || livingEntity.level().dimension().location().toString().equals("antarchy:thoraxis")) {
Antarchy.LOGGER.info(
"[antarchy-gravity] overhead antimetal applying inverted effect targetType={} uuid={} pos=({}, {}, {}) dim={} existingDuration={} gameTime={}",
livingEntity.getType(), livingEntity.getUUID(), livingEntity.getX(), livingEntity.getY(), livingEntity.getZ(),
livingEntity.level().dimension().location(),
existingInverted != null ? existingInverted.getDuration() : -1,
gameTime
);
}
livingEntity.addEffect(new MobEffectInstance(AntarchyNeoforgeMisc.INVERTED, ANTIMETAL_INVERTED_REFRESH_TICKS, 0, false, false, false));
spawnAntimetalInversionParticles(livingEntity);
}
}
private static boolean shouldScanOverheadAntimetal(LivingEntity entity, MobEffectInstance existingInverted, long gameTime) {
if (existingInverted != null && existingInverted.getDuration() <= ANTIMETAL_INVERTED_REFRESH_THRESHOLD_TICKS) {
return true;
}
int interval = entity instanceof Player ? ANTIMETAL_PLAYER_SCAN_INTERVAL_TICKS : ANTIMETAL_MOB_SCAN_INTERVAL_TICKS;
long phase = (long) entity.getUUID().hashCode() + gameTime;
return Math.floorMod(phase, interval) == 0L;
}
private static boolean isInOrBelowAntimetalScaffolding(LivingEntity entity) {
AABB bounds = entity.getBoundingBox().deflate(1.0E-3D);
int minX = net.minecraft.util.Mth.floor(bounds.minX);
@@ -484,18 +613,16 @@ public final class AntarchyNeoForgeEvents {
int minX = net.minecraft.util.Mth.floor(bounds.minX);
int maxX = net.minecraft.util.Mth.floor(bounds.maxX);
int minY = net.minecraft.util.Mth.floor(bounds.minY);
int maxY = net.minecraft.util.Mth.floor(bounds.maxY);
int minZ = net.minecraft.util.Mth.floor(bounds.minZ);
int maxZ = net.minecraft.util.Mth.floor(bounds.maxZ);
net.minecraft.core.BlockPos.MutableBlockPos crystalPos = new net.minecraft.core.BlockPos.MutableBlockPos();
for (int x = minX; x <= maxX; x++) {
for (int y = minY; y <= maxY; y++) {
for (int z = minZ; z <= maxZ; z++) {
net.minecraft.core.BlockPos crystalPos = new net.minecraft.core.BlockPos(x, y + 1, z);
if (entity.level().getBlockState(crystalPos).is(com.craisinlord.antarchy.content.AntarchyTags.Blocks.ANTIMETAL_INVERSION_BLOCKS)) {
return true;
}
for (int z = minZ; z <= maxZ; z++) {
crystalPos.set(x, maxY + 1, z);
if (entity.level().getBlockState(crystalPos).is(com.craisinlord.antarchy.content.AntarchyTags.Blocks.ANTIMETAL_INVERSION_BLOCKS)) {
return true;
}
}
}
@@ -1146,6 +1273,10 @@ public final class AntarchyNeoForgeEvents {
event.getBuilder().addMix(Potions.AWKWARD, AntarchyNeoforgeItems.TITANIUM_NUGGET.get(), AntarchyNeoforgeMisc.GROWING);
event.getBuilder().addMix(AntarchyNeoforgeMisc.GROWING, Items.GLOWSTONE_DUST, AntarchyNeoforgeMisc.STRONG_GROWING);
event.getBuilder().addMix(AntarchyNeoforgeMisc.STRONG_GROWING, Items.GLOWSTONE_DUST, AntarchyNeoforgeMisc.EXTREME_GROWING);
event.getBuilder().addMix(Potions.AWKWARD, AntarchyNeoforgeItems.KING_SCALE.get(), AntarchyNeoforgeMisc.COMMAND);
event.getBuilder().addMix(AntarchyNeoforgeMisc.COMMAND, Items.REDSTONE, AntarchyNeoforgeMisc.LONG_COMMAND);
event.getBuilder().addMix(Potions.AWKWARD, AntarchyNeoforgeItems.QUEEN_SCALE.get(), AntarchyNeoforgeMisc.TIME_DILATION);
event.getBuilder().addMix(AntarchyNeoforgeMisc.TIME_DILATION, Items.REDSTONE, AntarchyNeoforgeMisc.LONG_TIME_DILATION);
}
@@ -425,6 +425,7 @@ public final class AntarchyNeoforgeEntites {
() -> EntityType.Builder.of(ScorpionEntity::new, MobCategory.MONSTER)
.sized(1.5F, 1.0F)
.clientTrackingRange(8)
.fireImmune()
.build("scorpion"));
public static final DeferredHolder<EntityType<?>, EntityType<BasiliskEntity>> BASILISK = ENTITY_TYPES.register("basilisk",
() -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER)
@@ -435,6 +436,7 @@ public final class AntarchyNeoforgeEntites {
() -> EntityType.Builder.of(EmperorScorpionEntity::new, MobCategory.MONSTER)
.sized(6.0F, 3.0F)
.clientTrackingRange(12)
.fireImmune()
.build("emperor_scorpion"));
public static final DeferredHolder<EntityType<?>, EntityType<LucidEyeProjectileEntity>> LUCID_PEARL_PROJECTILE = ENTITY_TYPES.register("lucid_pearl_projectile",
() -> EntityType.Builder.<LucidEyeProjectileEntity>of(LucidEyeProjectileEntity::new, MobCategory.MISC)
@@ -497,6 +499,7 @@ public final class AntarchyNeoforgeEntites {
() -> EntityType.Builder.of(ManticoreEntity::new, MobCategory.MONSTER)
.sized(1.95F, 2.0F)
.clientTrackingRange(10)
.fireImmune()
.build("manticore"));
public static final DeferredHolder<EntityType<?>, EntityType<JerryEntity>> JERRY = ENTITY_TYPES.register("jerry",
() -> EntityType.Builder.of(JerryEntity::new, MobCategory.MONSTER)
@@ -541,6 +544,12 @@ public final class AntarchyNeoforgeEntites {
public static final DeferredHolder<EntityType<?>, EntityType<com.craisinlord.antarchy.content.entity.royal.RoyalBoltEntity>> ROYAL_BOLT = ENTITY_TYPES.register("royal_bolt",
() -> EntityType.Builder.<com.craisinlord.antarchy.content.entity.royal.RoyalBoltEntity>of(com.craisinlord.antarchy.content.entity.royal.RoyalBoltEntity::new, MobCategory.MISC)
.sized(0.4F, 0.4F).clientTrackingRange(8).updateInterval(1).fireImmune().build("royal_bolt"));
public static final DeferredHolder<EntityType<?>, EntityType<com.craisinlord.antarchy.content.entity.royal.RoyalElementalProjectileEntity>> ROYAL_ELEMENTAL_PROJECTILE = ENTITY_TYPES.register("royal_elemental_projectile",
() -> EntityType.Builder.<com.craisinlord.antarchy.content.entity.royal.RoyalElementalProjectileEntity>of(com.craisinlord.antarchy.content.entity.royal.RoyalElementalProjectileEntity::new, MobCategory.MISC)
.sized(1.0F, 1.0F).clientTrackingRange(16).updateInterval(1).fireImmune().build("royal_elemental_projectile"));
public static final DeferredHolder<EntityType<?>, EntityType<com.craisinlord.antarchy.content.entity.royal.RoyalIceSpikeEntity>> ROYAL_ICE_SPIKE = ENTITY_TYPES.register("royal_ice_spike",
() -> EntityType.Builder.<com.craisinlord.antarchy.content.entity.royal.RoyalIceSpikeEntity>of(com.craisinlord.antarchy.content.entity.royal.RoyalIceSpikeEntity::new, MobCategory.MISC)
.sized(2.0F, 4.0F).clientTrackingRange(16).updateInterval(1).fireImmune().build("royal_ice_spike"));
public static final DeferredHolder<EntityType<?>, EntityType<OuranwoodDeerEntity>> OURANWOOD_DEER = ENTITY_TYPES.register("ouranwood_deer",
() -> EntityType.Builder.of(OuranwoodDeerEntity::new, MobCategory.CREATURE)
.sized(1.125F, 1.75F)
@@ -7,6 +7,8 @@ import com.craisinlord.antarchy.content.effect.DreadMobEffect;
import com.craisinlord.antarchy.content.effect.GoopedMobEffect;
import com.craisinlord.antarchy.content.effect.GrowthMobEffect;
import com.craisinlord.antarchy.content.effect.InvertedMobEffect;
import com.craisinlord.antarchy.content.effect.CommandedMobEffect;
import com.craisinlord.antarchy.content.effect.DilatedMobEffect;
import com.craisinlord.antarchy.content.effect.ParalyzedMobEffect;
import com.craisinlord.antarchy.content.effect.ShrinkMobEffect;
import com.craisinlord.antarchy.content.effect.StinkyMobEffect;
@@ -127,6 +129,8 @@ public final class AntarchyNeoforgeMisc {
public static final DeferredHolder<MobEffect, DreadMobEffect> DREAD = MOB_EFFECTS.register("dread", DreadMobEffect::new);
public static final DeferredHolder<MobEffect, ParalyzedMobEffect> PARALYZED = MOB_EFFECTS.register("paralyzed", ParalyzedMobEffect::new);
public static final DeferredHolder<MobEffect, InvertedMobEffect> INVERTED = MOB_EFFECTS.register("inverted", InvertedMobEffect::new);
public static final DeferredHolder<MobEffect, CommandedMobEffect> COMMANDED = MOB_EFFECTS.register("commanded", CommandedMobEffect::new);
public static final DeferredHolder<MobEffect, DilatedMobEffect> DILATED = MOB_EFFECTS.register("dilated", DilatedMobEffect::new);
public static final DeferredHolder<MobEffect, StinkyMobEffect> STINKY = MOB_EFFECTS.register("stinky", StinkyMobEffect::new);
public static final DeferredHolder<MobEffect, GoopedMobEffect> GOOPED = MOB_EFFECTS.register("gooped", GoopedMobEffect::new);
public static final DeferredHolder<MobEffect, com.craisinlord.antarchy.content.effect.BloodglassWardEffect> BLOODGLASS_WARD = MOB_EFFECTS.register("bloodglass_ward", com.craisinlord.antarchy.content.effect.BloodglassWardEffect::new);
@@ -140,6 +144,14 @@ public final class AntarchyNeoforgeMisc {
() -> new Potion(new MobEffectInstance(INVERTED, 600)));
public static final DeferredHolder<Potion, Potion> LONG_INVERSION = POTIONS.register("long_inversion",
() -> new Potion("inversion", new MobEffectInstance(INVERTED, 2400)));
public static final DeferredHolder<Potion, Potion> COMMAND = POTIONS.register("command",
() -> new Potion(new MobEffectInstance(COMMANDED, 600)));
public static final DeferredHolder<Potion, Potion> LONG_COMMAND = POTIONS.register("long_command",
() -> new Potion("command", new MobEffectInstance(COMMANDED, 1200)));
public static final DeferredHolder<Potion, Potion> TIME_DILATION = POTIONS.register("time_dilation",
() -> new Potion(new MobEffectInstance(DILATED, 300)));
public static final DeferredHolder<Potion, Potion> LONG_TIME_DILATION = POTIONS.register("long_time_dilation",
() -> new Potion("time_dilation", new MobEffectInstance(DILATED, 600)));
public static final DeferredHolder<Potion, Potion> STINKY_POTION = POTIONS.register("stinky",
() -> new Potion(new MobEffectInstance(STINKY, 1200)));
public static final DeferredHolder<Potion, Potion> LONG_STINKY = POTIONS.register("long_stinky",
@@ -375,6 +387,9 @@ public final class AntarchyNeoforgeMisc {
public static final DeferredHolder<Feature<?>, DimensionalTearFeature> DIMENSIONAL_TEAR = FEATURES.register("dimensional_tear",
() -> new DimensionalTearFeature(NoneFeatureConfiguration.CODEC));
public static final DeferredHolder<Feature<?>, ThoraxisIchorLakeFeature> THORAXIS_ICHOR_LAKE = FEATURES.register("thoraxis_ichor_lake",
() -> new ThoraxisIchorLakeFeature(NoneFeatureConfiguration.CODEC));
// Biome sources
public static final DeferredHolder<MapCodec<? extends BiomeSource>, MapCodec<ElythiaBiomeSource>> ELYTHIA_BIOME_SOURCE = BIOME_SOURCES.register("elythia_biome_source",
() -> ElythiaBiomeSource.CODEC);