From 3c6c54ebd6940fda07a121138ada5b16c5b143fc Mon Sep 17 00:00:00 2001 From: craisinlord Date: Mon, 22 Jun 2026 20:41:32 -0500 Subject: [PATCH] Overhauled Basilisk and Nightmare mob AI Fixed ants not leaving nests in nether/end/thoraxis Overhauled Basilisk texture, model, animations --- .../antarchy/config/AntarchySettings.java | 96 ++++++-- .../block/entity/AntNestBlockEntity.java | 3 +- .../antarchy/content/entity/BomberEntity.java | 51 ++++ .../entity/basilisk/BasiliskEntity.java | 146 ++++++++---- .../entity/nightmare/NightmareEntity.java | 219 +++++++----------- .../animations/basilisk.animation.json | 14 +- .../fabric/AntarchyFabricContent.java | 2 +- .../AntarchyConfigModuleNeoforge.java | 22 ++ .../antarchy/neoforge/AntarchyMobsConfig.java | 131 ++++++++--- .../neoforge/AntarchyToolsConfig.java | 64 ++--- .../registry/AntarchyNeoforgeEntites.java | 2 +- 11 files changed, 481 insertions(+), 269 deletions(-) diff --git a/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java b/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java index 0d1ab5d4..80750f0f 100644 --- a/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java +++ b/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java @@ -88,7 +88,7 @@ public final class AntarchySettings { private static ResourceKey redAntDestinationDimension = dimensionKey("antarchy:thoraxis"); private static ResourceKey termiteDestinationDimension = dimensionKey("antarchy:cavaryn"); private static ResourceKey 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 brutalflyHealth = 400.0D; private static double brutalflySwipeDamage = 15.0D; @@ -146,6 +146,25 @@ public final class AntarchySettings { private static double nightmareSwordScalingFactor = 1.0D; private static boolean basiliskPetrifyingGazeEnabled = true; 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 diamondMinecartPlacesRails = true; private static double diamondMinecartCruiseSpeed = 0.6D; @@ -206,25 +225,6 @@ public final class AntarchySettings { private static final int reverieAmbientTargetMaxAgeTicks = 40; private static final int reverieAmbientPulseIntervalMinTicks = 12; 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 emperorScorpionAttackDamage = 12.0D; private static double emperorScorpionMovementSpeed = 0.32D; @@ -380,7 +380,7 @@ public final class AntarchySettings { private static double molevoreBreakVerticalRange = 2.2D; private static double molevoreBreakHalfWidth = 1.1D; 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 nightmareFlyingSpeed = 0.3D; private static double nightmareFollowRange = 48.0D; @@ -1377,9 +1377,63 @@ public final class AntarchySettings { 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 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 void setDiamondMinecartEnabled(boolean v) { diamondMinecartEnabled = v; } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/entity/AntNestBlockEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/block/entity/AntNestBlockEntity.java index 06684b2a..b2c39916 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/block/entity/AntNestBlockEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/entity/AntNestBlockEntity.java @@ -40,7 +40,8 @@ public class AntNestBlockEntity extends BlockEntity { nest.populateInitialAnts(level); } - if (level.isNight() || level.isRaining()) { + boolean ignoreNight = level.dimensionType().hasFixedTime(); + if ((!ignoreNight && level.isNight()) || level.isRaining()) { return; } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/BomberEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/BomberEntity.java index 5c073b38..d2608495 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/BomberEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/BomberEntity.java @@ -3,6 +3,7 @@ package com.craisinlord.antarchy.content.entity; import com.craisinlord.antarchy.config.AntarchySettings; import java.util.Objects; import net.minecraft.core.BlockPos; +import net.minecraft.tags.DamageTypeTags; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -11,8 +12,11 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; 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.EntityType; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; 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.monster.Monster; 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.ExplosionInteraction; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -123,6 +131,49 @@ public class BomberEntity extends Monster implements GeoEntity { 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 public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController)); diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/basilisk/BasiliskEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/basilisk/BasiliskEntity.java index 47d84958..aca22bed 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/basilisk/BasiliskEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/basilisk/BasiliskEntity.java @@ -9,6 +9,7 @@ import com.craisinlord.antarchy.content.damage.AntarchyDamageSources; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; 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.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; 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.LookAtPlayerGoal; 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.SynchedEntityData; +import java.util.List; import java.util.UUID; import java.util.function.Predicate; @@ -55,7 +59,6 @@ public class BasiliskEntity extends Monster implements GeoEntity { private static final EntityDataAccessor ANIMATION_STATE = SynchedEntityData.defineId(BasiliskEntity.class, EntityDataSerializers.INT); 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 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 DEATH_ANIM = RawAnimation.begin().thenPlay("death"); - private static final int HISS_COOLDOWN_TICKS = 600; - 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 static final float TURN_RATE_DEG_PER_TICK = 5.0F; private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); private int attackAnimTicks = 0; - private int hissCooldown = 100; + private int hissCooldown = AntarchySettings.basiliskHissCooldownTicks(); private int hissChargeTimer = 0; @Nullable private UUID pendingTargetId; - private int preyPetrifyCooldown = 200; + private int preyPetrifyCooldown = AntarchySettings.basiliskPreyPetrifyCooldownTicks(); public BasiliskEntity(EntityType entityType, Level level) { super(entityType, level); - this.xpReward = 50; + this.xpReward = AntarchySettings.basiliskXpReward(); + this.moveControl = new BasiliskMoveControl(this); } @Override @@ -102,12 +97,12 @@ public class BasiliskEntity extends Monster implements GeoEntity { public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes() - .add(Attributes.MAX_HEALTH, 150.0D) - .add(Attributes.MOVEMENT_SPEED, 0.35D) - .add(Attributes.ATTACK_DAMAGE, 18.0D) - .add(Attributes.ARMOR, 6.0D) - .add(Attributes.KNOCKBACK_RESISTANCE, 0.5D) - .add(Attributes.FOLLOW_RANGE, 28.0D); + .add(Attributes.MAX_HEALTH, AntarchySettings.basiliskHealth()) + .add(Attributes.MOVEMENT_SPEED, AntarchySettings.basiliskMovementSpeed()) + .add(Attributes.ATTACK_DAMAGE, AntarchySettings.basiliskAttackDamage()) + .add(Attributes.ARMOR, AntarchySettings.basiliskArmor()) + .add(Attributes.KNOCKBACK_RESISTANCE, AntarchySettings.basiliskKnockbackResistance()) + .add(Attributes.FOLLOW_RANGE, AntarchySettings.basiliskFollowRange()); } public static boolean canSpawn(EntityType entityType, ServerLevelAccessor level, @@ -159,6 +154,40 @@ public class BasiliskEntity extends Monster implements GeoEntity { 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 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 public void tick() { super.tick(); @@ -213,21 +242,21 @@ public class BasiliskEntity extends Monster implements GeoEntity { } if (!AntarchySettings.basiliskPetrifyingGazeEnabled()) { - this.hissCooldown = HISS_COOLDOWN_TICKS; + this.hissCooldown = AntarchySettings.basiliskHissCooldownTicks(); return; } Player target = this.findGazingPlayer(); if (target == null) { - this.hissCooldown = 20; + this.hissCooldown = AntarchySettings.basiliskHissCooldownTicks(); return; } this.level().playSound(null, this.getX(), this.getY(), this.getZ(), AntarchySoundEvents.BASILISK_HISS.get(), this.getSoundSource(), 1.4F, 0.92F); this.pendingTargetId = target.getUUID(); - this.hissChargeTimer = HISS_CHARGE_TICKS; - this.hissCooldown = HISS_COOLDOWN_TICKS; + this.hissChargeTimer = AntarchySettings.basiliskHissChargeTicks(); + this.hissCooldown = AntarchySettings.basiliskHissCooldownTicks(); this.getNavigation().stop(); this.getLookControl().setLookAt(target, 30.0F, 30.0F); } @@ -242,7 +271,7 @@ public class BasiliskEntity extends Monster implements GeoEntity { return; } - this.preyPetrifyCooldown = PREY_PETRIFY_COOLDOWN_TICKS; + this.preyPetrifyCooldown = AntarchySettings.basiliskPreyPetrifyCooldownTicks(); LivingEntity prey = this.findNearestPrey(); if (prey == null) { return; @@ -253,7 +282,7 @@ public class BasiliskEntity extends Monster implements GeoEntity { this.getLookControl().setLookAt(prey, 30.0F, 30.0F); prey.addEffect(new MobEffectInstance( AntarchyObjects.PARALYZED_EFFECT.get(), - PREY_PETRIFY_DURATION_TICKS, + AntarchySettings.basiliskPreyPetrifyTicks(), 0, false, true, @@ -279,7 +308,7 @@ public class BasiliskEntity extends Monster implements GeoEntity { Player nearest = null; 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)) { continue; } @@ -301,7 +330,7 @@ public class BasiliskEntity extends Monster implements GeoEntity { if (player.getItemBySlot(EquipmentSlot.HEAD).is(Items.CARVED_PUMPKIN)) { return false; } - if (player.distanceToSqr(this) > GAZE_RANGE_SQR) { + if (player.distanceToSqr(this) > AntarchySettings.basiliskGazeRange() * AntarchySettings.basiliskGazeRange()) { return false; } if (!this.hasLineOfSight(player)) { @@ -314,7 +343,7 @@ public class BasiliskEntity extends Monster implements GeoEntity { private boolean isPlayerGazingAtMe(Player player) { Vec3 eye = player.getEyePosition(); 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) { @@ -323,7 +352,7 @@ public class BasiliskEntity extends Monster implements GeoEntity { 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) { @@ -339,7 +368,7 @@ public class BasiliskEntity extends Monster implements GeoEntity { LivingEntity nearest = null; double nearestDistance = Double.MAX_VALUE; 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()) { continue; } @@ -379,9 +408,6 @@ public class BasiliskEntity extends Monster implements GeoEntity { if (this.getAnimationState() == ANIM_WALK) { return state.setAndContinue(WALK_ANIM); } - if (this.getTarget() != null || this.hissChargeTimer > 0 || this.pendingTargetId != null) { - return state.setAndContinue(WALK_ANIM); - } if (state.isMoving()) { return state.setAndContinue(WALK_ANIM); } @@ -396,7 +422,7 @@ public class BasiliskEntity extends Monster implements GeoEntity { @Override public void handleEntityEvent(byte id) { if (id == ATTACK_ENTITY_EVENT) { - this.attackAnimTicks = ATTACK_ANIM_TICKS; + this.attackAnimTicks = AntarchySettings.basiliskAttackAnimTicks(); this.setAnimationState(ANIM_ATTACK); return; } @@ -455,6 +481,11 @@ public class BasiliskEntity extends Monster implements GeoEntity { this.entityData.set(ANIMATION_STATE, state); } + @Override + public int getMaxHeadYRot() { + return 20; + } + @Override public boolean canAttack(LivingEntity target) { if (target instanceof Player player) { @@ -463,6 +494,12 @@ public class BasiliskEntity extends Monster implements GeoEntity { return super.canAttack(target); } + @Override + public boolean isWithinMeleeAttackRange(LivingEntity target) { + double reach = AntarchySettings.basiliskAttackReach(); + return this.distanceToSqr(target) <= reach * reach; + } + @Override public boolean removeWhenFarAway(double distanceToClosestPlayer) { return false; @@ -489,6 +526,31 @@ public class BasiliskEntity extends Monster implements GeoEntity { 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 extends NearestAttackableTargetGoal { PersistentNearestAttackableTargetGoal(Class targetType, int randomInterval, Predicate predicate) { super(BasiliskEntity.this, targetType, randomInterval, true, false, predicate); @@ -516,14 +578,12 @@ public class BasiliskEntity extends Monster implements GeoEntity { } @Override - protected void checkAndPerformAttack(LivingEntity enemy) { - if (BasiliskEntity.this.attackAnimTicks > 0) { - return; - } - if (this.canPerformAttack(enemy) && this.isTimeToAttack()) { - this.resetAttackCooldown(); - BasiliskEntity.this.doHurtTarget(enemy); - } + protected void checkAndPerformAttack(LivingEntity target) { + if (BasiliskEntity.this.attackAnimTicks > 0) return; + if (!this.canPerformAttack(target)) return; + + this.resetAttackCooldown(); + BasiliskEntity.this.performAoeAttack(); } } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java index e00b85fe..71f827f5 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java @@ -41,7 +41,6 @@ import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; 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 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 ATTACK_START_RANGE_SQR = 42.25D; 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_DISENGAGE_RANGE_SQR = 36.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 WALK_ANIM = RawAnimation.begin().thenLoop("walk"); 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_DAMAGED_ANIM = RawAnimation.begin().thenLoop("fly_damaged"); 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 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); - @Nullable private Vec3 patrolTarget; - private int patrolRetargetTicks; private int attackCooldown; private int attackAnimationTicks; private int roarTicks; private int roarCooldown; private int targetlessTicks; private int airborneTicks; + private int landingCooldown; + private int groundMoveTicks; private int wingFlapCooldown; private int blockBreakCooldown; private boolean attackHitApplied; private boolean introRoarUsed; + private boolean flyingToTarget; public NightmareEntity(EntityType entityType, Level level) { super(entityType, level); @@ -141,7 +137,7 @@ public class NightmareEntity extends Monster implements GeoEntity { .add(Attributes.MAX_HEALTH, 180.0D) .add(Attributes.ATTACK_DAMAGE, 14.0D) .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.KNOCKBACK_RESISTANCE, 0.75D) .add(Attributes.ARMOR, 8.0D); @@ -164,9 +160,8 @@ public class NightmareEntity extends Monster implements GeoEntity { @Override protected void registerGoals() { this.goalSelector.addGoal(1, new NightmareRoarGoal()); - this.goalSelector.addGoal(2, new NightmareAttackAnimationGoal()); - this.goalSelector.addGoal(3, new NightmareFlyToTargetGoal()); - this.goalSelector.addGoal(4, new NightmareMeleeGoal()); + this.goalSelector.addGoal(2, new NightmareFlyToTargetGoal()); + this.goalSelector.addGoal(3, new NightmareMeleeGoal()); this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 16.0F)); this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(7, new NightmareWanderGoal()); @@ -181,12 +176,17 @@ public class NightmareEntity extends Monster implements GeoEntity { } private PlayState mainAnimController(AnimationState state) { - state.getController().setAnimationSpeed(this.getAnimationState() == ANIM_FLY ? 0.45D : 1.0D); - return switch (this.getAnimationState()) { + int animState = 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_TAKEOFF -> state.setAndContinue(TAKEOFF_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_FLY_ATTACK -> state.setAndContinue(FLY_ATTACK_ANIM); case ANIM_ROAR -> state.setAndContinue(ROAR_ANIM); @@ -212,7 +212,6 @@ public class NightmareEntity extends Monster implements GeoEntity { @Override public void tick() { super.tick(); - this.setNoGravity(this.shouldUseFlight() && !this.isTooCloseToCeiling()); if (this.level().isClientSide) { this.tickClientParticles(); @@ -220,11 +219,18 @@ public class NightmareEntity extends Monster implements GeoEntity { return; } + this.setNoGravity(this.flyingToTarget && !this.isTooCloseToCeiling()); + + int prevAirborneTicks = this.airborneTicks; this.airborneTicks = this.onGround() ? 0 : this.airborneTicks + 1; + if (this.onGround() && prevAirborneTicks > 5) { + this.landingCooldown = 100; + } if (this.attackCooldown > 0) this.attackCooldown--; if (this.roarCooldown > 0) this.roarCooldown--; if (this.blockBreakCooldown > 0) this.blockBreakCooldown--; + if (this.landingCooldown > 0) this.landingCooldown--; LivingEntity target = this.getTarget(); if (!this.canTargetEntity(target)) { @@ -248,16 +254,20 @@ public class NightmareEntity extends Monster implements GeoEntity { return; } + if (this.attackAnimationTicks > 0) { + this.tickAttack(target); + } + this.updateAnimationState(); this.updateFlightRotation(); } @Override public void travel(Vec3 travelVector) { - if (this.isEffectiveAi() && (this.isNoGravity() || !this.onGround())) { + if (this.isEffectiveAi() && this.isNoGravity()) { this.moveRelative(this.getSpeed(), travelVector); 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; } super.travel(travelVector); @@ -393,7 +403,9 @@ public class NightmareEntity extends Monster implements GeoEntity { } private void setAnimationState(int animationState) { - this.entityData.set(ANIMATION_STATE, animationState); + if (this.entityData.get(ANIMATION_STATE) != animationState) { + this.entityData.set(ANIMATION_STATE, animationState); + } } private boolean shouldStartRoar(LivingEntity target) { @@ -546,11 +558,9 @@ public class NightmareEntity extends Monster implements GeoEntity { } private boolean shouldUseFlight() { + if (this.landingCooldown > 0) return false; LivingEntity target = this.getTarget(); - if (target != null) { - return this.distanceToSqr(target) > FLIGHT_ENGAGE_RANGE_SQR; - } - return this.patrolTarget != null && this.patrolTarget.y > this.getY() + 1.5D; + return target != null && this.distanceToSqr(target) > FLIGHT_ENGAGE_RANGE_SQR; } 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() { BlockPos current = BlockPos.containing(this.getX(), this.getY(), this.getZ()); @@ -689,36 +640,44 @@ public class NightmareEntity extends Monster implements GeoEntity { private void updateAnimationState() { if (this.isDeadOrDying()) { this.setAnimationState(ANIM_DEATH); + this.groundMoveTicks = 0; this.wingFlapCooldown = 0; return; } if (this.isRoaring()) { this.setAnimationState(ANIM_ROAR); + this.groundMoveTicks = 0; this.wingFlapCooldown = 0; return; } if (this.attackAnimationTicks > 0) { this.setAnimationState(this.onGround() ? ANIM_ATTACK : ANIM_FLY_ATTACK); + this.groundMoveTicks = 0; this.tickWingFlapSound(); return; } - if (!this.onGround() && this.airborneTicks > 0 && this.airborneTicks <= 10 && this.shouldUseFlight()) { - this.setAnimationState(ANIM_TAKEOFF); - this.wingFlapCooldown = 0; - return; - } - if (!this.onGround() && this.hurtTime > 0) { - this.setAnimationState(ANIM_FLY_DAMAGED); - this.tickWingFlapSound(); + if (this.flyingToTarget) { + this.groundMoveTicks = 0; + if (this.onGround() || this.airborneTicks <= 8) { + this.setAnimationState(ANIM_TAKEOFF); + this.wingFlapCooldown = 0; + } else { + this.setAnimationState(ANIM_FLY); + this.tickWingFlapSound(); + } return; } if (!this.onGround()) { + this.groundMoveTicks = 0; this.setAnimationState(ANIM_FLY); this.tickWingFlapSound(); return; } - Vec3 velocity = this.getDeltaMovement(); - if (velocity.horizontalDistanceSqr() > 0.008D) { + if (this.walkDist - this.walkDistO > 0.005F) { + this.groundMoveTicks = 6; + } + if (this.groundMoveTicks > 0) { + this.groundMoveTicks--; this.setAnimationState(ANIM_WALK); this.wingFlapCooldown = 0; 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 { NightmareFlyToTargetGoal() { this.setFlags(EnumSet.of(Flag.MOVE)); @@ -805,7 +743,9 @@ public class NightmareEntity extends Monster implements GeoEntity { @Override public boolean canUse() { 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 @@ -814,8 +754,15 @@ public class NightmareEntity extends Monster implements GeoEntity { return target != null && NightmareEntity.this.distanceToSqr(target) > FLIGHT_DISENGAGE_RANGE_SQR; } + @Override + public void start() { + NightmareEntity.this.flyingToTarget = true; + } + @Override public void stop() { + NightmareEntity.this.flyingToTarget = false; + NightmareEntity.this.landingCooldown = 80; NightmareEntity.this.getNavigation().stop(); } @@ -860,48 +807,42 @@ public class NightmareEntity extends Monster implements GeoEntity { } private final class NightmareWanderGoal extends Goal { + private double x, y, z; + private int wanderTicks; + NightmareWanderGoal() { this.setFlags(EnumSet.of(Flag.MOVE)); } @Override 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 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 public void start() { - NightmareEntity.this.patrolTarget = null; - NightmareEntity.this.patrolRetargetTicks = 0; - } - - @Override - public void stop() { - NightmareEntity.this.getNavigation().stop(); - NightmareEntity.this.patrolTarget = null; + this.wanderTicks = 80 + NightmareEntity.this.random.nextInt(40); } @Override public void tick() { - if (NightmareEntity.this.patrolRetargetTicks-- <= 0 - || NightmareEntity.this.patrolTarget == null - || 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 - ); - } + this.wanderTicks--; + NightmareEntity.this.getMoveControl().setWantedPosition(this.x, this.y, this.z, PATROL_SPEED); } } } diff --git a/common/src/main/resources/assets/antarchy/animations/basilisk.animation.json b/common/src/main/resources/assets/antarchy/animations/basilisk.animation.json index 1750cc4a..08c31a7d 100644 --- a/common/src/main/resources/assets/antarchy/animations/basilisk.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/basilisk.animation.json @@ -4,6 +4,11 @@ "idle": { "loop": true, "animation_length": 4, + "sound_effects": { + "0.0": { + "effect": "antarchy:basilisk_idle_loop|0.45|1.0" + } + }, "bones": { "upper_body": { "rotation": { @@ -402,7 +407,7 @@ } }, "attack": { - "loop": true, + "loop": false, "animation_length": 1, "bones": { "Basilisk": { @@ -891,7 +896,7 @@ } }, "death": { - "loop": true, + "loop": false, "animation_length": 1.25, "bones": { "Basilisk": { @@ -1518,6 +1523,11 @@ "walk": { "loop": true, "animation_length": 2, + "sound_effects": { + "0.0": { + "effect": "antarchy:basilisk_slither_loop|0.45|1.0" + } + }, "bones": { "Basilisk": { "position": { diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java index a50eed9f..2ef31311 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java @@ -1408,7 +1408,7 @@ public final class AntarchyFabricContent { .build("scorpion")); public static final DeferredHolder, EntityType> BASILISK = ENTITY_TYPES.register("basilisk", () -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER) - .sized(2.0F, 3.5F) + .sized(3.0F, 3.5F) .clientTrackingRange(14) .build("basilisk")); public static final DeferredHolder, EntityType> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion", diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java index 8f9c677c..183505ef 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java @@ -109,8 +109,30 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setReverieWarningThreatVerticalRange(AntarchyMobsConfig.reverieWarningThreatVerticalRange()); AntarchySettings.setReverieDuplicationCooldownTicks(AntarchyMobsConfig.reverieDuplicationCooldownTicks()); + AntarchySettings.setNightmareHealth(AntarchyMobsConfig.nightmareHealth()); + AntarchySettings.setNightmareAttackDamage(AntarchyMobsConfig.nightmareAttackDamage()); + AntarchySettings.setBasiliskPetrifyingGazeEnabled(AntarchyMobsConfig.basiliskPetrifyingGazeEnabled()); 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.setLucidPearlInvertedDurationSeconds(AntarchyMobsConfig.lucidPearlInvertedDurationSeconds()); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java index 97af8e9c..97715122 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java @@ -5,9 +5,9 @@ import net.neoforged.neoforge.common.ModConfigSpec; public final class AntarchyMobsConfig { public static final ModConfigSpec SPEC; - // ------------------------------------------------------------------------- + // Ants - // ------------------------------------------------------------------------- + private static final ModConfigSpec.BooleanValue ANTS_STEAL_FROM_CHESTS; private static final ModConfigSpec.BooleanValue BROWN_ANT_REQUIRES_REAGENT; @@ -35,72 +35,72 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.ConfigValue TERMITE_DESTINATION_DIMENSION; - // ------------------------------------------------------------------------- + // Easter Bunny - // ------------------------------------------------------------------------- + private static final ModConfigSpec.BooleanValue EASTER_BUNNY_ENABLED; private static final ModConfigSpec.IntValue EASTER_BUNNY_NATURAL_SPAWN_CHANCE_PERCENT; - // ------------------------------------------------------------------------- + // Wasp - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue WASP_HEALTH; private static final ModConfigSpec.DoubleValue WASP_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue WASP_MOVEMENT_SPEED; - // ------------------------------------------------------------------------- + // Bomber - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue BOMBER_HEALTH; private static final ModConfigSpec.DoubleValue BOMBER_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BOMBER_EXPLOSION_DAMAGE; private static final ModConfigSpec.DoubleValue BOMBER_EXPLOSION_RADIUS; - // ------------------------------------------------------------------------- + // Kraken - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue KRAKEN_HEALTH; private static final ModConfigSpec.DoubleValue KRAKEN_ATTACK_DAMAGE; 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_MASS_SPAWN_ENABLED; - // ------------------------------------------------------------------------- + // Brutalfly - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue BRUTALFLY_HEALTH; private static final ModConfigSpec.DoubleValue BRUTALFLY_SWIPE_DAMAGE; private static final ModConfigSpec.DoubleValue BRUTALFLY_SPIT_DAMAGE; - // ------------------------------------------------------------------------- + // Mantis - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue MANTIS_HEALTH; private static final ModConfigSpec.DoubleValue MANTIS_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue MANTIS_MOVEMENT_SPEED; private static final ModConfigSpec.DoubleValue MANTIS_FLYING_SPEED; private static final ModConfigSpec.BooleanValue MANTIS_IGNORE_LIGHT_LEVEL; - // ------------------------------------------------------------------------- + // Triffid - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue TRIFFID_HEALTH; private static final ModConfigSpec.DoubleValue TRIFFID_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue TRIFFID_GRAB_DAMAGE; - // ------------------------------------------------------------------------- + // Caterpillar - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue CATERPILLAR_PUPATION_TIME_SECONDS; - // ------------------------------------------------------------------------- + // Ant Dance - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue ANT_DANCE_RADIUS; - // ------------------------------------------------------------------------- + // Reverie - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue REVERIE_HEALTH; private static final ModConfigSpec.DoubleValue REVERIE_INTEREST_RADIUS; 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.IntValue REVERIE_DUPLICATION_COOLDOWN_TICKS; - // ------------------------------------------------------------------------- + + // Nightmare + + private static final ModConfigSpec.DoubleValue NIGHTMARE_HEALTH; + private static final ModConfigSpec.DoubleValue NIGHTMARE_ATTACK_DAMAGE; + + // Basilisk - // ------------------------------------------------------------------------- + private static final ModConfigSpec.BooleanValue BASILISK_PETRIFYING_GAZE_ENABLED; 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 - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue LUCID_ATTACK_RANGE; private static final ModConfigSpec.DoubleValue LUCID_PEARL_INVERTED_DURATION_SECONDS; - // ------------------------------------------------------------------------- + // Dread effect - // ------------------------------------------------------------------------- + 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_MAX_INTERVAL; @@ -251,7 +276,7 @@ public final class AntarchyMobsConfig { // 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_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); @@ -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); 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 @@ -333,6 +365,25 @@ public final class AntarchyMobsConfig { BASILISK_SPAWN_MAX_LIGHT_LEVEL = b .comment("Maximum local raw light level where basilisk natural spawning is allowed.") .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(); @@ -450,8 +501,30 @@ public final class AntarchyMobsConfig { static double reverieWarningThreatVerticalRange() { return REVERIE_WARNING_THREAT_VERTICAL_RANGE.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 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 lucidPearlInvertedDurationSeconds() { return LUCID_PEARL_INVERTED_DURATION_SECONDS.get(); } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java index d7633684..f1d75ea4 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java @@ -5,17 +5,17 @@ import net.neoforged.neoforge.common.ModConfigSpec; public final class AntarchyToolsConfig { public static final ModConfigSpec SPEC; - // ------------------------------------------------------------------------- + // Basilisk Dagger - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_DAMAGE; 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_AMPLIFIER; - // ------------------------------------------------------------------------- + // Ultimate Tools - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_SPEED; 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.BooleanValue ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED; - // ------------------------------------------------------------------------- + // Ultimate Bow - // ------------------------------------------------------------------------- + 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_DRAW_SPEED_MULTIPLIER; private static final ModConfigSpec.BooleanValue ULTIMATE_BOW_COMES_ENCHANTED_WITH_FLAME; private static final ModConfigSpec.IntValue ULTIMATE_BOW_ENCHANTABILITY; - // ------------------------------------------------------------------------- + // Ultimate Crossbow - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue ULTIMATE_CROSSBOW_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_CROSSBOW_CHARGE_SPEED_MULTIPLIER; private static final ModConfigSpec.IntValue ULTIMATE_CROSSBOW_ENCHANTABILITY; - // ------------------------------------------------------------------------- + // Ultimate Mace - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue ULTIMATE_MACE_DAMAGE_MULTIPLIER; private static final ModConfigSpec.DoubleValue ULTIMATE_MACE_ATTACK_SPEED; private static final ModConfigSpec.IntValue ULTIMATE_MACE_ENCHANTABILITY; - // ------------------------------------------------------------------------- + // Ultimate Armor - // ------------------------------------------------------------------------- + private static final ModConfigSpec.BooleanValue ULTIMATE_ARMOR_COMES_ENCHANTED; private static final ModConfigSpec.IntValue ULTIMATE_ARMOR_ENCHANTABILITY; 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_ARMOR_KNOCKBACK_RESISTANCE; - // ------------------------------------------------------------------------- + // Battle Axe - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue BATTLE_AXE_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BATTLE_AXE_ATTACK_SPEED; - // ------------------------------------------------------------------------- + // Big Bertha - // ------------------------------------------------------------------------- + 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_ATTACK_SPEED; @@ -98,9 +98,9 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue BLOOD_CRYSTAL_KATANA_LAUNCH_STRENGTH; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_KATANA_TRAIL_DURATION_TICKS; - // ------------------------------------------------------------------------- + // Nightmare Gear - // ------------------------------------------------------------------------- + private static final ModConfigSpec.IntValue NIGHTMARE_HELMET_ARMOR_VALUE; private static final ModConfigSpec.IntValue NIGHTMARE_CHESTPLATE_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_SCALING_FACTOR; - // ------------------------------------------------------------------------- + // Fallen King's Crown - // ------------------------------------------------------------------------- + private static final ModConfigSpec.IntValue FALLEN_KING_CROWN_ARMOR_VALUE; private static final ModConfigSpec.DoubleValue FALLEN_KING_CROWN_ARMOR_TOUGHNESS; - // ------------------------------------------------------------------------- + // Blood Crystal Armor - // ------------------------------------------------------------------------- + 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_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_BOOTS_DURABILITY; - // ------------------------------------------------------------------------- + // Squidzooka - // ------------------------------------------------------------------------- + private static final ModConfigSpec.DoubleValue SQUIDZOOKA_COOLDOWN_SECONDS; private static final ModConfigSpec.DoubleValue SQUIDZOOKA_LAUNCH_VELOCITY; - // ------------------------------------------------------------------------- + // Size Rays - // ------------------------------------------------------------------------- + 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_MIN_SCALE; @@ -156,9 +156,9 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue SHRINKING_POTION_DELTA; private static final ModConfigSpec.DoubleValue GROWTH_POTION_DELTA; - // ------------------------------------------------------------------------- + // Gravity Gun - // ------------------------------------------------------------------------- + private static final ModConfigSpec.BooleanValue GRAVITY_GUN_ENABLED; private static final ModConfigSpec.BooleanValue GRAVITY_GUN_BLOCKS_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_MAX_HOLD_DISTANCE; - // ------------------------------------------------------------------------- + // Miscellaneous items / consumables - // ------------------------------------------------------------------------- + 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.BooleanValue INVERT_PROJECTILES_FROM_INVERTED_PLAYERS; private static final ModConfigSpec.IntValue CORNEA_EAR_NIGHT_VISION_SECONDS; - // ------------------------------------------------------------------------- + // Moggles - // ------------------------------------------------------------------------- + private static final ModConfigSpec.IntValue MOGGLES_VISION_RADIUS; private static final ModConfigSpec.IntValue MOGGLES_VISION_MAX_LIGHT; private static final ModConfigSpec.DoubleValue MOGGLES_VISION_ALPHA; diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java index 1bbcb8c9..b2b0d9ef 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java @@ -214,7 +214,7 @@ public final class AntarchyNeoforgeEntites { .build("scorpion")); public static final DeferredHolder, EntityType> BASILISK = ENTITY_TYPES.register("basilisk", () -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER) - .sized(2.0F, 3.5F) + .sized(3.0F, 3.5F) .clientTrackingRange(14) .build("basilisk")); public static final DeferredHolder, EntityType> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion",