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:
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; }
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -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));
|
||||||
|
|||||||
+102
-42
@@ -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();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+76
-135
@@ -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",
|
||||||
|
|||||||
+22
@@ -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;
|
||||||
|
|||||||
+1
-1
@@ -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",
|
||||||
|
|||||||
Reference in new issue
Block a user