From aefbfb9f32c5ae31d7547a8051869e5f8238d0a1 Mon Sep 17 00:00:00 2001 From: craisinlord Date: Tue, 15 Sep 2026 23:20:54 -0500 Subject: [PATCH] undertrial sounds inverted squidzooka, rpo king and queen tweaks fix attidue adjustor bug --- .../structure_set/tigers_eye_shrine.json | 14 + .../worldgen/structure_set/underside.json | 18 + .../antarchy/config/AntarchySettings.java | 2 +- .../QueenTrailSpawnMarkerBlockEntity.java | 30 +- .../entity/UndertrialSpawnerBlockEntity.java | 4 + .../content/command/QueenLocateCommand.java | 5 + .../content/entity/MissileSquidEntity.java | 4 + .../content/entity/OctopusBombEntity.java | 8 + .../content/entity/ant/AntTeleportHelper.java | 135 +++++- .../content/entity/royal/KingEntity.java | 386 +++++++++++++++++- .../content/entity/royal/RoyalBossEntity.java | 7 +- .../royal/decree/CloseQuartersDecree.java | 8 +- .../item/AttitudeAdjusterSlamManager.java | 10 +- .../content/item/RpoLauncherItem.java | 18 +- .../antarchy/content/item/SquidzookaItem.java | 18 +- .../elythia/KingsTreeGridFeature.java | 32 +- .../gravity/EntityProjectileGravityMixin.java | 12 +- .../gravity/ProjectileGravityMixin.java | 2 +- .../resources/assets/antarchy/lang/en_us.json | 5 +- .../resources/assets/antarchy/sounds.json | 16 +- .../undertrial/undertrial_detect_player1.ogg | Bin 0 -> 17778 bytes .../undertrial/undertrial_detect_player2.ogg | Bin 0 -> 17717 bytes .../fabric/registry/AntarchyFabricSounds.java | 2 + .../antarchy/neoforge/AntarchyMobsConfig.java | 2 +- .../registry/AntarchyNeoforgeSounds.java | 2 + 25 files changed, 674 insertions(+), 66 deletions(-) create mode 100644 common-1.20.1/src/main/resources/data/antarchy/worldgen/structure_set/tigers_eye_shrine.json create mode 100644 common-1.20.1/src/main/resources/data/antarchy/worldgen/structure_set/underside.json create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/sounds/block/undertrial/undertrial_detect_player1.ogg create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/sounds/block/undertrial/undertrial_detect_player2.ogg diff --git a/common-1.20.1/src/main/resources/data/antarchy/worldgen/structure_set/tigers_eye_shrine.json b/common-1.20.1/src/main/resources/data/antarchy/worldgen/structure_set/tigers_eye_shrine.json new file mode 100644 index 00000000..5df0708e --- /dev/null +++ b/common-1.20.1/src/main/resources/data/antarchy/worldgen/structure_set/tigers_eye_shrine.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "antarchy:tigers_eye_shrine", + "weight": 1 + } + ], + "placement": { + "salt": 149275031, + "spacing": 24, + "separation": 16, + "type": "integrated_api:advanced_random_spread" + } +} diff --git a/common-1.20.1/src/main/resources/data/antarchy/worldgen/structure_set/underside.json b/common-1.20.1/src/main/resources/data/antarchy/worldgen/structure_set/underside.json new file mode 100644 index 00000000..0ca3e80f --- /dev/null +++ b/common-1.20.1/src/main/resources/data/antarchy/worldgen/structure_set/underside.json @@ -0,0 +1,18 @@ +{ + "structures": [ + { + "structure": "antarchy:underside_ruins", + "weight": 2 + }, + { + "structure": "antarchy:underside_castle", + "weight": 1 + } + ], + "placement": { + "salt": 184736291, + "spacing": 24, + "separation": 12, + "type": "integrated_api:advanced_random_spread" + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java index 0b80bcbe..cff0ae71 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java @@ -578,7 +578,7 @@ public final class AntarchySettings { private static double kingBeamTracking = 0.1D; private static double kingBeamTerrainRadius = 5.0D; private static int kingBeamTerrainCap = 192; - private static int royalDecreeCooldownTicks = 1200; + private static int royalDecreeCooldownTicks = 700; private static int kingRoyalMusterCooldownTicks = 500; private static int kingRoyalMusterWindupTicks = 30; private static int kingRoyalMusterDurationTicks = 600; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/QueenTrailSpawnMarkerBlockEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/QueenTrailSpawnMarkerBlockEntity.java index 22eb913e..fe5e04cc 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/QueenTrailSpawnMarkerBlockEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/QueenTrailSpawnMarkerBlockEntity.java @@ -68,12 +68,32 @@ public final class QueenTrailSpawnMarkerBlockEntity extends BlockEntity { level.getChunk(chunkX, chunkZ); } } - QueenEntity queen = QueenEntity.spawnFromUndersideTrail(level, marker.spawnPos, marker.homePos, marker.siteId, marker.yaw); - if (queen != null) { - marker.consumed = true; - marker.queenUuid = queen.getUUID(); - marker.setChanged(); + marker.spawnNow(level); + } + + @Nullable + public QueenEntity spawnNow(ServerLevel level) { + if (!this.configured) { + return null; } + if (this.consumed) { + if (this.queenUuid != null && level.getEntity(this.queenUuid) instanceof QueenEntity queen) { + return queen; + } + return null; + } + for (int chunkX = (this.spawnPos.getX() - 16) >> 4; chunkX <= (this.spawnPos.getX() + 16) >> 4; chunkX++) { + for (int chunkZ = (this.spawnPos.getZ() - 16) >> 4; chunkZ <= (this.spawnPos.getZ() + 16) >> 4; chunkZ++) { + level.getChunk(chunkX, chunkZ); + } + } + QueenEntity queen = QueenEntity.spawnFromUndersideTrail(level, this.spawnPos, this.homePos, this.siteId, this.yaw); + if (queen != null) { + this.consumed = true; + this.queenUuid = queen.getUUID(); + this.setChanged(); + } + return queen; } @Override diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UndertrialSpawnerBlockEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UndertrialSpawnerBlockEntity.java index ef33bce9..3f893500 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UndertrialSpawnerBlockEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UndertrialSpawnerBlockEntity.java @@ -92,6 +92,10 @@ public final class UndertrialSpawnerBlockEntity extends BlockEntity implements T pos.getZ() + 0.5D + (level.random.nextDouble() - 0.5D) * 0.7D, 0.0D, 0.01D, 0.0D); } } else if (currentState == TrialSpawnerState.WAITING_FOR_PLAYERS && blockEntity.previousClientState != currentState) { + ResourceLocation detectionSound = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, + level.random.nextBoolean() ? "undertrial_detect_player1" : "undertrial_detect_player2"); + level.playSound(null, pos, BuiltInRegistries.SOUND_EVENT.get(detectionSound), + net.minecraft.sounds.SoundSource.BLOCKS, 1.0F, 1.0F); for (int i = 0; i < 12; i++) { level.addParticle(blockEntity.particle("undertrial_spawner_detection"), pos.getX() + 0.5D + (level.random.nextDouble() - 0.5D) * 1.4D, pos.getY() + 0.15D + level.random.nextDouble() * 0.7D, diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/command/QueenLocateCommand.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/command/QueenLocateCommand.java index 69ee13d2..fb5fba4a 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/command/QueenLocateCommand.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/command/QueenLocateCommand.java @@ -3,6 +3,7 @@ package com.craisinlord.antarchy.content.command; import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.content.block.entity.QueenTrailSpawnMarkerBlockEntity; import com.craisinlord.antarchy.content.worldgen.thoraxis.QueenTrailGrid; +import com.craisinlord.antarchy.content.entity.royal.QueenEntity; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.context.CommandContext; import java.util.ArrayList; @@ -67,7 +68,11 @@ public final class QueenLocateCommand { if (marker == null) { continue; } + QueenEntity queen = marker.spawnNow(thoraxis); BlockPos spawn = marker.getSpawnPos(); + if (queen != null) { + spawn = BlockPos.containing(queen.position()); + } int distance = Mth.floor(Math.sqrt(distanceSquared(originX, originZ, site))); String coordinates = "[" + spawn.getX() + ", " + spawn.getY() + ", " + spawn.getZ() + "]"; String teleportCommand = "/execute in " + THORAXIS.location() + " run tp @s " diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/MissileSquidEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/MissileSquidEntity.java index 60262c9e..c18a37c0 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/MissileSquidEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/MissileSquidEntity.java @@ -6,6 +6,7 @@ import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; import com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection; import com.craisinlord.antarchy.content.gravity.AntarchyGravityRotationUtil; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityTransition; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; @@ -412,6 +413,9 @@ public class MissileSquidEntity extends Monster implements GeoEntity { this.launchOwnerUuid = owner != null ? owner.getUUID() : null; this.setTarget(null); this.setNoGravity(false); + if (owner != null && AntarchyGravityApi.isGravityInverted(owner)) { + AntarchyGravityApi.setAirborneGravityDirection(this, AntarchyGravityApi.getGravityDirection(owner), true, AntarchyGravityTransition.INSTANT); + } this.setDeltaMovement(velocity); this.hasImpulse = true; this.updateAnimationState(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java index 94a7a9eb..82492bae 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java @@ -357,6 +357,14 @@ public class OctopusBombEntity extends Monster implements GeoEntity { public void launchAsExplosiveProjectile(net.minecraft.world.entity.Entity launcher, Vec3 velocity) { this.explosiveImpact = true; this.explosiveLauncherId = launcher != null ? launcher.getUUID() : null; + if (launcher != null && com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.isGravityInverted(launcher)) { + com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setAirborneGravityDirection( + this, + com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.getGravityDirection(launcher), + true, + com.craisinlord.antarchy.content.gravity.AntarchyGravityTransition.INSTANT + ); + } this.setDeltaMovement(velocity); this.hasImpulse = true; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/AntTeleportHelper.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/AntTeleportHelper.java index b14d65c6..389ba6a5 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/AntTeleportHelper.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/AntTeleportHelper.java @@ -1,6 +1,7 @@ package com.craisinlord.antarchy.content.entity.ant; import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.portal.PermanentPortalType; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; @@ -9,8 +10,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.network.chat.Component; import net.minecraft.server.level.PlayerRespawnLogic; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -37,6 +38,8 @@ import org.jetbrains.annotations.Nullable; public final class AntTeleportHelper { private static final double COMPANION_FOLLOW_RADIUS = 16.0D; + private static final int ARRIVAL_SEARCH_RADIUS = 24; + private static final int ARRIVAL_VERTICAL_SEARCH = 24; private AntTeleportHelper() { } @@ -256,11 +259,12 @@ public final class AntTeleportHelper { return safeArrivalPos; } - return createEmergencyArrivalPlatform(destination, preferredPos); + return createEmergencyArrivalPlatform(destination, findEmergencyPlatformPosition(destination, preferredPos)); } @Nullable private static Vec3 findSafeArrivalPosition(ServerPlayer player, ServerLevel destination, BlockPos preferredPos) { + loadArrivalSearchArea(destination, preferredPos); int[] yRange = getDimensionYRange(destination); if (yRange != null) { return findSafeArrivalPositionInYRange(player, destination, preferredPos, yRange[0], yRange[1]); @@ -277,7 +281,7 @@ public final class AntTeleportHelper { addArrivalCandidate(candidates, PlayerRespawnLogic.getSpawnPosInChunk(destination, new ChunkPos(adjustedPreferredPos))); } - for (int radius = 0; radius <= 4; radius++) { + for (int radius = 0; radius <= ARRIVAL_SEARCH_RADIUS; radius++) { for (int xOffset = -radius; xOffset <= radius; xOffset++) { for (int zOffset = -radius; zOffset <= radius; zOffset++) { if (radius > 0 && Math.abs(xOffset) != radius && Math.abs(zOffset) != radius) { @@ -303,9 +307,27 @@ public final class AntTeleportHelper { return null; } + /** + * Arrival validation needs neighboring chunks for collision checks. Load a + * bounded area up front so unloaded terrain is not mistaken for an unsafe + * destination and sent straight to the emergency-platform path. + */ + private static void loadArrivalSearchArea(ServerLevel destination, BlockPos preferredPos) { + ChunkPos center = new ChunkPos(preferredPos); + int chunkRadius = (ARRIVAL_SEARCH_RADIUS >> 4) + 1; + for (int chunkX = center.x - chunkRadius; chunkX <= center.x + chunkRadius; chunkX++) { + for (int chunkZ = center.z - chunkRadius; chunkZ <= center.z + chunkRadius; chunkZ++) { + destination.getChunk(chunkX, chunkZ); + } + } + } + @Nullable private static int[] getDimensionYRange(ServerLevel destination) { ResourceKey dim = destination.dimension(); + if (dim == PermanentPortalType.ELYTHIA.primaryDimension()) { + return new int[]{64, 240}; + } if (dim == AntarchySettings.termiteDestinationDimension()) { return new int[]{100, 200}; } @@ -320,7 +342,48 @@ public final class AntTeleportHelper { @Nullable private static Vec3 findSafeArrivalPositionInYRange(ServerPlayer player, ServerLevel destination, BlockPos preferredPos, int minY, int maxY) { - for (int radius = 0; radius <= 8; radius++) { + Set surfaceCandidates = new LinkedHashSet<>(); + for (int radius = 0; radius <= ARRIVAL_SEARCH_RADIUS; radius++) { + for (int xOff = -radius; xOff <= radius; xOff++) { + for (int zOff = -radius; zOff <= radius; zOff++) { + if (radius > 0 && Math.abs(xOff) != radius && Math.abs(zOff) != radius) { + continue; + } + int x = preferredPos.getX() + xOff; + int z = preferredPos.getZ() + zOff; + BlockPos column = new BlockPos(x, preferredPos.getY(), z); + if (!destination.hasChunkAt(column)) { + continue; + } + + BlockPos surface = destination.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, column); + addArrivalCandidate(surfaceCandidates, surface); + addArrivalCandidate(surfaceCandidates, destination.getHeightmapPos(Heightmap.Types.WORLD_SURFACE, column)); + + for (int yOffset = 1; yOffset <= ARRIVAL_VERTICAL_SEARCH; yOffset++) { + surfaceCandidates.add(surface.above(yOffset)); + surfaceCandidates.add(surface.below(yOffset)); + } + } + } + } + + // Prefer actual generated surfaces. This is especially important in + // Elythia, where the configured spawn height is not necessarily the + // playable surface. + for (BlockPos candidate : surfaceCandidates) { + if (candidate.getY() < minY || candidate.getY() > maxY) { + continue; + } + Vec3 safePos = tryFindSafeDismount(player, destination, candidate); + if (safePos != null && safePos.y >= minY && safePos.y <= maxY) { + return safePos; + } + } + + // Heightmaps can be stale or unsuitable around structures, so retain a + // bounded exhaustive search as a final generated-terrain attempt. + for (int radius = 0; radius <= ARRIVAL_SEARCH_RADIUS; radius++) { for (int xOff = -radius; xOff <= radius; xOff++) { for (int zOff = -radius; zOff <= radius; zOff++) { if (radius > 0 && Math.abs(xOff) != radius && Math.abs(zOff) != radius) { @@ -412,6 +475,49 @@ public final class AntTeleportHelper { return new BlockPos(preferredPos.getX(), Mth.clamp(preferredPos.getY(), minY, maxY), preferredPos.getZ()); } + /** + * Keep the emergency platform grounded in generated terrain when possible. + * A configured/shared spawn can be an arbitrary coordinate in a custom + * dimension, so using its Y directly can strand the player in the sky. + */ + private static BlockPos findEmergencyPlatformPosition(ServerLevel destination, BlockPos preferredPos) { + BlockPos best = null; + int bestDistance = Integer.MAX_VALUE; + int minY = destination.getMinBuildHeight() + 1; + int maxY = destination.getMaxBuildHeight() - 2; + + for (int radius = 0; radius <= 8; radius++) { + for (int xOffset = -radius; xOffset <= radius; xOffset++) { + for (int zOffset = -radius; zOffset <= radius; zOffset++) { + if (radius > 0 && Math.abs(xOffset) != radius && Math.abs(zOffset) != radius) { + continue; + } + + BlockPos searchPos = preferredPos.offset(xOffset, 0, zOffset); + if (!destination.hasChunkAt(searchPos)) { + continue; + } + + BlockPos surface = destination.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, searchPos); + if (surface.getY() < minY || surface.getY() > maxY) { + continue; + } + + int distance = Math.abs(xOffset) + Math.abs(zOffset); + if (distance < bestDistance) { + best = surface; + bestDistance = distance; + } + } + } + if (best != null) { + break; + } + } + + return best != null ? best : getClampedFallbackPosition(destination, preferredPos); + } + /** * Last-resort landing location for custom dimensions whose generated spawn * area has no valid player-sized space. The normal search always runs first; @@ -424,7 +530,7 @@ public final class AntTeleportHelper { center = new BlockPos(center.getX(), Mth.clamp(center.getY(), minY, maxY), center.getZ()); destination.getChunkAt(center); - BlockState platformState = Blocks.STONE.defaultBlockState(); + BlockState platformState = emergencyPlatformState(destination); for (int xOffset = -2; xOffset <= 2; xOffset++) { for (int zOffset = -2; zOffset <= 2; zOffset++) { @@ -438,4 +544,23 @@ public final class AntTeleportHelper { return Vec3.atBottomCenterOf(center); } + + private static BlockState emergencyPlatformState(ServerLevel destination) { + if (destination.dimension() == PermanentPortalType.ELYTHIA.primaryDimension()) { + return PermanentPortalType.ELYTHIA.platformBlock().defaultBlockState(); + } + if (destination.dimension() == PermanentPortalType.THORAXIS.primaryDimension()) { + return PermanentPortalType.THORAXIS.platformBlock().defaultBlockState(); + } + if (destination.dimension() == PermanentPortalType.CAVARYN.primaryDimension()) { + return PermanentPortalType.CAVARYN.platformBlock().defaultBlockState(); + } + if (destination.dimension() == Level.NETHER) { + return Blocks.NETHERRACK.defaultBlockState(); + } + if (destination.dimension() == Level.END) { + return Blocks.END_STONE.defaultBlockState(); + } + return Blocks.DIRT.defaultBlockState(); + } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/KingEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/KingEntity.java index 8ee3ae4e..16c7f2ef 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/KingEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/KingEntity.java @@ -34,6 +34,7 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Arrow; import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.util.Mth; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.MenuProvider; import net.minecraft.world.item.ArmorItem; @@ -93,6 +94,16 @@ public class KingEntity extends RoyalBossEntity { private static final double COME_NO_CLOSER_RADIUS = 16.0D; private static final int COME_NO_CLOSER_PARTICLE_INTERVAL = 4; private static final int COME_NO_CLOSER_PARTICLE_COUNT = 40; + private static final double CLOSE_QUARTERS_RADIUS = 16.0D; + private static final int CLOSE_QUARTERS_APPROACH_TICKS = 120; + private static final int CLOSE_QUARTERS_EXIT_GRACE_TICKS = 40; + private static final int PROJECTILE_PRESSURE_MAX = 60; + private static final int PROJECTILE_PRESSURE_PER_HIT = 10; + private static final int GROUND_ASSAULT_TICKS = 200; + private static final int GROUND_ASSAULT_COOLDOWN_MIN = 600; + private static final int GROUND_ASSAULT_COOLDOWN_VARIANCE = 300; + private static final int COMBAT_WAYPOINT_MIN_TICKS = 45; + private static final int COMBAT_WAYPOINT_VARIANCE = 35; @Nullable private Vec3 patrolCenter; @@ -105,6 +116,10 @@ public class KingEntity extends RoyalBossEntity { private double treePatrolAngle; private boolean treePatrolBound; private int patrolCooldownTicks; + @Nullable + private Vec3 treePatrolProgressPosition; + private int treePatrolProgressTicks; + private int treePatrolFailures; private int decreeCooldownTicks; private int activeDecreeTicks; private int stompCooldownTicks; @@ -113,6 +128,23 @@ public class KingEntity extends RoyalBossEntity { private int iceballCooldownTicks = 120; private int iceSpikeCooldownTicks = 160; private boolean decreeRetreatPressure; + @Nullable + private String lastDecreeKey; + private boolean closeQuartersEntered; + private int closeQuartersOutsideTicks; + private int projectilePressure; + private int groundAssaultCooldownTicks = 400; + private int groundAssaultTicks; + private boolean kingLandingForCombat; + @Nullable + private Vec3 kingLandingWaypoint; + @Nullable + private Vec3 kingCombatWaypoint; + @Nullable + private Vec3 kingCombatProgressPosition; + private int kingCombatWaypointTicks; + private int kingCombatProgressTicks; + private int kingStrafeDirection = 1; private int royalBoundaryGraceTicks; @Nullable private ServerPlayer exileTarget; @@ -156,12 +188,20 @@ public class KingEntity extends RoyalBossEntity { return phase.maxConcurrentHeadAttacks(); } + @Override + protected boolean managesOwnCombatLocomotion() { + return true; + } + public void setTreePatrolHome(Vec3 center, double minimumY, double maximumY, double angle) { this.treePatrolCenter = center; this.treePatrolMinimumY = minimumY; this.treePatrolMaximumY = maximumY; this.treePatrolAngle = angle; this.treePatrolWaypoint = null; + this.treePatrolProgressPosition = null; + this.treePatrolProgressTicks = 0; + this.treePatrolFailures = 0; this.treePatrolBound = true; } @@ -383,11 +423,22 @@ public class KingEntity extends RoyalBossEntity { ServerLevel serverLevel = (ServerLevel) this.level(); this.iceBuildup.entrySet().removeIf(entry -> serverLevel.getEntity(entry.getKey()) == null); if (this.iceBuildup.size() > 16) this.iceBuildup.clear(); + if (this.tickCount % 10 == 0 && this.projectilePressure > 0) { + this.projectilePressure--; + } + if (this.tickCount % 40 == 0) { + this.bumpBehavior(Behavior.RANGED, -1); + } + if (this.tickCount % 20 == 0 && this.getArrowCount() > 6) { + this.setArrowCount(6); + } LivingEntity target = this.getTarget(); if (target != null && !this.isDeadOrDying() && this.level() instanceof ServerLevel level) { this.trackBehavior(target); this.tickDecree(level, target); this.tickKingWholeBody(level, target); + this.tickKingCombatMovement(target); + this.stabilizeKingRotation(); return; } @@ -395,6 +446,7 @@ public class KingEntity extends RoyalBossEntity { return; } this.setRoyalFlying(true); + this.resetKingCombatMovement(); this.decreeRetreatPressure = false; if (this.treePatrolBound && this.treePatrolCenter != null) { this.tickTreePatrol(); @@ -416,16 +468,20 @@ public class KingEntity extends RoyalBossEntity { } private void tickComeNoCloserIndicator() { - if (!(this.activeDecree instanceof ComeNoCloserDecree) + boolean keepOut = this.activeDecree instanceof ComeNoCloserDecree; + boolean closeQuarters = this.activeDecree instanceof CloseQuartersDecree; + if ((!keepOut && !closeQuarters) || this.tickCount % COME_NO_CLOSER_PARTICLE_INTERVAL != 0 || !(this.level() instanceof ServerLevel serverLevel)) { return; } + double radius = keepOut ? COME_NO_CLOSER_RADIUS : CLOSE_QUARTERS_RADIUS; for (int index = 0; index < COME_NO_CLOSER_PARTICLE_COUNT; index++) { double angle = (Math.PI * 2.0D * index) / COME_NO_CLOSER_PARTICLE_COUNT; - double x = this.getX() + Math.cos(angle) * COME_NO_CLOSER_RADIUS; - double z = this.getZ() + Math.sin(angle) * COME_NO_CLOSER_RADIUS; - serverLevel.sendParticles(ParticleTypes.END_ROD, x, this.getY() + 0.25D, z, + double x = this.getX() + Math.cos(angle) * radius; + double z = this.getZ() + Math.sin(angle) * radius; + serverLevel.sendParticles(keepOut ? ParticleTypes.END_ROD : ParticleTypes.ENCHANT, + x, this.getY() + 0.25D, z, 1, 0.0D, 0.0D, 0.0D, 0.0D); } } @@ -440,9 +496,25 @@ public class KingEntity extends RoyalBossEntity { this.treePatrolAngle -= Math.PI * 2.0D; } Vec3 waypoint = this.treePatrolWaypoint; + if (waypoint != null && ++this.treePatrolProgressTicks >= 40) { + if (this.treePatrolProgressPosition != null + && this.position().distanceToSqr(this.treePatrolProgressPosition) < 1.0D + && this.position().distanceToSqr(waypoint) > 36.0D) { + this.treePatrolWaypoint = null; + waypoint = null; + this.treePatrolFailures++; + this.treePatrolAngle += 0.35D; + } else { + this.treePatrolFailures = Math.max(0, this.treePatrolFailures - 1); + } + this.treePatrolProgressPosition = this.position(); + this.treePatrolProgressTicks = 0; + } if (waypoint == null || this.position().distanceToSqr(waypoint) < 36.0D) { waypoint = this.findTreePatrolWaypoint(center, this.treePatrolAngle); this.treePatrolWaypoint = waypoint; + this.treePatrolProgressPosition = this.position(); + this.treePatrolProgressTicks = 0; } if (waypoint != null) { this.getMoveControl().setWantedPosition(waypoint.x, waypoint.y, waypoint.z, 1.0D); @@ -503,18 +575,40 @@ public class KingEntity extends RoyalBossEntity { @Nullable private Vec3 findTreePatrolWaypoint(Vec3 center, double angle) { - for (int attempt = 0; attempt < 10; attempt++) { - double candidateAngle = angle + attempt * 0.22D; - double x = center.x + Math.cos(candidateAngle) * TREE_ORBIT_RADIUS; - double z = center.z + Math.sin(candidateAngle) * TREE_ORBIT_RADIUS; - double vertical = 0.5D + 0.5D * Math.sin(candidateAngle); - double y = this.treePatrolMinimumY - + (this.treePatrolMaximumY - this.treePatrolMinimumY) * vertical; - Vec3 candidate = new Vec3(x, y, z); - if (this.clearTreePatrolPath(candidate)) { - return candidate; + double currentAngle = Math.atan2(this.getZ() - center.z, this.getX() - center.x); + double baseAngle = Double.isFinite(currentAngle) ? currentAngle + 0.24D : angle; + double[] radii = {TREE_ORBIT_RADIUS, TREE_ORBIT_RADIUS + 20.0D, TREE_ORBIT_RADIUS - 20.0D}; + double[] heightOffsets = {0.0D, 16.0D, -12.0D, 30.0D}; + for (int angleAttempt = 0; angleAttempt < 8; angleAttempt++) { + double candidateAngle = baseAngle + angleAttempt * 0.16D; + for (double radius : radii) { + double x = center.x + Math.cos(candidateAngle) * radius; + double z = center.z + Math.sin(candidateAngle) * radius; + double vertical = 0.5D + 0.5D * Math.sin(candidateAngle); + double baseY = this.treePatrolMinimumY + + (this.treePatrolMaximumY - this.treePatrolMinimumY) * vertical; + for (double heightOffset : heightOffsets) { + double y = Mth.clamp(baseY + heightOffset, + this.treePatrolMinimumY + 8.0D, this.treePatrolMaximumY - 8.0D); + Vec3 candidate = new Vec3(x, y, z); + if (this.clearTreePatrolPath(candidate)) { + return candidate; + } + } } } + Vec3 outward = this.position().subtract(center).multiply(1.0D, 0.0D, 1.0D); + if (outward.lengthSqr() < 1.0E-4D) { + outward = new Vec3(Math.cos(angle), 0.0D, Math.sin(angle)); + } + Vec3 tangent = new Vec3(-outward.z, 0.0D, outward.x).normalize(); + Vec3 recovery = this.position().add(tangent.scale(24.0D)).add(0.0D, + this.treePatrolFailures >= 2 ? 18.0D : 8.0D, 0.0D); + recovery = new Vec3(recovery.x, + Mth.clamp(recovery.y, this.treePatrolMinimumY + 8.0D, this.treePatrolMaximumY - 8.0D), recovery.z); + if (this.clearTreePatrolPath(recovery)) { + return recovery; + } return null; } @@ -531,6 +625,179 @@ public class KingEntity extends RoyalBossEntity { return true; } + private void tickKingCombatMovement(LivingEntity target) { + boolean closeQuarters = this.activeDecree instanceof CloseQuartersDecree; + if (closeQuarters && this.isRoyalFlying() && !this.kingLandingForCombat) { + this.beginKingLanding(target); + } else if (!closeQuarters && this.isRoyalFlying() && !this.kingLandingForCombat + && this.groundAssaultCooldownTicks-- <= 0 && target.onGround()) { + this.beginKingLanding(target); + } + + if (this.kingLandingForCombat) { + if (!target.onGround() && !closeQuarters) { + this.kingLandingForCombat = false; + this.kingLandingWaypoint = null; + this.groundAssaultCooldownTicks = 160; + return; + } + if (this.kingLandingWaypoint == null) { + this.kingLandingWaypoint = this.findKingLandingPoint(target); + } + Vec3 landing = this.kingLandingWaypoint; + if (landing != null) { + this.setRoyalFlying(true); + this.getMoveControl().setWantedPosition(landing.x, landing.y, landing.z, 1.35D); + if (this.onGround() || this.getY() <= landing.y + 1.25D) { + this.setRoyalFlying(false); + this.kingLandingForCombat = false; + this.kingLandingWaypoint = null; + this.groundAssaultTicks = closeQuarters + ? Math.max(GROUND_ASSAULT_TICKS, this.activeDecreeTicks + 20) + : GROUND_ASSAULT_TICKS; + } + } + return; + } + + if (!this.isRoyalFlying()) { + if (closeQuarters) { + this.groundAssaultTicks = Math.max(this.groundAssaultTicks, this.activeDecreeTicks + 20); + } + this.getMoveControl().setWantedPosition(target.getX(), target.getY(), target.getZ(), 1.25D); + if (--this.groundAssaultTicks <= 0 && !closeQuarters) { + this.setRoyalFlying(true); + this.setDeltaMovement(this.getDeltaMovement().add(0.0D, 0.42D, 0.0D)); + this.hasImpulse = true; + this.groundAssaultCooldownTicks = GROUND_ASSAULT_COOLDOWN_MIN + + this.random.nextInt(GROUND_ASSAULT_COOLDOWN_VARIANCE + 1); + this.kingCombatWaypoint = null; + } + return; + } + + if (this.kingCombatWaypoint != null && ++this.kingCombatProgressTicks >= 40) { + if (this.kingCombatProgressPosition != null + && this.position().distanceToSqr(this.kingCombatProgressPosition) < 1.0D + && this.position().distanceToSqr(this.kingCombatWaypoint) > 16.0D) { + this.kingCombatWaypoint = null; + this.kingStrafeDirection *= -1; + } + this.kingCombatProgressPosition = this.position(); + this.kingCombatProgressTicks = 0; + } + if (this.kingCombatWaypoint == null || --this.kingCombatWaypointTicks <= 0 + || this.position().distanceToSqr(this.kingCombatWaypoint) < 16.0D) { + this.selectKingCombatWaypoint(target); + } + if (this.kingCombatWaypoint != null) { + double speed = this.projectilePressure >= 30 ? 1.4D : 1.15D; + this.getMoveControl().setWantedPosition(this.kingCombatWaypoint.x, + this.kingCombatWaypoint.y, this.kingCombatWaypoint.z, speed); + } + } + + private void beginKingLanding(LivingEntity target) { + this.kingLandingWaypoint = this.findKingLandingPoint(target); + if (this.kingLandingWaypoint != null) { + this.kingLandingForCombat = true; + this.kingCombatWaypoint = null; + } else { + this.groundAssaultCooldownTicks = 100; + } + } + + @Nullable + private Vec3 findKingLandingPoint(LivingEntity target) { + Vec3 away = this.position().subtract(target.position()).multiply(1.0D, 0.0D, 1.0D); + double baseAngle = away.lengthSqr() > 1.0E-4D ? Math.atan2(away.z, away.x) : this.random.nextDouble() * Mth.TWO_PI; + double[] radii = {9.0D, 13.0D, 17.0D, 6.0D}; + for (int angleIndex = 0; angleIndex < 12; angleIndex++) { + double angle = baseAngle + angleIndex * Mth.TWO_PI / 12.0D; + for (double radius : radii) { + double x = target.getX() + Math.cos(angle) * radius; + double z = target.getZ() + Math.sin(angle) * radius; + double y = this.groundYBelow(x, z) + 0.1D; + Vec3 candidate = new Vec3(x, y, z); + AABB box = this.getBoundingBox().move( + candidate.x - this.getX(), candidate.y - this.getY(), candidate.z - this.getZ()); + if (this.level().noCollision(this, box)) { + return candidate; + } + } + } + return null; + } + + private void selectKingCombatWaypoint(LivingEntity target) { + Vec3 radial = this.position().subtract(target.position()).multiply(1.0D, 0.0D, 1.0D); + if (radial.lengthSqr() < 1.0E-4D) { + radial = new Vec3(1.0D, 0.0D, 0.0D); + } + radial = radial.normalize(); + Vec3 tangent = new Vec3(-radial.z * this.kingStrafeDirection, 0.0D, + radial.x * this.kingStrafeDirection); + double range = this.activeDecree instanceof ComeNoCloserDecree || this.projectilePressure >= 30 + ? 40.0D : 34.0D; + Vec3 horizontal = target.position().add(radial.scale(range)).add(tangent.scale(12.0D)); + double groundY = this.groundYBelow(horizontal.x, horizontal.z); + double y = Mth.clamp(target.getY() + 8.0D, groundY + FLYING_MIN_HOVER, + groundY + FLYING_MAX_HOVER_ABOVE_GROUND); + this.kingCombatWaypoint = new Vec3(horizontal.x, y, horizontal.z); + this.kingCombatWaypointTicks = COMBAT_WAYPOINT_MIN_TICKS + + this.random.nextInt(COMBAT_WAYPOINT_VARIANCE + 1); + this.kingCombatProgressPosition = this.position(); + this.kingCombatProgressTicks = 0; + if (this.random.nextInt(4) == 0) { + this.kingStrafeDirection *= -1; + } + } + + private void stabilizeKingRotation() { + Vec3 movement = this.getDeltaMovement().multiply(1.0D, 0.0D, 1.0D); + if (movement.lengthSqr() < 0.0025D) { + return; + } + float desiredYaw = (float) (Mth.atan2(movement.z, movement.x) * 180.0D / Math.PI) - 90.0F; + float turn = Mth.clamp(Mth.wrapDegrees(desiredYaw - this.getYRot()), -7.0F, 7.0F); + this.setYRot(this.getYRot() + turn); + this.yBodyRot = this.getYRot(); + } + + private void resetKingCombatMovement() { + this.kingLandingForCombat = false; + this.kingLandingWaypoint = null; + this.kingCombatWaypoint = null; + this.kingCombatProgressPosition = null; + this.kingCombatWaypointTicks = 0; + this.kingCombatProgressTicks = 0; + this.groundAssaultTicks = 0; + if (this.groundAssaultCooldownTicks <= 0) { + this.groundAssaultCooldownTicks = 400; + } + } + + public void requestCloseQuartersAssault(LivingEntity target) { + if (target != null && target.isAlive() && this.isRoyalFlying() && !this.kingLandingForCombat) { + this.beginKingLanding(target); + } + } + + public RoyalDecree.Evaluation evaluateCloseQuarters(LivingEntity target) { + double distanceSquared = target.distanceToSqr(this); + if (distanceSquared <= CLOSE_QUARTERS_RADIUS * CLOSE_QUARTERS_RADIUS) { + this.closeQuartersEntered = true; + this.closeQuartersOutsideTicks = 0; + return RoyalDecree.Evaluation.COMPLIANT; + } + if (!this.closeQuartersEntered) { + return 300 - this.activeDecreeTicks >= CLOSE_QUARTERS_APPROACH_TICKS + ? RoyalDecree.Evaluation.VIOLATED : RoyalDecree.Evaluation.COMPLIANT; + } + return ++this.closeQuartersOutsideTicks > CLOSE_QUARTERS_EXIT_GRACE_TICKS + ? RoyalDecree.Evaluation.VIOLATED : RoyalDecree.Evaluation.COMPLIANT; + } + private void tickRoyalPunishment() { if (this.exileTarget == null && this.titheTarget == null && this.targetShotPlayer == null && this.sealedTarget == null) { return; @@ -742,6 +1009,8 @@ public class KingEntity extends RoyalBossEntity { this.activeDecree = decree; this.activeDecreeTicks = 300; this.decreeCooldownTicks = 0; + this.closeQuartersEntered = false; + this.closeQuartersOutsideTicks = 0; this.projectRoyalSound(AntarchySoundEvents.KING_DECREE.get(), 4.0F, 1.0F, target); this.sendDecreeTitle(target); return true; @@ -1093,6 +1362,8 @@ public class KingEntity extends RoyalBossEntity { this.activeDecreeTicks = 300; this.activeDecree = this.pickDecree(target); this.decreeRetreatPressure = false; + this.closeQuartersEntered = false; + this.closeQuartersOutsideTicks = 0; this.playRoyalSound(AntarchySoundEvents.KING_DECREE_CAST.get(), 0.9F + this.random.nextFloat() * 0.15F); this.playRoyalSound(AntarchySoundEvents.KING_ROAR.get(), 0.8F + this.random.nextFloat() * 0.12F); this.projectRoyalSound(AntarchySoundEvents.KING_DECREE.get(), 4.0F, 1.0F, target); @@ -1115,10 +1386,19 @@ public class KingEntity extends RoyalBossEntity { } private RoyalDecree pickDecree(LivingEntity target) { + if ((this.projectilePressure >= 20 || this.behaviorScore(Behavior.RANGED) >= 6) + && !"decree.antarchy.close_quarters".equals(this.lastDecreeKey)) { + return DECREES.stream() + .filter(CloseQuartersDecree.class::isInstance) + .findFirst() + .orElse(DECREES.get(0)); + } int totalWeight = 0; int[] weights = new int[DECREES.size()]; for (int i = 0; i < DECREES.size(); i++) { - weights[i] = Math.max(1, DECREES.get(i).contextWeight(this, target)); + RoyalDecree decree = DECREES.get(i); + weights[i] = decree.translationKey().equals(this.lastDecreeKey) + ? 0 : Math.max(1, decree.contextWeight(this, target)); totalWeight += weights[i]; } int roll = this.random.nextInt(totalWeight); @@ -1145,11 +1425,14 @@ public class KingEntity extends RoyalBossEntity { player.connection.send(new ClientboundClearTitlesPacket(false)); } if (this.activeDecree != null) { + this.lastDecreeKey = this.activeDecree.translationKey(); this.activeDecree.onEnded(); } this.activeDecree = null; this.activeDecreeTicks = 0; this.decreeRetreatPressure = false; + this.closeQuartersEntered = false; + this.closeQuartersOutsideTicks = 0; this.decreeCooldownTicks = AntarchySettings.royalDecreeCooldownTicks(); this.startRoyalRecovery(40); } @@ -1166,13 +1449,63 @@ public class KingEntity extends RoyalBossEntity { if (this.activeDecree == null || target == null || !target.isAlive()) { return; } - if (target instanceof ServerPlayer player) { - this.projectRoyalSound(AntarchySoundEvents.KING_JUDGEMENT.get(), 4.0F, 1.0F, target); - this.debugTriggerPunishment(RoyalPunishmentType.ROYAL_EXILE, player); - } else { - this.invokeJudgment(target); - } + this.attackScheduler.cancel(RoyalAttackLane.DECREE); + this.attackScheduler.cancel(RoyalAttackLane.HAZARD); this.endDecree(target); + this.projectRoyalSound(AntarchySoundEvents.KING_JUDGEMENT.get(), 4.0F, 1.0F, target); + if (target instanceof ServerPlayer player) { + this.sendDecreeViolationTitle(player); + } + this.startRoyalJudgmentBarrage(target); + } + + private void sendDecreeViolationTitle(ServerPlayer player) { + player.connection.send(new ClientboundSetTitlesAnimationPacket(5, 45, 10)); + player.connection.send(new ClientboundSetTitleTextPacket(Component.translatable("decree.antarchy.violated") + .withStyle(style -> style.withColor(ChatFormatting.DARK_PURPLE).withBold(true)))); + player.connection.send(new ClientboundSetSubtitleTextPacket(Component.translatable("decree.antarchy.violated.subtitle") + .withStyle(style -> style.withColor(ChatFormatting.LIGHT_PURPLE)))); + } + + private void startRoyalJudgmentBarrage(LivingEntity target) { + if (!(this.level() instanceof ServerLevel level)) { + return; + } + this.beginRoyalAttack("royal_judgment", RoyalAttackLane.HAZARD, 80, + 20, 9, 12, new com.craisinlord.antarchy.content.entity.royal.attack.RoyalAttackScheduler.Action() { + @Override + public void onStart() { + for (RoyalHead.Slot slot : RoyalHead.Slot.values()) { + KingEntity.this.triggerAnim(slot.controllerName(), "shoot"); + } + level.sendParticles(ParticleTypes.WITCH, + KingEntity.this.getX(), KingEntity.this.getY() + KingEntity.this.getBbHeight() * 0.7D, + KingEntity.this.getZ(), 70, 4.0D, 3.0D, 4.0D, 0.12D); + } + + @Override + public void onActive(int elapsedTicks) { + if (elapsedTicks % 4 == 0 && target.isAlive() && target.level() == level) { + KingEntity.this.fireRoyalJudgmentWave(level, target); + } + } + }); + } + + private void fireRoyalJudgmentWave(ServerLevel level, LivingEntity target) { + Vec3 predicted = target.getEyePosition().add(target.getDeltaMovement().scale(4.0D)); + for (RoyalHead.Slot slot : RoyalHead.Slot.values()) { + RoyalHead head = this.royalHead(slot); + Vec3 origin = this.headAnchor(head); + Vec3 direction = predicted.subtract(origin).normalize(); + RoyalBoltEntity bolt = new RoyalBoltEntity(AntarchyObjects.ROYAL_BOLT.get(), level); + bolt.setOwner(this); + bolt.setElement(RoyalBeamElement.QUEEN_PURPLE); + bolt.setPos(origin.x, origin.y, origin.z); + bolt.shoot(direction.x, direction.y, direction.z, 1.55F, 1.0F); + level.addFreshEntity(bolt); + } + this.playRoyalSound(AntarchySoundEvents.KING_BEAM_SHOOT.get(), 1.15F); } public boolean blocksHealing() { @@ -1200,6 +1533,17 @@ public class KingEntity extends RoyalBossEntity { this.lastPlayerDamageTime.put(attacker.getUUID(), this.level().getGameTime()); boolean projectile = source.getDirectEntity() instanceof Projectile; this.bumpBehavior(projectile ? Behavior.RANGED : Behavior.HUGGING, 2); + if (projectile) { + this.projectilePressure = Math.min(PROJECTILE_PRESSURE_MAX, + this.projectilePressure + PROJECTILE_PRESSURE_PER_HIT); + if (this.isRoyalFlying() && !(this.activeDecree instanceof CloseQuartersDecree)) { + if (this.projectilePressure >= 40) { + amount *= 0.55F; + } else if (this.projectilePressure >= 20) { + amount *= 0.75F; + } + } + } if (this.activeDecree instanceof CloseQuartersDecree && projectile) { this.failActiveDecree(attacker); } else if (this.activeDecree instanceof ComeNoCloserDecree && !projectile) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBossEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBossEntity.java index c6f46be2..ba279b3e 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBossEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBossEntity.java @@ -284,6 +284,11 @@ public abstract class RoyalBossEntity extends Monster implements GeoEntity, Mult return 0.35D; } + /** Lets a boss provide a bespoke air/ground cadence without changing the other royal encounter. */ + protected boolean managesOwnCombatLocomotion() { + return false; + } + protected boolean shouldClearObstruction() { return true; } @@ -799,7 +804,7 @@ public abstract class RoyalBossEntity extends Monster implements GeoEntity, Mult } private void tickCombatLocomotionMode(LivingEntity target) { - if (!this.isFlyingBoss()) { + if (!this.isFlyingBoss() || this.managesOwnCombatLocomotion()) { return; } boolean inverted = AntarchyGravityApi.isGravityInverted(this); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/decree/CloseQuartersDecree.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/decree/CloseQuartersDecree.java index 7c0f6d19..5474f2a8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/decree/CloseQuartersDecree.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/decree/CloseQuartersDecree.java @@ -4,7 +4,13 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; public final class CloseQuartersDecree implements RoyalDecree { public String translationKey() { return "decree.antarchy.close_quarters"; } - public void apply(ServerLevel level, KingEntity king, LivingEntity target) { } + public void apply(ServerLevel level, KingEntity king, LivingEntity target) { + king.requestCloseQuartersAssault(target); + } + @Override + public Evaluation evaluate(ServerLevel level, KingEntity king, LivingEntity target) { + return king.evaluateCloseQuarters(target); + } @Override public int contextWeight(KingEntity king, LivingEntity target) { return 4 + king.behaviorScore(KingEntity.Behavior.RANGED); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/AttitudeAdjusterSlamManager.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/AttitudeAdjusterSlamManager.java index 2fab071b..9cb53cf1 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/AttitudeAdjusterSlamManager.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/AttitudeAdjusterSlamManager.java @@ -23,6 +23,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.gameevent.GameEvent; @@ -104,7 +105,7 @@ public final class AttitudeAdjusterSlamManager { if (player.onGround() || player.isInWaterOrBubble() || player.isInLava() || player.isFallFlying() || player.getAbilities().flying || PLAYER_SLAMS.containsKey(player.getUUID())) { return false; } - PLAYER_SLAMS.put(player.getUUID(), new PlayerSlamState(player.getUUID(), player.serverLevel().dimension().location().toString(), player.serverLevel().getGameTime() + SLAM_TIMEOUT_TICKS, player.fallDistance)); + PLAYER_SLAMS.put(player.getUUID(), new PlayerSlamState(player.getUUID(), hand, player.serverLevel().dimension().location().toString(), player.serverLevel().getGameTime() + SLAM_TIMEOUT_TICKS, player.fallDistance)); AntarchyGravityDirection gravityDirection = AntarchyGravityRotationUtil.getGravityDownDirection(player) == Direction.UP ? AntarchyGravityDirection.UP : AntarchyGravityDirection.DOWN; Vec3 motion = player.getDeltaMovement(); Vec3 localMotion = AntarchyGravityRotationUtil.vecWorldToPlayer(motion, gravityDirection); @@ -194,7 +195,8 @@ public final class AttitudeAdjusterSlamManager { if (AntarchySettings.attitudeAdjusterBreaksBlocks()) { breakBlocks(level, player, groundPos, gravityDown); } - if (player.getMainHandItem().getItem() instanceof AttitudeAdjusterItem item) { + ItemStack slamStack = player.getItemInHand(state.hand); + if (slamStack.getItem() instanceof AttitudeAdjusterItem item) { player.getCooldowns().addCooldown(item, PLAYER_SLAM_COOLDOWN_TICKS); } iterator.remove(); @@ -319,12 +321,14 @@ public final class AttitudeAdjusterSlamManager { private static final class PlayerSlamState { private final UUID playerId; + private final net.minecraft.world.InteractionHand hand; private final String dimensionId; private final long expiresAt; private final float startFallDistance; - private PlayerSlamState(UUID playerId, String dimensionId, long expiresAt, float startFallDistance) { + private PlayerSlamState(UUID playerId, net.minecraft.world.InteractionHand hand, String dimensionId, long expiresAt, float startFallDistance) { this.playerId = playerId; + this.hand = hand; this.dimensionId = dimensionId; this.expiresAt = expiresAt; this.startFallDistance = startFallDistance; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RpoLauncherItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RpoLauncherItem.java index 634a928e..2b3b5cec 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RpoLauncherItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RpoLauncherItem.java @@ -6,6 +6,9 @@ import com.craisinlord.antarchy.content.AntarchySoundEvents; import com.craisinlord.antarchy.content.client.model.ResourceBackedGeoItemModel; import com.craisinlord.antarchy.content.client.renderer.AnimatedHeldItemRenderer; import com.craisinlord.antarchy.content.entity.OctopusBombEntity; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityRotationUtil; import java.util.function.Consumer; import java.util.function.Predicate; import net.minecraft.core.component.DataComponents; @@ -161,15 +164,12 @@ public class RpoLauncherItem extends ProjectileWeaponItem implements GeoItem { } float yaw = player.getYRot() + yawOffset; - Vec3 direction = Vec3.directionFromRotation(new Vec2(player.getXRot(), yaw)); - projectileBomb.moveTo( - player.getX(), - player.getEyeY() + 0.15D, - player.getZ(), - yaw, - player.getXRot() - ); - projectileBomb.launchAsExplosiveProjectile(player, direction.scale(AntarchySettings.rpoLauncherLaunchVelocity()).add(player.getDeltaMovement())); + Vec3 localDirection = Vec3.directionFromRotation(new Vec2(player.getXRot(), yaw)); + AntarchyGravityDirection gravity = AntarchyGravityApi.getGravityDirection(player); + Vec3 direction = AntarchyGravityRotationUtil.vecPlayerToWorld(localDirection, gravity).normalize(); + Vec3 spawn = player.getEyePosition().add(direction.scale(0.55D)); + projectileBomb.moveTo(spawn.x, spawn.y, spawn.z, yaw, player.getXRot()); + projectileBomb.launchAsExplosiveProjectile(player, direction.scale(AntarchySettings.rpoLauncherLaunchVelocity()).add(AntarchyGravityApi.deltaMovement(player))); level.addFreshEntity(projectileBomb); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/SquidzookaItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/SquidzookaItem.java index e907bdb1..6950d148 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/SquidzookaItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/SquidzookaItem.java @@ -5,6 +5,9 @@ import com.craisinlord.antarchy.content.AntarchyObjects; import com.craisinlord.antarchy.content.AntarchySoundEvents; import com.craisinlord.antarchy.content.client.model.ResourceBackedGeoItemModel; import com.craisinlord.antarchy.content.entity.MissileSquidEntity; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityRotationUtil; import java.util.function.Consumer; import java.util.function.Predicate; import net.minecraft.core.component.DataComponents; @@ -162,15 +165,12 @@ public class SquidzookaItem extends ProjectileWeaponItem implements GeoItem { } float yaw = player.getYRot() + yawOffset; - Vec3 direction = Vec3.directionFromRotation(new Vec2(player.getXRot(), yaw)); - projectileSquid.moveTo( - player.getX(), - player.getEyeY() - 0.2D, - player.getZ(), - yaw, - player.getXRot() - ); - projectileSquid.launchAsProjectile(player, direction.scale(AntarchySettings.squidzookaLaunchVelocity()).add(player.getDeltaMovement())); + Vec3 localDirection = Vec3.directionFromRotation(new Vec2(player.getXRot(), yaw)); + AntarchyGravityDirection gravity = AntarchyGravityApi.getGravityDirection(player); + Vec3 direction = AntarchyGravityRotationUtil.vecPlayerToWorld(localDirection, gravity).normalize(); + Vec3 spawn = player.getEyePosition().add(direction.scale(0.45D)); + projectileSquid.moveTo(spawn.x, spawn.y, spawn.z, yaw, player.getXRot()); + projectileSquid.launchAsProjectile(player, direction.scale(AntarchySettings.squidzookaLaunchVelocity()).add(AntarchyGravityApi.deltaMovement(player))); level.addFreshEntity(projectileSquid); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/KingsTreeGridFeature.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/KingsTreeGridFeature.java index 2015399e..5d4c7dbd 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/KingsTreeGridFeature.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/KingsTreeGridFeature.java @@ -147,14 +147,42 @@ public final class KingsTreeGridFeature extends FeatureDFV{FG?6A!1f&Qg^xnHt6zM2cDN+&PX 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 P1qlKGItcN`3k3WRQ>Cxq literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/sounds/block/undertrial/undertrial_detect_player2.ogg b/common-1.21.1/src/main/resources/assets/antarchy/sounds/block/undertrial/undertrial_detect_player2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..81fe573ea9a81e6b0207bc4cd77f44b6882ff0b7 GIT binary patch literal 17717 zcmeIZXIzuP(>JxmH1%`D40Fe}cdoric&b z*qG>0i99&3y2)dkW+JBDQ50O?nwRI6{PIDT2};=AOvgz4NtOv!m92%2kz(Ggjrhf2 z8yjEkEmD&@ZTxZPVka}~&-&R9VZ88~7O(;U#-wu2Byil*1~4E80OVz2Y2U=sgjBNJ zjM@L9kT}T*0R2I%#+j_2T7*r%N}5jTS=&d?T(!493~`)0i~I`iY-hDXjB1`&UEm*} zcju%&cas9(Cy~uSY=DvMzsLi)im4=szTJ!pPJ8UB;w>?_`5;JeX45!8Vso=7cwFUD zVepVLswg<=zNf4=39l%a`LUBLJ&EtCpoFu%0x0~9&S7%9i>~E`8 ze5D3Skl@CqvA@&|2^v=+q5OT+anu9{S)A2eakzOaK!<|_X>!#>2J4*V{SUl<L>VotfX3b@m|=Q{yyzX!xt|yZMOMy?1qfRi~o(BBpw2BtTsjh zPyX{r5O~Vz`cb^5D3(^@Wo1Q@+-J!*qjDo>kDcZ>tvB*IPcXT4znft4LfH|4Tm@i9OU@?itz!XEi4XR2SXVE^N;&dC8MU`b+>HOC)`AH4-Tk{Ow6E?gr{3%P)I9tK=jr!P>y7_NCYgY3q zJN@eq^jF^MFXWidJuqK*V1KjK@n)Of+CKVpHDyn@O#R^~VbT$6(qSRjj&j5hQOrB4fJR|`(CIO(o)FsUYFc3sPoIw(L zlEnXKjF!Ji1a z1ppCGZaL)VdBpQLFW8&WeKNwDP5!g>6;T^%*_ZG1Qp81DY7%5OD>rV)#&N!#SF2@x z{FOw8%jB?0df>4zD69G`{v`(h`|bl1O@eJE{!0STm56~! z@jq>m8uBh6#s5@FYGw7gAb)}A|4}3Vc{ytnRPg_7OYDDYi`3BnOKttX(ck~Sj{h%H z07lY`02S#+S3a4+27(j;uy^+)=>UMo_^Sc{1PL2Yk#yr%1#5BuFrU&p^D_RA0)$i> zj0}LlXgta$Gjah4D*)5BRyb#rRt+Mx=;BjCwXY8I2J11E)d3`A$fGmla|O)FWULon zGXn`=Kt?&q!>2$jOV}KvU@dH1uo+%qG^IX)F=Ht~g; v+CPF5lgD58&EK}wSOd5 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 ANTIMETAL_PLACE = registerSoundEvent("antimetal_place"); public static final DeferredHolder ANTIMETAL_STEP = registerSoundEvent("antimetal_step"); public static final DeferredHolder ANTIMETAL_SCAFFOLD = registerSoundEvent("antimetal_scaffold"); + public static final DeferredHolder UNDERTRIAL_DETECT_PLAYER1 = registerSoundEvent("undertrial_detect_player1"); + public static final DeferredHolder UNDERTRIAL_DETECT_PLAYER2 = registerSoundEvent("undertrial_detect_player2"); public static final DeferredHolder KING_IDLE = registerSoundEvent("king_idle"); public static final DeferredHolder KING_WALK = registerSoundEvent("king_walk"); diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java index ce216847..ca44e19c 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java @@ -676,7 +676,7 @@ public final class AntarchyMobsConfig { KING_BEAM_TRACKING = b.defineInRange("kingBeamTracking", 0.1D, 0.0D, 1.0D); KING_BEAM_TERRAIN_RADIUS = b.defineInRange("kingBeamTerrainRadius", 5.0D, 0.0D, 32.0D); KING_BEAM_TERRAIN_CAP = b.defineInRange("kingBeamTerrainCap", 192, 0, 4096); - ROYAL_DECREE_COOLDOWN_TICKS = b.comment("Cooldown in ticks between the end of one King decree and the next.").defineInRange("royalDecreeCooldownTicks", 1200, 1, 72000); + ROYAL_DECREE_COOLDOWN_TICKS = b.comment("Cooldown in ticks between the end of one King decree and the next.").defineInRange("royalDecreeCooldownTicks", 700, 1, 72000); KING_ROYAL_MUSTER_COOLDOWN_TICKS = b.comment("Cooldown in ticks between King's command pulses.").defineInRange("kingRoyalMusterCooldownTicks", 500, 1, 72000); KING_ROYAL_MUSTER_WINDUP_TICKS = b.comment("Warning time before the King commands nearby hostile mobs.").defineInRange("kingRoyalMusterWindupTicks", 30, 0, 1200); KING_ROYAL_MUSTER_DURATION_TICKS = b.comment("Duration of Commanded applied by the King's muster.").defineInRange("kingRoyalMusterDurationTicks", 600, 1, 72000); diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java index 9dadc728..8e265d8d 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java @@ -213,6 +213,8 @@ public final class AntarchyNeoforgeSounds { public static final DeferredHolder ANTIMETAL_PLACE = registerSoundEvent("antimetal_place"); public static final DeferredHolder ANTIMETAL_STEP = registerSoundEvent("antimetal_step"); public static final DeferredHolder ANTIMETAL_SCAFFOLD = registerSoundEvent("antimetal_scaffold"); + public static final DeferredHolder UNDERTRIAL_DETECT_PLAYER1 = registerSoundEvent("undertrial_detect_player1"); + public static final DeferredHolder UNDERTRIAL_DETECT_PLAYER2 = registerSoundEvent("undertrial_detect_player2"); public static final DeferredHolder KING_IDLE = registerSoundEvent("king_idle"); public static final DeferredHolder KING_WALK = registerSoundEvent("king_walk");