Overhauled Basilisk and Nightmare mob AI

Fixed ants not leaving nests in nether/end/thoraxis
Overhauled Basilisk texture, model, animations
This commit is contained in:
craisinlord committed 2026-06-22 20:41:32 -05:00
1 parent 2b358130b2
commit 3c6c54ebd6
11 files changed
+476 -264

No files matched your search

@@ -88,7 +88,7 @@ public final class AntarchySettings {
private static ResourceKey<Level> redAntDestinationDimension = dimensionKey("antarchy:thoraxis"); private static ResourceKey<Level> redAntDestinationDimension = dimensionKey("antarchy:thoraxis");
private static ResourceKey<Level> termiteDestinationDimension = dimensionKey("antarchy:cavaryn"); private static ResourceKey<Level> termiteDestinationDimension = dimensionKey("antarchy:cavaryn");
private static ResourceKey<Level> rainbowAntNonInfinityFallbackDimension = dimensionKey("antarchy:elythia"); private static ResourceKey<Level> rainbowAntNonInfinityFallbackDimension = dimensionKey("antarchy:elythia");
private static double krakenHealth = 750.0D; private static double krakenHealth = 1500.0D;
private static double krakenAttackDamage = 45.0D; private static double krakenAttackDamage = 45.0D;
private static double brutalflyHealth = 400.0D; private static double brutalflyHealth = 400.0D;
private static double brutalflySwipeDamage = 15.0D; private static double brutalflySwipeDamage = 15.0D;
@@ -146,6 +146,25 @@ public final class AntarchySettings {
private static double nightmareSwordScalingFactor = 1.0D; private static double nightmareSwordScalingFactor = 1.0D;
private static boolean basiliskPetrifyingGazeEnabled = true; private static boolean basiliskPetrifyingGazeEnabled = true;
private static int basiliskSpawnMaxLightLevel = 5; private static int basiliskSpawnMaxLightLevel = 5;
private static double basiliskHealth = 150.0D;
private static double basiliskAttackDamage = 18.0D;
private static double basiliskMovementSpeed = 0.35D;
private static double basiliskArmor = 6.0D;
private static double basiliskKnockbackResistance = 0.5D;
private static double basiliskFollowRange = 28.0D;
private static int basiliskXpReward = 50;
private static int basiliskAttackAnimTicks = 18;
private static int basiliskAttackDamageTick = 9;
private static int basiliskHissCooldownTicks = 600;
private static double basiliskAttackReach = 3.0D;
private static double basiliskGazeRange = 12.0D;
private static double basiliskGazeDotThreshold = 0.64D;
private static double basiliskGazeFacingThreshold = 0.45D;
private static int basiliskHissChargeTicks = 30;
private static int basiliskPlayerParalyzeTicks = 50;
private static int basiliskPreyPetrifyCooldownTicks = 500;
private static double basiliskPreyPetrifyRange = 8.0D;
private static int basiliskPreyPetrifyTicks = 200;
private static boolean diamondMinecartEnabled = true; private static boolean diamondMinecartEnabled = true;
private static boolean diamondMinecartPlacesRails = true; private static boolean diamondMinecartPlacesRails = true;
private static double diamondMinecartCruiseSpeed = 0.6D; private static double diamondMinecartCruiseSpeed = 0.6D;
@@ -206,25 +225,6 @@ public final class AntarchySettings {
private static final int reverieAmbientTargetMaxAgeTicks = 40; private static final int reverieAmbientTargetMaxAgeTicks = 40;
private static final int reverieAmbientPulseIntervalMinTicks = 12; private static final int reverieAmbientPulseIntervalMinTicks = 12;
private static final int reverieAmbientPulseIntervalMaxTicks = 19; private static final int reverieAmbientPulseIntervalMaxTicks = 19;
private static double basiliskHealth = 100.0D;
private static double basiliskAttackDamage = 12.0D;
private static double basiliskMovementSpeed = 0.25D;
private static double basiliskArmor = 6.0D;
private static double basiliskKnockbackResistance = 0.5D;
private static double basiliskFollowRange = 28.0D;
private static int basiliskXpReward = 50;
private static int basiliskAttackAnimTicks = 18;
private static int basiliskAttackHitTick = 8;
private static int basiliskAttackCooldownTicks = 20;
private static int basiliskHissCooldownTicks = 600;
private static double basiliskGazeRange = 12.0D;
private static double basiliskGazeDotThreshold = 0.64D;
private static double basiliskFacingThreshold = 0.45D;
private static int basiliskHissChargeTicks = 30;
private static int basiliskPlayerParalyzeTicks = 50;
private static int basiliskPreyPetrifyCooldownTicks = 500;
private static double basiliskPreyPetrifyRange = 8.0D;
private static int basiliskPreyPetrifyTicks = 200;
private static double emperorScorpionHealth = 100.0D; private static double emperorScorpionHealth = 100.0D;
private static double emperorScorpionAttackDamage = 12.0D; private static double emperorScorpionAttackDamage = 12.0D;
private static double emperorScorpionMovementSpeed = 0.32D; private static double emperorScorpionMovementSpeed = 0.32D;
@@ -380,7 +380,7 @@ public final class AntarchySettings {
private static double molevoreBreakVerticalRange = 2.2D; private static double molevoreBreakVerticalRange = 2.2D;
private static double molevoreBreakHalfWidth = 1.1D; private static double molevoreBreakHalfWidth = 1.1D;
private static double nightmareHealth = 180.0D; private static double nightmareHealth = 180.0D;
private static double nightmareAttackDamage = 14.0D; private static double nightmareAttackDamage = 16.0D;
private static double nightmareMovementSpeed = 0.28D; private static double nightmareMovementSpeed = 0.28D;
private static double nightmareFlyingSpeed = 0.3D; private static double nightmareFlyingSpeed = 0.3D;
private static double nightmareFollowRange = 48.0D; private static double nightmareFollowRange = 48.0D;
@@ -1377,9 +1377,63 @@ public final class AntarchySettings {
basiliskSpawnMaxLightLevel = value; basiliskSpawnMaxLightLevel = value;
} }
public static double basiliskHealth() { return basiliskHealth; }
public static void setBasiliskHealth(double value) { basiliskHealth = value; }
public static double basiliskAttackDamage() { return basiliskAttackDamage; }
public static void setBasiliskAttackDamage(double value) { basiliskAttackDamage = value; }
public static double basiliskMovementSpeed() { return basiliskMovementSpeed; }
public static void setBasiliskMovementSpeed(double value) { basiliskMovementSpeed = value; }
public static double basiliskArmor() { return basiliskArmor; }
public static void setBasiliskArmor(double value) { basiliskArmor = value; }
public static double basiliskKnockbackResistance() { return basiliskKnockbackResistance; }
public static void setBasiliskKnockbackResistance(double value) { basiliskKnockbackResistance = value; }
public static double basiliskFollowRange() { return basiliskFollowRange; }
public static void setBasiliskFollowRange(double value) { basiliskFollowRange = value; }
public static int basiliskXpReward() { return basiliskXpReward; }
public static void setBasiliskXpReward(int value) { basiliskXpReward = value; }
public static int basiliskAttackAnimTicks() { return basiliskAttackAnimTicks; }
public static void setBasiliskAttackAnimTicks(int value) { basiliskAttackAnimTicks = value; }
public static int basiliskAttackDamageTick() { return basiliskAttackDamageTick; }
public static void setBasiliskAttackDamageTick(int value) { basiliskAttackDamageTick = value; }
public static int basiliskHissCooldownTicks() { return basiliskHissCooldownTicks; }
public static void setBasiliskHissCooldownTicks(int value) { basiliskHissCooldownTicks = value; }
public static double basiliskAttackReach() { return basiliskAttackReach; }
public static void setBasiliskAttackReach(double value) { basiliskAttackReach = value; }
public static double basiliskGazeRange() { return basiliskGazeRange; }
public static void setBasiliskGazeRange(double value) { basiliskGazeRange = value; }
public static double basiliskGazeDotThreshold() { return basiliskGazeDotThreshold; }
public static void setBasiliskGazeDotThreshold(double value) { basiliskGazeDotThreshold = value; }
public static double basiliskGazeFacingThreshold() { return basiliskGazeFacingThreshold; }
public static void setBasiliskGazeFacingThreshold(double value) { basiliskGazeFacingThreshold = value; }
public static int basiliskHissChargeTicks() { return basiliskHissChargeTicks; }
public static void setBasiliskHissChargeTicks(int value) { basiliskHissChargeTicks = value; }
public static int basiliskPlayerParalyzeTicks() { return basiliskPlayerParalyzeTicks; } public static int basiliskPlayerParalyzeTicks() { return basiliskPlayerParalyzeTicks; }
public static void setBasiliskPlayerParalyzeTicks(int value) { basiliskPlayerParalyzeTicks = value; } public static void setBasiliskPlayerParalyzeTicks(int value) { basiliskPlayerParalyzeTicks = value; }
public static int basiliskPreyPetrifyCooldownTicks() { return basiliskPreyPetrifyCooldownTicks; }
public static void setBasiliskPreyPetrifyCooldownTicks(int value) { basiliskPreyPetrifyCooldownTicks = value; }
public static double basiliskPreyPetrifyRange() { return basiliskPreyPetrifyRange; }
public static void setBasiliskPreyPetrifyRange(double value) { basiliskPreyPetrifyRange = value; }
public static int basiliskPreyPetrifyTicks() { return basiliskPreyPetrifyTicks; }
public static void setBasiliskPreyPetrifyTicks(int value) { basiliskPreyPetrifyTicks = value; }
public static boolean diamondMinecartEnabled() { return diamondMinecartEnabled; } public static boolean diamondMinecartEnabled() { return diamondMinecartEnabled; }
public static void setDiamondMinecartEnabled(boolean v) { diamondMinecartEnabled = v; } public static void setDiamondMinecartEnabled(boolean v) { diamondMinecartEnabled = v; }
@@ -40,7 +40,8 @@ public class AntNestBlockEntity extends BlockEntity {
nest.populateInitialAnts(level); nest.populateInitialAnts(level);
} }
if (level.isNight() || level.isRaining()) { boolean ignoreNight = level.dimensionType().hasFixedTime();
if ((!ignoreNight && level.isNight()) || level.isRaining()) {
return; return;
} }
@@ -3,6 +3,7 @@ package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.config.AntarchySettings;
import java.util.Objects; import java.util.Objects;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.tags.DamageTypeTags;
import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
@@ -11,8 +12,11 @@ import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.Difficulty; import net.minecraft.world.Difficulty;
import net.minecraft.world.DifficultyInstance; import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.MobSpawnType;
@@ -27,11 +31,15 @@ import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal;
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.monster.Monster;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.Level.ExplosionInteraction; import net.minecraft.world.level.Level.ExplosionInteraction;
import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.GeoEntity;
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
@@ -123,6 +131,49 @@ public class BomberEntity extends Monster implements GeoEntity {
return true; return true;
} }
@Override
public boolean hurt(DamageSource source, float amount) {
if (source.is(DamageTypeTags.IS_FIRE)) {
this.primeFuse();
return false;
}
Entity directEntity = source.getDirectEntity();
if (directEntity instanceof AbstractArrow arrow && arrow.isOnFire()) {
this.primeFuse();
}
return super.hurt(source, amount);
}
@Override
public InteractionResult mobInteract(Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
if (this.detonating) {
return InteractionResult.PASS;
}
if (stack.is(Items.FLINT_AND_STEEL)) {
if (!this.level().isClientSide) {
this.primeFuse();
stack.hurtAndBreak(1, player, hand == InteractionHand.MAIN_HAND ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND);
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
if (stack.is(Items.FIRE_CHARGE)) {
if (!this.level().isClientSide) {
this.primeFuse();
if (!player.getAbilities().instabuild) {
stack.shrink(1);
}
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
return super.mobInteract(player, hand);
}
@Override @Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController)); controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController));
@@ -9,6 +9,7 @@ import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.Difficulty; import net.minecraft.world.Difficulty;
import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageSource;
@@ -17,9 +18,11 @@ import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.MobSpawnType;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.control.MoveControl;
import net.minecraft.world.entity.ai.goal.FloatGoal; import net.minecraft.world.entity.ai.goal.FloatGoal;
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; import net.minecraft.world.entity.ai.goal.MeleeAttackGoal;
@@ -48,6 +51,7 @@ import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -55,7 +59,6 @@ public class BasiliskEntity extends Monster implements GeoEntity {
private static final EntityDataAccessor<Integer> ANIMATION_STATE = private static final EntityDataAccessor<Integer> ANIMATION_STATE =
SynchedEntityData.defineId(BasiliskEntity.class, EntityDataSerializers.INT); SynchedEntityData.defineId(BasiliskEntity.class, EntityDataSerializers.INT);
private static final byte ATTACK_ENTITY_EVENT = 4; private static final byte ATTACK_ENTITY_EVENT = 4;
private static final int ATTACK_ANIM_TICKS = 18;
private static final int DEATH_TICKS = 25; private static final int DEATH_TICKS = 25;
private static final int ANIM_IDLE = 0; private static final int ANIM_IDLE = 0;
@@ -68,30 +71,22 @@ public class BasiliskEntity extends Monster implements GeoEntity {
private static final RawAnimation ATTACK_ANIM = RawAnimation.begin().thenPlay("attack"); private static final RawAnimation ATTACK_ANIM = RawAnimation.begin().thenPlay("attack");
private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlay("death"); private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlay("death");
private static final int HISS_COOLDOWN_TICKS = 600; private static final float TURN_RATE_DEG_PER_TICK = 5.0F;
private static final double GAZE_RANGE = 12.0D;
private static final double GAZE_RANGE_SQR = GAZE_RANGE * GAZE_RANGE;
private static final double GAZE_DOT_THRESHOLD = 0.64D;
private static final double BASILISK_GAZE_FACING_THRESHOLD = 0.45D;
private static final int HISS_CHARGE_TICKS = 30;
private static final int PREY_PETRIFY_COOLDOWN_TICKS = 500;
private static final double PREY_PETRIFY_RANGE = 8.0D;
private static final int PREY_PETRIFY_DURATION_TICKS = 200;
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
private int attackAnimTicks = 0; private int attackAnimTicks = 0;
private int hissCooldown = 100; private int hissCooldown = AntarchySettings.basiliskHissCooldownTicks();
private int hissChargeTimer = 0; private int hissChargeTimer = 0;
@Nullable private UUID pendingTargetId; @Nullable private UUID pendingTargetId;
private int preyPetrifyCooldown = 200; private int preyPetrifyCooldown = AntarchySettings.basiliskPreyPetrifyCooldownTicks();
public BasiliskEntity(EntityType<? extends BasiliskEntity> entityType, Level level) { public BasiliskEntity(EntityType<? extends BasiliskEntity> entityType, Level level) {
super(entityType, level); super(entityType, level);
this.xpReward = 50; this.xpReward = AntarchySettings.basiliskXpReward();
this.moveControl = new BasiliskMoveControl(this);
} }
@Override @Override
@@ -102,12 +97,12 @@ public class BasiliskEntity extends Monster implements GeoEntity {
public static AttributeSupplier.Builder createAttributes() { public static AttributeSupplier.Builder createAttributes() {
return Monster.createMonsterAttributes() return Monster.createMonsterAttributes()
.add(Attributes.MAX_HEALTH, 150.0D) .add(Attributes.MAX_HEALTH, AntarchySettings.basiliskHealth())
.add(Attributes.MOVEMENT_SPEED, 0.35D) .add(Attributes.MOVEMENT_SPEED, AntarchySettings.basiliskMovementSpeed())
.add(Attributes.ATTACK_DAMAGE, 18.0D) .add(Attributes.ATTACK_DAMAGE, AntarchySettings.basiliskAttackDamage())
.add(Attributes.ARMOR, 6.0D) .add(Attributes.ARMOR, AntarchySettings.basiliskArmor())
.add(Attributes.KNOCKBACK_RESISTANCE, 0.5D) .add(Attributes.KNOCKBACK_RESISTANCE, AntarchySettings.basiliskKnockbackResistance())
.add(Attributes.FOLLOW_RANGE, 28.0D); .add(Attributes.FOLLOW_RANGE, AntarchySettings.basiliskFollowRange());
} }
public static boolean canSpawn(EntityType<BasiliskEntity> entityType, ServerLevelAccessor level, public static boolean canSpawn(EntityType<BasiliskEntity> entityType, ServerLevelAccessor level,
@@ -159,6 +154,40 @@ public class BasiliskEntity extends Monster implements GeoEntity {
return hurt; return hurt;
} }
private void performAoeAttack() {
if (!(this.level() instanceof ServerLevel serverLevel)) return;
double attackReach = AntarchySettings.basiliskAttackReach();
Vec3 forward = Vec3.directionFromRotation(0, this.getYRot());
Vec3 right = new Vec3(-forward.z, 0, forward.x);
Vec3 origin = this.position();
List<LivingEntity> candidates = this.level().getEntitiesOfClass(
LivingEntity.class,
this.getBoundingBox().inflate(Math.max(4.0D, attackReach + 1.5D)),
e -> e != this && e.isAlive()
);
boolean hitAnything = false;
for (LivingEntity entity : candidates) {
Vec3 toEntity = entity.position().subtract(origin);
double fwdDist = toEntity.dot(forward);
double sideDist = toEntity.dot(right);
// Forward bite volume measured from the basilisk's center.
if (fwdDist >= 1.0 && fwdDist <= attackReach && Math.abs(sideDist) <= 1.5) {
if (entity.hurt(AntarchyDamageSources.basiliskBite(serverLevel, this),
(float) this.getAttributeValue(Attributes.ATTACK_DAMAGE))) {
hitAnything = true;
}
}
}
this.level().broadcastEntityEvent(this, ATTACK_ENTITY_EVENT);
if (hitAnything) {
this.playSound(AntarchySoundEvents.BASILISK_BITE.get(), 1.1F, 0.95F + this.random.nextFloat() * 0.08F);
}
}
@Override @Override
public void tick() { public void tick() {
super.tick(); super.tick();
@@ -213,21 +242,21 @@ public class BasiliskEntity extends Monster implements GeoEntity {
} }
if (!AntarchySettings.basiliskPetrifyingGazeEnabled()) { if (!AntarchySettings.basiliskPetrifyingGazeEnabled()) {
this.hissCooldown = HISS_COOLDOWN_TICKS; this.hissCooldown = AntarchySettings.basiliskHissCooldownTicks();
return; return;
} }
Player target = this.findGazingPlayer(); Player target = this.findGazingPlayer();
if (target == null) { if (target == null) {
this.hissCooldown = 20; this.hissCooldown = AntarchySettings.basiliskHissCooldownTicks();
return; return;
} }
this.level().playSound(null, this.getX(), this.getY(), this.getZ(), this.level().playSound(null, this.getX(), this.getY(), this.getZ(),
AntarchySoundEvents.BASILISK_HISS.get(), this.getSoundSource(), 1.4F, 0.92F); AntarchySoundEvents.BASILISK_HISS.get(), this.getSoundSource(), 1.4F, 0.92F);
this.pendingTargetId = target.getUUID(); this.pendingTargetId = target.getUUID();
this.hissChargeTimer = HISS_CHARGE_TICKS; this.hissChargeTimer = AntarchySettings.basiliskHissChargeTicks();
this.hissCooldown = HISS_COOLDOWN_TICKS; this.hissCooldown = AntarchySettings.basiliskHissCooldownTicks();
this.getNavigation().stop(); this.getNavigation().stop();
this.getLookControl().setLookAt(target, 30.0F, 30.0F); this.getLookControl().setLookAt(target, 30.0F, 30.0F);
} }
@@ -242,7 +271,7 @@ public class BasiliskEntity extends Monster implements GeoEntity {
return; return;
} }
this.preyPetrifyCooldown = PREY_PETRIFY_COOLDOWN_TICKS; this.preyPetrifyCooldown = AntarchySettings.basiliskPreyPetrifyCooldownTicks();
LivingEntity prey = this.findNearestPrey(); LivingEntity prey = this.findNearestPrey();
if (prey == null) { if (prey == null) {
return; return;
@@ -253,7 +282,7 @@ public class BasiliskEntity extends Monster implements GeoEntity {
this.getLookControl().setLookAt(prey, 30.0F, 30.0F); this.getLookControl().setLookAt(prey, 30.0F, 30.0F);
prey.addEffect(new MobEffectInstance( prey.addEffect(new MobEffectInstance(
AntarchyObjects.PARALYZED_EFFECT.get(), AntarchyObjects.PARALYZED_EFFECT.get(),
PREY_PETRIFY_DURATION_TICKS, AntarchySettings.basiliskPreyPetrifyTicks(),
0, 0,
false, false,
true, true,
@@ -279,7 +308,7 @@ public class BasiliskEntity extends Monster implements GeoEntity {
Player nearest = null; Player nearest = null;
double nearestDistance = Double.MAX_VALUE; double nearestDistance = Double.MAX_VALUE;
for (Player player : this.level().getEntitiesOfClass(Player.class, this.getBoundingBox().inflate(GAZE_RANGE))) { for (Player player : this.level().getEntitiesOfClass(Player.class, this.getBoundingBox().inflate(AntarchySettings.basiliskGazeRange()))) {
if (!this.canMaintainGazeOn(player)) { if (!this.canMaintainGazeOn(player)) {
continue; continue;
} }
@@ -301,7 +330,7 @@ public class BasiliskEntity extends Monster implements GeoEntity {
if (player.getItemBySlot(EquipmentSlot.HEAD).is(Items.CARVED_PUMPKIN)) { if (player.getItemBySlot(EquipmentSlot.HEAD).is(Items.CARVED_PUMPKIN)) {
return false; return false;
} }
if (player.distanceToSqr(this) > GAZE_RANGE_SQR) { if (player.distanceToSqr(this) > AntarchySettings.basiliskGazeRange() * AntarchySettings.basiliskGazeRange()) {
return false; return false;
} }
if (!this.hasLineOfSight(player)) { if (!this.hasLineOfSight(player)) {
@@ -314,7 +343,7 @@ public class BasiliskEntity extends Monster implements GeoEntity {
private boolean isPlayerGazingAtMe(Player player) { private boolean isPlayerGazingAtMe(Player player) {
Vec3 eye = player.getEyePosition(); Vec3 eye = player.getEyePosition();
Vec3 toMe = this.getEyePosition().subtract(eye).normalize(); Vec3 toMe = this.getEyePosition().subtract(eye).normalize();
return player.getLookAngle().dot(toMe) >= GAZE_DOT_THRESHOLD; return player.getLookAngle().dot(toMe) >= AntarchySettings.basiliskGazeDotThreshold();
} }
private boolean isFacingPlayerForGaze(Player player) { private boolean isFacingPlayerForGaze(Player player) {
@@ -323,7 +352,7 @@ public class BasiliskEntity extends Monster implements GeoEntity {
return true; return true;
} }
return this.getViewVector(1.0F).normalize().dot(toPlayer.normalize()) >= BASILISK_GAZE_FACING_THRESHOLD; return this.getViewVector(1.0F).normalize().dot(toPlayer.normalize()) >= AntarchySettings.basiliskGazeFacingThreshold();
} }
private boolean canTargetPlayer(@Nullable Player player) { private boolean canTargetPlayer(@Nullable Player player) {
@@ -339,7 +368,7 @@ public class BasiliskEntity extends Monster implements GeoEntity {
LivingEntity nearest = null; LivingEntity nearest = null;
double nearestDistance = Double.MAX_VALUE; double nearestDistance = Double.MAX_VALUE;
for (LivingEntity entity : this.level().getEntitiesOfClass(LivingEntity.class, for (LivingEntity entity : this.level().getEntitiesOfClass(LivingEntity.class,
this.getBoundingBox().inflate(PREY_PETRIFY_RANGE))) { this.getBoundingBox().inflate(AntarchySettings.basiliskPreyPetrifyRange()))) {
if (entity == this || entity instanceof Player || entity.isDeadOrDying()) { if (entity == this || entity instanceof Player || entity.isDeadOrDying()) {
continue; continue;
} }
@@ -379,9 +408,6 @@ public class BasiliskEntity extends Monster implements GeoEntity {
if (this.getAnimationState() == ANIM_WALK) { if (this.getAnimationState() == ANIM_WALK) {
return state.setAndContinue(WALK_ANIM); return state.setAndContinue(WALK_ANIM);
} }
if (this.getTarget() != null || this.hissChargeTimer > 0 || this.pendingTargetId != null) {
return state.setAndContinue(WALK_ANIM);
}
if (state.isMoving()) { if (state.isMoving()) {
return state.setAndContinue(WALK_ANIM); return state.setAndContinue(WALK_ANIM);
} }
@@ -396,7 +422,7 @@ public class BasiliskEntity extends Monster implements GeoEntity {
@Override @Override
public void handleEntityEvent(byte id) { public void handleEntityEvent(byte id) {
if (id == ATTACK_ENTITY_EVENT) { if (id == ATTACK_ENTITY_EVENT) {
this.attackAnimTicks = ATTACK_ANIM_TICKS; this.attackAnimTicks = AntarchySettings.basiliskAttackAnimTicks();
this.setAnimationState(ANIM_ATTACK); this.setAnimationState(ANIM_ATTACK);
return; return;
} }
@@ -455,6 +481,11 @@ public class BasiliskEntity extends Monster implements GeoEntity {
this.entityData.set(ANIMATION_STATE, state); this.entityData.set(ANIMATION_STATE, state);
} }
@Override
public int getMaxHeadYRot() {
return 20;
}
@Override @Override
public boolean canAttack(LivingEntity target) { public boolean canAttack(LivingEntity target) {
if (target instanceof Player player) { if (target instanceof Player player) {
@@ -463,6 +494,12 @@ public class BasiliskEntity extends Monster implements GeoEntity {
return super.canAttack(target); return super.canAttack(target);
} }
@Override
public boolean isWithinMeleeAttackRange(LivingEntity target) {
double reach = AntarchySettings.basiliskAttackReach();
return this.distanceToSqr(target) <= reach * reach;
}
@Override @Override
public boolean removeWhenFarAway(double distanceToClosestPlayer) { public boolean removeWhenFarAway(double distanceToClosestPlayer) {
return false; return false;
@@ -489,6 +526,31 @@ public class BasiliskEntity extends Monster implements GeoEntity {
return 0.7F; return 0.7F;
} }
/** Limits body rotation to TURN_RATE_DEG_PER_TICK so the long snake turns gradually. */
private static final class BasiliskMoveControl extends MoveControl {
private BasiliskMoveControl(Mob mob) {
super(mob);
}
@Override
public void tick() {
if (this.operation == MoveControl.Operation.MOVE_TO) {
this.operation = MoveControl.Operation.WAIT;
double dx = this.wantedX - this.mob.getX();
double dz = this.wantedZ - this.mob.getZ();
double dy = this.wantedY - this.mob.getY();
if (dx * dx + dy * dy + dz * dz < 2.5E-7) {
this.mob.setZza(0.0F);
return;
}
float targetYaw = (float)(Mth.atan2(dz, dx) * (180.0 / Math.PI)) - 90.0F;
this.mob.setYRot(this.rotlerp(this.mob.getYRot(), targetYaw, TURN_RATE_DEG_PER_TICK));
this.mob.setSpeed((float)(this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED)));
this.mob.setZza(1.0F);
}
}
}
private final class PersistentNearestAttackableTargetGoal<T extends LivingEntity> extends NearestAttackableTargetGoal<T> { private final class PersistentNearestAttackableTargetGoal<T extends LivingEntity> extends NearestAttackableTargetGoal<T> {
PersistentNearestAttackableTargetGoal(Class<T> targetType, int randomInterval, Predicate<LivingEntity> predicate) { PersistentNearestAttackableTargetGoal(Class<T> targetType, int randomInterval, Predicate<LivingEntity> predicate) {
super(BasiliskEntity.this, targetType, randomInterval, true, false, predicate); super(BasiliskEntity.this, targetType, randomInterval, true, false, predicate);
@@ -516,14 +578,12 @@ public class BasiliskEntity extends Monster implements GeoEntity {
} }
@Override @Override
protected void checkAndPerformAttack(LivingEntity enemy) { protected void checkAndPerformAttack(LivingEntity target) {
if (BasiliskEntity.this.attackAnimTicks > 0) { if (BasiliskEntity.this.attackAnimTicks > 0) return;
return; if (!this.canPerformAttack(target)) return;
}
if (this.canPerformAttack(enemy) && this.isTimeToAttack()) {
this.resetAttackCooldown(); this.resetAttackCooldown();
BasiliskEntity.this.doHurtTarget(enemy); BasiliskEntity.this.performAoeAttack();
}
} }
} }
} }
@@ -41,7 +41,6 @@ import net.minecraft.world.entity.monster.Monster;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -93,7 +92,7 @@ public class NightmareEntity extends Monster implements GeoEntity {
private static final int FLIGHT_CEILING_CLEARANCE_BLOCKS = 4; private static final int FLIGHT_CEILING_CLEARANCE_BLOCKS = 4;
private static final double PATROL_SPEED = 0.34D; private static final double PATROL_SPEED = 0.34D;
private static final double COMBAT_FLIGHT_SPEED = 0.58D; private static final double COMBAT_FLIGHT_SPEED = 0.725D;
private static final double GROUND_APPROACH_SPEED = 0.82D; private static final double GROUND_APPROACH_SPEED = 0.82D;
private static final double ATTACK_START_RANGE_SQR = 42.25D; private static final double ATTACK_START_RANGE_SQR = 42.25D;
private static final double ATTACK_REACH_RADIUS = 2.65D; private static final double ATTACK_REACH_RADIUS = 2.65D;
@@ -101,34 +100,31 @@ public class NightmareEntity extends Monster implements GeoEntity {
private static final double FLIGHT_ENGAGE_RANGE_SQR = 100.0D; private static final double FLIGHT_ENGAGE_RANGE_SQR = 100.0D;
private static final double FLIGHT_DISENGAGE_RANGE_SQR = 36.0D; private static final double FLIGHT_DISENGAGE_RANGE_SQR = 36.0D;
private static final double ROAR_RETRY_DISTANCE_SQR = 400.0D; private static final double ROAR_RETRY_DISTANCE_SQR = 400.0D;
private static final double PATROL_AIR_MIN_HEIGHT = 1.15D;
private static final double PATROL_AIR_HEIGHT_SPAN = 0.85D;
private static final float AIR_PATROL_CHANCE = 0.2F;
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("Idle"); private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("Idle");
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk"); private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
private static final RawAnimation TAKEOFF_ANIM = RawAnimation.begin().thenPlay("animation").thenLoop("fly"); private static final RawAnimation TAKEOFF_ANIM = RawAnimation.begin().thenPlay("animation").thenLoop("fly");
private static final RawAnimation FLY_ANIM = RawAnimation.begin().thenLoop("fly"); private static final RawAnimation FLY_ANIM = RawAnimation.begin().thenLoop("fly");
private static final RawAnimation FLY_DAMAGED_ANIM = RawAnimation.begin().thenLoop("fly_damaged");
private static final RawAnimation ATTACK_ANIM = RawAnimation.begin().thenPlay("attack").thenLoop("Idle"); private static final RawAnimation ATTACK_ANIM = RawAnimation.begin().thenPlay("attack").thenLoop("Idle");
private static final RawAnimation FLY_ATTACK_ANIM = RawAnimation.begin().thenPlay("fly_attack").thenLoop("fly"); private static final RawAnimation FLY_ATTACK_ANIM = RawAnimation.begin().thenPlay("fly_attack").thenLoop("fly");
private static final RawAnimation ROAR_ANIM = RawAnimation.begin().thenPlay("roar").thenLoop("Idle"); private static final RawAnimation ROAR_ANIM = RawAnimation.begin().thenPlay("roar").thenLoop("Idle");
private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlay("death").thenLoop("death"); private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlayAndHold("death");
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
@Nullable private Vec3 patrolTarget;
private int patrolRetargetTicks;
private int attackCooldown; private int attackCooldown;
private int attackAnimationTicks; private int attackAnimationTicks;
private int roarTicks; private int roarTicks;
private int roarCooldown; private int roarCooldown;
private int targetlessTicks; private int targetlessTicks;
private int airborneTicks; private int airborneTicks;
private int landingCooldown;
private int groundMoveTicks;
private int wingFlapCooldown; private int wingFlapCooldown;
private int blockBreakCooldown; private int blockBreakCooldown;
private boolean attackHitApplied; private boolean attackHitApplied;
private boolean introRoarUsed; private boolean introRoarUsed;
private boolean flyingToTarget;
public NightmareEntity(EntityType<? extends NightmareEntity> entityType, Level level) { public NightmareEntity(EntityType<? extends NightmareEntity> entityType, Level level) {
super(entityType, level); super(entityType, level);
@@ -141,7 +137,7 @@ public class NightmareEntity extends Monster implements GeoEntity {
.add(Attributes.MAX_HEALTH, 180.0D) .add(Attributes.MAX_HEALTH, 180.0D)
.add(Attributes.ATTACK_DAMAGE, 14.0D) .add(Attributes.ATTACK_DAMAGE, 14.0D)
.add(Attributes.MOVEMENT_SPEED, 0.28D) .add(Attributes.MOVEMENT_SPEED, 0.28D)
.add(Attributes.FLYING_SPEED, 0.3D) .add(Attributes.FLYING_SPEED, 0.375D)
.add(Attributes.FOLLOW_RANGE, 48.0D) .add(Attributes.FOLLOW_RANGE, 48.0D)
.add(Attributes.KNOCKBACK_RESISTANCE, 0.75D) .add(Attributes.KNOCKBACK_RESISTANCE, 0.75D)
.add(Attributes.ARMOR, 8.0D); .add(Attributes.ARMOR, 8.0D);
@@ -164,9 +160,8 @@ public class NightmareEntity extends Monster implements GeoEntity {
@Override @Override
protected void registerGoals() { protected void registerGoals() {
this.goalSelector.addGoal(1, new NightmareRoarGoal()); this.goalSelector.addGoal(1, new NightmareRoarGoal());
this.goalSelector.addGoal(2, new NightmareAttackAnimationGoal()); this.goalSelector.addGoal(2, new NightmareFlyToTargetGoal());
this.goalSelector.addGoal(3, new NightmareFlyToTargetGoal()); this.goalSelector.addGoal(3, new NightmareMeleeGoal());
this.goalSelector.addGoal(4, new NightmareMeleeGoal());
this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 16.0F)); this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 16.0F));
this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(6, new RandomLookAroundGoal(this));
this.goalSelector.addGoal(7, new NightmareWanderGoal()); this.goalSelector.addGoal(7, new NightmareWanderGoal());
@@ -181,12 +176,17 @@ public class NightmareEntity extends Monster implements GeoEntity {
} }
private PlayState mainAnimController(AnimationState<NightmareEntity> state) { private PlayState mainAnimController(AnimationState<NightmareEntity> state) {
state.getController().setAnimationSpeed(this.getAnimationState() == ANIM_FLY ? 0.45D : 1.0D); int animState = this.getAnimationState();
return switch (this.getAnimationState()) { state.getController().setAnimationSpeed(switch (animState) {
case ANIM_FLY -> 0.45D;
case ANIM_DEATH -> 0.6D;
default -> 1.0D;
});
return switch (animState) {
case ANIM_WALK -> state.setAndContinue(WALK_ANIM); case ANIM_WALK -> state.setAndContinue(WALK_ANIM);
case ANIM_TAKEOFF -> state.setAndContinue(TAKEOFF_ANIM); case ANIM_TAKEOFF -> state.setAndContinue(TAKEOFF_ANIM);
case ANIM_FLY -> state.setAndContinue(FLY_ANIM); case ANIM_FLY -> state.setAndContinue(FLY_ANIM);
case ANIM_FLY_DAMAGED -> state.setAndContinue(FLY_DAMAGED_ANIM); // case ANIM_FLY_DAMAGED -> state.setAndContinue(FLY_ANIM);
case ANIM_ATTACK -> state.setAndContinue(ATTACK_ANIM); case ANIM_ATTACK -> state.setAndContinue(ATTACK_ANIM);
case ANIM_FLY_ATTACK -> state.setAndContinue(FLY_ATTACK_ANIM); case ANIM_FLY_ATTACK -> state.setAndContinue(FLY_ATTACK_ANIM);
case ANIM_ROAR -> state.setAndContinue(ROAR_ANIM); case ANIM_ROAR -> state.setAndContinue(ROAR_ANIM);
@@ -212,7 +212,6 @@ public class NightmareEntity extends Monster implements GeoEntity {
@Override @Override
public void tick() { public void tick() {
super.tick(); super.tick();
this.setNoGravity(this.shouldUseFlight() && !this.isTooCloseToCeiling());
if (this.level().isClientSide) { if (this.level().isClientSide) {
this.tickClientParticles(); this.tickClientParticles();
@@ -220,11 +219,18 @@ public class NightmareEntity extends Monster implements GeoEntity {
return; return;
} }
this.setNoGravity(this.flyingToTarget && !this.isTooCloseToCeiling());
int prevAirborneTicks = this.airborneTicks;
this.airborneTicks = this.onGround() ? 0 : this.airborneTicks + 1; this.airborneTicks = this.onGround() ? 0 : this.airborneTicks + 1;
if (this.onGround() && prevAirborneTicks > 5) {
this.landingCooldown = 100;
}
if (this.attackCooldown > 0) this.attackCooldown--; if (this.attackCooldown > 0) this.attackCooldown--;
if (this.roarCooldown > 0) this.roarCooldown--; if (this.roarCooldown > 0) this.roarCooldown--;
if (this.blockBreakCooldown > 0) this.blockBreakCooldown--; if (this.blockBreakCooldown > 0) this.blockBreakCooldown--;
if (this.landingCooldown > 0) this.landingCooldown--;
LivingEntity target = this.getTarget(); LivingEntity target = this.getTarget();
if (!this.canTargetEntity(target)) { if (!this.canTargetEntity(target)) {
@@ -248,16 +254,20 @@ public class NightmareEntity extends Monster implements GeoEntity {
return; return;
} }
if (this.attackAnimationTicks > 0) {
this.tickAttack(target);
}
this.updateAnimationState(); this.updateAnimationState();
this.updateFlightRotation(); this.updateFlightRotation();
} }
@Override @Override
public void travel(Vec3 travelVector) { public void travel(Vec3 travelVector) {
if (this.isEffectiveAi() && (this.isNoGravity() || !this.onGround())) { if (this.isEffectiveAi() && this.isNoGravity()) {
this.moveRelative(this.getSpeed(), travelVector); this.moveRelative(this.getSpeed(), travelVector);
this.move(MoverType.SELF, this.getDeltaMovement()); this.move(MoverType.SELF, this.getDeltaMovement());
this.setDeltaMovement(this.getDeltaMovement().scale(this.onGround() ? 0.88D : 0.91D)); this.setDeltaMovement(this.getDeltaMovement().scale(0.91D));
return; return;
} }
super.travel(travelVector); super.travel(travelVector);
@@ -393,8 +403,10 @@ public class NightmareEntity extends Monster implements GeoEntity {
} }
private void setAnimationState(int animationState) { private void setAnimationState(int animationState) {
if (this.entityData.get(ANIMATION_STATE) != animationState) {
this.entityData.set(ANIMATION_STATE, animationState); this.entityData.set(ANIMATION_STATE, animationState);
} }
}
private boolean shouldStartRoar(LivingEntity target) { private boolean shouldStartRoar(LivingEntity target) {
if (!this.onGround() || this.roarCooldown > 0 || !this.hasLineOfSight(target)) return false; if (!this.onGround() || this.roarCooldown > 0 || !this.hasLineOfSight(target)) return false;
@@ -546,11 +558,9 @@ public class NightmareEntity extends Monster implements GeoEntity {
} }
private boolean shouldUseFlight() { private boolean shouldUseFlight() {
if (this.landingCooldown > 0) return false;
LivingEntity target = this.getTarget(); LivingEntity target = this.getTarget();
if (target != null) { return target != null && this.distanceToSqr(target) > FLIGHT_ENGAGE_RANGE_SQR;
return this.distanceToSqr(target) > FLIGHT_ENGAGE_RANGE_SQR;
}
return this.patrolTarget != null && this.patrolTarget.y > this.getY() + 1.5D;
} }
private boolean canStartAttackOn(LivingEntity target) { private boolean canStartAttackOn(LivingEntity target) {
@@ -589,65 +599,6 @@ public class NightmareEntity extends Monster implements GeoEntity {
} }
} }
private Vec3 findPatrolTarget() {
BlockPos origin = this.blockPosition();
for (int attempt = 0; attempt < 18; attempt++) {
int x = origin.getX() + this.random.nextInt(29) - 14;
int z = origin.getZ() + this.random.nextInt(29) - 14;
BlockPos terrainPos = this.level().getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, new BlockPos(x, origin.getY(), z));
boolean airPatrol = this.random.nextFloat() < AIR_PATROL_CHANCE;
double y = airPatrol
? terrainPos.getY() + PATROL_AIR_MIN_HEIGHT + this.random.nextDouble() * PATROL_AIR_HEIGHT_SPAN
: terrainPos.getY() + 1.0D;
Vec3 desired = new Vec3(x + 0.5D, y, z + 0.5D);
Vec3 openTarget = this.findNearestFlightTarget(desired);
if (openTarget.distanceToSqr(desired) <= 16.0D) return openTarget;
}
BlockPos fallback = this.level().getHeightmapPos(
Heightmap.Types.MOTION_BLOCKING_NO_LEAVES,
origin.offset(this.random.nextInt(25) - 12, 0, this.random.nextInt(25) - 12)
);
return new Vec3(fallback.getX() + 0.5D, fallback.getY() + 1.0D, fallback.getZ() + 0.5D);
}
private Vec3 findNearestFlightTarget(Vec3 desired) {
BlockPos desiredPos = BlockPos.containing(desired);
Vec3 best = null;
double bestScore = Double.MAX_VALUE;
for (int attempt = 0; attempt < 14; attempt++) {
BlockPos candidate = desiredPos.offset(
this.random.nextInt(7) - 3,
this.random.nextInt(5) - 2,
this.random.nextInt(7) - 3
);
if (!this.isOpenFlightSpace(candidate) || !this.isCeilingBuffered(candidate)) continue;
Vec3 center = Vec3.atCenterOf(candidate);
double score = center.distanceToSqr(desired) + Math.max(0.0D, center.y - desired.y) * 6.0D;
if (score < bestScore) {
best = center;
bestScore = score;
}
}
if (best != null) return best;
for (int down = 0; down <= 12; down++) {
BlockPos lowered = desiredPos.below(down);
if (this.isOpenFlightSpace(lowered) && this.isCeilingBuffered(lowered)) return Vec3.atCenterOf(lowered);
}
return desired;
}
private boolean isOpenFlightSpace(BlockPos pos) {
return this.level().isEmptyBlock(pos)
&& this.level().isEmptyBlock(pos.above())
&& this.level().isEmptyBlock(pos.above(2));
}
private boolean isCeilingBuffered(BlockPos pos) {
for (int i = 3; i <= FLIGHT_CEILING_CLEARANCE_BLOCKS; i++) {
if (!this.level().isEmptyBlock(pos.above(i))) return false;
}
return true;
}
private boolean isTooCloseToCeiling() { private boolean isTooCloseToCeiling() {
BlockPos current = BlockPos.containing(this.getX(), this.getY(), this.getZ()); BlockPos current = BlockPos.containing(this.getX(), this.getY(), this.getZ());
@@ -689,36 +640,44 @@ public class NightmareEntity extends Monster implements GeoEntity {
private void updateAnimationState() { private void updateAnimationState() {
if (this.isDeadOrDying()) { if (this.isDeadOrDying()) {
this.setAnimationState(ANIM_DEATH); this.setAnimationState(ANIM_DEATH);
this.groundMoveTicks = 0;
this.wingFlapCooldown = 0; this.wingFlapCooldown = 0;
return; return;
} }
if (this.isRoaring()) { if (this.isRoaring()) {
this.setAnimationState(ANIM_ROAR); this.setAnimationState(ANIM_ROAR);
this.groundMoveTicks = 0;
this.wingFlapCooldown = 0; this.wingFlapCooldown = 0;
return; return;
} }
if (this.attackAnimationTicks > 0) { if (this.attackAnimationTicks > 0) {
this.setAnimationState(this.onGround() ? ANIM_ATTACK : ANIM_FLY_ATTACK); this.setAnimationState(this.onGround() ? ANIM_ATTACK : ANIM_FLY_ATTACK);
this.groundMoveTicks = 0;
this.tickWingFlapSound(); this.tickWingFlapSound();
return; return;
} }
if (!this.onGround() && this.airborneTicks > 0 && this.airborneTicks <= 10 && this.shouldUseFlight()) { if (this.flyingToTarget) {
this.groundMoveTicks = 0;
if (this.onGround() || this.airborneTicks <= 8) {
this.setAnimationState(ANIM_TAKEOFF); this.setAnimationState(ANIM_TAKEOFF);
this.wingFlapCooldown = 0; this.wingFlapCooldown = 0;
return; } else {
} this.setAnimationState(ANIM_FLY);
if (!this.onGround() && this.hurtTime > 0) {
this.setAnimationState(ANIM_FLY_DAMAGED);
this.tickWingFlapSound(); this.tickWingFlapSound();
}
return; return;
} }
if (!this.onGround()) { if (!this.onGround()) {
this.groundMoveTicks = 0;
this.setAnimationState(ANIM_FLY); this.setAnimationState(ANIM_FLY);
this.tickWingFlapSound(); this.tickWingFlapSound();
return; return;
} }
Vec3 velocity = this.getDeltaMovement(); if (this.walkDist - this.walkDistO > 0.005F) {
if (velocity.horizontalDistanceSqr() > 0.008D) { this.groundMoveTicks = 6;
}
if (this.groundMoveTicks > 0) {
this.groundMoveTicks--;
this.setAnimationState(ANIM_WALK); this.setAnimationState(ANIM_WALK);
this.wingFlapCooldown = 0; this.wingFlapCooldown = 0;
return; return;
@@ -776,27 +735,6 @@ public class NightmareEntity extends Monster implements GeoEntity {
} }
} }
private final class NightmareAttackAnimationGoal extends Goal {
NightmareAttackAnimationGoal() {
this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK));
}
@Override
public boolean canUse() {
return NightmareEntity.this.attackAnimationTicks > 0;
}
@Override
public boolean canContinueToUse() {
return NightmareEntity.this.attackAnimationTicks > 0;
}
@Override
public void tick() {
NightmareEntity.this.tickAttack(NightmareEntity.this.getTarget());
}
}
private final class NightmareFlyToTargetGoal extends Goal { private final class NightmareFlyToTargetGoal extends Goal {
NightmareFlyToTargetGoal() { NightmareFlyToTargetGoal() {
this.setFlags(EnumSet.of(Flag.MOVE)); this.setFlags(EnumSet.of(Flag.MOVE));
@@ -805,7 +743,9 @@ public class NightmareEntity extends Monster implements GeoEntity {
@Override @Override
public boolean canUse() { public boolean canUse() {
LivingEntity target = NightmareEntity.this.getTarget(); LivingEntity target = NightmareEntity.this.getTarget();
return target != null && NightmareEntity.this.distanceToSqr(target) > FLIGHT_ENGAGE_RANGE_SQR; return target != null
&& NightmareEntity.this.landingCooldown <= 0
&& NightmareEntity.this.distanceToSqr(target) > FLIGHT_ENGAGE_RANGE_SQR;
} }
@Override @Override
@@ -814,8 +754,15 @@ public class NightmareEntity extends Monster implements GeoEntity {
return target != null && NightmareEntity.this.distanceToSqr(target) > FLIGHT_DISENGAGE_RANGE_SQR; return target != null && NightmareEntity.this.distanceToSqr(target) > FLIGHT_DISENGAGE_RANGE_SQR;
} }
@Override
public void start() {
NightmareEntity.this.flyingToTarget = true;
}
@Override @Override
public void stop() { public void stop() {
NightmareEntity.this.flyingToTarget = false;
NightmareEntity.this.landingCooldown = 80;
NightmareEntity.this.getNavigation().stop(); NightmareEntity.this.getNavigation().stop();
} }
@@ -860,48 +807,42 @@ public class NightmareEntity extends Monster implements GeoEntity {
} }
private final class NightmareWanderGoal extends Goal { private final class NightmareWanderGoal extends Goal {
private double x, y, z;
private int wanderTicks;
NightmareWanderGoal() { NightmareWanderGoal() {
this.setFlags(EnumSet.of(Flag.MOVE)); this.setFlags(EnumSet.of(Flag.MOVE));
} }
@Override @Override
public boolean canUse() { public boolean canUse() {
return NightmareEntity.this.getTarget() == null && !NightmareEntity.this.isDeadOrDying(); if (NightmareEntity.this.getTarget() != null || NightmareEntity.this.isDeadOrDying()) return false;
if (NightmareEntity.this.random.nextInt(40) != 0) return false;
double angle = NightmareEntity.this.random.nextDouble() * Math.PI * 2;
double dist = 4 + NightmareEntity.this.random.nextDouble() * 10;
this.x = NightmareEntity.this.getX() + Math.cos(angle) * dist;
this.z = NightmareEntity.this.getZ() + Math.sin(angle) * dist;
this.y = NightmareEntity.this.getY();
return true;
} }
@Override @Override
public boolean canContinueToUse() { public boolean canContinueToUse() {
return this.canUse(); return this.wanderTicks > 0
&& NightmareEntity.this.getTarget() == null
&& !NightmareEntity.this.isDeadOrDying()
&& NightmareEntity.this.distanceToSqr(this.x, this.y, this.z) > 2.25;
} }
@Override @Override
public void start() { public void start() {
NightmareEntity.this.patrolTarget = null; this.wanderTicks = 80 + NightmareEntity.this.random.nextInt(40);
NightmareEntity.this.patrolRetargetTicks = 0;
}
@Override
public void stop() {
NightmareEntity.this.getNavigation().stop();
NightmareEntity.this.patrolTarget = null;
} }
@Override @Override
public void tick() { public void tick() {
if (NightmareEntity.this.patrolRetargetTicks-- <= 0 this.wanderTicks--;
|| NightmareEntity.this.patrolTarget == null NightmareEntity.this.getMoveControl().setWantedPosition(this.x, this.y, this.z, PATROL_SPEED);
|| NightmareEntity.this.position().distanceToSqr(NightmareEntity.this.patrolTarget) < 4.0D) {
NightmareEntity.this.patrolRetargetTicks = 30 + NightmareEntity.this.random.nextInt(30);
NightmareEntity.this.patrolTarget = NightmareEntity.this.findPatrolTarget();
}
if (NightmareEntity.this.patrolTarget != null) {
NightmareEntity.this.getMoveControl().setWantedPosition(
NightmareEntity.this.patrolTarget.x,
NightmareEntity.this.patrolTarget.y,
NightmareEntity.this.patrolTarget.z,
PATROL_SPEED
);
}
} }
} }
} }
@@ -4,6 +4,11 @@
"idle": { "idle": {
"loop": true, "loop": true,
"animation_length": 4, "animation_length": 4,
"sound_effects": {
"0.0": {
"effect": "antarchy:basilisk_idle_loop|0.45|1.0"
}
},
"bones": { "bones": {
"upper_body": { "upper_body": {
"rotation": { "rotation": {
@@ -402,7 +407,7 @@
} }
}, },
"attack": { "attack": {
"loop": true, "loop": false,
"animation_length": 1, "animation_length": 1,
"bones": { "bones": {
"Basilisk": { "Basilisk": {
@@ -891,7 +896,7 @@
} }
}, },
"death": { "death": {
"loop": true, "loop": false,
"animation_length": 1.25, "animation_length": 1.25,
"bones": { "bones": {
"Basilisk": { "Basilisk": {
@@ -1518,6 +1523,11 @@
"walk": { "walk": {
"loop": true, "loop": true,
"animation_length": 2, "animation_length": 2,
"sound_effects": {
"0.0": {
"effect": "antarchy:basilisk_slither_loop|0.45|1.0"
}
},
"bones": { "bones": {
"Basilisk": { "Basilisk": {
"position": { "position": {
@@ -1408,7 +1408,7 @@ public final class AntarchyFabricContent {
.build("scorpion")); .build("scorpion"));
public static final DeferredHolder<EntityType<?>, EntityType<BasiliskEntity>> BASILISK = ENTITY_TYPES.register("basilisk", public static final DeferredHolder<EntityType<?>, EntityType<BasiliskEntity>> BASILISK = ENTITY_TYPES.register("basilisk",
() -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER) () -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER)
.sized(2.0F, 3.5F) .sized(3.0F, 3.5F)
.clientTrackingRange(14) .clientTrackingRange(14)
.build("basilisk")); .build("basilisk"));
public static final DeferredHolder<EntityType<?>, EntityType<EmperorScorpionEntity>> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion", public static final DeferredHolder<EntityType<?>, EntityType<EmperorScorpionEntity>> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion",
@@ -109,8 +109,30 @@ public final class AntarchyConfigModuleNeoforge {
AntarchySettings.setReverieWarningThreatVerticalRange(AntarchyMobsConfig.reverieWarningThreatVerticalRange()); AntarchySettings.setReverieWarningThreatVerticalRange(AntarchyMobsConfig.reverieWarningThreatVerticalRange());
AntarchySettings.setReverieDuplicationCooldownTicks(AntarchyMobsConfig.reverieDuplicationCooldownTicks()); AntarchySettings.setReverieDuplicationCooldownTicks(AntarchyMobsConfig.reverieDuplicationCooldownTicks());
AntarchySettings.setNightmareHealth(AntarchyMobsConfig.nightmareHealth());
AntarchySettings.setNightmareAttackDamage(AntarchyMobsConfig.nightmareAttackDamage());
AntarchySettings.setBasiliskPetrifyingGazeEnabled(AntarchyMobsConfig.basiliskPetrifyingGazeEnabled()); AntarchySettings.setBasiliskPetrifyingGazeEnabled(AntarchyMobsConfig.basiliskPetrifyingGazeEnabled());
AntarchySettings.setBasiliskSpawnMaxLightLevel(AntarchyMobsConfig.basiliskSpawnMaxLightLevel()); AntarchySettings.setBasiliskSpawnMaxLightLevel(AntarchyMobsConfig.basiliskSpawnMaxLightLevel());
AntarchySettings.setBasiliskHealth(AntarchyMobsConfig.basiliskHealth());
AntarchySettings.setBasiliskAttackDamage(AntarchyMobsConfig.basiliskAttackDamage());
AntarchySettings.setBasiliskMovementSpeed(AntarchyMobsConfig.basiliskMovementSpeed());
AntarchySettings.setBasiliskArmor(AntarchyMobsConfig.basiliskArmor());
AntarchySettings.setBasiliskKnockbackResistance(AntarchyMobsConfig.basiliskKnockbackResistance());
AntarchySettings.setBasiliskFollowRange(AntarchyMobsConfig.basiliskFollowRange());
AntarchySettings.setBasiliskXpReward(AntarchyMobsConfig.basiliskXpReward());
AntarchySettings.setBasiliskAttackAnimTicks(AntarchyMobsConfig.basiliskAttackAnimTicks());
AntarchySettings.setBasiliskAttackDamageTick(AntarchyMobsConfig.basiliskAttackDamageTick());
AntarchySettings.setBasiliskHissCooldownTicks(AntarchyMobsConfig.basiliskHissCooldownTicks());
AntarchySettings.setBasiliskAttackReach(AntarchyMobsConfig.basiliskAttackReach());
AntarchySettings.setBasiliskGazeRange(AntarchyMobsConfig.basiliskGazeRange());
AntarchySettings.setBasiliskGazeDotThreshold(AntarchyMobsConfig.basiliskGazeDotThreshold());
AntarchySettings.setBasiliskGazeFacingThreshold(AntarchyMobsConfig.basiliskGazeFacingThreshold());
AntarchySettings.setBasiliskHissChargeTicks(AntarchyMobsConfig.basiliskHissChargeTicks());
AntarchySettings.setBasiliskPlayerParalyzeTicks(AntarchyMobsConfig.basiliskPlayerParalyzeTicks());
AntarchySettings.setBasiliskPreyPetrifyCooldownTicks(AntarchyMobsConfig.basiliskPreyPetrifyCooldownTicks());
AntarchySettings.setBasiliskPreyPetrifyRange(AntarchyMobsConfig.basiliskPreyPetrifyRange());
AntarchySettings.setBasiliskPreyPetrifyTicks(AntarchyMobsConfig.basiliskPreyPetrifyTicks());
AntarchySettings.setLucidAttackRange(AntarchyMobsConfig.lucidAttackRange()); AntarchySettings.setLucidAttackRange(AntarchyMobsConfig.lucidAttackRange());
AntarchySettings.setLucidPearlInvertedDurationSeconds(AntarchyMobsConfig.lucidPearlInvertedDurationSeconds()); AntarchySettings.setLucidPearlInvertedDurationSeconds(AntarchyMobsConfig.lucidPearlInvertedDurationSeconds());
@@ -5,9 +5,9 @@ import net.neoforged.neoforge.common.ModConfigSpec;
public final class AntarchyMobsConfig { public final class AntarchyMobsConfig {
public static final ModConfigSpec SPEC; public static final ModConfigSpec SPEC;
// -------------------------------------------------------------------------
// Ants // Ants
// -------------------------------------------------------------------------
private static final ModConfigSpec.BooleanValue ANTS_STEAL_FROM_CHESTS; private static final ModConfigSpec.BooleanValue ANTS_STEAL_FROM_CHESTS;
private static final ModConfigSpec.BooleanValue BROWN_ANT_REQUIRES_REAGENT; private static final ModConfigSpec.BooleanValue BROWN_ANT_REQUIRES_REAGENT;
@@ -35,72 +35,72 @@ public final class AntarchyMobsConfig {
private static final ModConfigSpec.ConfigValue<String> TERMITE_DESTINATION_DIMENSION; private static final ModConfigSpec.ConfigValue<String> TERMITE_DESTINATION_DIMENSION;
// -------------------------------------------------------------------------
// Easter Bunny // Easter Bunny
// -------------------------------------------------------------------------
private static final ModConfigSpec.BooleanValue EASTER_BUNNY_ENABLED; private static final ModConfigSpec.BooleanValue EASTER_BUNNY_ENABLED;
private static final ModConfigSpec.IntValue EASTER_BUNNY_NATURAL_SPAWN_CHANCE_PERCENT; private static final ModConfigSpec.IntValue EASTER_BUNNY_NATURAL_SPAWN_CHANCE_PERCENT;
// -------------------------------------------------------------------------
// Wasp // Wasp
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue WASP_HEALTH; private static final ModConfigSpec.DoubleValue WASP_HEALTH;
private static final ModConfigSpec.DoubleValue WASP_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue WASP_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue WASP_MOVEMENT_SPEED; private static final ModConfigSpec.DoubleValue WASP_MOVEMENT_SPEED;
// -------------------------------------------------------------------------
// Bomber // Bomber
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue BOMBER_HEALTH; private static final ModConfigSpec.DoubleValue BOMBER_HEALTH;
private static final ModConfigSpec.DoubleValue BOMBER_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BOMBER_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue BOMBER_EXPLOSION_DAMAGE; private static final ModConfigSpec.DoubleValue BOMBER_EXPLOSION_DAMAGE;
private static final ModConfigSpec.DoubleValue BOMBER_EXPLOSION_RADIUS; private static final ModConfigSpec.DoubleValue BOMBER_EXPLOSION_RADIUS;
// -------------------------------------------------------------------------
// Kraken // Kraken
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue KRAKEN_HEALTH; private static final ModConfigSpec.DoubleValue KRAKEN_HEALTH;
private static final ModConfigSpec.DoubleValue KRAKEN_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue KRAKEN_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue KRAKEN_PROJECTILE_DAMAGE_TAKEN_MULTIPLIER; private static final ModConfigSpec.DoubleValue KRAKEN_PROJECTILE_DAMAGE_TAKEN_MULTIPLIER;
private static final ModConfigSpec.BooleanValue KRAKEN_SQUID_SPAWN_ENABLED; private static final ModConfigSpec.BooleanValue KRAKEN_SQUID_SPAWN_ENABLED;
private static final ModConfigSpec.BooleanValue KRAKEN_MASS_SPAWN_ENABLED; private static final ModConfigSpec.BooleanValue KRAKEN_MASS_SPAWN_ENABLED;
// -------------------------------------------------------------------------
// Brutalfly // Brutalfly
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue BRUTALFLY_HEALTH; private static final ModConfigSpec.DoubleValue BRUTALFLY_HEALTH;
private static final ModConfigSpec.DoubleValue BRUTALFLY_SWIPE_DAMAGE; private static final ModConfigSpec.DoubleValue BRUTALFLY_SWIPE_DAMAGE;
private static final ModConfigSpec.DoubleValue BRUTALFLY_SPIT_DAMAGE; private static final ModConfigSpec.DoubleValue BRUTALFLY_SPIT_DAMAGE;
// -------------------------------------------------------------------------
// Mantis // Mantis
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue MANTIS_HEALTH; private static final ModConfigSpec.DoubleValue MANTIS_HEALTH;
private static final ModConfigSpec.DoubleValue MANTIS_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue MANTIS_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue MANTIS_MOVEMENT_SPEED; private static final ModConfigSpec.DoubleValue MANTIS_MOVEMENT_SPEED;
private static final ModConfigSpec.DoubleValue MANTIS_FLYING_SPEED; private static final ModConfigSpec.DoubleValue MANTIS_FLYING_SPEED;
private static final ModConfigSpec.BooleanValue MANTIS_IGNORE_LIGHT_LEVEL; private static final ModConfigSpec.BooleanValue MANTIS_IGNORE_LIGHT_LEVEL;
// -------------------------------------------------------------------------
// Triffid // Triffid
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue TRIFFID_HEALTH; private static final ModConfigSpec.DoubleValue TRIFFID_HEALTH;
private static final ModConfigSpec.DoubleValue TRIFFID_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue TRIFFID_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue TRIFFID_GRAB_DAMAGE; private static final ModConfigSpec.DoubleValue TRIFFID_GRAB_DAMAGE;
// -------------------------------------------------------------------------
// Caterpillar // Caterpillar
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue CATERPILLAR_PUPATION_TIME_SECONDS; private static final ModConfigSpec.DoubleValue CATERPILLAR_PUPATION_TIME_SECONDS;
// -------------------------------------------------------------------------
// Ant Dance // Ant Dance
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue ANT_DANCE_RADIUS; private static final ModConfigSpec.DoubleValue ANT_DANCE_RADIUS;
// -------------------------------------------------------------------------
// Reverie // Reverie
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue REVERIE_HEALTH; private static final ModConfigSpec.DoubleValue REVERIE_HEALTH;
private static final ModConfigSpec.DoubleValue REVERIE_INTEREST_RADIUS; private static final ModConfigSpec.DoubleValue REVERIE_INTEREST_RADIUS;
private static final ModConfigSpec.DoubleValue REVERIE_ABANDON_PLAYER_DISTANCE; private static final ModConfigSpec.DoubleValue REVERIE_ABANDON_PLAYER_DISTANCE;
@@ -114,21 +114,46 @@ public final class AntarchyMobsConfig {
private static final ModConfigSpec.DoubleValue REVERIE_WARNING_THREAT_VERTICAL_RANGE; private static final ModConfigSpec.DoubleValue REVERIE_WARNING_THREAT_VERTICAL_RANGE;
private static final ModConfigSpec.IntValue REVERIE_DUPLICATION_COOLDOWN_TICKS; private static final ModConfigSpec.IntValue REVERIE_DUPLICATION_COOLDOWN_TICKS;
// -------------------------------------------------------------------------
// Nightmare
private static final ModConfigSpec.DoubleValue NIGHTMARE_HEALTH;
private static final ModConfigSpec.DoubleValue NIGHTMARE_ATTACK_DAMAGE;
// Basilisk // Basilisk
// -------------------------------------------------------------------------
private static final ModConfigSpec.BooleanValue BASILISK_PETRIFYING_GAZE_ENABLED; private static final ModConfigSpec.BooleanValue BASILISK_PETRIFYING_GAZE_ENABLED;
private static final ModConfigSpec.IntValue BASILISK_SPAWN_MAX_LIGHT_LEVEL; private static final ModConfigSpec.IntValue BASILISK_SPAWN_MAX_LIGHT_LEVEL;
private static final ModConfigSpec.DoubleValue BASILISK_HEALTH;
private static final ModConfigSpec.DoubleValue BASILISK_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue BASILISK_MOVEMENT_SPEED;
private static final ModConfigSpec.DoubleValue BASILISK_ARMOR;
private static final ModConfigSpec.DoubleValue BASILISK_KNOCKBACK_RESISTANCE;
private static final ModConfigSpec.DoubleValue BASILISK_FOLLOW_RANGE;
private static final ModConfigSpec.IntValue BASILISK_XP_REWARD;
private static final ModConfigSpec.IntValue BASILISK_ATTACK_ANIM_TICKS;
private static final ModConfigSpec.IntValue BASILISK_ATTACK_DAMAGE_TICK;
private static final ModConfigSpec.IntValue BASILISK_HISS_COOLDOWN_TICKS;
private static final ModConfigSpec.DoubleValue BASILISK_ATTACK_REACH;
private static final ModConfigSpec.DoubleValue BASILISK_GAZE_RANGE;
private static final ModConfigSpec.DoubleValue BASILISK_GAZE_DOT_THRESHOLD;
private static final ModConfigSpec.DoubleValue BASILISK_GAZE_FACING_THRESHOLD;
private static final ModConfigSpec.IntValue BASILISK_HISS_CHARGE_TICKS;
private static final ModConfigSpec.IntValue BASILISK_PLAYER_PARALYZE_TICKS;
private static final ModConfigSpec.IntValue BASILISK_PREY_PETRIFY_COOLDOWN_TICKS;
private static final ModConfigSpec.DoubleValue BASILISK_PREY_PETRIFY_RANGE;
private static final ModConfigSpec.IntValue BASILISK_PREY_PETRIFY_TICKS;
// -------------------------------------------------------------------------
// Lucid // Lucid
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue LUCID_ATTACK_RANGE; private static final ModConfigSpec.DoubleValue LUCID_ATTACK_RANGE;
private static final ModConfigSpec.DoubleValue LUCID_PEARL_INVERTED_DURATION_SECONDS; private static final ModConfigSpec.DoubleValue LUCID_PEARL_INVERTED_DURATION_SECONDS;
// -------------------------------------------------------------------------
// Dread effect // Dread effect
// -------------------------------------------------------------------------
private static final ModConfigSpec.BooleanValue DREAD_HALLUCINATION_SOUNDS_ENABLED; private static final ModConfigSpec.BooleanValue DREAD_HALLUCINATION_SOUNDS_ENABLED;
private static final ModConfigSpec.DoubleValue DREAD_HALLUCINATION_SOUND_MIN_INTERVAL; private static final ModConfigSpec.DoubleValue DREAD_HALLUCINATION_SOUND_MIN_INTERVAL;
private static final ModConfigSpec.DoubleValue DREAD_HALLUCINATION_SOUND_MAX_INTERVAL; private static final ModConfigSpec.DoubleValue DREAD_HALLUCINATION_SOUND_MAX_INTERVAL;
@@ -251,7 +276,7 @@ public final class AntarchyMobsConfig {
// Kraken // Kraken
b.push("kraken"); b.push("kraken");
KRAKEN_HEALTH = b.comment("Base max health.") .defineInRange("health", 750.0D, 1.0D, 32768.0D); KRAKEN_HEALTH = b.comment("Base max health.") .defineInRange("health", 1500.0D, 1.0D, 32768.0D);
KRAKEN_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 45.0D, 0.0D, 1024.0D); KRAKEN_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 45.0D, 0.0D, 1024.0D);
KRAKEN_PROJECTILE_DAMAGE_TAKEN_MULTIPLIER = b.comment("Damage multiplier from projectiles. 0.5 means 50% damage.") .defineInRange("projectileDamageTakenMultiplier", 0.5D, 0.0D, 10.0D); KRAKEN_PROJECTILE_DAMAGE_TAKEN_MULTIPLIER = b.comment("Damage multiplier from projectiles. 0.5 means 50% damage.") .defineInRange("projectileDamageTakenMultiplier", 0.5D, 0.0D, 10.0D);
KRAKEN_SQUID_SPAWN_ENABLED = b.comment("If true, killing a Missile Squid has a 1/100 chance to spawn a single Kraken nearby.") .define("squidSpawnEnabled", true); KRAKEN_SQUID_SPAWN_ENABLED = b.comment("If true, killing a Missile Squid has a 1/100 chance to spawn a single Kraken nearby.") .define("squidSpawnEnabled", true);
@@ -323,6 +348,13 @@ public final class AntarchyMobsConfig {
REVERIE_DUPLICATION_COOLDOWN_TICKS = b.comment("Cooldown in ticks before Blood Crystal can duplicate the Reverie again.") .defineInRange("duplicationCooldownTicks", 6000, 20, 24000); REVERIE_DUPLICATION_COOLDOWN_TICKS = b.comment("Cooldown in ticks before Blood Crystal can duplicate the Reverie again.") .defineInRange("duplicationCooldownTicks", 6000, 20, 24000);
b.pop(); b.pop();
// Nightmare
b.push("nightmare");
NIGHTMARE_HEALTH = b.comment("Base max health.").defineInRange("health", 180.0D, 1.0D, 32768.0D);
NIGHTMARE_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 16.0D, 0.0D, 1024.0D);
b.pop();
// Basilisk // Basilisk
@@ -333,6 +365,25 @@ public final class AntarchyMobsConfig {
BASILISK_SPAWN_MAX_LIGHT_LEVEL = b BASILISK_SPAWN_MAX_LIGHT_LEVEL = b
.comment("Maximum local raw light level where basilisk natural spawning is allowed.") .comment("Maximum local raw light level where basilisk natural spawning is allowed.")
.defineInRange("spawnMaxLightLevel", 5, 0, 15); .defineInRange("spawnMaxLightLevel", 5, 0, 15);
BASILISK_HEALTH = b.comment("Base max health.").defineInRange("health", 150.0D, 1.0D, 32768.0D);
BASILISK_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 18.0D, 0.0D, 1024.0D);
BASILISK_MOVEMENT_SPEED = b.comment("Base movement speed.").defineInRange("movementSpeed", 0.35D, 0.0D, 10.0D);
BASILISK_ARMOR = b.comment("Base armor value.").defineInRange("armor", 6.0D, 0.0D, 1024.0D);
BASILISK_KNOCKBACK_RESISTANCE = b.comment("Base knockback resistance.").defineInRange("knockbackResistance", 0.5D, 0.0D, 1.0D);
BASILISK_FOLLOW_RANGE = b.comment("Base follow range.").defineInRange("followRange", 28.0D, 1.0D, 128.0D);
BASILISK_XP_REWARD = b.comment("Base experience reward.").defineInRange("xpReward", 50, 0, 100000);
BASILISK_ATTACK_ANIM_TICKS = b.comment("Ticks for the attack animation window.").defineInRange("attackAnimTicks", 18, 1, 400);
BASILISK_ATTACK_DAMAGE_TICK = b.comment("Tick during the attack animation when damage is applied.").defineInRange("attackDamageTick", 9, 0, 400);
BASILISK_HISS_COOLDOWN_TICKS = b.comment("Ticks between petrifying gaze attempts.").defineInRange("hissCooldownTicks", 600, 0, 20000);
BASILISK_ATTACK_REACH = b.comment("Forward bite reach in blocks measured from the basilisk's center.").defineInRange("attackReach", 3.0D, 0.0D, 128.0D);
BASILISK_GAZE_RANGE = b.comment("Range in blocks for petrifying gaze checks.").defineInRange("gazeRange", 12.0D, 0.0D, 128.0D);
BASILISK_GAZE_DOT_THRESHOLD = b.comment("Dot threshold for the player gaze check.").defineInRange("gazeDotThreshold", 0.64D, -1.0D, 1.0D);
BASILISK_GAZE_FACING_THRESHOLD = b.comment("Dot threshold for the Basilisk facing check.").defineInRange("gazeFacingThreshold", 0.45D, -1.0D, 1.0D);
BASILISK_HISS_CHARGE_TICKS = b.comment("Ticks a player must keep looking to trigger petrification.").defineInRange("hissChargeTicks", 30, 0, 2000);
BASILISK_PLAYER_PARALYZE_TICKS = b.comment("Ticks the Paralyzed effect lasts on players.").defineInRange("playerParalyzeTicks", 50, 0, 20000);
BASILISK_PREY_PETRIFY_COOLDOWN_TICKS = b.comment("Ticks between prey petrification checks.").defineInRange("preyPetrifyCooldownTicks", 500, 0, 20000);
BASILISK_PREY_PETRIFY_RANGE = b.comment("Range in blocks for prey petrification checks.").defineInRange("preyPetrifyRange", 8.0D, 0.0D, 128.0D);
BASILISK_PREY_PETRIFY_TICKS = b.comment("Ticks the prey petrify effect lasts.").defineInRange("preyPetrifyTicks", 200, 0, 20000);
b.pop(); b.pop();
@@ -450,8 +501,30 @@ public final class AntarchyMobsConfig {
static double reverieWarningThreatVerticalRange() { return REVERIE_WARNING_THREAT_VERTICAL_RANGE.get(); } static double reverieWarningThreatVerticalRange() { return REVERIE_WARNING_THREAT_VERTICAL_RANGE.get(); }
static int reverieDuplicationCooldownTicks() { return REVERIE_DUPLICATION_COOLDOWN_TICKS.get(); } static int reverieDuplicationCooldownTicks() { return REVERIE_DUPLICATION_COOLDOWN_TICKS.get(); }
static double nightmareHealth() { return NIGHTMARE_HEALTH.get(); }
static double nightmareAttackDamage() { return NIGHTMARE_ATTACK_DAMAGE.get(); }
static boolean basiliskPetrifyingGazeEnabled() { return BASILISK_PETRIFYING_GAZE_ENABLED.get(); } static boolean basiliskPetrifyingGazeEnabled() { return BASILISK_PETRIFYING_GAZE_ENABLED.get(); }
static int basiliskSpawnMaxLightLevel() { return BASILISK_SPAWN_MAX_LIGHT_LEVEL.get(); } static int basiliskSpawnMaxLightLevel() { return BASILISK_SPAWN_MAX_LIGHT_LEVEL.get(); }
static double basiliskHealth() { return BASILISK_HEALTH.get(); }
static double basiliskAttackDamage() { return BASILISK_ATTACK_DAMAGE.get(); }
static double basiliskMovementSpeed() { return BASILISK_MOVEMENT_SPEED.get(); }
static double basiliskArmor() { return BASILISK_ARMOR.get(); }
static double basiliskKnockbackResistance() { return BASILISK_KNOCKBACK_RESISTANCE.get(); }
static double basiliskFollowRange() { return BASILISK_FOLLOW_RANGE.get(); }
static int basiliskXpReward() { return BASILISK_XP_REWARD.get(); }
static int basiliskAttackAnimTicks() { return BASILISK_ATTACK_ANIM_TICKS.get(); }
static int basiliskAttackDamageTick() { return BASILISK_ATTACK_DAMAGE_TICK.get(); }
static int basiliskHissCooldownTicks() { return BASILISK_HISS_COOLDOWN_TICKS.get(); }
static double basiliskAttackReach() { return BASILISK_ATTACK_REACH.get(); }
static double basiliskGazeRange() { return BASILISK_GAZE_RANGE.get(); }
static double basiliskGazeDotThreshold() { return BASILISK_GAZE_DOT_THRESHOLD.get(); }
static double basiliskGazeFacingThreshold() { return BASILISK_GAZE_FACING_THRESHOLD.get(); }
static int basiliskHissChargeTicks() { return BASILISK_HISS_CHARGE_TICKS.get(); }
static int basiliskPlayerParalyzeTicks() { return BASILISK_PLAYER_PARALYZE_TICKS.get(); }
static int basiliskPreyPetrifyCooldownTicks() { return BASILISK_PREY_PETRIFY_COOLDOWN_TICKS.get(); }
static double basiliskPreyPetrifyRange() { return BASILISK_PREY_PETRIFY_RANGE.get(); }
static int basiliskPreyPetrifyTicks() { return BASILISK_PREY_PETRIFY_TICKS.get(); }
static double lucidAttackRange() { return LUCID_ATTACK_RANGE.get(); } static double lucidAttackRange() { return LUCID_ATTACK_RANGE.get(); }
static double lucidPearlInvertedDurationSeconds() { return LUCID_PEARL_INVERTED_DURATION_SECONDS.get(); } static double lucidPearlInvertedDurationSeconds() { return LUCID_PEARL_INVERTED_DURATION_SECONDS.get(); }
@@ -5,17 +5,17 @@ import net.neoforged.neoforge.common.ModConfigSpec;
public final class AntarchyToolsConfig { public final class AntarchyToolsConfig {
public static final ModConfigSpec SPEC; public static final ModConfigSpec SPEC;
// -------------------------------------------------------------------------
// Basilisk Dagger // Basilisk Dagger
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_SPEED; private static final ModConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_SPEED;
private static final ModConfigSpec.IntValue BASILISK_DAGGER_POISON_DURATION_TICKS; private static final ModConfigSpec.IntValue BASILISK_DAGGER_POISON_DURATION_TICKS;
private static final ModConfigSpec.IntValue BASILISK_DAGGER_POISON_AMPLIFIER; private static final ModConfigSpec.IntValue BASILISK_DAGGER_POISON_AMPLIFIER;
// -------------------------------------------------------------------------
// Ultimate Tools // Ultimate Tools
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_SPEED; private static final ModConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_SPEED;
private static final ModConfigSpec.DoubleValue ULTIMATE_PICKAXE_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_PICKAXE_ATTACK_DAMAGE;
@@ -29,32 +29,32 @@ public final class AntarchyToolsConfig {
private static final ModConfigSpec.IntValue ULTIMATE_TOOL_ENCHANTABILITY; private static final ModConfigSpec.IntValue ULTIMATE_TOOL_ENCHANTABILITY;
private static final ModConfigSpec.BooleanValue ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED; private static final ModConfigSpec.BooleanValue ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED;
// -------------------------------------------------------------------------
// Ultimate Bow // Ultimate Bow
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_PLAYER_HEAL; private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_PLAYER_HEAL;
private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_DRAW_SPEED_MULTIPLIER; private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_DRAW_SPEED_MULTIPLIER;
private static final ModConfigSpec.BooleanValue ULTIMATE_BOW_COMES_ENCHANTED_WITH_FLAME; private static final ModConfigSpec.BooleanValue ULTIMATE_BOW_COMES_ENCHANTED_WITH_FLAME;
private static final ModConfigSpec.IntValue ULTIMATE_BOW_ENCHANTABILITY; private static final ModConfigSpec.IntValue ULTIMATE_BOW_ENCHANTABILITY;
// -------------------------------------------------------------------------
// Ultimate Crossbow // Ultimate Crossbow
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue ULTIMATE_CROSSBOW_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_CROSSBOW_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue ULTIMATE_CROSSBOW_CHARGE_SPEED_MULTIPLIER; private static final ModConfigSpec.DoubleValue ULTIMATE_CROSSBOW_CHARGE_SPEED_MULTIPLIER;
private static final ModConfigSpec.IntValue ULTIMATE_CROSSBOW_ENCHANTABILITY; private static final ModConfigSpec.IntValue ULTIMATE_CROSSBOW_ENCHANTABILITY;
// -------------------------------------------------------------------------
// Ultimate Mace // Ultimate Mace
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue ULTIMATE_MACE_DAMAGE_MULTIPLIER; private static final ModConfigSpec.DoubleValue ULTIMATE_MACE_DAMAGE_MULTIPLIER;
private static final ModConfigSpec.DoubleValue ULTIMATE_MACE_ATTACK_SPEED; private static final ModConfigSpec.DoubleValue ULTIMATE_MACE_ATTACK_SPEED;
private static final ModConfigSpec.IntValue ULTIMATE_MACE_ENCHANTABILITY; private static final ModConfigSpec.IntValue ULTIMATE_MACE_ENCHANTABILITY;
// -------------------------------------------------------------------------
// Ultimate Armor // Ultimate Armor
// -------------------------------------------------------------------------
private static final ModConfigSpec.BooleanValue ULTIMATE_ARMOR_COMES_ENCHANTED; private static final ModConfigSpec.BooleanValue ULTIMATE_ARMOR_COMES_ENCHANTED;
private static final ModConfigSpec.IntValue ULTIMATE_ARMOR_ENCHANTABILITY; private static final ModConfigSpec.IntValue ULTIMATE_ARMOR_ENCHANTABILITY;
private static final ModConfigSpec.IntValue ULTIMATE_HELMET_ARMOR_VALUE; private static final ModConfigSpec.IntValue ULTIMATE_HELMET_ARMOR_VALUE;
@@ -67,15 +67,15 @@ public final class AntarchyToolsConfig {
private static final ModConfigSpec.DoubleValue ULTIMATE_BOOTS_ARMOR_TOUGHNESS; private static final ModConfigSpec.DoubleValue ULTIMATE_BOOTS_ARMOR_TOUGHNESS;
private static final ModConfigSpec.DoubleValue ULTIMATE_ARMOR_KNOCKBACK_RESISTANCE; private static final ModConfigSpec.DoubleValue ULTIMATE_ARMOR_KNOCKBACK_RESISTANCE;
// -------------------------------------------------------------------------
// Battle Axe // Battle Axe
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue BATTLE_AXE_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BATTLE_AXE_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue BATTLE_AXE_ATTACK_SPEED; private static final ModConfigSpec.DoubleValue BATTLE_AXE_ATTACK_SPEED;
// -------------------------------------------------------------------------
// Big Bertha // Big Bertha
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue BIG_BERTHA_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BIG_BERTHA_ATTACK_DAMAGE;
private static final ModConfigSpec.DoubleValue BIG_BERTHA_REACH_BONUS; private static final ModConfigSpec.DoubleValue BIG_BERTHA_REACH_BONUS;
private static final ModConfigSpec.DoubleValue BIG_BERTHA_ATTACK_SPEED; private static final ModConfigSpec.DoubleValue BIG_BERTHA_ATTACK_SPEED;
@@ -98,9 +98,9 @@ public final class AntarchyToolsConfig {
private static final ModConfigSpec.DoubleValue BLOOD_CRYSTAL_KATANA_LAUNCH_STRENGTH; private static final ModConfigSpec.DoubleValue BLOOD_CRYSTAL_KATANA_LAUNCH_STRENGTH;
private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_KATANA_TRAIL_DURATION_TICKS; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_KATANA_TRAIL_DURATION_TICKS;
// -------------------------------------------------------------------------
// Nightmare Gear // Nightmare Gear
// -------------------------------------------------------------------------
private static final ModConfigSpec.IntValue NIGHTMARE_HELMET_ARMOR_VALUE; private static final ModConfigSpec.IntValue NIGHTMARE_HELMET_ARMOR_VALUE;
private static final ModConfigSpec.IntValue NIGHTMARE_CHESTPLATE_ARMOR_VALUE; private static final ModConfigSpec.IntValue NIGHTMARE_CHESTPLATE_ARMOR_VALUE;
private static final ModConfigSpec.IntValue NIGHTMARE_LEGGINGS_ARMOR_VALUE; private static final ModConfigSpec.IntValue NIGHTMARE_LEGGINGS_ARMOR_VALUE;
@@ -115,15 +115,15 @@ public final class AntarchyToolsConfig {
private static final ModConfigSpec.DoubleValue NIGHTMARE_SWORD_ATTACK_SPEED; private static final ModConfigSpec.DoubleValue NIGHTMARE_SWORD_ATTACK_SPEED;
private static final ModConfigSpec.DoubleValue NIGHTMARE_SWORD_SCALING_FACTOR; private static final ModConfigSpec.DoubleValue NIGHTMARE_SWORD_SCALING_FACTOR;
// -------------------------------------------------------------------------
// Fallen King's Crown // Fallen King's Crown
// -------------------------------------------------------------------------
private static final ModConfigSpec.IntValue FALLEN_KING_CROWN_ARMOR_VALUE; private static final ModConfigSpec.IntValue FALLEN_KING_CROWN_ARMOR_VALUE;
private static final ModConfigSpec.DoubleValue FALLEN_KING_CROWN_ARMOR_TOUGHNESS; private static final ModConfigSpec.DoubleValue FALLEN_KING_CROWN_ARMOR_TOUGHNESS;
// -------------------------------------------------------------------------
// Blood Crystal Armor // Blood Crystal Armor
// -------------------------------------------------------------------------
private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_ARMOR_SHIELD_RECHARGE_TICKS; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_ARMOR_SHIELD_RECHARGE_TICKS;
private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_SHIELD_COUNT; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_SHIELD_COUNT;
private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_DURATION_TICKS; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_DURATION_TICKS;
@@ -139,15 +139,15 @@ public final class AntarchyToolsConfig {
private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_LEGGINGS_DURABILITY; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_LEGGINGS_DURABILITY;
private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_BOOTS_DURABILITY; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_BOOTS_DURABILITY;
// -------------------------------------------------------------------------
// Squidzooka // Squidzooka
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue SQUIDZOOKA_COOLDOWN_SECONDS; private static final ModConfigSpec.DoubleValue SQUIDZOOKA_COOLDOWN_SECONDS;
private static final ModConfigSpec.DoubleValue SQUIDZOOKA_LAUNCH_VELOCITY; private static final ModConfigSpec.DoubleValue SQUIDZOOKA_LAUNCH_VELOCITY;
// -------------------------------------------------------------------------
// Size Rays // Size Rays
// -------------------------------------------------------------------------
private static final ModConfigSpec.BooleanValue SIZE_CHANGING_RAYS_ENABLED; private static final ModConfigSpec.BooleanValue SIZE_CHANGING_RAYS_ENABLED;
private static final ModConfigSpec.DoubleValue SIZE_RAY_COOLDOWN_SECONDS; private static final ModConfigSpec.DoubleValue SIZE_RAY_COOLDOWN_SECONDS;
private static final ModConfigSpec.DoubleValue SIZE_RAY_MIN_SCALE; private static final ModConfigSpec.DoubleValue SIZE_RAY_MIN_SCALE;
@@ -156,9 +156,9 @@ public final class AntarchyToolsConfig {
private static final ModConfigSpec.DoubleValue SHRINKING_POTION_DELTA; private static final ModConfigSpec.DoubleValue SHRINKING_POTION_DELTA;
private static final ModConfigSpec.DoubleValue GROWTH_POTION_DELTA; private static final ModConfigSpec.DoubleValue GROWTH_POTION_DELTA;
// -------------------------------------------------------------------------
// Gravity Gun // Gravity Gun
// -------------------------------------------------------------------------
private static final ModConfigSpec.BooleanValue GRAVITY_GUN_ENABLED; private static final ModConfigSpec.BooleanValue GRAVITY_GUN_ENABLED;
private static final ModConfigSpec.BooleanValue GRAVITY_GUN_BLOCKS_ENABLED; private static final ModConfigSpec.BooleanValue GRAVITY_GUN_BLOCKS_ENABLED;
private static final ModConfigSpec.BooleanValue GRAVITY_GUN_ENTITIES_ENABLED; private static final ModConfigSpec.BooleanValue GRAVITY_GUN_ENTITIES_ENABLED;
@@ -168,16 +168,16 @@ public final class AntarchyToolsConfig {
private static final ModConfigSpec.DoubleValue GRAVITY_GUN_COOLDOWN_SECONDS; private static final ModConfigSpec.DoubleValue GRAVITY_GUN_COOLDOWN_SECONDS;
private static final ModConfigSpec.DoubleValue GRAVITY_GUN_MAX_HOLD_DISTANCE; private static final ModConfigSpec.DoubleValue GRAVITY_GUN_MAX_HOLD_DISTANCE;
// -------------------------------------------------------------------------
// Miscellaneous items / consumables // Miscellaneous items / consumables
// -------------------------------------------------------------------------
private static final ModConfigSpec.DoubleValue DUCT_TAPE_REPAIR_PERCENT_PER_USE; private static final ModConfigSpec.DoubleValue DUCT_TAPE_REPAIR_PERCENT_PER_USE;
private static final ModConfigSpec.DoubleValue POTENT_NYXITE_INVERTED_DURATION_SECONDS; private static final ModConfigSpec.DoubleValue POTENT_NYXITE_INVERTED_DURATION_SECONDS;
private static final ModConfigSpec.BooleanValue INVERT_PROJECTILES_FROM_INVERTED_PLAYERS; private static final ModConfigSpec.BooleanValue INVERT_PROJECTILES_FROM_INVERTED_PLAYERS;
private static final ModConfigSpec.IntValue CORNEA_EAR_NIGHT_VISION_SECONDS; private static final ModConfigSpec.IntValue CORNEA_EAR_NIGHT_VISION_SECONDS;
// -------------------------------------------------------------------------
// Moggles // Moggles
// -------------------------------------------------------------------------
private static final ModConfigSpec.IntValue MOGGLES_VISION_RADIUS; private static final ModConfigSpec.IntValue MOGGLES_VISION_RADIUS;
private static final ModConfigSpec.IntValue MOGGLES_VISION_MAX_LIGHT; private static final ModConfigSpec.IntValue MOGGLES_VISION_MAX_LIGHT;
private static final ModConfigSpec.DoubleValue MOGGLES_VISION_ALPHA; private static final ModConfigSpec.DoubleValue MOGGLES_VISION_ALPHA;
@@ -214,7 +214,7 @@ public final class AntarchyNeoforgeEntites {
.build("scorpion")); .build("scorpion"));
public static final DeferredHolder<EntityType<?>, EntityType<BasiliskEntity>> BASILISK = ENTITY_TYPES.register("basilisk", public static final DeferredHolder<EntityType<?>, EntityType<BasiliskEntity>> BASILISK = ENTITY_TYPES.register("basilisk",
() -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER) () -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER)
.sized(2.0F, 3.5F) .sized(3.0F, 3.5F)
.clientTrackingRange(14) .clientTrackingRange(14)
.build("basilisk")); .build("basilisk"));
public static final DeferredHolder<EntityType<?>, EntityType<EmperorScorpionEntity>> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion", public static final DeferredHolder<EntityType<?>, EntityType<EmperorScorpionEntity>> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion",