diff --git a/build.gradle b/build.gradle index a4973bb6..46e8f0de 100644 --- a/build.gradle +++ b/build.gradle @@ -10,9 +10,6 @@ allprojects { group = rootProject.maven_group repositories { - // CurseForge Maven artifacts must be resolved from CurseMaven. The - // Fabric repository does not proxy these coordinates reliably and can - // prevent Gradle from reaching the working repository. maven { name = "CurseMaven" url = "https://www.cursemaven.com" @@ -63,13 +60,10 @@ allprojects { } -// Don't build the root project itself. tasks.named('jar') { enabled = false } -// Delegate forge-1.20.1 tasks to its own Gradle 8.8 wrapper. ForgeGradle 6 can't run -// on Gradle 9 and includeBuild can't mix Gradle versions, so we shell out instead. def forge1201Dir = file('forge-1.20.1') def forge1201Wrapper = providers.systemProperty('os.name').get().toLowerCase().contains('win') ? new File(forge1201Dir, 'gradlew.bat') @@ -84,10 +78,6 @@ def forge1201Wrapper = providers.systemProperty('os.name').get().toLowerCase().c } } -// Delegate fabric-1.20.1 tasks to its own standalone Gradle wrapper. Fabric Loom's -// build-wide tinyRemapperService isn't classloader-safe across two loom projects -// targeting different Minecraft versions in the same Gradle invocation, so -// fabric-1.20.1 can't be a normal included subproject alongside fabric-1.21.1. def fabric120Dir = file('fabric-1.20.1') def fabric120Wrapper = providers.systemProperty('os.name').get().toLowerCase().contains('win') ? new File(fabric120Dir, 'gradlew.bat') diff --git a/common-1.20.1/build.gradle b/common-1.20.1/build.gradle index 1edaf3bc..e6d5eb74 100644 --- a/common-1.20.1/build.gradle +++ b/common-1.20.1/build.gradle @@ -6,7 +6,6 @@ base { archivesName = "${mod_id}-common-1.20.1" } -// Source-only module — each loader module compiles these sources itself. tasks.named('compileJava').configure { enabled = false } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java index d8a8f572..794ac937 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java @@ -107,6 +107,9 @@ public final class AntarchySettings { private static int ultimateCrossbowEnchantability = 20; private static int ultimateMaceEnchantability = 20; private static boolean ultimateToolsThreeByThreeEnabled = true; + private static boolean ultimateToolsVeinMiningEnabled = true; + private static int ultimateToolsVeinMiningMaxBlocks = 64; + private static int ultimateToolsTreeFellingMaxLogs = 128; private static boolean ultimateArmorComesEnchanted = true; private static int ultimateHelmetArmorValue = 6; private static int ultimateChestplateArmorValue = 11; @@ -299,6 +302,7 @@ public final class AntarchySettings { private static double royalBossKnockbackResistance = 1.0D; private static double royalBossStepHeight = 3.0D; private static double royalBossMaxSingleHitDamage = 250.0D; + private static double royalBossHitOverflowRate = 0.25D; private static double royalBossBiteReach = 12.0D; private static double royalBossBiteDamageMultiplier = 1.6D; private static int royalBossBiteCooldownTicks = 45; @@ -974,6 +978,18 @@ public final class AntarchySettings { return ultimateToolsThreeByThreeEnabled; } + public static boolean ultimateToolsVeinMiningEnabled() { + return ultimateToolsVeinMiningEnabled; + } + + public static int ultimateToolsVeinMiningMaxBlocks() { + return ultimateToolsVeinMiningMaxBlocks; + } + + public static int ultimateToolsTreeFellingMaxLogs() { + return ultimateToolsTreeFellingMaxLogs; + } + public static boolean ultimateArmorComesEnchanted() { return ultimateArmorComesEnchanted; } @@ -1624,6 +1640,18 @@ public final class AntarchySettings { ultimateToolsThreeByThreeEnabled = value; } + public static void setUltimateToolsVeinMiningEnabled(boolean value) { + ultimateToolsVeinMiningEnabled = value; + } + + public static void setUltimateToolsVeinMiningMaxBlocks(int value) { + ultimateToolsVeinMiningMaxBlocks = value; + } + + public static void setUltimateToolsTreeFellingMaxLogs(int value) { + ultimateToolsTreeFellingMaxLogs = value; + } + public static void setUltimateArmorComesEnchanted(boolean value) { ultimateArmorComesEnchanted = value; } @@ -2229,6 +2257,9 @@ public final class AntarchySettings { public static double royalBossMaxSingleHitDamage() { return royalBossMaxSingleHitDamage; } public static void setRoyalBossMaxSingleHitDamage(double v) { royalBossMaxSingleHitDamage = v; } + public static double royalBossHitOverflowRate() { return royalBossHitOverflowRate; } + public static void setRoyalBossHitOverflowRate(double v) { royalBossHitOverflowRate = v; } + public static double royalBossBiteReach() { return royalBossBiteReach; } public static void setRoyalBossBiteReach(double v) { royalBossBiteReach = v; } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java index 4a54dc63..581c1828 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java @@ -11,6 +11,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.material.Fluid; public final class AntarchyTags { @@ -157,4 +158,11 @@ public final class AntarchyTags { private Biomes() { } } + + public static final class DimensionTypes { + public static final TagKey NO_MANTIS_CLIMB = TagKey.create(Registries.DIMENSION_TYPE, id("no_mantis_climb")); + + private DimensionTypes() { + } + } } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/MoonSkyTracker.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/MoonSkyTracker.java index 08df86a3..9b5cc52b 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/MoonSkyTracker.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/MoonSkyTracker.java @@ -17,7 +17,6 @@ public final class MoonSkyTracker { private static final long MAX_AGE_MILLIS = 1500L; private static final double AIM_COSINE = Math.cos(Math.toRadians(PortalGunMoonMath.AIM_TOLERANCE_DEGREES)); private static Vec3 direction; - // Weak so a dimension change or logout doesn't pin the old client world in memory. private static WeakReference level = new WeakReference<>(null); private static long recordedAt; private static Consumer sender = payload -> {}; diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunCrosshairRenderer.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunCrosshairRenderer.java index e568acf1..4d6acf31 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunCrosshairRenderer.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunCrosshairRenderer.java @@ -20,7 +20,6 @@ public final class PortalGunCrosshairRenderer { private static final int HALF_WIDTH = 17; private static final float MISSING_BRIGHTNESS = 0.3F; private static final float MISSING_ALPHA = 0.75F; - // Weak so a dimension change or logout doesn't pin the old client world in memory. private static WeakReference cachedLevel = new WeakReference<>(null); private static long cachedGameTime = Long.MIN_VALUE; private static UUID cachedGunId; diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunIndicatorClientState.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunIndicatorClientState.java index 956e7d91..f5923617 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunIndicatorClientState.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunIndicatorClientState.java @@ -12,7 +12,6 @@ import net.minecraft.client.multiplayer.ClientLevel; public final class PortalGunIndicatorClientState { private static final Map STATES = new HashMap<>(); - // Weak so a dimension change or logout doesn't pin the old client world in memory. private static WeakReference level = new WeakReference<>(null); private static long lastRequestTick = Long.MIN_VALUE; private static UUID lastRequestedGun; diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/model/RoyalMountModel.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/model/RoyalMountModel.java index e1ece6fc..c9366b81 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/model/RoyalMountModel.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/client/model/RoyalMountModel.java @@ -11,6 +11,12 @@ import software.bernie.geckolib.model.GeoModel; public class RoyalMountModel extends GeoModel { private static final String[] HEADS = {"head_left", "head", "head_right"}; + private static final String[] RIDDEN_NECK_CHAIN = { + "neck", "neck2", "neck3", "head", + "neck_left", "neck_left2", "neck_left3", "head_left", + "neck_right", "neck_right2", "neck_right3", "head_right" + }; + private static final float RIDDEN_NECK_RAISE = 0.35F; @Override public ResourceLocation getModelResource(RoyalMountEntity animatable) { @@ -31,6 +37,11 @@ public class RoyalMountModel extends GeoModel { public void setCustomAnimations(RoyalMountEntity animatable, long instanceId, AnimationState animationState) { super.setCustomAnimations(animatable, instanceId, animationState); + if (animatable.isVehicle()) { + for (String name : RIDDEN_NECK_CHAIN) { + this.getBone(name).ifPresent(bone -> bone.setRotX(bone.getRotX() * RIDDEN_NECK_RAISE)); + } + } for (String head : HEADS) { this.getBone(head).ifPresent(bone -> bone.setTrackingMatrices(true)); } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodglassWardEffect.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodglassWardEffect.java index e56947b7..9c049b83 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodglassWardEffect.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodglassWardEffect.java @@ -21,6 +21,7 @@ public final class BloodglassWardEffect extends MobEffect { public void addAttributeModifiers(net.minecraft.world.entity.LivingEntity livingEntity, AttributeMap attributeMap, int amplifier) { AttributeInstance instance = attributeMap.getInstance(AntarchyObjects.BLOODGLASS_MAX_HEARTS.get()); if (instance == null) return; + instance.removeModifier(MODIFIER_ID); instance.addTransientModifier( new AttributeModifier(MODIFIER_ID, "bloodglass_ward_hearts", amplifier + 1, AttributeModifier.Operation.ADDITION) ); diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java index f5901571..d5e47af1 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java @@ -392,6 +392,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl if (this.isKnockedDown()) { this.tickKnockedDown(); } else if (this.isLeashed()) { + if (this.chargeTicksRemaining > 0 || this.isChargeAnimationActive()) { + this.endChargeState(); + } this.getNavigation().stop(); this.setTarget(null); this.updateAmbientAnimation(); @@ -484,6 +487,10 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl } private void tickCharge() { + if (this.chargeTicksRemaining <= 0) { + this.endChargeState(); + return; + } if (this.getAnimationState() != ANIM_CHARGE) { this.setAnimationState(ANIM_CHARGE); } @@ -910,6 +917,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl if (!this.isFlying() && !mountedCharge) { this.pendingChargeStart = true; this.requestFlightStart(); + if (this.getAnimationState() != ANIM_OPEN_WINGS) { + this.pendingChargeStart = false; + } return; } this.beginChargeStart(this.chargeDirection, this.pendingChargeDuration, mountedCharge); @@ -979,13 +989,23 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl serverLevel.sendParticles(ParticleTypes.CRIT, this.getX(), this.getY() + 0.8D, this.getZ(), 20, 2.0D, 0.6D, 2.0D, 0.08D); this.broadcastImpactShake(serverLevel); - if (this.onGround()) { + this.endChargeState(); + } + + private void endChargeState() { + this.chargeTicksRemaining = 0; + this.groundedMountedCharge = false; + this.noPhysics = false; + this.setAnimationState(this.isFlying() ? ANIM_FLY : ANIM_IDLE); + if (!this.isVehicle() && this.isFlying() && this.hasGroundBelow()) { this.requestFlightStop(); - } else { - this.updateAmbientAnimation(); } } + private boolean hasGroundBelow() { + return !this.level().noCollision(this, this.getBoundingBox().move(this.toWorld(0.0D, -0.2D, 0.0D))); + } + private void breakBlocksForChargeImpact(ServerLevel level) { if (!this.isHerculesBeetleGriefingEnabled(level)) { return; @@ -1424,6 +1444,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl this.chargeCooldown = tag.getInt("ChargeCooldown"); this.attackCooldown = tag.getInt("AttackCooldown"); this.combatCryDone = tag.getBoolean("CombatCryDone"); + if (this.isChargeAnimationActive()) { + this.setAnimationState(this.isFlying() ? ANIM_FLY : ANIM_IDLE); + } if (this.isKnockedDown() && this.getAnimationState() != ANIM_KNOCKED_DOWN_IDLE) { this.setAnimationState(ANIM_KNOCKED_DOWN_IDLE); } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java index 503cf1d3..a4d65466 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java @@ -40,6 +40,8 @@ import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.Level; @@ -85,7 +87,7 @@ public class BrutalflyEntity extends Monster implements GeoEntity { private static final int SPIT_WINDUP_TICKS = 16; private static final int SWIPE_TICKS = 18; private static final float SWIPE_KNOCKBACK = 2.8F; - private static final int COCOON_HIT_THRESHOLD = 3; + private static final int COCOON_HIT_THRESHOLD = 5; private static final int COCOON_HIT_COOLDOWN_TICKS = 60; private static final int COCOON_HIT_ANIM_TICKS = 30; private static final int COCOON_HATCH_ANIM_TICKS = 40; @@ -337,6 +339,12 @@ public class BrutalflyEntity extends Monster implements GeoEntity { if (nearbyPlayer != null && !nearbyPlayer.isCreative() && !nearbyPlayer.isSpectator()) { this.setTarget(nearbyPlayer); } + this.spitCooldown = 0; + } + + public float getDamageScale() { + double base = AntarchySettings.brutalflySwipeDamage(); + return base <= 0.0D ? 1.0F : (float) (this.getAttributeValue(Attributes.ATTACK_DAMAGE) / base); } public boolean isCocooned() { @@ -514,6 +522,11 @@ public class BrutalflyEntity extends Monster implements GeoEntity { this.playSound(AntarchySoundEvents.BRUTALFLY_SPIT.get(), 1.0F, 0.9F + this.random.nextFloat() * 0.2F); switch (this.getFightPhase()) { case PHASE_THREE -> { + this.launchOrb(serverLevel, origin, target, BrutalflyOrbEntity.OrbVariant.POISON, -14.0F); + this.launchOrb(serverLevel, origin, target, BrutalflyOrbEntity.OrbVariant.STICKY, 0.0F); + this.launchOrb(serverLevel, origin, target, BrutalflyOrbEntity.OrbVariant.POISON, 14.0F); + } + case PHASE_TWO -> { this.launchOrb(serverLevel, origin, target, BrutalflyOrbEntity.OrbVariant.POISON, -8.0F); this.launchOrb(serverLevel, origin, target, BrutalflyOrbEntity.OrbVariant.STICKY, 8.0F); } @@ -586,7 +599,8 @@ public class BrutalflyEntity extends Monster implements GeoEntity { } private void performSwipeHit() { - float swipeDamage = (float) AntarchySettings.brutalflySwipeDamage(); + float swipeDamage = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); + boolean finalPhase = this.getFightPhase() == FightPhase.PHASE_THREE; AABB attackBox = this.getBoundingBox().inflate(4.8D, 2.4D, 4.8D).expandTowards(0.0D, -2.5D, 0.0D); for (LivingEntity target : this.level().getEntitiesOfClass( LivingEntity.class, @@ -598,6 +612,9 @@ public class BrutalflyEntity extends Monster implements GeoEntity { } target.hurt(this.damageSources().mobAttack(this), swipeDamage); + if (finalPhase) { + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 1, false, true)); + } double dx = target.getX() - this.getX(); double dz = target.getZ() - this.getZ(); diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyOrbEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyOrbEntity.java index 13e133c5..5ec942ec 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyOrbEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyOrbEntity.java @@ -162,6 +162,9 @@ public class BrutalflyOrbEntity extends ThrowableItemProjectile { if (!this.level().isClientSide && result.getEntity() instanceof LivingEntity livingTarget) { float directHitDamage = (float) AntarchySettings.brutalflySpitDamage(); Entity owner = this.getOwner(); + if (owner instanceof BrutalflyEntity brutalfly) { + directHitDamage *= brutalfly.getDamageScale(); + } if (owner instanceof LivingEntity livingOwner) { livingTarget.hurt(this.damageSources().mobProjectile(this, livingOwner), directHitDamage); } else { diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/PrinceEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/PrinceEntity.java index cb671845..78813207 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/PrinceEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/PrinceEntity.java @@ -3,13 +3,31 @@ package com.craisinlord.antarchy.content.entity.royal; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.AntarchyObjects; import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.effect.RoyalEffectEligibility; +import com.craisinlord.antarchy.content.effect.RoyalEffectHooks; import com.craisinlord.antarchy.content.entity.royal.beam.RoyalBeamElement; +import java.util.Comparator; +import java.util.List; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.monster.Enemy; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; public class PrinceEntity extends RoyalMountEntity { + private static final DustParticleOptions COMMAND_DUST = new DustParticleOptions(new Vector3f(1.0F, 0.75F, 0.15F), 1.6F); + public PrinceEntity(EntityType entityType, Level level) { super(entityType, level); } @@ -40,6 +58,117 @@ public class PrinceEntity extends RoyalMountEntity { }; } + @Override + protected ParticleOptions beamWindupParticle() { + return switch (this.getBeamElement()) { + case FIRE -> ParticleTypes.FLAME; + case ICE -> ParticleTypes.SNOWFLAKE; + default -> ParticleTypes.ELECTRIC_SPARK; + }; + } + + @Override + protected float beamBaseDamage() { + return 12.0F; + } + + @Override + public boolean prefersAerialCombat() { + return false; + } + + @Override + public double preferredCombatRange() { + return 0.0D; + } + + @Override + protected float biteWeight() { + return 3.0F; + } + + @Override + protected float spitWeight() { + return 1.0F; + } + + @Override + protected float beamWeight() { + return 1.2F; + } + + @Override + protected float signatureWeight() { + return 4.0F; + } + + @Override + protected int signatureCooldownTicks() { + return 360; + } + + private double commandRadius() { + return 14.0D + 2.0D * this.getGrowthScale(); + } + + private int commandLimit() { + return 3 + Mth.floor(this.getGrowthScale()); + } + + private List commandCandidates(Vec3 center) { + double radius = this.commandRadius(); + return this.level().getEntitiesOfClass(Mob.class, this.getBoundingBox().inflate(radius), mob -> + mob != this && mob.isAlive() && mob instanceof Enemy && !mob.isAlliedTo(this) + && !(mob instanceof RoyalBossEntity) && RoyalEffectEligibility.canApplyCommanded(mob) + && RoyalEffectHooks.commandedHolder() != null + && !mob.hasEffect(RoyalEffectHooks.commandedHolder()) + && mob.distanceToSqr(center) <= radius * radius); + } + + @Override + protected boolean isSignatureUseful(LivingEntity target) { + return RoyalEffectHooks.commandedHolder() != null && this.commandCandidates(this.position()).size() >= 2; + } + + @Override + protected void signatureTelegraph(ServerLevel level, int tick, @Nullable LivingEntity target, @Nullable Vec3 aimPoint) { + if (tick % 3 != 0) { + return; + } + double radius = (this.getBbWidth() * 0.5D + 1.0D) + tick * 0.25D * this.getGrowthScale(); + for (int i = 0; i < 16; i++) { + double angle = i * Mth.TWO_PI / 16.0D + tick * 0.1D; + level.sendParticles(COMMAND_DUST, this.getX() + Math.cos(angle) * radius, this.getY() + 0.3D, + this.getZ() + Math.sin(angle) * radius, 1, 0.0D, 0.05D, 0.0D, 0.0D); + } + if (tick == 3) { + level.sendParticles(ParticleTypes.ENCHANTED_HIT, this.getX(), this.getY() + this.getBbHeight(), this.getZ(), + 20, this.getBbWidth() * 0.3D, 0.3D, this.getBbWidth() * 0.3D, 0.1D); + } + } + + @Override + protected boolean performSignature(ServerLevel level, @Nullable LivingEntity target, @Nullable Vec3 aimPoint, boolean ridden) { + if (RoyalEffectHooks.commandedHolder() == null) { + return false; + } + Vec3 center = this.position(); + List candidates = this.commandCandidates(center); + candidates.sort(Comparator.comparingDouble(mob -> mob.distanceToSqr(center))); + int applied = 0; + for (Mob mob : candidates) { + if (applied >= this.commandLimit()) { + break; + } + if (mob.addEffect(new MobEffectInstance(RoyalEffectHooks.commandedHolder(), 300 + 20 * Mth.floor(this.getGrowthScale())), this)) { + applied++; + level.sendParticles(COMMAND_DUST, mob.getX(), mob.getY() + mob.getBbHeight() + 0.3D, mob.getZ(), 8, 0.25D, 0.2D, 0.25D, 0.0D); + } + } + level.sendParticles(ParticleTypes.SONIC_BOOM, this.getX(), this.getY() + this.getBbHeight() * 0.6D, this.getZ(), 1, 0.0D, 0.0D, 0.0D, 0.0D); + return applied > 0; + } + @Override protected String geoName() { return "prince"; diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/PrincessEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/PrincessEntity.java index af6e829d..ef9f3088 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/PrincessEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/PrincessEntity.java @@ -4,10 +4,18 @@ import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.AntarchyObjects; import com.craisinlord.antarchy.content.AntarchySoundEvents; import com.craisinlord.antarchy.content.entity.royal.beam.RoyalBeamElement; +import com.craisinlord.anthology.time.TimeDilationApi; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; public class PrincessEntity extends RoyalMountEntity { public PrincessEntity(EntityType entityType, Level level) { @@ -24,11 +32,120 @@ public class PrincessEntity extends RoyalMountEntity { @Override protected RoyalBeamElement boltElement(int lateralIndex) { - return switch (lateralIndex) { - case -1 -> RoyalBeamElement.FIRE; - case 1 -> RoyalBeamElement.ICE; - default -> RoyalBeamElement.LIGHTNING; - }; + return RoyalBeamElement.GENERIC; + } + + @Override + protected Vec3 boltOrigin(int lateralIndex) { + float scale = this.getGrowthScale(); + Vec3 forward = Vec3.directionFromRotation(0.0F, this.getYRot()); + Vec3 side = new Vec3(-forward.z, 0.0D, forward.x); + return this.position() + .add(0.0D, (lateralIndex == 0 ? 0.4D : 0.33D) * scale, 0.0D) + .add(forward.scale((lateralIndex == 0 ? 0.32D : 0.23D) * scale + this.getBbWidth() * 0.15D)) + .add(side.scale(lateralIndex * 0.24D * scale)); + } + + @Override + protected int nextBeamHead(int previous) { + return 1; + } + + @Override + protected ParticleOptions beamWindupParticle() { + return ParticleTypes.REVERSE_PORTAL; + } + + @Override + protected float beamBaseDamage() { + return 10.0F; + } + + @Override + public boolean prefersAerialCombat() { + return this.canFly(); + } + + @Override + public double preferredCombatRange() { + return 8.0D + 1.5D * this.getGrowthScale(); + } + + @Override + protected float biteWeight() { + return 1.0F; + } + + @Override + protected float spitWeight() { + return 2.5F; + } + + @Override + protected float beamWeight() { + return 1.6F; + } + + @Override + protected float signatureWeight() { + return 2.5F; + } + + @Override + protected int signatureCooldownTicks() { + return 300; + } + + private double fieldRadius() { + return 5.0D + 0.8D * this.getGrowthScale(); + } + + private boolean ownerInside(Vec3 center) { + LivingEntity owner = this.getOwner(); + if (owner == null || owner.level() != this.level() || this.hasPassenger(owner)) { + return false; + } + double clearance = this.fieldRadius() + 1.5D; + return owner.position().distanceToSqr(center) < clearance * clearance; + } + + @Override + protected boolean isSignatureUseful(LivingEntity target) { + return this.combatGap(target) < 10.0D + 1.5D * this.getGrowthScale() && !this.ownerInside(target.position()); + } + + private Vec3 fieldCenter(@Nullable LivingEntity target, @Nullable Vec3 aimPoint) { + if (target != null && target.isAlive()) { + return target.position(); + } + return aimPoint != null ? aimPoint : this.position().add(Vec3.directionFromRotation(0.0F, this.getYRot()).scale(this.getBbWidth() + 6.0D)); + } + + @Override + protected void signatureTelegraph(ServerLevel level, int tick, @Nullable LivingEntity target, @Nullable Vec3 aimPoint) { + if (tick % 2 != 0) { + return; + } + Vec3 center = this.fieldCenter(target, aimPoint); + double radius = this.fieldRadius() * (1.0D - tick / 24.0D) + 0.5D; + for (int i = 0; i < 12; i++) { + double angle = i * Mth.TWO_PI / 12.0D - tick * 0.15D; + level.sendParticles(ParticleTypes.REVERSE_PORTAL, center.x + Math.cos(angle) * radius, center.y + 0.2D, + center.z + Math.sin(angle) * radius, 1, 0.0D, 0.05D, 0.0D, 0.0D); + } + Vec3 orb = this.boltOrigin(0); + level.sendParticles(ParticleTypes.END_ROD, orb.x, orb.y, orb.z, 2, 0.1D, 0.1D, 0.1D, 0.01D); + } + + @Override + protected boolean performSignature(ServerLevel level, @Nullable LivingEntity target, @Nullable Vec3 aimPoint, boolean ridden) { + Vec3 center = this.fieldCenter(target, aimPoint); + if (this.ownerInside(center)) { + return false; + } + TimeDilationApi.createField(level, center, this.fieldRadius(), 0.35D, 100 + 10 * Mth.floor(this.getGrowthScale()), this.getUUID()); + level.sendParticles(ParticleTypes.END_ROD, center.x, center.y + 0.5D, center.z, 36, this.fieldRadius() * 0.3D, 0.6D, this.fieldRadius() * 0.3D, 0.03D); + return true; } @Override diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBoltEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBoltEntity.java index 33a6e5d8..10665df2 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBoltEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBoltEntity.java @@ -86,6 +86,14 @@ public class RoyalBoltEntity extends AbstractHurtingProjectile { }; } + @Override + protected boolean canHitEntity(Entity target) { + if (this.getOwner() instanceof RoyalMountEntity mount && mount.isFriendlyTo(target)) { + return false; + } + return super.canHitEntity(target); + } + @Override protected void onHitEntity(EntityHitResult result) { super.onHitEntity(result); @@ -101,7 +109,13 @@ public class RoyalBoltEntity extends AbstractHurtingProjectile { && royal.isTame() && other.isTame()) { return; } + if (owner instanceof RoyalMountEntity mount && mount.isFriendlyTo(target)) { + return; + } float damage = (float) AntarchySettings.royalBoltDamage(); + if (owner instanceof RoyalMountEntity mount) { + damage *= mount.projectileDamageMultiplier(); + } target.hurt(this.damageSources().mobProjectile(this, owner instanceof LivingEntity le ? le : null), damage); if (target instanceof LivingEntity living) { living.knockback(0.35D, this.getX() - target.getX(), this.getZ() - target.getZ()); @@ -125,6 +139,9 @@ public class RoyalBoltEntity extends AbstractHurtingProjectile { } } case GENERIC -> { + if (owner instanceof PrincessEntity) { + living.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 1), owner); + } } } } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBossEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBossEntity.java index 5545692a..bed01511 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBossEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBossEntity.java @@ -2006,7 +2006,8 @@ public abstract class RoyalBossEntity extends Monster implements GeoEntity, Mult if (source.is(DamageTypes.GENERIC_KILL)) { return super.hurt(source, amount); } - float cappedAmount = (float) Math.min(amount, AntarchySettings.royalBossMaxSingleHitDamage()); + float cap = (float) AntarchySettings.royalBossMaxSingleHitDamage(); + float cappedAmount = amount <= cap ? amount : cap + (amount - cap) * (float) AntarchySettings.royalBossHitOverflowRate(); return super.hurt(source, cappedAmount); } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountCombatGoal.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountCombatGoal.java new file mode 100644 index 00000000..dfa6df54 --- /dev/null +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountCombatGoal.java @@ -0,0 +1,239 @@ +package com.craisinlord.antarchy.content.entity.royal; + +import java.util.EnumSet; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.phys.Vec3; + +public class RoyalMountCombatGoal extends Goal { + private static final int FLIGHT_DECISION_INTERVAL = 40; + + private final RoyalMountEntity mount; + private LivingEntity target; + private int repathTicks; + private int flightDecisionTicks; + private boolean wantsFlight; + private int stuckTicks; + private Vec3 lastCheckPosition = Vec3.ZERO; + private float orbitAngle; + private int orbitDirection = 1; + private int diveTicks; + private int unseenTicks; + + public RoyalMountCombatGoal(RoyalMountEntity mount) { + this.mount = mount; + this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); + } + + @Override + public boolean canUse() { + LivingEntity candidate = this.mount.getTarget(); + if (!this.isValid(candidate)) { + return false; + } + this.target = candidate; + return true; + } + + @Override + public boolean canContinueToUse() { + LivingEntity current = this.mount.getTarget(); + if (current != this.target || !this.isValid(current)) { + return false; + } + double range = this.mount.getAttributeValue(net.minecraft.world.entity.ai.attributes.Attributes.FOLLOW_RANGE) * 1.2D; + return this.mount.distanceToSqr(current) < range * range && this.unseenTicks < 200; + } + + private boolean isValid(LivingEntity candidate) { + return candidate != null && candidate.isAlive() && !this.mount.isVehicle() && !this.mount.isOrderedToSit() + && candidate.level() == this.mount.level() && this.mount.canAttack(candidate); + } + + @Override + public void start() { + this.repathTicks = 0; + this.flightDecisionTicks = 0; + this.wantsFlight = false; + this.stuckTicks = 0; + this.unseenTicks = 0; + this.diveTicks = 0; + this.lastCheckPosition = this.mount.position(); + Vec3 offset = this.mount.position().subtract(this.target.position()); + this.orbitAngle = (float) Mth.atan2(offset.z, offset.x); + this.orbitDirection = this.mount.getRandom().nextBoolean() ? 1 : -1; + } + + @Override + public void stop() { + this.target = null; + this.mount.getNavigation().stop(); + } + + @Override + public boolean requiresUpdateEveryTick() { + return true; + } + + @Override + public void tick() { + LivingEntity current = this.target; + if (current == null) { + return; + } + boolean canSee = this.mount.getSensing().hasLineOfSight(current); + this.unseenTicks = canSee ? 0 : this.unseenTicks + 1; + double gap = this.mount.combatGap(current); + this.mount.getLookControl().setLookAt(current, 30.0F, 30.0F); + this.trackStuck(); + this.updateFlightDecision(current, gap); + + if (this.mount.isActing()) { + this.holdDuringAction(current); + return; + } + + int chosen = this.mount.chooseCombatAction(current, gap, canSee); + if (chosen != RoyalMountEntity.ACTION_NONE && this.isFacing(current, this.facingTolerance(chosen))) { + if (this.mount.startAction(chosen, current, current.getEyePosition(), false)) { + this.diveTicks = 0; + this.holdDuringAction(current); + return; + } + } + if (chosen != RoyalMountEntity.ACTION_NONE) { + this.mount.turnTowards(current.position(), 18.0F); + } + + if (this.mount.isFlying()) { + this.tickAerial(current, gap); + } else { + this.tickGround(current, gap, canSee); + } + } + + private float facingTolerance(int action) { + return switch (action) { + case RoyalMountEntity.ACTION_BITE -> 50.0F; + case RoyalMountEntity.ACTION_SIGNATURE -> 180.0F; + default -> 120.0F; + }; + } + + private boolean isFacing(LivingEntity current, float tolerance) { + Vec3 toTarget = current.position().subtract(this.mount.position()); + float desired = (float) (Mth.atan2(toTarget.z, toTarget.x) * Mth.RAD_TO_DEG) - 90.0F; + return Math.abs(Mth.wrapDegrees(desired - this.mount.getYRot())) <= tolerance; + } + + private void holdDuringAction(LivingEntity current) { + this.mount.getNavigation().stop(); + if (this.mount.isFlying()) { + this.mount.claimFlight(); + if (this.mount.currentAction() == RoyalMountEntity.ACTION_BITE) { + this.mount.getMoveControl().setWantedPosition(current.getX(), current.getY() + current.getBbHeight() * 0.5D, current.getZ(), 0.6D); + } else { + this.mount.getMoveControl().setWantedPosition(this.mount.getX(), this.mount.getY(), this.mount.getZ(), 0.4D); + } + } else if (this.mount.currentAction() != RoyalMountEntity.ACTION_BITE) { + this.mount.setDeltaMovement(this.mount.getDeltaMovement().multiply(0.5D, 1.0D, 0.5D)); + } + } + + private void trackStuck() { + if (this.mount.tickCount % 20 != 0) { + return; + } + Vec3 position = this.mount.position(); + boolean trying = !this.mount.getNavigation().isDone() || this.mount.isFlying(); + if (trying && position.distanceToSqr(this.lastCheckPosition) < 1.0D) { + this.stuckTicks += 20; + } else { + this.stuckTicks = 0; + } + this.lastCheckPosition = position; + } + + private void updateFlightDecision(LivingEntity current, double gap) { + if (!this.mount.canFly()) { + this.wantsFlight = false; + return; + } + if (--this.flightDecisionTicks <= 0 || this.stuckTicks >= 40) { + this.flightDecisionTicks = FLIGHT_DECISION_INTERVAL; + boolean targetAbove = current.getY() - this.mount.getY() > 4.0D + this.mount.getBbHeight() * 0.25D; + boolean targetAirborne = !current.onGround() && !current.isInWater() && RoyalMountEntity.isAirborne(current) || targetAbove; + boolean groundBlocked = !this.mount.isFlying() && (this.stuckTicks >= 40 + || this.mount.getNavigation().isDone() && gap > 4.0D && this.mount.getNavigation().createPath(current, 0) == null); + boolean prefersAir = this.mount.prefersAerialCombat() && gap > 3.0D; + this.wantsFlight = targetAirborne || groundBlocked || prefersAir || (this.mount.isFlying() && this.diveTicks > 0); + if (this.stuckTicks >= 40) { + this.stuckTicks = 0; + } + } + if (this.wantsFlight) { + this.mount.claimFlight(); + } + } + + private void tickAerial(LivingEntity current, double gap) { + if (!this.wantsFlight) { + return; + } + this.mount.claimFlight(); + float scale = this.mount.getGrowthScale(); + boolean wantsBite = this.mount.isActionAvailable(RoyalMountEntity.ACTION_BITE) + && (!this.mount.prefersAerialCombat() || gap < this.mount.preferredCombatRange() * 0.5D || this.diveTicks > 0); + if (wantsBite && this.mount.isActionReady()) { + this.diveTicks++; + Vec3 approach = current.position().subtract(this.mount.position()).multiply(1.0D, 0.0D, 1.0D); + Vec3 offset = approach.lengthSqr() > 1.0E-4D ? approach.normalize().scale(-(this.mount.getBbWidth() * 0.5D + 0.6D * scale)) : Vec3.ZERO; + this.mount.getMoveControl().setWantedPosition(current.getX() + offset.x, current.getY() + 0.2D, current.getZ() + offset.z, 1.4D); + if (this.diveTicks > 80) { + this.diveTicks = 0; + this.orbitDirection = -this.orbitDirection; + } + return; + } + this.diveTicks = 0; + double radius = Math.max(6.0D + 1.5D * scale, this.mount.preferredCombatRange()) + this.mount.getBbWidth() * 0.5D; + this.orbitAngle += this.orbitDirection * (float) Math.min(0.08D, 1.2D / radius); + double x = current.getX() + Math.cos(this.orbitAngle) * radius; + double z = current.getZ() + Math.sin(this.orbitAngle) * radius; + double y = current.getY() + 3.0D + 0.8D * scale; + if (!this.mount.canOccupy(x, y, z)) { + this.orbitDirection = -this.orbitDirection; + y += 2.0D + scale; + } + this.mount.getMoveControl().setWantedPosition(x, y, z, 1.1D); + } + + private void tickGround(LivingEntity current, double gap, boolean canSee) { + double preferred = this.mount.preferredCombatRange(); + boolean ranged = preferred > 0.0D && this.mount.canSpit(); + if (ranged && canSee && gap < preferred * 0.5D && !this.mount.isActionAvailable(RoyalMountEntity.ACTION_BITE)) { + Vec3 away = this.mount.position().subtract(current.position()).multiply(1.0D, 0.0D, 1.0D); + if (away.lengthSqr() > 1.0E-4D && --this.repathTicks <= 0) { + this.repathTicks = 10; + Vec3 destination = this.mount.position().add(away.normalize().scale(4.0D + this.mount.getBbWidth() * 0.5D)); + this.mount.getNavigation().moveTo(destination.x, destination.y, destination.z, 1.2D); + } + return; + } + if (ranged && canSee && gap <= preferred && gap >= preferred * 0.5D && !this.mount.isActionAvailable(RoyalMountEntity.ACTION_BITE)) { + this.mount.getNavigation().stop(); + this.mount.turnTowards(current.position(), 12.0F); + return; + } + if (this.mount.canBiteReach(current)) { + this.mount.getNavigation().stop(); + this.mount.turnTowards(current.position(), 18.0F); + return; + } + if (--this.repathTicks <= 0) { + this.repathTicks = 6 + this.mount.getRandom().nextInt(6); + this.mount.getNavigation().moveTo(current, 1.2D); + } + } +} diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountCompanionGoal.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountCompanionGoal.java new file mode 100644 index 00000000..d715ac1a --- /dev/null +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountCompanionGoal.java @@ -0,0 +1,175 @@ +package com.craisinlord.antarchy.content.entity.royal; + +import java.util.EnumSet; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.phys.Vec3; + +public class RoyalMountCompanionGoal extends Goal { + private static final double MAX_OWNER_DISTANCE = 40.0D; + + private final RoyalMountEntity mount; + private LivingEntity owner; + private int side = 1; + private float orbitAngle; + private int repathTicks; + private int settledTicks; + private int cooldown; + private Vec3 spot; + + public RoyalMountCompanionGoal(RoyalMountEntity mount) { + this.mount = mount; + this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); + } + + private boolean isEligible(LivingEntity candidate) { + return candidate != null && candidate.isAlive() && !candidate.isSpectator() + && candidate.level() == this.mount.level() + && this.mount.isTame() && !this.mount.isVehicle() && !this.mount.isOrderedToSit() + && !this.mount.isLeashed() && this.mount.getTarget() == null && !this.mount.isActing() + && this.mount.distanceToSqr(candidate) < MAX_OWNER_DISTANCE * MAX_OWNER_DISTANCE; + } + + private double settleDistance() { + return 4.0D + this.mount.getBbWidth() * 0.6D; + } + + private boolean needsToReposition(LivingEntity candidate) { + if (this.mount.canFly() && RoyalMountEntity.isAirborne(candidate)) { + return true; + } + if (this.mount.isFlying()) { + return true; + } + double settle = this.settleDistance() + 2.0D; + return this.mount.distanceToSqr(candidate) > settle * settle; + } + + @Override + public boolean canUse() { + if (this.cooldown > 0) { + this.cooldown--; + return false; + } + LivingEntity candidate = this.mount.getOwner(); + if (!this.isEligible(candidate) || !this.needsToReposition(candidate)) { + return false; + } + this.owner = candidate; + return true; + } + + @Override + public boolean canContinueToUse() { + return this.isEligible(this.owner) && this.owner == this.mount.getOwner() && this.settledTicks < 40; + } + + @Override + public void start() { + this.side = this.mount.getRandom().nextBoolean() ? 1 : -1; + this.repathTicks = 0; + this.settledTicks = 0; + this.spot = null; + Vec3 offset = this.mount.position().subtract(this.owner.position()); + this.orbitAngle = (float) Mth.atan2(offset.z, offset.x); + } + + @Override + public void stop() { + this.owner = null; + this.spot = null; + this.cooldown = 20; + this.mount.getNavigation().stop(); + } + + @Override + public boolean requiresUpdateEveryTick() { + return true; + } + + @Override + public void tick() { + float scale = this.mount.getGrowthScale(); + if (this.mount.canFly() && RoyalMountEntity.isAirborne(this.owner)) { + this.settledTicks = 0; + this.spot = null; + this.mount.claimFlight(); + this.circleOwner(scale); + return; + } + + if (--this.repathTicks <= 0 || this.spot == null) { + this.repathTicks = 20; + this.spot = this.pickSpotBesideOwner(); + } + + if (this.mount.isFlying()) { + this.settledTicks = 0; + this.mount.getLookControl().setLookAt(this.owner, 10.0F, this.mount.getMaxHeadXRot()); + if (this.mount.onGround() || this.mount.isInWater()) { + this.mount.setFlying(false); + return; + } + this.mount.claimFlight(); + Vec3 target = this.spot != null ? this.spot : this.owner.position(); + double horizontal = Math.sqrt(Mth.square(target.x - this.mount.getX()) + Mth.square(target.z - this.mount.getZ())); + double y = horizontal > 3.0D + scale ? Math.max(target.y + 1.5D * scale, this.mount.getY() - 2.0D) : target.y - 0.5D; + this.mount.getMoveControl().setWantedPosition(target.x, y, target.z, 1.0D); + return; + } + + double settle = this.settleDistance(); + boolean nearOwner = this.mount.distanceToSqr(this.owner) <= settle * settle; + boolean nearSpot = this.spot != null && this.mount.position().distanceToSqr(this.spot) <= Mth.square(1.5D + 0.5D * scale); + if (nearOwner || nearSpot) { + this.mount.getNavigation().stop(); + if (this.settledTicks == 0) { + this.mount.turnTowards(this.mount.position().add(this.owner.getLookAngle().multiply(1.0D, 0.0D, 1.0D)), 30.0F); + if (this.mount.getRandom().nextInt(4) == 0) { + this.mount.triggerQuirk(); + } + } + this.mount.getLookControl().setLookAt(this.owner, 10.0F, this.mount.getMaxHeadXRot()); + this.settledTicks++; + return; + } + this.settledTicks = 0; + this.mount.getLookControl().setLookAt(this.owner, 10.0F, this.mount.getMaxHeadXRot()); + if (this.repathTicks == 20) { + Vec3 destination = this.spot != null ? this.spot : this.owner.position(); + if (!this.mount.getNavigation().moveTo(destination.x, destination.y, destination.z, 1.0D)) { + this.mount.getNavigation().moveTo(this.owner, 1.0D); + } + } + } + + private void circleOwner(float scale) { + double radius = 5.0D + this.mount.getBbWidth() * 0.75D; + this.orbitAngle += this.side * (float) Math.min(0.07D, 1.0D / radius); + double x = this.owner.getX() + Math.cos(this.orbitAngle) * radius; + double z = this.owner.getZ() + Math.sin(this.orbitAngle) * radius; + double y = this.owner.getY() + 2.0D + 0.6D * scale; + if (!this.mount.canOccupy(x, y, z)) { + y += 2.0D + scale; + } + this.mount.getMoveControl().setWantedPosition(x, y, z, 1.2D); + this.mount.getLookControl().setLookAt(this.owner, 10.0F, this.mount.getMaxHeadXRot()); + } + + private Vec3 pickSpotBesideOwner() { + Vec3 facing = Vec3.directionFromRotation(0.0F, this.owner.getYRot()); + Vec3 right = new Vec3(-facing.z, 0.0D, facing.x); + double distance = this.mount.getBbWidth() * 0.5D + 1.5D; + for (int attempt = 0; attempt < 2; attempt++) { + int currentSide = attempt == 0 ? this.side : -this.side; + Vec3 base = this.owner.position().add(right.scale(currentSide * distance)); + double ground = this.mount.findGroundY(base.x, this.owner.getY() + 3.0D, base.z, 10); + if (!Double.isNaN(ground) && this.mount.canOccupy(base.x, ground, base.z)) { + this.side = currentSide; + return new Vec3(base.x, ground, base.z); + } + } + return null; + } +} diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountEntity.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountEntity.java index 6cf4f91b..612285f2 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountEntity.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountEntity.java @@ -1,21 +1,20 @@ package com.craisinlord.antarchy.content.entity.royal; -import com.craisinlord.antarchy.config.AntarchySettings; -import com.craisinlord.antarchy.content.AntarchySoundEvents; import com.craisinlord.antarchy.content.AntarchyTags; import com.craisinlord.antarchy.content.entity.royal.beam.RoyalBeamElement; import com.craisinlord.anthology.beam.BeamController; +import com.craisinlord.anthology.beam.BeamOwner; import com.craisinlord.anthology.beam.BeamSettings; import com.craisinlord.anthology.beam.BeamTerrainMode; -import com.craisinlord.antarchy.content.effect.RoyalEffectEligibility; -import com.craisinlord.antarchy.content.effect.RoyalEffectHooks; -import com.craisinlord.anthology.time.TimeDilationApi; -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; @@ -31,10 +30,12 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.OwnableEntity; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.TamableAnimal; -import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; import net.minecraft.world.entity.ai.control.MoveControl; @@ -49,19 +50,20 @@ import net.minecraft.world.entity.ai.goal.target.OwnerHurtTargetGoal; import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.monster.Enemy; import net.minecraft.world.entity.animal.FlyingAnimal; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.Enemy; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.core.particles.ParticleTypes; import java.util.UUID; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; @@ -74,9 +76,16 @@ import software.bernie.geckolib.core.object.PlayState; import software.bernie.geckolib.core.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; -public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntity, FlyingAnimal { +public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntity, FlyingAnimal, BeamOwner { private static final ResourceLocation GROWTH_HEALTH_MODIFIER = new ResourceLocation("antarchy", "royal_mount_growth_health"); + private static final ResourceLocation GROWTH_DAMAGE_MODIFIER = new ResourceLocation("antarchy", "royal_mount_growth_damage"); + private static final ResourceLocation GROWTH_SPEED_MODIFIER = new ResourceLocation("antarchy", "royal_mount_growth_speed"); + private static final ResourceLocation GROWTH_FLYING_SPEED_MODIFIER = new ResourceLocation("antarchy", "royal_mount_growth_flying_speed"); private static final UUID GROWTH_HEALTH_MODIFIER_UUID = UUID.nameUUIDFromBytes(GROWTH_HEALTH_MODIFIER.toString().getBytes()); + private static final UUID GROWTH_DAMAGE_MODIFIER_UUID = UUID.nameUUIDFromBytes(GROWTH_DAMAGE_MODIFIER.toString().getBytes()); + private static final UUID GROWTH_SPEED_MODIFIER_UUID = UUID.nameUUIDFromBytes(GROWTH_SPEED_MODIFIER.toString().getBytes()); + private static final UUID GROWTH_FLYING_SPEED_MODIFIER_UUID = UUID.nameUUIDFromBytes(GROWTH_FLYING_SPEED_MODIFIER.toString().getBytes()); + public static final int ANIM_IDLE = 0; public static final int ANIM_WALK = 1; public static final int ANIM_FLY = 2; @@ -85,6 +94,22 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit public static final int ANIM_SHOOT = 5; public static final int ANIM_FLY_SHOOT = 6; + public static final int ACTION_NONE = 0; + public static final int ACTION_BITE = 1; + public static final int ACTION_SPIT = 2; + public static final int ACTION_BEAM = 3; + public static final int ACTION_SIGNATURE = 4; + + public static final float MAX_SCALE = 5.0F; + public static final float JUVENILE_PROGRESS = 0.25F; + public static final float ADULT_PROGRESS = 0.75F; + private static final float GOLDEN_APPLE_GROWTH = 0.025F; + private static final float ENCHANTED_APPLE_GROWTH = 0.125F; + + private static final double SEAT_HEIGHT = 17.0D / 16.0D; + private static final double SEAT_BACK = 2.0D / 16.0D; + private static final double FLY_BOB_HEIGHT = 9.0D / 16.0D; + private static final EntityDataAccessor ANIM_STATE = SynchedEntityData.defineId(RoyalMountEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor FLYING = @@ -117,33 +142,49 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit private static final RawAnimation SHOOT_ANIM = RawAnimation.begin().then("shoot", Animation.LoopType.PLAY_ONCE); private static final RawAnimation FLY_SHOOT_ANIM = RawAnimation.begin().then("fly_shoot", Animation.LoopType.PLAY_ONCE); - private static final int ACTION_TICKS = 12; + private static final int BITE_TICKS = 12; private static final int BITE_HIT_TICK = 6; + private static final int BITE_COOLDOWN_TICKS = 14; + private static final int SPIT_TICKS = 20; + private static final int SPIT_FIRE_TICK = 8; + private static final int SPIT_COOLDOWN_TICKS = 50; private static final int BEAM_WINDUP_TICKS = 24; + private static final int BEAM_DURATION_TICKS = 14; + private static final int BEAM_RECOVERY_TICKS = 10; private static final int BEAM_COOLDOWN_TICKS = 240; - private static final int BEAM_DURATION_TICKS = 12; - private static final int COMMAND_COOLDOWN_TICKS = 360; - private static final int TIME_FIELD_COOLDOWN_TICKS = 260; + private static final int SIGNATURE_WINDUP_TICKS = 20; + private static final int SIGNATURE_TICKS = 30; + private static final int ACTION_RECOVERY_TICKS = 8; private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); private final MoveControl groundMoveControl; private final MoveControl flyingMoveControl; private final PathNavigation groundNavigation; private final PathNavigation flyingNavigation; + private final BeamController beamController = new BeamController(this); + private int action = ACTION_NONE; private int actionTicks; - private boolean actionHit; - private int spitCooldown; + private boolean actionFired; + private boolean actionRidden; + @Nullable + private LivingEntity actionTarget; + @Nullable + private Vec3 actionAimPoint; + private int actionRecoveryTicks; + private int lastAction = ACTION_NONE; + private int biteCooldownTicks; + private int spitCooldownTicks; + private int beamCooldownTicks; + private int signatureCooldownTicks; + private int beamHead; + private int quirkTimer; private int flapSoundTimer; + private int flightClaimTick = -100; + private int ownerAwayTicks; private boolean riderAscendPressed; private boolean riderDescendPressed; - private final BeamController beamController = new BeamController(this); - private int beamWindupTicks; - private int beamCooldownTicks; - private int beamHead; - private int commandCooldownTicks; - private int timeFieldCooldownTicks; protected RoyalMountEntity(EntityType entityType, Level level) { super(entityType, level); @@ -173,6 +214,22 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit .add(Attributes.ARMOR, armor); } + public enum Stage { + HATCHLING("hatchling"), + JUVENILE("juvenile"), + ADULT("adult"); + + private final String id; + + Stage(String id) { + this.id = id; + } + + public Component displayName() { + return Component.translatable("entity.antarchy.royal_mount.stage." + this.id); + } + } + protected abstract String geoName(); protected abstract EntityType boltType(); @@ -187,6 +244,34 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit protected abstract SoundEvent stepSound(); + protected abstract int signatureCooldownTicks(); + + protected abstract boolean isSignatureUseful(LivingEntity target); + + protected abstract void signatureTelegraph(ServerLevel level, int tick, @Nullable LivingEntity target, @Nullable Vec3 aimPoint); + + protected abstract boolean performSignature(ServerLevel level, @Nullable LivingEntity target, @Nullable Vec3 aimPoint, boolean ridden); + + protected abstract float beamBaseDamage(); + + protected abstract ParticleOptions beamWindupParticle(); + + public abstract boolean prefersAerialCombat(); + + public abstract double preferredCombatRange(); + + protected abstract float biteWeight(); + + protected abstract float spitWeight(); + + protected abstract float beamWeight(); + + protected abstract float signatureWeight(); + + protected int nextBeamHead(int previous) { + return (previous + 1) % 3; + } + @Override protected SoundEvent getAmbientSound() { return this.idleSound(); @@ -194,7 +279,7 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit @Override protected void playStepSound(BlockPos pos, BlockState state) { - this.playSound(this.stepSound(), 0.16F, 1.0F + (this.random.nextFloat() - 0.5F) * 0.2F); + this.playSound(this.stepSound(), 0.16F * this.getGrowthScale(), 1.1F - 0.06F * this.getGrowthScale() + (this.random.nextFloat() - 0.5F) * 0.2F); } @Override @@ -207,61 +292,37 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); - this.goalSelector.addGoal(1, new SitWhenOrderedToGoal(this) { - @Override - public boolean canUse() { - return super.canUse(); - } - }); - this.goalSelector.addGoal(2, new RoyalMountSpitGoal(this)); - this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.MeleeAttackGoal(this, 1.2D, true) { - @Override - protected void checkAndPerformAttack(LivingEntity target, double distance) { - if (this.isTimeToAttack() && distance <= this.getAttackReachSqr(target) - && this.mob.getSensing().hasLineOfSight(target)) { - this.resetAttackCooldown(); - RoyalMountEntity.this.startBite(); - } - } - - @Override - public boolean canUse() { - return !RoyalMountEntity.this.isVehicle() && super.canUse(); - } - }); + this.goalSelector.addGoal(1, new SitWhenOrderedToGoal(this)); + this.goalSelector.addGoal(2, new RoyalMountCombatGoal(this)); this.goalSelector.addGoal(4, new RoyalMountFollowOwnerGoal(this)); + this.goalSelector.addGoal(5, new RoyalMountCompanionGoal(this)); this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 0.8D) { @Override public boolean canUse() { - return !RoyalMountEntity.this.isVehicle() - && !RoyalMountEntity.this.isOrderedToSit() && super.canUse(); + return RoyalMountEntity.this.canWanderFreely() && super.canUse(); + } + + @Override + public boolean canContinueToUse() { + return RoyalMountEntity.this.canWanderFreely() && super.canContinueToUse(); } }); this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 12.0F)); - this.goalSelector.addGoal(8, new RandomLookAroundGoal(this) { - @Override - public boolean canUse() { - return super.canUse(); - } - }); - this.targetSelector.addGoal(1, new OwnerHurtByTargetGoal(this) { - @Override - public boolean canUse() { - return super.canUse(); - } - }); - this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this) { - @Override - public boolean canUse() { - return super.canUse(); - } - }); - this.targetSelector.addGoal(3, new HurtByTargetGoal(this) { - @Override - public boolean canUse() { - return super.canUse(); - } - }.setAlertOthers()); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new OwnerHurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); + this.targetSelector.addGoal(3, new HurtByTargetGoal(this)); + } + + private boolean canWanderFreely() { + if (this.isVehicle() || this.isOrderedToSit() || this.isFlying() || this.isActing()) { + return false; + } + if (!this.isTame()) { + return true; + } + LivingEntity owner = this.getOwner(); + return owner == null || owner.level() != this.level() || this.distanceToSqr(owner) > 48.0D * 48.0D; } @Override @@ -286,8 +347,7 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit tag.putBoolean("Saddled", this.isSaddled()); tag.putBoolean("Flying", this.isFlying()); tag.putInt("BeamCooldown", this.beamCooldownTicks); - tag.putInt("CommandCooldown", this.commandCooldownTicks); - tag.putInt("TimeFieldCooldown", this.timeFieldCooldownTicks); + tag.putInt("SignatureCooldown", this.signatureCooldownTicks); tag.putFloat("GrowthProgress", this.getGrowthProgress()); } @@ -295,18 +355,20 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); this.setSaddled(tag.getBoolean("Saddled")); - this.setFlying(tag.getBoolean("Flying")); - this.actionTicks = 0; - this.actionHit = false; - this.spitCooldown = 0; + this.clearAction(); + this.biteCooldownTicks = 0; + this.spitCooldownTicks = 0; + this.actionRecoveryTicks = 0; this.beamCooldownTicks = Math.max(0, tag.getInt("BeamCooldown")); - this.commandCooldownTicks = Math.max(0, tag.getInt("CommandCooldown")); - this.timeFieldCooldownTicks = Math.max(0, tag.getInt("TimeFieldCooldown")); + int signatureCooldown = tag.contains("SignatureCooldown") + ? tag.getInt("SignatureCooldown") + : Math.max(tag.getInt("CommandCooldown"), tag.getInt("TimeFieldCooldown")); + this.signatureCooldownTicks = Math.max(0, signatureCooldown); this.setGrowthProgress(tag.contains("GrowthProgress") ? tag.getFloat("GrowthProgress") : 0.0F); - } - - public boolean isFlying() { - return this.entityData.get(FLYING); + if (tag.contains("Health", 99)) { + this.setHealth(tag.getFloat("Health")); + } + this.setFlying(tag.getBoolean("Flying") && this.canFly()); } @Override @@ -323,10 +385,15 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit } } + public boolean isFlying() { + return this.entityData.get(FLYING); + } + public void setFlying(boolean flying) { if (this.entityData.get(FLYING) != flying) { this.entityData.set(FLYING, flying); this.moveControl = flying ? this.flyingMoveControl : this.groundMoveControl; + this.navigation.stop(); this.navigation = flying ? this.flyingNavigation : this.groundNavigation; this.setNoGravity(flying); if (flying && !this.level().isClientSide) { @@ -335,6 +402,15 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit } } + public boolean claimFlight() { + if (!this.canFly()) { + return false; + } + this.setFlying(true); + this.flightClaimTick = this.tickCount; + return true; + } + public boolean isSaddled() { return this.entityData.get(SADDLED); } @@ -352,35 +428,91 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit } public float getGrowthScale() { - return 1.0F + 14.0F * this.getGrowthProgress(); + return 1.0F + (MAX_SCALE - 1.0F) * this.getGrowthProgress(); } public float getGrowthProgress() { return this.entityData.get(GROWTH_PROGRESS); } + public Stage getStage() { + float progress = this.getGrowthProgress(); + if (progress >= ADULT_PROGRESS) { + return Stage.ADULT; + } + return progress >= JUVENILE_PROGRESS ? Stage.JUVENILE : Stage.HATCHLING; + } + + public boolean canBeRidden() { + return this.getStage() != Stage.HATCHLING; + } + + public boolean canFly() { + return this.getStage() == Stage.ADULT; + } + + public boolean canSpit() { + return this.getStage() != Stage.HATCHLING; + } + + public boolean canUseAdultAbilities() { + return this.getStage() == Stage.ADULT; + } + public void setGrowthProgress(float progress) { float clamped = Mth.clamp(progress, 0.0F, 1.0F); if (this.getGrowthProgress() != clamped) { float oldHealth = this.getHealth(); this.entityData.set(GROWTH_PROGRESS, clamped); - var maxHealth = this.getAttribute(Attributes.MAX_HEALTH); - if (maxHealth != null) { - maxHealth.removeModifier(GROWTH_HEALTH_MODIFIER_UUID); - if (clamped > 0.0F) { - maxHealth.addTransientModifier(new AttributeModifier(GROWTH_HEALTH_MODIFIER_UUID, GROWTH_HEALTH_MODIFIER.toString(), - this.getGrowthScale() - 1.0D, AttributeModifier.Operation.MULTIPLY_BASE)); - } - this.setHealth(Math.min(oldHealth, this.getMaxHealth())); - } + this.applyGrowthModifiers(); + this.setHealth(Math.min(oldHealth, this.getMaxHealth())); this.refreshDimensions(); } } + private void applyGrowthModifiers() { + float bonus = this.getGrowthScale() - 1.0F; + this.applyGrowthModifier(this.getAttribute(Attributes.MAX_HEALTH), GROWTH_HEALTH_MODIFIER, GROWTH_HEALTH_MODIFIER_UUID, bonus); + this.applyGrowthModifier(this.getAttribute(Attributes.ATTACK_DAMAGE), GROWTH_DAMAGE_MODIFIER, GROWTH_DAMAGE_MODIFIER_UUID, bonus * 0.5D); + this.applyGrowthModifier(this.getAttribute(Attributes.MOVEMENT_SPEED), GROWTH_SPEED_MODIFIER, GROWTH_SPEED_MODIFIER_UUID, bonus * 0.1D); + this.applyGrowthModifier(this.getAttribute(Attributes.FLYING_SPEED), GROWTH_FLYING_SPEED_MODIFIER, GROWTH_FLYING_SPEED_MODIFIER_UUID, bonus * 0.1D); + } + + private void applyGrowthModifier(@Nullable AttributeInstance attribute, ResourceLocation id, UUID uuid, double amount) { + if (attribute == null) { + return; + } + attribute.removeModifier(uuid); + if (amount > 0.0D) { + attribute.addTransientModifier(new AttributeModifier(uuid, id.toString(), amount, AttributeModifier.Operation.MULTIPLY_BASE)); + } + } + + private void grow(float amount, @Nullable Player feeder) { + Stage before = this.getStage(); + this.setGrowthProgress(this.getGrowthProgress() + amount); + Stage after = this.getStage(); + if (after != before && this.level() instanceof ServerLevel level) { + double radius = this.getBbWidth() * 0.5D; + level.sendParticles(ParticleTypes.TOTEM_OF_UNDYING, this.getX(), this.getY() + this.getBbHeight() * 0.6D, this.getZ(), + 40, radius, this.getBbHeight() * 0.3D, radius, 0.3D); + this.playSound(this.idleSound(), 2.0F, 0.6F); + this.triggerQuirk(); + if (feeder != null) { + feeder.displayClientMessage(Component.translatable("message.antarchy.royal_mount.stage_up", + this.getDisplayName(), after.displayName()), true); + } + } else if (feeder != null) { + feeder.displayClientMessage(Component.translatable("message.antarchy.royal_mount.growth", + this.getDisplayName(), this.getStage().displayName(), Math.round(this.getGrowthProgress() * 100.0F)), true); + } + } + @Override public boolean hurt(DamageSource source, float amount) { Entity attacker = source.getEntity(); - if (attacker != null && this.hasPassenger(attacker)) { + if (attacker != null && attacker != this && (this.hasPassenger(attacker) + || attacker != this.getOwner() && this.isFriendlyTo(attacker))) { return false; } return super.hurt(source, amount); @@ -391,6 +523,11 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit return super.getDimensions(pose).scale(this.getGrowthScale()); } + @Override + public float maxUpStep() { + return Math.max(1.1F, 0.5F + 0.6F * this.getGrowthScale()); + } + @Override public boolean isFood(ItemStack stack) { return stack.is(AntarchyTags.Items.ROYAL_MOUNT_FOOD); @@ -399,49 +536,54 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack stack = player.getItemInHand(hand); + boolean owned = this.isTame() && this.isOwnedBy(player); if (stack.is(Items.GOLDEN_APPLE) && !this.isTame()) { if (!this.level().isClientSide) { - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } + this.consume(player, stack); this.tame(player); + this.setTarget(null); this.heal(8.0F); this.level().broadcastEntityEvent(this, (byte) 7); } return InteractionResult.sidedSuccess(this.level().isClientSide); } - if (stack.is(Items.ENCHANTED_GOLDEN_APPLE) && this.isTame() && this.isOwnedBy(player)) { + if (owned && (stack.is(Items.ENCHANTED_GOLDEN_APPLE) || stack.is(Items.GOLDEN_APPLE))) { + boolean enchanted = stack.is(Items.ENCHANTED_GOLDEN_APPLE); + boolean canGrow = this.getGrowthProgress() < 1.0F; + if (!canGrow && this.getHealth() >= this.getMaxHealth()) { + return InteractionResult.PASS; + } if (!this.level().isClientSide) { - if (!player.getAbilities().instabuild) { - stack.shrink(1); + this.consume(player, stack); + this.heal(enchanted ? 20.0F : 8.0F); + if (canGrow) { + this.grow(enchanted ? ENCHANTED_APPLE_GROWTH : GOLDEN_APPLE_GROWTH, player); } - this.heal(8.0F); - this.setGrowthProgress(this.getGrowthProgress() + (1.0F - this.getGrowthProgress()) * 0.1F); - this.level().broadcastEntityEvent(this, (byte) 6); + this.level().broadcastEntityEvent(this, (byte) 7); + this.triggerQuirk(); } return InteractionResult.sidedSuccess(this.level().isClientSide); } if (this.isFood(stack)) { - if (!this.level().isClientSide && this.isTame() && this.isOwnedBy(player) && this.getHealth() < this.getMaxHealth()) { - if (!player.getAbilities().instabuild) { - stack.shrink(1); + if (owned && this.getHealth() < this.getMaxHealth()) { + if (!this.level().isClientSide) { + this.consume(player, stack); + this.heal(8.0F); + this.level().broadcastEntityEvent(this, (byte) 7); } - this.heal(8.0F); - this.level().broadcastEntityEvent(this, (byte) 6); + return InteractionResult.sidedSuccess(this.level().isClientSide); } - return InteractionResult.sidedSuccess(this.level().isClientSide); + return InteractionResult.PASS; } - if (this.isTame() && this.isOwnedBy(player)) { + if (owned) { if (!this.isSaddled() && stack.is(Items.SADDLE)) { if (!this.level().isClientSide) { this.setSaddled(true); - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } + this.consume(player, stack); this.playSound(SoundEvents.HORSE_SADDLE, 1.0F, 1.0F); } return InteractionResult.sidedSuccess(this.level().isClientSide); @@ -453,15 +595,14 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit this.setInSittingPose(this.isOrderedToSit()); this.navigation.stop(); this.setTarget(null); + this.clearAction(); } return InteractionResult.sidedSuccess(this.level().isClientSide); } if (stack.isEmpty() && !player.isPassenger()) { if (!this.level().isClientSide) { - this.setOrderedToSit(false); - this.setInSittingPose(false); - player.startRiding(this); + this.tryMount(player); } return InteractionResult.sidedSuccess(this.level().isClientSide); } @@ -470,6 +611,25 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit return super.mobInteract(player, hand); } + private void consume(Player player, ItemStack stack) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } + } + + private boolean tryMount(Player player) { + if (!this.canBeRidden()) { + player.displayClientMessage(Component.translatable("message.antarchy.royal_mount.too_young_ride", + this.getDisplayName(), Stage.JUVENILE.displayName()), true); + return false; + } + this.setOrderedToSit(false); + this.setInSittingPose(false); + this.setTarget(null); + this.clearAction(); + return player.startRiding(this); + } + @Nullable @Override public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob other) { @@ -490,35 +650,20 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit } LivingEntity target = this.getTarget(); - if (target != null && !this.canAttack(target)) { + if (target != null && (!target.isAlive() || !this.canAttack(target))) { this.setTarget(null); } - if (this.spitCooldown > 0) { - this.spitCooldown--; - } - this.tickRoyalAbilities(); + this.tickCooldowns(); + this.tickAction(); + this.tickFlightState(); + this.tickOwnerGreeting(); if ((this.isFlying() || !this.onGround()) && --this.flapSoundTimer <= 0) { this.flapSoundTimer = 24 + this.random.nextInt(12); this.playSound(this.flySound(), 0.6F, 1.0F + (this.random.nextFloat() - 0.5F) * 0.3F); } - if (this.actionTicks > 0) { - this.entityData.set(QUIRKING, false); - this.actionTicks--; - if (!this.actionHit && this.actionTicks <= ACTION_TICKS - BITE_HIT_TICK - && (this.getAnimState() == ANIM_BITE || this.getAnimState() == ANIM_FLY_BITE)) { - this.actionHit = true; - this.applyBiteDamage(); - } - if (this.actionTicks == 0) { - this.updateAmbientAnimState(); - } - return; - } - - this.tickFlightState(); this.updateAmbientAnimState(); if (this.quirkTimer > 0) { @@ -527,95 +672,475 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit if (this.getAnimState() == ANIM_IDLE && this.quirkTimer == 0 && this.random.nextInt(600) == 0) { this.quirkTimer = 80; } - this.entityData.set(QUIRKING, this.quirkTimer > 0 && this.getAnimState() == ANIM_IDLE); + this.entityData.set(QUIRKING, this.quirkTimer > 0 && this.getAnimState() == ANIM_IDLE && !this.isActing()); } - private void tickRoyalAbilities() { - if (this.beamCooldownTicks > 0) this.beamCooldownTicks--; - if (this.commandCooldownTicks > 0) this.commandCooldownTicks--; - if (this.timeFieldCooldownTicks > 0) this.timeFieldCooldownTicks--; - if (this.beamWindupTicks > 0) { - this.beamWindupTicks--; - if (this.beamWindupTicks == 0) { - this.beamController.start(this.beamShootFrom(), this.beamTargetPosition(), BEAM_DURATION_TICKS); - this.entityData.set(BEAM_ACTIVE, true); - } + public void triggerQuirk() { + if (!this.isActing()) { + this.quirkTimer = 80; } - if (this.beamController.isFiring()) { - this.beamController.tick(this.beamShootFrom(), this.getTarget(), this.beamSettings(), BeamTerrainMode.NONE, this::setBeamEndPosition); - if (!this.beamController.isFiring()) { - this.entityData.set(BEAM_ACTIVE, false); - this.entityData.set(BEAM_HEAD, -1); - this.beamCooldownTicks = BEAM_COOLDOWN_TICKS; + } + + private void tickCooldowns() { + if (this.biteCooldownTicks > 0) this.biteCooldownTicks--; + if (this.spitCooldownTicks > 0) this.spitCooldownTicks--; + if (this.beamCooldownTicks > 0) this.beamCooldownTicks--; + if (this.signatureCooldownTicks > 0) this.signatureCooldownTicks--; + if (this.actionRecoveryTicks > 0) this.actionRecoveryTicks--; + } + + private void tickFlightState() { + if (!this.isFlying()) { + return; + } + if (this.isVehicle()) { + if (!this.canFly()) { + this.setFlying(false); + } else if (this.onGround() && this.riderDescendPressed) { + this.setFlying(false); } return; } - if (this.isOrderedToSit()) return; - LivingEntity target = this.getTarget(); - if (target == null && this.getControllingPassenger() instanceof Player) { - target = this.frontTarget(); - if (target != null) this.setTarget(target); + if (this.canFly() && this.tickCount - this.flightClaimTick <= 10) { + return; } - if (target == null || !target.isAlive() || !this.hasLineOfSight(target)) return; - double targetDistance = this.distanceTo(target); - if (this.beamCooldownTicks <= 0 && this.beamWindupTicks <= 0 && targetDistance > 7.0D && targetDistance < 28.0D && this.tickCount % 20 == 0) { - this.beamHead = (this.beamHead + 1) % 3; - this.entityData.set(BEAM_HEAD, this.beamHead); - this.beamWindupTicks = BEAM_WINDUP_TICKS; - this.setAnimState(this.isFlying() ? ANIM_FLY_SHOOT : ANIM_SHOOT); - this.triggerAnim("main", this.isFlying() ? "fly_shoot" : "shoot"); - this.playSound(this.shootSound(), 0.9F, 0.75F); + if (this.onGround() || this.isInWater() || this.isInLava()) { + this.setFlying(false); + return; } - if (this instanceof PrinceEntity && this.commandCooldownTicks <= 0 && this.tickCount % 20 == 0) { - this.performPrinceCommand(); + this.navigation.stop(); + this.moveControl.setWantedPosition(this.getX(), this.getY() - 3.0D, this.getZ(), 0.8D); + } + + private void tickOwnerGreeting() { + if (!this.isTame() || this.isVehicle() || this.tickCount % 10 != 0) { + return; } - if (this instanceof PrincessEntity && this.timeFieldCooldownTicks <= 0 && this.tickCount % 20 == 0) { - this.performPrincessTimeField(target); + LivingEntity owner = this.getOwner(); + if (owner == null || owner.level() != this.level()) { + this.ownerAwayTicks = Math.min(this.ownerAwayTicks + 10, 2400); + return; + } + double distance = this.distanceTo(owner); + if (distance > 24.0D + this.getBbWidth()) { + this.ownerAwayTicks = Math.min(this.ownerAwayTicks + 10, 2400); + } else if (distance < 8.0D + this.getBbWidth()) { + if (this.ownerAwayTicks >= 400 && this.getTarget() == null) { + this.triggerQuirk(); + this.playSound(this.idleSound(), 1.4F, 1.15F); + this.lookControl.setLookAt(owner, 30.0F, 30.0F); + } + this.ownerAwayTicks = 0; } } - private void performPrinceCommand() { - if (!(this.level() instanceof ServerLevel level) || RoyalEffectHooks.commandedHolder() == null) return; - int applied = 0; - for (Mob mob : level.getEntitiesOfClass(Mob.class, this.getBoundingBox().inflate(16.0D), mob -> - mob != this && mob.isAlive() && mob instanceof Enemy && !mob.isAlliedTo(this) - && !(mob instanceof RoyalBossEntity) && RoyalEffectEligibility.canApplyCommanded(mob))) { - if (applied >= 5) break; - if (mob.addEffect(new MobEffectInstance(RoyalEffectHooks.commandedHolder(), 300), this)) { - applied++; - level.sendParticles(ParticleTypes.HAPPY_VILLAGER, mob.getX(), mob.getY() + mob.getBbHeight(), mob.getZ(), 4, 0.2D, 0.2D, 0.2D, 0.02D); + private void updateAmbientAnimState() { + if (this.isActing()) { + return; + } + if (this.isFlying() || (!this.onGround() && !this.isInWater())) { + this.setAnimState(ANIM_FLY); + return; + } + boolean moving; + if (this.getControllingPassenger() instanceof Player rider) { + moving = Math.abs(rider.zza) > 0.05F || Math.abs(rider.xxa) > 0.05F; + } else { + moving = this.getDeltaMovement().horizontalDistanceSqr() > 0.0025D; + } + this.setAnimState(moving ? ANIM_WALK : ANIM_IDLE); + } + + public boolean isActing() { + return this.action != ACTION_NONE; + } + + public int currentAction() { + return this.action; + } + + public boolean isActionReady() { + return this.action == ACTION_NONE && this.actionRecoveryTicks <= 0; + } + + @Nullable + public LivingEntity actionTarget() { + return this.actionTarget; + } + + public boolean isActionCommitted() { + return switch (this.action) { + case ACTION_BEAM -> this.actionTicks >= BEAM_WINDUP_TICKS - 6; + case ACTION_SPIT -> this.actionTicks >= SPIT_FIRE_TICK - 3; + case ACTION_SIGNATURE -> this.actionTicks >= SIGNATURE_WINDUP_TICKS - 6; + default -> this.action != ACTION_NONE; + }; + } + + public boolean isActionAvailable(int type) { + return switch (type) { + case ACTION_BITE -> this.biteCooldownTicks <= 0; + case ACTION_SPIT -> this.canSpit() && this.spitCooldownTicks <= 0; + case ACTION_BEAM -> this.canUseAdultAbilities() && this.beamCooldownTicks <= 0; + case ACTION_SIGNATURE -> this.canUseAdultAbilities() && this.signatureCooldownTicks <= 0; + default -> false; + }; + } + + public boolean startAction(int type, @Nullable LivingEntity target, @Nullable Vec3 aimPoint, boolean ridden) { + if (this.level().isClientSide || !this.isActionReady() || !this.isActionAvailable(type)) { + return false; + } + this.action = type; + this.actionTicks = 0; + this.actionFired = false; + this.actionRidden = ridden; + this.actionTarget = target; + this.actionAimPoint = aimPoint; + this.lastAction = type; + this.entityData.set(QUIRKING, false); + this.quirkTimer = 0; + boolean flying = this.isFlying(); + switch (type) { + case ACTION_BITE -> { + this.biteCooldownTicks = BITE_COOLDOWN_TICKS; + this.setAnimState(flying ? ANIM_FLY_BITE : ANIM_BITE); + this.triggerAnim("main", flying ? "fly_bite" : "bite"); + this.playSound(this.biteSound(), 1.2F, 0.95F - 0.04F * this.getGrowthScale() + this.random.nextFloat() * 0.2F); + } + case ACTION_SPIT -> { + this.spitCooldownTicks = SPIT_COOLDOWN_TICKS; + this.setAnimState(flying ? ANIM_FLY_SHOOT : ANIM_SHOOT); + this.triggerAnim("main", flying ? "fly_shoot" : "shoot"); + } + case ACTION_BEAM -> { + this.beamCooldownTicks = BEAM_COOLDOWN_TICKS; + this.beamHead = this.nextBeamHead(this.beamHead); + this.entityData.set(BEAM_HEAD, this.beamHead); + this.setAnimState(flying ? ANIM_FLY_SHOOT : ANIM_SHOOT); + this.triggerAnim("main", flying ? "fly_shoot" : "shoot"); + this.playSound(this.shootSound(), 1.0F, 0.7F); + } + case ACTION_SIGNATURE -> { + this.signatureCooldownTicks = this.signatureCooldownTicks(); + this.setAnimState(flying ? ANIM_FLY_SHOOT : ANIM_SHOOT); + this.triggerAnim("main", flying ? "fly_shoot" : "shoot"); + this.playSound(this.idleSound(), 2.0F, 0.6F); + } + default -> { + this.clearAction(); + return false; } } - if (applied > 0) { - this.commandCooldownTicks = COMMAND_COOLDOWN_TICKS; - this.playSound(this.shootSound(), 1.0F, 0.65F); + return true; + } + + private void tickAction() { + if (this.action == ACTION_NONE) { + if (this.beamController.isFiring()) { + this.stopBeam(); + } + return; + } + if (!(this.level() instanceof ServerLevel level)) { + return; + } + if (this.actionRidden && this.getControllingPassenger() == null) { + this.actionRidden = false; + } + this.actionTicks++; + if (!this.actionRidden && this.actionTarget != null && !this.isActionCommitted()) { + this.turnTowards(this.actionTarget.position(), 14.0F); + } + switch (this.action) { + case ACTION_BITE -> { + if (!this.actionFired && this.actionTicks >= BITE_HIT_TICK) { + this.actionFired = true; + this.applyBiteDamage(); + } + if (this.actionTicks >= BITE_TICKS) { + this.finishAction(); + } + } + case ACTION_SPIT -> { + if (!this.actionFired && this.actionTicks >= SPIT_FIRE_TICK) { + this.actionFired = true; + this.fireSpitVolley(); + } + if (this.actionTicks >= SPIT_TICKS) { + this.finishAction(); + } + } + case ACTION_BEAM -> this.tickBeamAction(level); + case ACTION_SIGNATURE -> { + if (!this.actionFired) { + this.signatureTelegraph(level, this.actionTicks, this.actionTarget, this.actionAimPoint); + if (this.actionTicks >= SIGNATURE_WINDUP_TICKS) { + this.actionFired = true; + if (this.performSignature(level, this.validActionTarget(), this.actionAimPoint, this.actionRidden)) { + this.playSound(this.shootSound(), 1.4F, 0.6F); + } else { + this.signatureCooldownTicks = Math.min(this.signatureCooldownTicks, 60); + } + } + } + if (this.actionTicks >= SIGNATURE_TICKS) { + this.finishAction(); + } + } + default -> this.finishAction(); } } - private void performPrincessTimeField(@Nullable LivingEntity target) { - if (!(this.level() instanceof ServerLevel level)) return; - Vec3 center = target != null && target.isAlive() ? target.position() : this.position(); - TimeDilationApi.createField(level, center, 8.0D, 0.45D, 100, this.getUUID()); - this.timeFieldCooldownTicks = TIME_FIELD_COOLDOWN_TICKS; - level.sendParticles(ParticleTypes.END_ROD, center.x, center.y + 0.5D, center.z, 28, 1.2D, 0.6D, 1.2D, 0.03D); + @Nullable + private LivingEntity validActionTarget() { + LivingEntity target = this.actionTarget; + return target != null && target.isAlive() && target.level() == this.level() ? target : null; + } + + private void tickBeamAction(ServerLevel level) { + if (!this.actionFired) { + if (this.actionTicks % 2 == 0) { + Vec3 origin = this.beamShootFrom(); + level.sendParticles(this.beamWindupParticle(), origin.x, origin.y, origin.z, 3, + 0.15D * this.getGrowthScale(), 0.15D * this.getGrowthScale(), 0.15D * this.getGrowthScale(), 0.02D); + } + if (this.actionTicks >= BEAM_WINDUP_TICKS) { + this.actionFired = true; + Vec3 aim = this.currentBeamAim(); + this.beamController.start(this.beamShootFrom(), aim, BEAM_DURATION_TICKS); + this.entityData.set(BEAM_ACTIVE, true); + this.playSound(this.shootSound(), 1.4F, 0.6F); + } + return; + } + if (this.beamController.isFiring()) { + Vec3 from = this.beamShootFrom(); + LivingEntity target = this.actionRidden ? null : this.validActionTarget(); + Vec3 direction; + if (this.actionRidden && this.getControllingPassenger() instanceof Player rider) { + direction = this.riderAimPoint(rider, this.beamRange()).subtract(from); + } else { + direction = this.getLookAngle(); + } + this.beamController.tick(from, direction, target, this.beamSettings(), BeamTerrainMode.NONE, + this::setBeamEndPosition, !this.actionRidden); + if (!this.beamController.isFiring()) { + this.entityData.set(BEAM_ACTIVE, false); + this.entityData.set(HAS_BEAM_END, false); + } + return; + } + if (this.actionTicks >= BEAM_WINDUP_TICKS + BEAM_DURATION_TICKS + BEAM_RECOVERY_TICKS) { + this.finishAction(); + } + } + + private Vec3 currentBeamAim() { + if (this.actionRidden && this.getControllingPassenger() instanceof Player rider) { + return this.riderAimPoint(rider, this.beamRange()); + } + LivingEntity target = this.validActionTarget(); + if (target != null) { + return target.getEyePosition(); + } + return this.actionAimPoint != null ? this.actionAimPoint : this.getEyePosition().add(this.getLookAngle().scale(20.0D)); + } + + private void finishAction() { + this.clearAction(); + this.actionRecoveryTicks = ACTION_RECOVERY_TICKS; + } + + public void clearAction() { + this.action = ACTION_NONE; + this.actionTicks = 0; + this.actionFired = false; + this.actionRidden = false; + this.actionTarget = null; + this.actionAimPoint = null; + if (this.beamController.isFiring() || this.entityData.get(BEAM_ACTIVE)) { + this.stopBeam(); + } + } + + private void stopBeam() { + this.beamController.stop(); + this.entityData.set(BEAM_ACTIVE, false); + this.entityData.set(HAS_BEAM_END, false); + this.entityData.set(BEAM_HEAD, -1); + } + + public int chooseCombatAction(LivingEntity target, double gap, boolean canSee) { + if (!this.isActionReady()) { + return ACTION_NONE; + } + float bite = this.isActionAvailable(ACTION_BITE) && this.canBiteReach(target) ? this.biteWeight() : 0.0F; + float spit = this.isActionAvailable(ACTION_SPIT) && canSee && gap > 2.0D && gap < 22.0D + this.getGrowthScale() ? this.spitWeight() : 0.0F; + float beam = this.isActionAvailable(ACTION_BEAM) && canSee && gap > 5.0D && gap < this.beamRange() - 2.0D ? this.beamWeight() : 0.0F; + float signature = this.isActionAvailable(ACTION_SIGNATURE) && this.isSignatureUseful(target) ? this.signatureWeight() : 0.0F; + if (this.lastAction == ACTION_SPIT) spit *= 0.5F; + if (this.lastAction == ACTION_BITE && spit > 0.0F) bite *= 0.7F; + float total = bite + spit + beam + signature; + if (total <= 0.0F) { + return ACTION_NONE; + } + float roll = this.random.nextFloat() * total; + if ((roll -= signature) < 0.0F) return ACTION_SIGNATURE; + if ((roll -= beam) < 0.0F) return ACTION_BEAM; + if ((roll -= bite) < 0.0F) return ACTION_BITE; + return ACTION_SPIT; + } + + public void turnTowards(Vec3 point, float maxTurn) { + double dx = point.x - this.getX(); + double dz = point.z - this.getZ(); + if (dx * dx + dz * dz < 1.0E-4D) { + return; + } + float desired = (float) (Mth.atan2(dz, dx) * Mth.RAD_TO_DEG) - 90.0F; + float yaw = Mth.approachDegrees(this.getYRot(), desired, maxTurn); + this.setYRot(yaw); + this.yBodyRot = yaw; + this.yHeadRot = yaw; + } + + public double combatGap(LivingEntity target) { + double horizontal = Math.sqrt(Mth.square(target.getX() - this.getX()) + Mth.square(target.getZ() - this.getZ())); + double vertical = Math.max(0.0D, Math.max(target.getY() - (this.getY() + this.getBbHeight()), this.getY() - (target.getY() + target.getBbHeight()))); + double flat = Math.max(0.0D, horizontal - this.getBbWidth() * 0.5D - target.getBbWidth() * 0.5D); + return Math.sqrt(flat * flat + vertical * vertical); + } + + public AABB biteBox() { + float scale = this.getGrowthScale(); + Vec3 forward = Vec3.directionFromRotation(0.0F, this.getYRot()); + double reach = this.getBbWidth() * 0.5D + 1.0D * scale; + double radius = 1.1D * scale + 0.6D; + Vec3 center = this.position().add(forward.scale(reach)); + return new AABB(center.x - radius, this.getY() - 0.75D, center.z - radius, + center.x + radius, this.getY() + this.getBbHeight() + 0.75D * scale, center.z + radius); + } + + public boolean canBiteReach(LivingEntity target) { + return this.biteBox().intersects(target.getBoundingBox()); + } + + private void applyBiteDamage() { + AABB box = this.biteBox(); + float damage = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); + DamageSource source = this.damageSources().mobAttack(this); + int hits = 0; + LivingEntity primary = this.validActionTarget(); + if (primary != null && box.intersects(primary.getBoundingBox()) && this.canAttack(primary)) { + this.biteHit(primary, damage, source); + hits++; + } + for (LivingEntity candidate : this.level().getEntitiesOfClass(LivingEntity.class, box, + living -> living != primary && living.isAlive() && this.canAttack(living))) { + if (hits >= 3) { + break; + } + if (!this.actionRidden && !(candidate instanceof Enemy) && candidate != this.getTarget()) { + continue; + } + this.biteHit(candidate, damage, source); + hits++; + } + } + + private void biteHit(LivingEntity victim, float damage, DamageSource source) { + if (victim.hurt(source, damage)) { + Vec3 push = victim.position().subtract(this.position()).multiply(1.0D, 0.0D, 1.0D); + if (push.lengthSqr() > 1.0E-4D) { + push = push.normalize(); + victim.knockback(0.3D + 0.1D * this.getGrowthScale(), -push.x, -push.z); + } + } + } + + private void fireSpitVolley() { + Vec3 aim; + LivingEntity target = this.validActionTarget(); + if (this.actionRidden && this.getControllingPassenger() instanceof Player rider) { + aim = this.riderAimPoint(rider, 48.0D).subtract(this.getEyePosition()).normalize(); + } else if (target != null) { + aim = target.getEyePosition().subtract(this.getEyePosition()).normalize(); + } else { + aim = this.getLookAngle(); + } + Vec3 flat = new Vec3(-aim.z, 0.0D, aim.x); + Vec3 right = flat.lengthSqr() < 1.0E-6D ? new Vec3(1.0D, 0.0D, 0.0D) : flat.normalize(); + float speed = 1.3F + 0.06F * this.getGrowthScale(); + for (int i = -1; i <= 1; i++) { + Vec3 origin = this.boltOrigin(i); + Vec3 dir; + if (target != null && !this.actionRidden) { + dir = target.getEyePosition().subtract(origin).normalize().add(right.scale(i * 0.05D)).normalize(); + } else { + dir = aim.add(right.scale(i * 0.06D)).normalize(); + } + RoyalBoltEntity bolt = new RoyalBoltEntity(this.boltType(), this.level()); + bolt.setOwner(this); + bolt.setElement(this.boltElement(i)); + bolt.setPos(origin.x, origin.y, origin.z); + bolt.shoot(dir.x, dir.y, dir.z, speed, 1.0F); + this.level().addFreshEntity(bolt); + } + this.playSound(this.shootSound(), 1.2F, 0.95F - 0.03F * this.getGrowthScale() + this.random.nextFloat() * 0.2F); + } + + protected Vec3 boltOrigin(int lateralIndex) { + float scale = this.getGrowthScale(); + Vec3 forward = Vec3.directionFromRotation(0.0F, this.getYRot()); + Vec3 side = new Vec3(-forward.z, 0.0D, forward.x); + return this.position() + .add(0.0D, 1.05D * scale, 0.0D) + .add(forward.scale(1.75D * scale)) + .add(side.scale(lateralIndex * 0.85D * scale)); + } + + public float projectileDamageMultiplier() { + return 1.0F + 0.35F * (this.getGrowthScale() - 1.0F); + } + + protected RoyalBeamElement boltElement(int lateralIndex) { + return RoyalBeamElement.GENERIC; + } + + public double beamRange() { + return 26.0D + 2.0D * this.getGrowthScale(); } private BeamSettings beamSettings() { - float damage = this instanceof PrincessEntity ? 10.0F : 12.0F; - return new BeamSettings(28.0D, 0.08D, 4.0D, BEAM_DURATION_TICKS, 6, BEAM_COOLDOWN_TICKS, - 0.35F, 0.45F, damage, 0.45F, 3, 0.0D, 0.0F, 0.0F, 0, 0.0F, 0.0F, 0.0F, false, true); + return new BeamSettings(this.beamRange(), 0.08D, 4.0D, BEAM_DURATION_TICKS, 6, BEAM_COOLDOWN_TICKS, + 0.35F + 0.08F * this.getGrowthScale(), 0.45F + 0.15F * this.getGrowthScale(), this.beamBaseDamage(), + 0.45F, 3, 0.0D, 0.0F, 0.0F, 0, 0.0F, 0.0F, 0.0F, false, true); } - private Vec3 beamTargetPosition() { - LivingEntity target = this.getTarget(); - return target != null ? target.getEyePosition() : this.getEyePosition().add(this.getLookAngle().scale(20.0D)); + @Override + public float scaleBeamDamage(float damage) { + return damage * (1.0F + 0.25F * (this.getGrowthScale() - 1.0F)); + } + + @Override + public boolean canBeamDamage(LivingEntity target) { + if (this.isFriendlyTo(target)) { + return false; + } + if (this.actionRidden) { + return true; + } + return target instanceof Enemy || target == this.getTarget() || target == this.actionTarget + || target instanceof Mob mob && mob.getTarget() != null && this.isFriendlyTo(mob.getTarget()); } public Vec3 beamShootFrom() { float scale = this.getGrowthScale(); Vec3 forward = Vec3.directionFromRotation(0.0F, this.getYRot()); Vec3 side = new Vec3(-forward.z, 0.0D, forward.x); - return this.position().add(0.0D, 1.0D * scale, 0.0D).add(forward.scale(1.05D * scale)).add(side.scale((this.getBeamHead() - 1) * 0.72D * scale)); + int head = Math.max(0, this.getBeamHead()); + return this.position().add(0.0D, 1.05D * scale, 0.0D).add(forward.scale(1.75D * scale)).add(side.scale((head - 1) * 0.85D * scale)); } public int getBeamHead() { return this.entityData.get(BEAM_HEAD); } @@ -634,127 +1159,77 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit } } - private void tickFlightState() { - if (this.isVehicle()) { - return; - } - if (this.isFlying() && this.onGround() && this.getTarget() == null) { - this.setFlying(false); - } + public Vec3 riderAimPoint(Player rider, double range) { + Vec3 eye = rider.getEyePosition(); + Vec3 end = eye.add(rider.getViewVector(1.0F).scale(range)); + var blockHit = this.level().clip(new ClipContext(eye, end, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, rider)); + Vec3 limit = blockHit.getLocation(); + EntityHitResult entityHit = ProjectileUtil.getEntityHitResult(this.level(), rider, eye, limit, + new AABB(eye, limit).inflate(1.0D), + entity -> entity instanceof LivingEntity living && living.isAlive() && !entity.isSpectator() && !this.isFriendlyTo(entity)); + return entityHit != null ? entityHit.getLocation() : limit; } - private void updateAmbientAnimState() { - if (this.actionTicks > 0) { - return; - } - if (this.isFlying() || !this.onGround()) { - this.setAnimState(ANIM_FLY); - return; - } - boolean moving; - if (this.getControllingPassenger() instanceof Player rider) { - moving = Math.abs(rider.zza) > 0.05F || Math.abs(rider.xxa) > 0.05F; - } else { - moving = this.getDeltaMovement().horizontalDistanceSqr() > 0.0025D; - } - this.setAnimState(moving ? ANIM_WALK : ANIM_IDLE); + @Nullable + public LivingEntity riderAimEntity(Player rider, double range) { + Vec3 eye = rider.getEyePosition(); + Vec3 end = eye.add(rider.getViewVector(1.0F).scale(range)); + var blockHit = this.level().clip(new ClipContext(eye, end, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, rider)); + Vec3 limit = blockHit.getLocation(); + EntityHitResult entityHit = ProjectileUtil.getEntityHitResult(this.level(), rider, eye, limit, + new AABB(eye, limit).inflate(1.0D), + entity -> entity instanceof LivingEntity living && living.isAlive() && !entity.isSpectator() && !this.isFriendlyTo(entity)); + return entityHit != null && entityHit.getEntity() instanceof LivingEntity living ? living : null; } - public void startBite() { - if (this.actionTicks > 0) { - return; + public boolean isFriendlyTo(@Nullable Entity entity) { + if (entity == null) { + return false; } - this.actionTicks = ACTION_TICKS; - this.actionHit = false; - this.setAnimState(this.isFlying() ? ANIM_FLY_BITE : ANIM_BITE); - this.triggerAnim("main", this.isFlying() ? "fly_bite" : "bite"); - this.playSound(this.biteSound(), 1.2F, 0.9F + this.random.nextFloat() * 0.2F); - } - - private void applyBiteDamage() { - LivingEntity target = this.getTarget(); - if (target == null && this.getControllingPassenger() instanceof Player) { - target = this.frontTarget(); + if (entity == this || this.hasPassenger(entity)) { + return true; } - if (target != null && this.canAttack(target) && target.distanceTo(this) < 5.0D) { - target.hurt(this.damageSources().mobAttack(this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE)); + if (entity instanceof RoyalMountEntity other && this.isTame() && other.isTame()) { + return true; } + if (this.isAlliedTo(entity) || entity.isAlliedTo(this)) { + return true; + } + if (!this.isTame()) { + return false; + } + LivingEntity owner = this.getOwner(); + if (owner != null && (entity == owner || entity.isAlliedTo(owner) || owner.isAlliedTo(entity))) { + return true; + } + return entity instanceof OwnableEntity ownable && this.getOwnerUUID() != null + && this.getOwnerUUID().equals(ownable.getOwnerUUID()); } @Override public boolean canAttack(LivingEntity target) { - return !(target instanceof RoyalMountEntity other && this.isTame() && other.isTame()) - && super.canAttack(target); + return !this.isFriendlyTo(target) && super.canAttack(target); } - @Nullable - private LivingEntity frontTarget() { - Vec3 look = this.getLookAngle(); - Vec3 eye = this.getEyePosition(); - LivingEntity best = null; - double bestDot = 0.3D; - for (LivingEntity candidate : this.level().getEntitiesOfClass(LivingEntity.class, this.getBoundingBox().inflate(6.0D))) { - if (candidate == this || candidate == this.getControllingPassenger() || candidate == this.getOwner()) { - continue; - } - if (!this.canAttack(candidate)) { - continue; - } - Vec3 to = candidate.getEyePosition().subtract(eye); - double dist = to.length(); - if (dist > 6.0D || dist < 1.0E-3D) { - continue; - } - double dot = to.scale(1.0D / dist).dot(look); - if (dot > bestDot) { - bestDot = dot; - best = candidate; - } + @Override + public boolean wantsToAttack(LivingEntity target, LivingEntity owner) { + if (target instanceof Creeper || this.isFriendlyTo(target)) { + return false; } - return best; - } - - public void startSpitVolley(@Nullable LivingEntity target) { - if (this.spitCooldown > 0 || this.level().isClientSide) { - return; + if (target instanceof Player victim && owner instanceof Player ownerPlayer && !ownerPlayer.canHarmPlayer(victim)) { + return false; } - this.spitCooldown = 40; - this.actionTicks = ACTION_TICKS; - this.actionHit = true; - this.setAnimState(this.isFlying() ? ANIM_FLY_SHOOT : ANIM_SHOOT); - this.triggerAnim("main", this.isFlying() ? "fly_shoot" : "shoot"); - - Vec3 aim; - if (target != null) { - aim = target.getEyePosition().subtract(this.getEyePosition()).normalize(); - } else if (this.getControllingPassenger() instanceof Player rider) { - aim = rider.getLookAngle(); - } else { - aim = this.getLookAngle(); - } - - Vec3 right = new Vec3(-aim.z, 0.0D, aim.x).normalize(); - for (int i = -1; i <= 1; i++) { - Vec3 dir = aim.add(right.scale(i * 0.14D)).normalize(); - RoyalBoltEntity bolt = new RoyalBoltEntity(this.boltType(), this.level()); - bolt.setOwner(this); - bolt.setElement(this.boltElement(i)); - Vec3 spawn = this.getEyePosition().add(aim.scale(1.6D)).add(right.scale(i * 0.9D)); - bolt.setPos(spawn.x, spawn.y, spawn.z); - bolt.shoot(dir.x, dir.y, dir.z, 1.4F, 1.0F); - this.level().addFreshEntity(bolt); - } - this.playSound(this.shootSound(), 1.2F, 0.9F + this.random.nextFloat() * 0.2F); - } - - protected RoyalBeamElement boltElement(int lateralIndex) { - return RoyalBeamElement.GENERIC; + return super.wantsToAttack(target, owner); } public boolean toggleMountedFlight(ServerPlayer player) { if (!this.canControl(player)) { return false; } + if (!this.isFlying() && !this.canFly()) { + this.notifyLocked(player, "message.antarchy.royal_mount.too_young_fly", Stage.ADULT); + return false; + } this.setFlying(!this.isFlying()); if (this.isFlying()) { this.setDeltaMovement(this.getDeltaMovement().add(0.0D, 0.4D, 0.0D)); @@ -765,19 +1240,51 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit public void handleMountedBite(ServerPlayer player) { if (this.canControl(player)) { - this.startBite(); + this.startAction(ACTION_BITE, null, null, true); } } public void handleMountedSpit(ServerPlayer player) { - if (this.canControl(player)) { - this.startSpitVolley(null); + if (!this.canControl(player)) { + return; } + if (!this.canSpit()) { + this.notifyLocked(player, "message.antarchy.royal_mount.too_young_ability", Stage.JUVENILE); + return; + } + this.startAction(ACTION_SPIT, null, null, true); + } + + public void handleMountedBeam(ServerPlayer player) { + if (!this.canControl(player)) { + return; + } + if (!this.canUseAdultAbilities()) { + this.notifyLocked(player, "message.antarchy.royal_mount.too_young_ability", Stage.ADULT); + return; + } + this.startAction(ACTION_BEAM, null, this.riderAimPoint(player, this.beamRange()), true); + } + + public void handleMountedSignature(ServerPlayer player) { + if (!this.canControl(player)) { + return; + } + if (!this.canUseAdultAbilities()) { + this.notifyLocked(player, "message.antarchy.royal_mount.too_young_ability", Stage.ADULT); + return; + } + LivingEntity aimed = this.riderAimEntity(player, 32.0D); + this.startAction(ACTION_SIGNATURE, aimed, this.riderAimPoint(player, 32.0D), true); + } + + private void notifyLocked(Player player, String key, Stage required) { + player.displayClientMessage(Component.translatable(key, this.getDisplayName(), required.displayName()), true); } public void setRiderAscend(boolean pressed) { this.riderAscendPressed = pressed; - if (pressed && !this.isFlying() && this.getControllingPassenger() != null) { + if (pressed && !this.isFlying() && this.canFly() && this.getControllingPassenger() != null) { this.setFlying(true); this.setDeltaMovement(this.getDeltaMovement().add(0.0D, 0.35D, 0.0D)); this.hasImpulse = true; @@ -809,7 +1316,7 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit Vec3 end = eye.add(player.getViewVector(1.0F).scale(com.craisinlord.antarchy.compat.entity.EntityReach.entityInteractionRange(player) + extraReach)); RoyalMountEntity best = null; double bestDistance = Double.MAX_VALUE; - for (RoyalMountEntity mount : player.level().getEntitiesOfClass(RoyalMountEntity.class, player.getBoundingBox().inflate(80.0D), + for (RoyalMountEntity mount : player.level().getEntitiesOfClass(RoyalMountEntity.class, player.getBoundingBox().inflate(40.0D), mount -> mount.isAlive() && mount.isTame() && mount.isOwnedBy(player) && !mount.isVehicle())) { AABB box = mount.assistedMountBox(); double distance; @@ -832,12 +1339,7 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit public static boolean tryAssistedMount(ServerPlayer player) { RoyalMountEntity mount = findAssistedMountTarget(player, 2.0D); - if (mount == null) { - return false; - } - mount.setOrderedToSit(false); - mount.setInSittingPose(false); - return player.startRiding(mount); + return mount != null && mount.tryMount(player); } @Nullable @@ -848,7 +1350,23 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit @Override public boolean canAddPassenger(Entity passenger) { - return this.getPassengers().isEmpty(); + return this.getPassengers().isEmpty() && this.canBeRidden(); + } + + @Override + protected void removePassenger(Entity passenger) { + super.removePassenger(passenger); + this.riderAscendPressed = false; + this.riderDescendPressed = false; + if (this.actionRidden) { + this.clearAction(); + } + } + + public double seatHeight() { + double bob = this.getAnimState() == ANIM_FLY || this.getAnimState() == ANIM_FLY_BITE || this.getAnimState() == ANIM_FLY_SHOOT + ? FLY_BOB_HEIGHT : 0.0D; + return (SEAT_HEIGHT + bob) * this.getGrowthScale(); } @Override @@ -857,10 +1375,17 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit return; } float scale = this.getGrowthScale(); - double yOffset = 1.3D * scale; - double backDistance = 0.35D * scale; - Vec3 back = Vec3.directionFromRotation(0.0F, this.getYRot()).scale(-backDistance); - moveFunction.accept(passenger, this.getX() + back.x, this.getY() + yOffset, this.getZ() + back.z); + Vec3 back = Vec3.directionFromRotation(0.0F, this.yBodyRot).scale(-SEAT_BACK * scale); + double attach = -passenger.getMyRidingOffset(); + moveFunction.accept(passenger, this.getX() + back.x, this.getY() + this.seatHeight() - attach, this.getZ() + back.z); + } + + public float thirdPersonCameraBonus() { + return 1.5F + 2.6F * (this.getGrowthScale() - 1.0F); + } + + public float thirdPersonCameraLift() { + return 0.3F * this.getGrowthScale(); } @Override @@ -893,13 +1418,18 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit return; } - this.setYRot(rider.getYRot()); - this.yBodyRot = this.getYRot(); - this.yHeadRot = this.getYRot(); + float yaw = this.isActionCommittedForRider() ? Mth.approachDegrees(this.getYRot(), rider.getYRot(), 6.0F) : rider.getYRot(); + this.setYRot(yaw); + this.yBodyRot = yaw; + this.yHeadRot = yaw; this.setXRot(rider.getXRot() * 0.5F); Vec3 input = this.getRiddenInput(rider, travelVector); - this.setSpeed(this.getRiddenSpeed(rider)); + float speed = this.getRiddenSpeed(rider); + if (this.action == ACTION_BEAM || this.action == ACTION_SIGNATURE) { + speed *= 0.45F; + } + this.setSpeed(speed); if (this.isFlying()) { this.moveRelative(this.getSpeed(), new Vec3(input.x, 0.0D, input.z)); @@ -913,21 +1443,91 @@ public abstract class RoyalMountEntity extends TamableAnimal implements GeoEntit } } + private boolean isActionCommittedForRider() { + return this.action == ACTION_BEAM && this.actionFired; + } + @Override public boolean causeFallDamage(float fallDistance, float multiplier, DamageSource source) { return false; } - @Override - public float maxUpStep() { - return 1.5F; - } - @Override public boolean removeWhenFarAway(double distanceToClosestPlayer) { return false; } + public static boolean isAirborne(LivingEntity entity) { + if (entity.isFallFlying()) { + return true; + } + if (entity instanceof Player player && player.getAbilities().flying) { + return true; + } + Entity vehicle = entity.getVehicle(); + return vehicle != null && !vehicle.onGround() && !vehicle.isInWater() && vehicle.isNoGravity(); + } + + public double findGroundY(double x, double startY, double z, int maxDepth) { + BlockPos.MutableBlockPos cursor = BlockPos.containing(x, startY, z).mutable(); + for (int i = 0; i < maxDepth; i++) { + BlockState state = this.level().getBlockState(cursor); + if (!state.getCollisionShape(this.level(), cursor).isEmpty() || !state.getFluidState().isEmpty()) { + return cursor.getY() + 1.0D; + } + cursor.move(0, -1, 0); + if (cursor.getY() < this.level().getMinBuildHeight()) { + break; + } + } + return Double.NaN; + } + + public boolean canOccupy(double x, double y, double z) { + AABB box = this.getBoundingBox().move(x - this.getX(), y - this.getY(), z - this.getZ()); + return this.level().noCollision(this, box) && !this.level().containsAnyLiquid(box); + } + + public boolean tryTeleportNear(LivingEntity anchor) { + boolean allowAir = this.canFly() && isAirborne(anchor); + double base = this.getBbWidth() * 0.5D + 1.5D; + float startAngle = this.random.nextFloat() * Mth.TWO_PI; + for (int ring = 0; ring < 3; ring++) { + double radius = base + ring * (1.5D + this.getBbWidth() * 0.25D); + for (int step = 0; step < 12; step++) { + double angle = startAngle + step * (Mth.TWO_PI / 12.0D); + double x = anchor.getX() + Math.cos(angle) * radius; + double z = anchor.getZ() + Math.sin(angle) * radius; + if (allowAir) { + double y = anchor.getY() + 1.0D; + if (this.canOccupy(x, y, z)) { + this.finishTeleport(x, y, z, true); + return true; + } + continue; + } + double ground = this.findGroundY(x, anchor.getY() + 3.0D, z, 8); + if (Double.isNaN(ground) || !this.level().getBlockState(BlockPos.containing(x, ground - 1.0D, z)).getFluidState().isEmpty()) { + continue; + } + if (this.canOccupy(x, ground, z)) { + this.finishTeleport(x, ground, z, false); + return true; + } + } + } + return false; + } + + private void finishTeleport(double x, double y, double z, boolean flying) { + this.navigation.stop(); + this.setFlying(flying && this.canFly()); + if (flying) { + this.flightClaimTick = this.tickCount; + } + this.teleportTo(x, y, z); + } + @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { controllers.add(new AnimationController<>(this, "main", 2, this::animController) diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountFollowOwnerGoal.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountFollowOwnerGoal.java index 0235984e..57095136 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountFollowOwnerGoal.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountFollowOwnerGoal.java @@ -1,81 +1,76 @@ package com.craisinlord.antarchy.content.entity.royal; -import net.minecraft.core.BlockPos; +import java.util.EnumSet; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.phys.Vec3; public class RoyalMountFollowOwnerGoal extends Goal { - private static final double START_DISTANCE = 12.0D; - private static final double STOP_DISTANCE = 6.0D; - private static final double TELEPORT_DISTANCE = 48.0D; - private final RoyalMountEntity mount; private LivingEntity owner; private int recalcTimer; + private int stuckTicks; + private int teleportCooldown; + private Vec3 lastCheckPosition = Vec3.ZERO; public RoyalMountFollowOwnerGoal(RoyalMountEntity mount) { this.mount = mount; + this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); + } + + private double startDistance() { + return 14.0D + 2.0D * this.mount.getGrowthScale(); + } + + private double stopDistance() { + return 6.0D + 1.5D * this.mount.getGrowthScale(); + } + + private double teleportDistance() { + return 48.0D + 4.0D * this.mount.getGrowthScale(); + } + + private boolean canFollow(LivingEntity candidate) { + return candidate != null && candidate.isAlive() && !candidate.isSpectator() + && candidate.level() == this.mount.level() + && this.mount.isTame() && !this.mount.isVehicle() && !this.mount.isOrderedToSit() + && !this.mount.isLeashed() && this.mount.getTarget() == null; } @Override public boolean canUse() { - if (!this.mount.isTame() || this.mount.isVehicle() || this.mount.isOrderedToSit()) { + LivingEntity candidate = this.mount.getOwner(); + if (!this.canFollow(candidate)) { return false; } - LivingEntity potentialOwner = this.mount.getOwner(); - if (potentialOwner == null || potentialOwner.isSpectator()) { + double start = this.startDistance(); + if (this.mount.distanceToSqr(candidate) < start * start) { return false; } - if (this.mount.distanceToSqr(potentialOwner) < START_DISTANCE * START_DISTANCE) { - return false; - } - this.owner = potentialOwner; + this.owner = candidate; return true; } @Override public boolean canContinueToUse() { - return !this.mount.getNavigation().isDone() - && this.mount.distanceToSqr(this.owner) > STOP_DISTANCE * STOP_DISTANCE - && !this.mount.isOrderedToSit(); + if (!this.canFollow(this.owner) || this.owner != this.mount.getOwner()) { + return false; + } + double stop = this.stopDistance(); + return this.mount.distanceToSqr(this.owner) > stop * stop; } @Override public void start() { this.recalcTimer = 0; + this.stuckTicks = 0; + this.lastCheckPosition = this.mount.position(); } @Override public void stop() { this.owner = null; this.mount.getNavigation().stop(); - this.mount.setFlying(false); - } - - @Override - public void tick() { - this.mount.getLookControl().setLookAt(this.owner, 10.0F, this.mount.getMaxHeadXRot()); - - double distanceSqr = this.mount.distanceToSqr(this.owner); - if (distanceSqr > TELEPORT_DISTANCE * TELEPORT_DISTANCE) { - this.trySafeTeleport(); - return; - } - - boolean ownerAirborne = !this.owner.onGround() || (this.owner.getY() - this.mount.getY()) > 3.0D; - this.mount.setFlying(ownerAirborne || distanceSqr > 24.0D * 24.0D); - - if (--this.recalcTimer <= 0) { - this.recalcTimer = 10; - if (this.mount.isFlying()) { - Vec3 to = this.owner.position().subtract(this.mount.position()); - Vec3 step = this.mount.position().add(to.normalize().scale(Math.min(to.length(), 8.0D))); - this.mount.getMoveControl().setWantedPosition(step.x, step.y + 1.0D, step.z, 1.2D); - } else { - this.mount.getNavigation().moveTo(this.owner, 1.1D); - } - } } @Override @@ -83,28 +78,57 @@ public class RoyalMountFollowOwnerGoal extends Goal { return true; } - private void trySafeTeleport() { - Vec3 ownerPosition = this.owner.position(); - BlockPos ownerBlock = this.owner.blockPosition(); - for (int radius = 0; radius <= 2; radius++) { - for (int dx = -radius; dx <= radius; dx++) { - for (int dz = -radius; dz <= radius; dz++) { - for (int dy = -1; dy <= 2; dy++) { - double x = ownerPosition.x + dx + 0.5D; - double y = ownerBlock.getY() + dy; - double z = ownerPosition.z + dz + 0.5D; - BlockPos floor = BlockPos.containing(x, y - 0.1D, z); - var destination = this.mount.getBoundingBox().move(x - this.mount.getX(), y - this.mount.getY(), z - this.mount.getZ()); - if (!this.mount.level().noCollision(this.mount, destination)) { - continue; - } - if (this.mount.isFlying() || !this.mount.level().getBlockState(floor).getCollisionShape(this.mount.level(), floor).isEmpty()) { - this.mount.teleportTo(x, y, z); - return; - } - } - } + @Override + public void tick() { + this.mount.getLookControl().setLookAt(this.owner, 10.0F, this.mount.getMaxHeadXRot()); + if (this.teleportCooldown > 0) { + this.teleportCooldown--; + } + this.trackStuck(); + + double distance = this.mount.distanceTo(this.owner); + if ((distance > this.teleportDistance() || this.stuckTicks >= 100 && distance > 24.0D) && this.teleportCooldown <= 0) { + this.teleportCooldown = 20; + if (this.mount.tryTeleportNear(this.owner)) { + this.stuckTicks = 0; + return; } } + + boolean ownerAirborne = RoyalMountEntity.isAirborne(this.owner); + boolean wantsFlight = this.mount.canFly() && (ownerAirborne || distance > 24.0D + this.mount.getBbWidth() + || this.stuckTicks >= 40 || this.owner.getY() - this.mount.getY() > 4.0D); + if (wantsFlight && this.mount.claimFlight()) { + if (--this.recalcTimer <= 0) { + this.recalcTimer = 5; + float scale = this.mount.getGrowthScale(); + Vec3 destination = this.owner.position().add(0.0D, 2.0D + 0.6D * scale, 0.0D); + Vec3 to = destination.subtract(this.mount.position()); + double stepLength = Math.min(to.length(), 12.0D + 2.0D * scale); + Vec3 step = to.lengthSqr() > 1.0E-4D ? this.mount.position().add(to.normalize().scale(stepLength)) : destination; + this.mount.getMoveControl().setWantedPosition(step.x, step.y, step.z, 1.3D); + } + return; + } + if (this.mount.isFlying()) { + return; + } + if (--this.recalcTimer <= 0) { + this.recalcTimer = 10; + this.mount.getNavigation().moveTo(this.owner, 1.2D); + } + } + + private void trackStuck() { + if (this.mount.tickCount % 20 != 0) { + return; + } + Vec3 position = this.mount.position(); + if (position.distanceToSqr(this.lastCheckPosition) < 1.0D) { + this.stuckTicks += 20; + } else { + this.stuckTicks = 0; + } + this.lastCheckPosition = position; } } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountSpitGoal.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountSpitGoal.java deleted file mode 100644 index 1dfa4f6b..00000000 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalMountSpitGoal.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.craisinlord.antarchy.content.entity.royal; - -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.goal.Goal; - -public class RoyalMountSpitGoal extends Goal { - private final RoyalMountEntity mount; - private int cooldown; - - public RoyalMountSpitGoal(RoyalMountEntity mount) { - this.mount = mount; - } - - @Override - public boolean canUse() { - if (this.mount.isVehicle() || this.mount.isOrderedToSit()) { - return false; - } - LivingEntity target = this.mount.getTarget(); - if (target == null || !target.isAlive() || !this.mount.canAttack(target)) { - return false; - } - double distance = this.mount.distanceTo(target); - return distance > 5.0D && distance < 20.0D && this.mount.hasLineOfSight(target); - } - - @Override - public void start() { - this.cooldown = 20; - } - - @Override - public void tick() { - LivingEntity target = this.mount.getTarget(); - if (target == null || !this.mount.canAttack(target)) { - return; - } - this.mount.getLookControl().setLookAt(target, 30.0F, 30.0F); - if (this.cooldown-- <= 0) { - this.mount.startSpitVolley(target); - this.cooldown = 60; - } - } - - @Override - public boolean requiresUpdateEveryTick() { - return true; - } -} diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/AttitudeAdjusterItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/AttitudeAdjusterItem.java index 23e58e8a..b5457b5d 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/AttitudeAdjusterItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/AttitudeAdjusterItem.java @@ -29,6 +29,14 @@ public class AttitudeAdjusterItem extends SwordItem { this.tier = tier; } + @Override + public com.google.common.collect.Multimap getDefaultAttributeModifiers(net.minecraft.world.entity.EquipmentSlot slot) { + if (slot != net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + return super.getDefaultAttributeModifiers(slot); + } + return com.craisinlord.antarchy.compat.item.WeaponAttributes.base(this.tier, (float) Math.round(AntarchySettings.attitudeAdjusterBaseDamage()), ATTACK_SPEED).build(); + } + @Override public void appendHoverText(ItemStack stack, Level level, List tooltipComponents, TooltipFlag tooltipFlag) { tooltipComponents.add(Component.translatable("tooltip.antarchy.attitude_adjuster.grounded").withStyle(ChatFormatting.DARK_GRAY)); diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BasiliskDaggerItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BasiliskDaggerItem.java index 032e057c..80c1440d 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BasiliskDaggerItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BasiliskDaggerItem.java @@ -21,6 +21,14 @@ public class BasiliskDaggerItem extends SwordItem { this.attackSpeed = attackSpeed; } + @Override + public com.google.common.collect.Multimap getDefaultAttributeModifiers(net.minecraft.world.entity.EquipmentSlot slot) { + if (slot != net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + return super.getDefaultAttributeModifiers(slot); + } + return com.craisinlord.antarchy.compat.item.WeaponAttributes.base(this.tier, (float) Math.round(AntarchySettings.basiliskDaggerAttackDamage()), (float) AntarchySettings.basiliskDaggerAttackSpeed()).build(); + } + @Override public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { boolean didHurt = super.hurtEnemy(stack, target, attacker); diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BattleAxeItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BattleAxeItem.java index 260d58f9..ebd31d20 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BattleAxeItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/BattleAxeItem.java @@ -2,13 +2,23 @@ package com.craisinlord.antarchy.content.item; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.client.model.ResourceBackedGeoItemModel; +import com.craisinlord.antarchy.content.item.ultimate.UltimateToolHelper; +import java.util.List; import java.util.function.Consumer; import java.util.function.DoubleSupplier; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoItem; import com.craisinlord.antarchy.content.client.AntarchyGeoItemRenderer; import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; @@ -34,6 +44,33 @@ public class BattleAxeItem extends AxeItem implements GeoItem, com.craisinlord.a GeoItem.registerSyncedAnimatable(this); } + @Override + public com.google.common.collect.Multimap getDefaultAttributeModifiers(net.minecraft.world.entity.EquipmentSlot slot) { + if (slot != net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + return super.getDefaultAttributeModifiers(slot); + } + return com.craisinlord.antarchy.compat.item.WeaponAttributes.base(this.tier, (float) this.attackDamage.getAsDouble(), (float) AntarchySettings.battleAxeAttackSpeed()).build(); + } + + @Override + public void appendHoverText(ItemStack stack, Level level, List tooltipComponents, TooltipFlag tooltipFlag) { + super.appendHoverText(stack, level, tooltipComponents, tooltipFlag); + if (AntarchySettings.ultimateToolsVeinMiningEnabled()) { + tooltipComponents.add(Component.translatable("tooltip.antarchy.battle_axe_tree_felling").withStyle(ChatFormatting.GRAY)); + } + } + + @Override + public boolean mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, LivingEntity miningEntity) { + boolean result = super.mineBlock(stack, level, state, pos, miningEntity); + if (AntarchySettings.ultimateToolsVeinMiningEnabled() + && miningEntity instanceof ServerPlayer player + && !player.isShiftKeyDown()) { + UltimateToolHelper.mineTree(stack, level, state, pos, player, AntarchySettings.ultimateToolsTreeFellingMaxLogs()); + } + return result; + } + @Override public boolean isEnchantable(ItemStack stack) { return stack.getCount() == 1; diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateAxeItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateAxeItem.java index a4cd9514..afcd81f0 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateAxeItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateAxeItem.java @@ -31,10 +31,18 @@ public class UltimateAxeItem extends AxeItem { this.attackSpeed = attackSpeed; } + @Override + public com.google.common.collect.Multimap getDefaultAttributeModifiers(net.minecraft.world.entity.EquipmentSlot slot) { + if (slot != net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + return super.getDefaultAttributeModifiers(slot); + } + return com.craisinlord.antarchy.compat.item.WeaponAttributes.base(this.tier, (float) this.attackDamage.getAsDouble(), (float) AntarchySettings.ultimateAxeAttackSpeed()).build(); + } + @Override public void appendHoverText(ItemStack stack, Level level, List tooltipComponents, TooltipFlag tooltipFlag) { super.appendHoverText(stack, level, tooltipComponents, tooltipFlag); - UltimateToolHelper.appendThreeByThreeTooltip(tooltipComponents); + UltimateToolHelper.appendModeTooltip(UltimateToolHelper.ToolKind.AXE, tooltipComponents); } @Override diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateHoeItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateHoeItem.java index fb737915..8408b794 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateHoeItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateHoeItem.java @@ -31,10 +31,18 @@ public class UltimateHoeItem extends HoeItem { this.attackSpeed = attackSpeed; } + @Override + public com.google.common.collect.Multimap getDefaultAttributeModifiers(net.minecraft.world.entity.EquipmentSlot slot) { + if (slot != net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + return super.getDefaultAttributeModifiers(slot); + } + return com.craisinlord.antarchy.compat.item.WeaponAttributes.base(this.tier, (float) Math.round(this.attackDamage.getAsDouble()), (float) AntarchySettings.ultimateHoeAttackSpeed()).build(); + } + @Override public void appendHoverText(ItemStack stack, Level level, List tooltipComponents, TooltipFlag tooltipFlag) { super.appendHoverText(stack, level, tooltipComponents, tooltipFlag); - UltimateToolHelper.appendThreeByThreeTooltip(tooltipComponents); + UltimateToolHelper.appendModeTooltip(UltimateToolHelper.ToolKind.HOE, tooltipComponents); } @Override diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimatePickaxeItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimatePickaxeItem.java index 0b306189..a1548cae 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimatePickaxeItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimatePickaxeItem.java @@ -31,10 +31,18 @@ public class UltimatePickaxeItem extends PickaxeItem { this.attackSpeed = attackSpeed; } + @Override + public com.google.common.collect.Multimap getDefaultAttributeModifiers(net.minecraft.world.entity.EquipmentSlot slot) { + if (slot != net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + return super.getDefaultAttributeModifiers(slot); + } + return com.craisinlord.antarchy.compat.item.WeaponAttributes.base(this.tier, (float) Math.round(this.attackDamage.getAsDouble()), (float) AntarchySettings.ultimatePickaxeAttackSpeed()).build(); + } + @Override public void appendHoverText(ItemStack stack, Level level, List tooltipComponents, TooltipFlag tooltipFlag) { super.appendHoverText(stack, level, tooltipComponents, tooltipFlag); - UltimateToolHelper.appendThreeByThreeTooltip(tooltipComponents); + UltimateToolHelper.appendModeTooltip(UltimateToolHelper.ToolKind.PICKAXE, tooltipComponents); } @Override diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateSwordItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateSwordItem.java index 9eec0d49..897bd322 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateSwordItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateSwordItem.java @@ -19,6 +19,14 @@ public class UltimateSwordItem extends SwordItem { this.attackSpeed = attackSpeed; } + @Override + public com.google.common.collect.Multimap getDefaultAttributeModifiers(net.minecraft.world.entity.EquipmentSlot slot) { + if (slot != net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + return super.getDefaultAttributeModifiers(slot); + } + return com.craisinlord.antarchy.compat.item.WeaponAttributes.base(this.tier, (float) Math.round(this.attackDamage.getAsDouble()), (float) AntarchySettings.ultimateSwordAttackSpeed()).build(); + } + @Override public boolean isEnchantable(ItemStack stack) { return stack.getCount() == 1; diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateToolHelper.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateToolHelper.java index c72b4775..f46a824e 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateToolHelper.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateToolHelper.java @@ -3,12 +3,16 @@ package com.craisinlord.antarchy.content.item.ultimate; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.item.GiantFryingPanItem; import com.craisinlord.antarchy.content.item.GiantFryingPanToolHelper; +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.function.Function; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -23,12 +27,16 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Tier; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; public final class UltimateToolHelper { private static final String THREE_BY_THREE_TAG = "antarchy.ultimate_three_by_three"; + private static final String MINING_MODE_TAG = "antarchy.ultimate_mining_mode"; private static final ThreadLocal BREAKING_EXTRA_BLOCKS = ThreadLocal.withInitial(() -> false); private static final float GENERAL_MINING_MULTIPLIER = 1.1F; private static final float ULTIMATE_SHOVEL_MINING_SPEED = 24.0F; @@ -38,26 +46,43 @@ public final class UltimateToolHelper { public static InteractionResultHolder handleToggleUse(Level level, Player player, InteractionHand hand) { ItemStack stack = player.getItemInHand(hand); - if (!AntarchySettings.ultimateToolsThreeByThreeEnabled() || !player.isShiftKeyDown()) { + if (!player.isShiftKeyDown() || availableModes(toolKindOf(stack.getItem())).size() < 2) { return InteractionResultHolder.pass(stack); } - toggleThreeByThree(level, player, stack); + cycleMiningMode(level, player, stack); return InteractionResultHolder.sidedSuccess(stack, level.isClientSide); } public static InteractionResult handleToggleUseOn(UseOnContext context) { Player player = context.getPlayer(); - if (!AntarchySettings.ultimateToolsThreeByThreeEnabled() || player == null || !player.isShiftKeyDown()) { + if (player == null || !player.isShiftKeyDown() || availableModes(toolKindOf(context.getItemInHand().getItem())).size() < 2) { return InteractionResult.PASS; } - toggleThreeByThree(context.getLevel(), player, context.getItemInHand()); + cycleMiningMode(context.getLevel(), player, context.getItemInHand()); return InteractionResult.sidedSuccess(context.getLevel().isClientSide); } public static boolean isThreeByThreeEnabled(ItemStack stack) { - return stack.hasTag() && stack.getTag().getBoolean(THREE_BY_THREE_TAG); + return getMiningMode(stack) == MiningMode.THREE_BY_THREE; + } + + public static boolean isVeinEnabled(ItemStack stack) { + return getMiningMode(stack) == MiningMode.VEIN; + } + + public static MiningMode getMiningMode(ItemStack stack) { + CompoundTag tag = stack.getTag(); + if (tag == null) { + return MiningMode.DEFAULT; + } + if (tag.contains(MINING_MODE_TAG)) { + int index = tag.getByte(MINING_MODE_TAG); + MiningMode[] modes = MiningMode.values(); + return index >= 0 && index < modes.length ? modes[index] : MiningMode.DEFAULT; + } + return tag.getBoolean(THREE_BY_THREE_TAG) ? MiningMode.THREE_BY_THREE : MiningMode.DEFAULT; } public static float getDestroySpeed(ToolKind toolKind, Tier tier, ItemStack stack, BlockState state, float defaultSpeed) { @@ -74,23 +99,127 @@ public final class UltimateToolHelper { return defaultSpeed * GENERAL_MINING_MULTIPLIER; } - public static void appendThreeByThreeTooltip(List tooltip) { - if (!AntarchySettings.ultimateToolsThreeByThreeEnabled()) { + public static void appendModeTooltip(ToolKind toolKind, List tooltip) { + List modes = availableModes(toolKind); + boolean area = modes.contains(MiningMode.THREE_BY_THREE); + boolean vein = modes.contains(MiningMode.VEIN); + String key; + if (area && vein) { + key = "tooltip.antarchy.ultimate_tools_3x3_vein"; + } else if (area) { + key = "tooltip.antarchy.ultimate_tools_3x3"; + } else if (vein) { + key = "tooltip.antarchy.ultimate_tools_vein"; + } else { return; } - tooltip.add(Component.translatable("tooltip.antarchy.ultimate_tools_3x3").withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable(key).withStyle(ChatFormatting.GRAY)); } public static void handleAreaMining(ToolKind toolKind, ItemStack stack, Level level, BlockState originState, BlockPos origin, LivingEntity entity) { - if (!AntarchySettings.ultimateToolsThreeByThreeEnabled() - || level.isClientSide + if (level.isClientSide || BREAKING_EXTRA_BLOCKS.get() - || !isThreeByThreeEnabled(stack) || !(entity instanceof ServerPlayer player)) { return; } - mineArea(toolKind, stack, level, originState, origin, player, 1); + MiningMode mode = getMiningMode(stack); + if (mode == MiningMode.DEFAULT || !availableModes(toolKind).contains(mode)) { + return; + } + if (mode == MiningMode.THREE_BY_THREE) { + mineArea(toolKind, stack, level, originState, origin, player, 1); + } else { + mineVein(toolKind, stack, level, originState, origin, player, veinLimit(originState)); + } + } + + public static int veinLimit(BlockState state) { + return state.is(BlockTags.LOGS) + ? AntarchySettings.ultimateToolsTreeFellingMaxLogs() + : AntarchySettings.ultimateToolsVeinMiningMaxBlocks(); + } + + public static void mineVein(ToolKind toolKind, ItemStack stack, Level level, BlockState originState, BlockPos origin, ServerPlayer player, int maxBlocks) { + if (level.isClientSide || BREAKING_EXTRA_BLOCKS.get() || maxBlocks <= 0 || !matchesToolKind(toolKind, originState)) { + return; + } + + breakAll(toolKind, stack, level, player, collectConnected(level, origin, originState.getBlock(), maxBlocks, false)); + } + + public static void mineTree(ItemStack stack, Level level, BlockState originState, BlockPos origin, ServerPlayer player, int maxBlocks) { + if (level.isClientSide || BREAKING_EXTRA_BLOCKS.get() || maxBlocks <= 0 || !originState.is(BlockTags.LOGS)) { + return; + } + + breakAll(ToolKind.AXE, stack, level, player, collectConnected(level, origin, originState.getBlock(), maxBlocks, true)); + } + + private static void breakAll(ToolKind toolKind, ItemStack stack, Level level, ServerPlayer player, List targets) { + if (targets.isEmpty()) { + return; + } + + BREAKING_EXTRA_BLOCKS.set(true); + try { + for (BlockPos targetPos : targets) { + if (!canBreak(toolKind, player, stack, level, targetPos, level.getBlockState(targetPos))) { + continue; + } + + player.gameMode.destroyBlock(targetPos); + if (stack.isEmpty()) { + break; + } + } + } finally { + BREAKING_EXTRA_BLOCKS.set(false); + } + } + + private static List collectConnected(Level level, BlockPos origin, Block block, int maxBlocks, boolean requireFoliage) { + List found = new ArrayList<>(); + Set visited = new HashSet<>(); + ArrayDeque queue = new ArrayDeque<>(); + visited.add(origin); + queue.add(origin); + boolean foliage = false; + + while (!queue.isEmpty() && found.size() < maxBlocks) { + BlockPos current = queue.poll(); + for (int dx = -1; dx <= 1 && found.size() < maxBlocks; dx++) { + for (int dy = -1; dy <= 1 && found.size() < maxBlocks; dy++) { + for (int dz = -1; dz <= 1 && found.size() < maxBlocks; dz++) { + if (dx == 0 && dy == 0 && dz == 0) { + continue; + } + + BlockPos next = current.offset(dx, dy, dz); + if (!visited.add(next) || !level.isLoaded(next)) { + continue; + } + + BlockState state = level.getBlockState(next); + if (state.is(block)) { + found.add(next); + queue.add(next); + } else if (requireFoliage && !foliage && isNaturalFoliage(state)) { + foliage = true; + } + } + } + } + } + + return requireFoliage && !foliage ? List.of() : found; + } + + private static boolean isNaturalFoliage(BlockState state) { + if (state.is(BlockTags.LEAVES)) { + return !state.hasProperty(BlockStateProperties.PERSISTENT) || !state.getValue(BlockStateProperties.PERSISTENT); + } + return state.is(BlockTags.WART_BLOCKS) || state.is(Blocks.SHROOMLIGHT); } public static void mineArea(ToolKind toolKind, ItemStack stack, Level level, BlockState originState, BlockPos origin, ServerPlayer player, int radius) { @@ -211,23 +340,50 @@ public final class UltimateToolHelper { HOE } - private static void toggleThreeByThree(Level level, Player player, ItemStack stack) { - boolean enabled = !isThreeByThreeEnabled(stack); - if (enabled) { - stack.getOrCreateTag().putBoolean(THREE_BY_THREE_TAG, true); - } else if (stack.hasTag()) { - stack.getTag().remove(THREE_BY_THREE_TAG); + public enum MiningMode { + DEFAULT, + THREE_BY_THREE, + VEIN + } + + private static List availableModes(ToolKind toolKind) { + List modes = new ArrayList<>(3); + if (toolKind == null) { + return modes; + } + modes.add(MiningMode.DEFAULT); + if (AntarchySettings.ultimateToolsThreeByThreeEnabled()) { + modes.add(MiningMode.THREE_BY_THREE); + } + if (AntarchySettings.ultimateToolsVeinMiningEnabled() && (toolKind == ToolKind.PICKAXE || toolKind == ToolKind.AXE)) { + modes.add(MiningMode.VEIN); + } + return modes; + } + + private static void cycleMiningMode(Level level, Player player, ItemStack stack) { + List modes = availableModes(toolKindOf(stack.getItem())); + int current = modes.indexOf(getMiningMode(stack)); + MiningMode next = modes.get((current + 1) % modes.size()); + if (next == MiningMode.DEFAULT) { + CompoundTag tag = stack.getTag(); + if (tag != null) { + tag.remove(THREE_BY_THREE_TAG); + tag.remove(MINING_MODE_TAG); + } + } else { + CompoundTag tag = stack.getOrCreateTag(); + tag.remove(THREE_BY_THREE_TAG); + tag.putByte(MINING_MODE_TAG, (byte) next.ordinal()); } if (!level.isClientSide) { - player.displayClientMessage( - Component.translatable( - enabled - ? "message.antarchy.ultimate_tool.mode_3x3" - : "message.antarchy.ultimate_tool.mode_default" - ), - true - ); + String key = switch (next) { + case DEFAULT -> "message.antarchy.ultimate_tool.mode_default"; + case THREE_BY_THREE -> "message.antarchy.ultimate_tool.mode_3x3"; + case VEIN -> "message.antarchy.ultimate_tool.mode_vein"; + }; + player.displayClientMessage(Component.translatable(key), true); } } diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UtlimateShovelItem.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UtlimateShovelItem.java index 3fb3bc68..20743781 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UtlimateShovelItem.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UtlimateShovelItem.java @@ -34,10 +34,18 @@ public class UtlimateShovelItem extends ShovelItem { this.attackSpeed = attackSpeed; } + @Override + public com.google.common.collect.Multimap getDefaultAttributeModifiers(net.minecraft.world.entity.EquipmentSlot slot) { + if (slot != net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + return super.getDefaultAttributeModifiers(slot); + } + return com.craisinlord.antarchy.compat.item.WeaponAttributes.base(this.tier, (float) this.attackDamage.getAsDouble(), (float) AntarchySettings.ultimateShovelAttackSpeed()).build(); + } + @Override public void appendHoverText(ItemStack stack, Level level, List tooltipComponents, TooltipFlag tooltipFlag) { super.appendHoverText(stack, level, tooltipComponents, tooltipFlag); - UltimateToolHelper.appendThreeByThreeTooltip(tooltipComponents); + UltimateToolHelper.appendModeTooltip(UltimateToolHelper.ToolKind.SHOVEL, tooltipComponents); } @Override diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/network/RoyalMountActionPayload.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/network/RoyalMountActionPayload.java index 78324b44..9076d4f9 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/network/RoyalMountActionPayload.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/network/RoyalMountActionPayload.java @@ -12,6 +12,8 @@ public record RoyalMountActionPayload(int action) implements CustomPacketPayload public static final int BITE = 1; public static final int SPIT = 2; public static final int MOUNT = 3; + public static final int BEAM = 4; + public static final int SIGNATURE = 5; public static final Type TYPE = new Type<>(new ResourceLocation(Antarchy.MODID, "royal_mount_action")); diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java index f21f9441..1ef5a9fe 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java @@ -34,7 +34,7 @@ public class TermiteNestFeature extends SurfaceAntNestFeature { protected BlockPos resolveNestPos(WorldGenLevel level, BlockPos origin) { int x = origin.getX(); int z = origin.getZ(); - int startY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, x, z) - 1; + int startY = Math.min(origin.getY(), level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, x, z) - 1); int minY = level.getMinBuildHeight() + 1; for (int y = startY; y >= minY; y--) { diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/mixins/MantisClawWallClimbMixin.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/mixins/MantisClawWallClimbMixin.java index 9896bdbd..f6707386 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/mixins/MantisClawWallClimbMixin.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/mixins/MantisClawWallClimbMixin.java @@ -1,5 +1,6 @@ package com.craisinlord.antarchy.mixins; +import com.craisinlord.antarchy.content.AntarchyTags; import com.craisinlord.antarchy.content.item.MantisClawItem; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; @@ -91,6 +92,7 @@ public abstract class MantisClawWallClimbMixin extends LivingEntity { Player player = (Player) (Object) this; return MantisClawItem.isDualWielding(player) && this.horizontalCollision + && !this.level().dimensionTypeRegistration().is(AntarchyTags.DimensionTypes.NO_MANTIS_CLIMB) && !this.onGround() && !this.isInWaterOrBubble() && !this.isPassenger() diff --git a/common-1.20.1/src/main/java/com/craisinlord/antarchy/mixins/client/MountedVehicleCameraMixin.java b/common-1.20.1/src/main/java/com/craisinlord/antarchy/mixins/client/MountedVehicleCameraMixin.java index 5a4e5c7a..ef5158e6 100644 --- a/common-1.20.1/src/main/java/com/craisinlord/antarchy/mixins/client/MountedVehicleCameraMixin.java +++ b/common-1.20.1/src/main/java/com/craisinlord/antarchy/mixins/client/MountedVehicleCameraMixin.java @@ -1,6 +1,7 @@ package com.craisinlord.antarchy.mixins.client; import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; +import com.craisinlord.antarchy.content.entity.royal.RoyalMountEntity; import net.minecraft.client.Camera; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.BlockGetter; @@ -10,6 +11,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Camera.class) @@ -23,6 +25,18 @@ public abstract class MountedVehicleCameraMixin { @Shadow protected abstract void setPosition(Vec3 position); + @ModifyArg( + method = "setup", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;getMaxZoom(D)D"), + index = 0 + ) + private double antarchy$extendRoyalMountZoom(double distance) { + if (this.entity != null && this.entity.getVehicle() instanceof RoyalMountEntity mount) { + return distance + mount.thirdPersonCameraBonus(); + } + return distance; + } + @Inject(method = "setup", at = @At("RETURN")) private void antarchy$adjustMountedCamera( BlockGetter level, @@ -32,6 +46,11 @@ public abstract class MountedVehicleCameraMixin { float partialTick, CallbackInfo ci ) { + if (this.detached && this.entity != null && this.entity.getVehicle() instanceof RoyalMountEntity mount) { + Camera camera = (Camera) (Object) this; + this.setPosition(camera.getPosition().add(new Vec3(camera.getUpVector()).scale(mount.thirdPersonCameraLift()))); + return; + } if (!this.antarchy$ridingHerculesBeetle()) { return; } diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/de_de.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/de_de.json index 45fb7005..871e012f 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/de_de.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/de_de.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Auf 3x3-Abbau umgeschaltet", + "message.antarchy.ultimate_tool.mode_vein": "Auf Adernabbau umgeschaltet", "message.antarchy.ultimate_tool.mode_default": "Auf normalen Abbau umgeschaltet", "advancements.antarchy.hey_listen.title": "Hey, hör zu!", "advancements.antarchy.hey_listen.description": "Eine Reverie hat sich dir angeschlossen.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Rechtsklick, um dich drehend nach vorn zu bohren und Molevore-Blöcke zu durchdringen.", "tooltip.antarchy.big_bertha.mode.toreterror": "Rechtsklick, um in die Luft zu springen und mit einer Flächenschockwelle herabzustürzen.", "tooltip.antarchy.ultimate_tools_3x3": "Umschalt-Rechtsklick, um 3x3-Abbau umzuschalten.", + "tooltip.antarchy.ultimate_tools_vein": "Umschalt-Rechtsklick, um Adernabbau umzuschalten.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Umschalt-Rechtsklick wechselt zwischen 3x3-Abbau und Adernabbau.", + "tooltip.antarchy.battle_axe_tree_felling": "Fällt ganze Bäume. Schleichen, um einen einzelnen Stamm zu hacken.", "tooltip.antarchy.moggles.reveal": "Gewährt Nachtsicht und weist auf nahe Höhlen hin.", "tooltip.antarchy.moggles.underground": "Funktioniert nur, wenn du keinen freien Blick zum Himmel hast.", "tooltip.antarchy.cornea_ear.vision": "Gewährt %s Sekunden lang Nachtsicht.", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/en_us.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/en_us.json index 94a13611..ad57d8f3 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/en_us.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/en_us.json @@ -604,6 +604,16 @@ "message.antarchy.royal_boundary.activated": "Royal Boundary raised", "message.antarchy.royal_boundary.recharging": "Royal Boundary is recharging", "key.antarchy.mount_flight_toggle": "Mount: Toggle Flight", + "key.antarchy.mount_beam": "Royal Mount: Beam", + "key.antarchy.mount_signature": "Royal Mount: Command / Time Field", + "entity.antarchy.royal_mount.stage.hatchling": "Hatchling", + "entity.antarchy.royal_mount.stage.juvenile": "Juvenile", + "entity.antarchy.royal_mount.stage.adult": "Adult", + "message.antarchy.royal_mount.stage_up": "%s has reached the %s stage!", + "message.antarchy.royal_mount.growth": "%s: %s, %s%% grown", + "message.antarchy.royal_mount.too_young_ride": "%s must reach the %s stage before it can be ridden", + "message.antarchy.royal_mount.too_young_fly": "%s must reach the %s stage before it can fly", + "message.antarchy.royal_mount.too_young_ability": "%s must reach the %s stage to use that", "item.antarchy.springbug_leg": "Springbug Leg", "item.antarchy.springy_boots": "Springy Boots", "tooltip.antarchy.springy_boots": "Sneak to charge, then jump to spring upward.", @@ -791,6 +801,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Switched to 3x3 Mining", + "message.antarchy.ultimate_tool.mode_vein": "Switched to Vein Mining", "message.antarchy.ultimate_tool.mode_default": "Switched to Default Mining", "advancements.antarchy.hey_listen.title": "Hey Listen", "advancements.antarchy.hey_listen.description": "A Reverie has joined you.", @@ -829,6 +840,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Use to spin forward and drill through Molevore blocks.", "tooltip.antarchy.big_bertha.mode.toreterror": "Use to launch into the air and crash down with an AOE shockwave.", "tooltip.antarchy.ultimate_tools_3x3": "Shift + use to toggle 3x3 Mining.", + "tooltip.antarchy.ultimate_tools_vein": "Shift + use to toggle Vein Mining.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Shift + use to cycle 3x3 and Vein Mining.", + "tooltip.antarchy.battle_axe_tree_felling": "Fells whole trees. Sneak to chop a single log.", "tooltip.antarchy.moggles.reveal": "Gives night vision and points to nearby caves.", "tooltip.antarchy.moggles.underground": "Works only while you have no sky access.", "tooltip.antarchy.cornea_ear.vision": "Grants Night Vision for %s seconds.", @@ -1644,12 +1658,12 @@ ,"guide.antarchy.entry.queen.description6": "In her final phase she also casts her own time dilation field, slowing anyone caught inside it." ,"guide.antarchy.entry.prince.title": "Prince" ,"guide.antarchy.entry.prince.subtitle": "Royal mount record" - ,"guide.antarchy.entry.prince.description": "Prince Eggs hatch into small Princes that grow when fed golden items." - ,"guide.antarchy.entry.prince.description2": "A grown Prince can be tamed and saddled for flight, fires elemental bolts at your enemies, and can command nearby hostile mobs. Feed responsibly; you are raising a small flying warlord." + ,"guide.antarchy.entry.prince.description": "Prince Eggs hatch into Hatchlings bonded to whoever placed the egg. Golden apples grow them a little and enchanted golden apples grow them a lot: Juveniles can be ridden and spit bolts, and Adults can fly, fire beams, and use their signature ability." + ,"guide.antarchy.entry.prince.description2": "The Prince is a ground brawler: he closes in to bite with all three heads, spits fire, ice, and lightning, and as an Adult commands nearby hostile mobs to fight for him. Feed responsibly; you are raising a small flying warlord." ,"guide.antarchy.entry.princess.title": "Princess" ,"guide.antarchy.entry.princess.subtitle": "Royal mount record" - ,"guide.antarchy.entry.princess.description": "Princess Eggs hatch into small Princesses that grow when fed golden items." - ,"guide.antarchy.entry.princess.description2": "A grown Princess can be tamed and saddled for flight, fires elemental bolts, and creates time-dilation fields around enemies." + ,"guide.antarchy.entry.princess.description": "Princess Eggs hatch into Hatchlings bonded to whoever placed the egg. Golden apples grow them a little and enchanted golden apples grow them a lot: Juveniles can be ridden and spit bolts, and Adults can fly, fire beams, and use their signature ability." + ,"guide.antarchy.entry.princess.description2": "The Princess fights at range: she keeps her distance, fires slowing bolts from her orbs, and as an Adult hovers above her foes and traps them in time-dilation fields." ,"subtitles.antarchy.hoverboard_mount": "Hoverboard starts" ,"subtitles.antarchy.hoverboard_dismount": "Hoverboard stops" ,"subtitles.antarchy.hoverboard_idle": "Hoverboard hums" diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/es_es.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/es_es.json index 0850ea36..efdc47ff 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/es_es.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/es_es.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Cambiado a minería 3x3", + "message.antarchy.ultimate_tool.mode_vein": "Cambiado a minería de vetas", "message.antarchy.ultimate_tool.mode_default": "Cambiado a minería normal", "advancements.antarchy.hey_listen.title": "¡Oye, escucha!", "advancements.antarchy.hey_listen.description": "Una Reverie se ha unido a ti.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Clic derecho para girar hacia delante y perforar bloques de Molevore.", "tooltip.antarchy.big_bertha.mode.toreterror": "Clic derecho para lanzarte al aire y caer con una onda de choque en área.", "tooltip.antarchy.ultimate_tools_3x3": "Mayús + clic derecho para alternar la minería 3x3.", + "tooltip.antarchy.ultimate_tools_vein": "Mayús + clic derecho para alternar la minería de vetas.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Mayús + clic derecho para alternar entre minería 3x3 y de vetas.", + "tooltip.antarchy.battle_axe_tree_felling": "Tala árboles enteros. Agáchate para cortar un solo tronco.", "tooltip.antarchy.moggles.reveal": "Otorga Visión nocturna y señala cuevas cercanas.", "tooltip.antarchy.moggles.underground": "Solo funciona cuando no tienes acceso al cielo.", "tooltip.antarchy.cornea_ear.vision": "Otorga Visión nocturna durante %s segundos.", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/fr_fr.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/fr_fr.json index 4a8625e7..c7276816 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/fr_fr.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/fr_fr.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Mode minage 3x3 activé", + "message.antarchy.ultimate_tool.mode_vein": "Mode minage de filons activé", "message.antarchy.ultimate_tool.mode_default": "Mode minage normal activé", "advancements.antarchy.hey_listen.title": "Hé, écoute !", "advancements.antarchy.hey_listen.description": "Une Reverie vous a rejoint.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Clic droit pour tournoyer vers l’avant et forer les blocs de Molevore.", "tooltip.antarchy.big_bertha.mode.toreterror": "Clic droit pour bondir dans les airs et retomber avec une onde de choc de zone.", "tooltip.antarchy.ultimate_tools_3x3": "Maj + clic droit pour activer ou désactiver le minage 3x3.", + "tooltip.antarchy.ultimate_tools_vein": "Maj + clic droit pour activer ou désactiver le minage de filons.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Maj + clic droit pour alterner entre minage 3x3 et minage de filons.", + "tooltip.antarchy.battle_axe_tree_felling": "Abat des arbres entiers. Accroupis-toi pour couper une seule bûche.", "tooltip.antarchy.moggles.reveal": "Accorde Vision nocturne et indique les grottes proches.", "tooltip.antarchy.moggles.underground": "Fonctionne uniquement lorsque vous n’avez pas accès au ciel.", "tooltip.antarchy.cornea_ear.vision": "Accorde Vision nocturne pendant %s secondes.", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/it_it.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/it_it.json index 46a76f73..2447e7eb 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/it_it.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/it_it.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Scavo 3×3 attivato", + "message.antarchy.ultimate_tool.mode_vein": "Scavo di vene attivato", "message.antarchy.ultimate_tool.mode_default": "Scavo normale attivato", "advancements.antarchy.hey_listen.title": "Ehi, ascolta!", "advancements.antarchy.hey_listen.description": "Una Reverie si è unita a te.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Fai clic destro per ruotare in avanti e perforare i blocchi di Molevore.", "tooltip.antarchy.big_bertha.mode.toreterror": "Fai clic destro per balzare in aria e schiantarti con un’onda d’urto ad area.", "tooltip.antarchy.ultimate_tools_3x3": "Maiusc + clic destro per attivare o disattivare lo scavo 3×3.", + "tooltip.antarchy.ultimate_tools_vein": "Maiusc + clic destro per attivare o disattivare lo scavo di vene.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Maiusc + clic destro per alternare scavo 3×3 e scavo di vene.", + "tooltip.antarchy.battle_axe_tree_felling": "Abbatte alberi interi. Accovacciati per tagliare un solo tronco.", "tooltip.antarchy.moggles.reveal": "Fornisce Visione notturna e indica le grotte vicine.", "tooltip.antarchy.moggles.underground": "Funziona solo quando non puoi vedere il cielo.", "tooltip.antarchy.cornea_ear.vision": "Conferisce Visione notturna per %s secondi.", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/ja_jp.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/ja_jp.json index 58d8c476..4dacd3cc 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/ja_jp.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/ja_jp.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "モールヴォア", "message.antarchy.big_bertha.mode.toreterror": "トアテラー", "message.antarchy.ultimate_tool.mode_3x3": "3×3採掘に切り替えました", + "message.antarchy.ultimate_tool.mode_vein": "鉱脈採掘に切り替えました", "message.antarchy.ultimate_tool.mode_default": "通常採掘に切り替えました", "advancements.antarchy.hey_listen.title": "ねえ、聞いて!", "advancements.antarchy.hey_listen.description": "レヴェリーが仲間になりました。", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "右クリックで回転しながら前進し、モールヴォアブロックを掘り抜きます。", "tooltip.antarchy.big_bertha.mode.toreterror": "右クリックで空中へ飛び上がり、範囲衝撃波とともに落下します。", "tooltip.antarchy.ultimate_tools_3x3": "シフトキー+右クリックで3×3採掘を切り替えます。", + "tooltip.antarchy.ultimate_tools_vein": "シフトキー+右クリックで鉱脈採掘を切り替えます。", + "tooltip.antarchy.ultimate_tools_3x3_vein": "シフトキー+右クリックで3×3採掘と鉱脈採掘を切り替えます。", + "tooltip.antarchy.battle_axe_tree_felling": "木を丸ごと伐採します。スニーク中は原木を1つだけ切ります。", "tooltip.antarchy.moggles.reveal": "暗視を付与し、近くの洞窟を示します。", "tooltip.antarchy.moggles.underground": "空が見えない場所でのみ機能します。", "tooltip.antarchy.cornea_ear.vision": "%s秒間暗視を付与します。", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/ko_kr.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/ko_kr.json index 86001626..9eccad8c 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/ko_kr.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/ko_kr.json @@ -792,6 +792,7 @@ "message.antarchy.big_bertha.mode.molevore": "몰레보어", "message.antarchy.big_bertha.mode.toreterror": "토레테러", "message.antarchy.ultimate_tool.mode_3x3": "3x3 채굴 모드로 전환됨", + "message.antarchy.ultimate_tool.mode_vein": "광맥 채굴 모드로 전환됨", "message.antarchy.ultimate_tool.mode_default": "기본 채굴 모드로 전환됨", "advancements.antarchy.hey_listen.title": "야, 들어봐!", "advancements.antarchy.hey_listen.description": "레버리가 당신과 함께합니다.", @@ -830,6 +831,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "공격 시 추가 피해를 입히고 대상을 공중 높이 띄웁니다.", "tooltip.antarchy.big_bertha.mode.toreterror": "사용하여 앞으로 회전하며 몰레보어 블록을 뚫고 나아갑니다.", "tooltip.antarchy.ultimate_tools_3x3": "Shift + 사용: 3x3 채굴을 켜거나 끕니다.", + "tooltip.antarchy.ultimate_tools_vein": "Shift + 사용: 광맥 채굴을 켜거나 끕니다.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Shift + 사용: 3x3 채굴과 광맥 채굴을 전환합니다.", + "tooltip.antarchy.battle_axe_tree_felling": "나무 전체를 벱니다. 웅크리면 통나무 하나만 벱니다.", "tooltip.antarchy.moggles.reveal": "야간 시야를 부여하고 근처 동굴을 가리킵니다.", "tooltip.antarchy.moggles.underground": "하늘이 가려진 곳에서만 작동합니다.", "tooltip.antarchy.cornea_ear.vision": "%s초 동안 야간 시야를 부여합니다.", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/pt_br.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/pt_br.json index 62f2f944..9e812e1a 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/pt_br.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/pt_br.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Alternado para Mineração 3x3", + "message.antarchy.ultimate_tool.mode_vein": "Alternado para Mineração de Veios", "message.antarchy.ultimate_tool.mode_default": "Alternado para Mineração Padrão", "advancements.antarchy.hey_listen.title": "Ei, Escute!", "advancements.antarchy.hey_listen.description": "Uma Reverie se juntou a você.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Clique com o botão direito para girar para a frente e perfurar blocos de Molevore.", "tooltip.antarchy.big_bertha.mode.toreterror": "Clique com o botão direito para se lançar ao ar e cair com uma onda de choque em área.", "tooltip.antarchy.ultimate_tools_3x3": "Shift + clique com o botão direito para alternar a Mineração 3x3.", + "tooltip.antarchy.ultimate_tools_vein": "Shift + clique com o botão direito para alternar a Mineração de Veios.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Shift + clique com o botão direito para alternar entre Mineração 3x3 e de Veios.", + "tooltip.antarchy.battle_axe_tree_felling": "Derruba árvores inteiras. Agache para cortar um único tronco.", "tooltip.antarchy.moggles.reveal": "Concede Visão Noturna e aponta para cavernas próximas.", "tooltip.antarchy.moggles.underground": "Funciona apenas quando você não tem acesso ao céu.", "tooltip.antarchy.cornea_ear.vision": "Concede Visão Noturna por %s segundos.", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/ru_ru.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/ru_ru.json index b6259002..893d17ec 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/ru_ru.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/ru_ru.json @@ -488,6 +488,7 @@ "message.antarchy.big_bertha.mode.molevore": "Кротожор", "message.antarchy.big_bertha.mode.toreterror": "Тортеррор", "message.antarchy.ultimate_tool.mode_3x3": "Включено копание 3x3", + "message.antarchy.ultimate_tool.mode_vein": "Включена добыча жил", "message.antarchy.ultimate_tool.mode_default": "Включено обычное копание", "advancements.antarchy.hey_listen.title": "Эй, послушай", "advancements.antarchy.hey_listen.description": "К вам присоединилась грёза.", @@ -520,6 +521,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "ПКМ для рывка вперёд и бурения сквозь блоки кротожора.", "tooltip.antarchy.big_bertha.mode.toreterror": "ПКМ запускает вас в воздух и обрушивает вниз с ударной волной по площади.", "tooltip.antarchy.ultimate_tools_3x3": "Shift + ПКМ для переключения режима копания 3x3.", + "tooltip.antarchy.ultimate_tools_vein": "Shift + ПКМ для переключения добычи жил.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Shift + ПКМ переключает копание 3x3 и добычу жил.", + "tooltip.antarchy.battle_axe_tree_felling": "Срубает дерево целиком. Присядьте, чтобы срубить одно бревно.", "tooltip.antarchy.moggles.reveal": "Дают ночное зрение и указывают на ближайшие пещеры.", "tooltip.antarchy.moggles.underground": "Работает только если над вами нет открытого неба.", "tooltip.antarchy.cornea_ear.vision": "Даёт Ночное зрение на %s секунд.", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/zh_cn.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/zh_cn.json index 643d8f0e..0cf821af 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/zh_cn.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/zh_cn.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "莫尔沃尔", "message.antarchy.big_bertha.mode.toreterror": "托尔泰罗尔", "message.antarchy.ultimate_tool.mode_3x3": "已切换至3×3挖掘", + "message.antarchy.ultimate_tool.mode_vein": "已切换至连锁挖矿", "message.antarchy.ultimate_tool.mode_default": "已切换至默认挖掘", "advancements.antarchy.hey_listen.title": "嘿,听着!", "advancements.antarchy.hey_listen.description": "一只雷弗里加入了你。", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "右键旋转向前并钻穿莫尔沃尔方块。", "tooltip.antarchy.big_bertha.mode.toreterror": "右键跃向空中并以范围冲击波砸落。", "tooltip.antarchy.ultimate_tools_3x3": "潜行键+右键切换3×3挖掘。", + "tooltip.antarchy.ultimate_tools_vein": "潜行键+右键切换连锁挖矿。", + "tooltip.antarchy.ultimate_tools_3x3_vein": "潜行键+右键在3×3挖掘与连锁挖矿之间切换。", + "tooltip.antarchy.battle_axe_tree_felling": "一次砍倒整棵树。潜行时只砍一块原木。", "tooltip.antarchy.moggles.reveal": "获得夜视并指向附近洞穴。", "tooltip.antarchy.moggles.underground": "仅在无法接触天空时生效。", "tooltip.antarchy.cornea_ear.vision": "获得%s秒夜视。", diff --git a/common-1.20.1/src/main/resources/assets/antarchy/lang/zh_tw.json b/common-1.20.1/src/main/resources/assets/antarchy/lang/zh_tw.json index 246f582c..3d88f3f5 100644 --- a/common-1.20.1/src/main/resources/assets/antarchy/lang/zh_tw.json +++ b/common-1.20.1/src/main/resources/assets/antarchy/lang/zh_tw.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "莫爾沃爾", "message.antarchy.big_bertha.mode.toreterror": "托爾泰羅爾", "message.antarchy.ultimate_tool.mode_3x3": "已切換至3×3挖掘", + "message.antarchy.ultimate_tool.mode_vein": "已切換至連鎖挖礦", "message.antarchy.ultimate_tool.mode_default": "已切換至預設挖掘", "advancements.antarchy.hey_listen.title": "嘿,聽著!", "advancements.antarchy.hey_listen.description": "一隻雷弗里加入了你。", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "右鍵旋轉向前並鑽穿莫爾沃爾方塊。", "tooltip.antarchy.big_bertha.mode.toreterror": "右鍵躍向空中並以範圍衝擊波砸落。", "tooltip.antarchy.ultimate_tools_3x3": "潛行鍵+右鍵切換3×3挖掘。", + "tooltip.antarchy.ultimate_tools_vein": "潛行鍵+右鍵切換連鎖挖礦。", + "tooltip.antarchy.ultimate_tools_3x3_vein": "潛行鍵+右鍵在3×3挖掘與連鎖挖礦之間切換。", + "tooltip.antarchy.battle_axe_tree_felling": "一次砍倒整棵樹。潛行時只砍一塊原木。", "tooltip.antarchy.moggles.reveal": "獲得夜視並指向附近洞穴。", "tooltip.antarchy.moggles.underground": "僅在無法接觸天空時生效。", "tooltip.antarchy.cornea_ear.vision": "獲得%s秒夜視。", diff --git a/common-1.20.1/src/main/resources/data/antarchy/worldgen/biome/cavaryn_moleworm_caves.json b/common-1.20.1/src/main/resources/data/antarchy/worldgen/biome/cavaryn_moleworm_caves.json index 869ded6c..76649eb1 100644 --- a/common-1.20.1/src/main/resources/data/antarchy/worldgen/biome/cavaryn_moleworm_caves.json +++ b/common-1.20.1/src/main/resources/data/antarchy/worldgen/biome/cavaryn_moleworm_caves.json @@ -55,7 +55,8 @@ ], [ "antarchy:moleworm_caves_creepvine", - "antarchy:moleworm_caves_hanging_creeproots" + "antarchy:moleworm_caves_hanging_creeproots", + "antarchy:termite_nest" ], [] ], diff --git a/common-1.20.1/src/main/resources/data/antarchy/worldgen/biome/wormy_caves.json b/common-1.20.1/src/main/resources/data/antarchy/worldgen/biome/wormy_caves.json index 709f910c..a29b0c88 100644 --- a/common-1.20.1/src/main/resources/data/antarchy/worldgen/biome/wormy_caves.json +++ b/common-1.20.1/src/main/resources/data/antarchy/worldgen/biome/wormy_caves.json @@ -52,7 +52,8 @@ "antarchy:wormy_caves_creepvine", "antarchy:wormy_caves_hanging_creeproots", "antarchy:wormy_caves_molting_vines", - "antarchy:wormy_caves_ground_molting_vines" + "antarchy:wormy_caves_ground_molting_vines", + "antarchy:termite_nest" ], [] ], diff --git a/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest.json b/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest.json index 81555f52..bd766f59 100644 --- a/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest.json +++ b/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 24 + "chance": 8 }, { "type": "minecraft:in_square" diff --git a/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest_magma.json b/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest_magma.json index 850042eb..f8e3a1d2 100644 --- a/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest_magma.json +++ b/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest_magma.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 24 + "chance": 8 }, { "type": "minecraft:in_square" diff --git a/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest.json b/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest.json index 70a93fad..0b01f7bd 100644 --- a/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest.json +++ b/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest.json @@ -3,14 +3,22 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 88 + "chance": 24 }, { "type": "minecraft:in_square" }, { - "type": "minecraft:heightmap", - "heightmap": "WORLD_SURFACE_WG" + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "min_inclusive": { + "absolute": 8 + }, + "max_inclusive": { + "absolute": 190 + } + } }, { "type": "minecraft:biome" diff --git a/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest_cavaryn.json b/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest_cavaryn.json index 933bd153..3136c852 100644 --- a/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest_cavaryn.json +++ b/common-1.20.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest_cavaryn.json @@ -3,14 +3,22 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 44 + "chance": 16 }, { "type": "minecraft:in_square" }, { - "type": "minecraft:heightmap", - "heightmap": "WORLD_SURFACE_WG" + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "min_inclusive": { + "absolute": 8 + }, + "max_inclusive": { + "absolute": 190 + } + } }, { "type": "minecraft:biome" diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatBridge.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatBridge.java index 07432a22..85dc9177 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatBridge.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatBridge.java @@ -31,11 +31,6 @@ public interface InfinityCompatBridge { return InfinityWarpResult.REJECTED; } - /** - * Converts an already-ignited vanilla Nether portal frame at {@code anyPortalBlockPos} into a real, permanent - * Infinite Dimensions portal to {@code dimensionId}, generating the dimension first if it doesn't exist yet. - * Mirrors what Infinity itself does when a written book is thrown into a lit portal. - */ default boolean createPhysicalPortal(ServerLevel level, BlockPos anyPortalBlockPos, ResourceLocation dimensionId) { return false; } 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 560a53d0..5ba86f5d 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 @@ -107,6 +107,9 @@ public final class AntarchySettings { private static int ultimateCrossbowEnchantability = 20; private static int ultimateMaceEnchantability = 20; private static boolean ultimateToolsThreeByThreeEnabled = true; + private static boolean ultimateToolsVeinMiningEnabled = true; + private static int ultimateToolsVeinMiningMaxBlocks = 64; + private static int ultimateToolsTreeFellingMaxLogs = 128; private static boolean ultimateArmorComesEnchanted = true; private static int ultimateHelmetArmorValue = 6; private static int ultimateChestplateArmorValue = 11; @@ -299,6 +302,7 @@ public final class AntarchySettings { private static double royalBossKnockbackResistance = 1.0D; private static double royalBossStepHeight = 3.0D; private static double royalBossMaxSingleHitDamage = 250.0D; + private static double royalBossHitOverflowRate = 0.25D; private static double royalBossBiteReach = 12.0D; private static double royalBossBiteDamageMultiplier = 1.6D; private static int royalBossBiteCooldownTicks = 45; @@ -563,7 +567,6 @@ public final class AntarchySettings { private static int bloodCrystalAppleDurationTicks = 2400; private static int bloodCrystalAppleShieldRechargeTicks = 600; private static int bloodCrystalHardMaxShields = 10; - // Armor stats (iron defense, gold durability, 0 toughness by default) private static int bloodCrystalHelmetDefense = 3; private static int bloodCrystalChestplateDefense = 7; private static int bloodCrystalLeggingsDefense = 6; @@ -975,6 +978,18 @@ public final class AntarchySettings { return ultimateToolsThreeByThreeEnabled; } + public static boolean ultimateToolsVeinMiningEnabled() { + return ultimateToolsVeinMiningEnabled; + } + + public static int ultimateToolsVeinMiningMaxBlocks() { + return ultimateToolsVeinMiningMaxBlocks; + } + + public static int ultimateToolsTreeFellingMaxLogs() { + return ultimateToolsTreeFellingMaxLogs; + } + public static boolean ultimateArmorComesEnchanted() { return ultimateArmorComesEnchanted; } @@ -1625,6 +1640,18 @@ public final class AntarchySettings { ultimateToolsThreeByThreeEnabled = value; } + public static void setUltimateToolsVeinMiningEnabled(boolean value) { + ultimateToolsVeinMiningEnabled = value; + } + + public static void setUltimateToolsVeinMiningMaxBlocks(int value) { + ultimateToolsVeinMiningMaxBlocks = value; + } + + public static void setUltimateToolsTreeFellingMaxLogs(int value) { + ultimateToolsTreeFellingMaxLogs = value; + } + public static void setUltimateArmorComesEnchanted(boolean value) { ultimateArmorComesEnchanted = value; } @@ -2230,6 +2257,9 @@ public final class AntarchySettings { public static double royalBossMaxSingleHitDamage() { return royalBossMaxSingleHitDamage; } public static void setRoyalBossMaxSingleHitDamage(double v) { royalBossMaxSingleHitDamage = v; } + public static double royalBossHitOverflowRate() { return royalBossHitOverflowRate; } + public static void setRoyalBossHitOverflowRate(double v) { royalBossHitOverflowRate = v; } + public static double royalBossBiteReach() { return royalBossBiteReach; } public static void setRoyalBossBiteReach(double v) { royalBossBiteReach = v; } @@ -2499,7 +2529,6 @@ public final class AntarchySettings { public static int reverieDuplicationCooldownTicks() { return reverieDuplicationCooldownTicks; } public static void setReverieDuplicationCooldownTicks(int v){ reverieDuplicationCooldownTicks = v; } - // Hardcoded AI tuning — getters only, no config wiring public static double reveriePreferredFollowMinDistance() { return reveriePreferredFollowMinDistance; } public static double reveriePreferredFollowMaxDistance() { return reveriePreferredFollowMaxDistance; } public static double reverieCatchUpDistance() { return reverieCatchUpDistance; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java index 9d47b1a2..8b8e020e 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java @@ -11,6 +11,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.material.Fluid; public final class AntarchyTags { @@ -157,4 +158,11 @@ public final class AntarchyTags { private Biomes() { } } + + public static final class DimensionTypes { + public static final TagKey NO_MANTIS_CLIMB = TagKey.create(Registries.DIMENSION_TYPE, id("no_mantis_climb")); + + private DimensionTypes() { + } + } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/advancement/AntarchyAdvancementTriggers.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/advancement/AntarchyAdvancementTriggers.java index 59f6e83e..5eb6b348 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/advancement/AntarchyAdvancementTriggers.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/advancement/AntarchyAdvancementTriggers.java @@ -30,11 +30,6 @@ public final class AntarchyAdvancementTriggers { register((id, trigger) -> CriteriaTriggers.register(id.toString(), trigger)); } - /** - * Registers these triggers through the active loader's lifecycle hook. - * NeoForge calls this from its trigger-type RegisterEvent; Fabric can call - * the no-argument overload during its initializer. - */ public static void register(BiConsumer> registrar) { registrar.accept(ResourceLocation.fromNamespaceAndPath("antarchy", "crossed_gravity_throat"), CROSSING); registrar.accept(ResourceLocation.fromNamespaceAndPath("antarchy", "horde_phase_changed"), HORDE_PHASE); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/DuplicatorTreeLogic.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/DuplicatorTreeLogic.java index 49cced4e..6ed83453 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/DuplicatorTreeLogic.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/DuplicatorTreeLogic.java @@ -25,7 +25,6 @@ public final class DuplicatorTreeLogic { private static final int LOG_SEARCH_BELOW = 5; private static final int LOG_SEARCH_ABOVE = 1; - // Cache center log pos per chunk. WeakHashMap lets levels be GC'd when unloaded. private static final WeakHashMap> CENTER_LOG_CACHE = new WeakHashMap<>(); private DuplicatorTreeLogic() { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/GlimmeringReedBlock.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/GlimmeringReedBlock.java index d9f44d41..dac49bec 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/GlimmeringReedBlock.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/GlimmeringReedBlock.java @@ -20,7 +20,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.phys.BlockHitResult; -/** A two-block-tall, light-emitting reed found around Lumen pools. */ public final class GlimmeringReedBlock extends DoublePlantBlock implements BonemealableBlock { public static final MapCodec CODEC = Block.simpleCodec(GlimmeringReedBlock::new); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodLeavesBlock.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodLeavesBlock.java index 88b3c0ab..bb2a0792 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodLeavesBlock.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodLeavesBlock.java @@ -25,12 +25,6 @@ import net.minecraft.world.level.material.Fluids; public class OuranwoodLeavesBlock extends LeavesBlock implements BonemealableBlock { public static final MapCodec CODEC = Block.simpleCodec(OuranwoodLeavesBlock::new); - /* - * We still include vanilla LeavesBlock.DISTANCE in the state definition because - * LeavesBlock's constructor sets it. - * - * This is the real Ouranwood decay distance. - */ public static final IntegerProperty OURANWOOD_DISTANCE = IntegerProperty.create("ouranwood_distance", 1, 17); public static final BooleanProperty PERSISTENT = LeavesBlock.PERSISTENT; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodSquirrelNestBlock.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodSquirrelNestBlock.java index 585e0ede..610f3ed0 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodSquirrelNestBlock.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodSquirrelNestBlock.java @@ -13,12 +13,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; -/** - * Invisible world-gen-only marker placed inside a flying squirrel hollow. - * Schedules itself to replace with COARSE_DIRT and spawn squirrels shortly - * after the chunk loads, so entity creation never blocks the gen thread. - * No BlockItem is registered, so this block never appears in creative or JEI. - */ public class OuranwoodSquirrelNestBlock extends Block { public static final IntegerProperty SQUIRREL_COUNT = IntegerProperty.create("squirrels", 1, 3); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/RoyalEggBlock.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/RoyalEggBlock.java index 409dfb9a..99d4bd0f 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/RoyalEggBlock.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/RoyalEggBlock.java @@ -168,11 +168,6 @@ public abstract class RoyalEggBlock extends BaseEntityBlock { } } - /** - * Vanilla FallingBlockEntity always falls in world-down direction, so an - * unsupported egg placed with inverted underside gravity is stepped - * upward toward its support instead of being handed to that entity. - */ private void tickInvertedFall(BlockState state, ServerLevel level, BlockPos pos) { BlockPos above = pos.above(); if (!FallingBlock.isFree(level.getBlockState(above)) || above.getY() > level.getMaxBuildHeight()) { 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 fba75d35..512c3207 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 @@ -65,8 +65,6 @@ public final class QueenTrailSpawnMarkerBlockEntity extends BlockEntity { if (!nearbyPlayer) { return; } - // The Queen is large enough to span several chunks. Ensure the area around - // the arrival point is available before checking its collision box. for (int chunkX = (marker.spawnPos.getX() - 16) >> 4; chunkX <= (marker.spawnPos.getX() + 16) >> 4; chunkX++) { for (int chunkZ = (marker.spawnPos.getZ() - 16) >> 4; chunkZ <= (marker.spawnPos.getZ() + 16) >> 4; chunkZ++) { level.getChunk(chunkX, chunkZ); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UnderVaultBlockEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UnderVaultBlockEntity.java index d9ba2465..694bceca 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UnderVaultBlockEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UnderVaultBlockEntity.java @@ -47,9 +47,6 @@ public final class UnderVaultBlockEntity extends BlockEntity { public static void serverTick(ServerLevel level, BlockPos pos, BlockState state, UnderVaultBlockEntity blockEntity) { blockEntity.vaultData.setLevel(level); - // The vanilla vault detector can miss this ceiling-mounted wrapper because its - // block state has a separate render-facing property. Keep the state synchronized - // with the same four-block activation range before running vanilla's state machine. boolean playerNearby = !level.getEntitiesOfClass(Player.class, new AABB(pos).inflate(4.0D), player -> !player.isSpectator()).isEmpty(); if (state.getValue(UnderVaultBlock.STATE) == VaultState.INACTIVE && playerNearby && !blockEntity.playerWasNearby) { state = state.setValue(UnderVaultBlock.STATE, VaultState.ACTIVE); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UndertrialSpawnContext.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UndertrialSpawnContext.java index 2f03fa6b..36729689 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UndertrialSpawnContext.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UndertrialSpawnContext.java @@ -1,10 +1,5 @@ package com.craisinlord.antarchy.content.block.entity; -/** - * Identifies spawn-rule checks made by an Undertrial spawner's vanilla - * TrialSpawner tick. The context is scoped to the current server-thread call - * so ordinary trial spawners and all other spawn paths retain vanilla rules. - */ public final class UndertrialSpawnContext implements AutoCloseable { private static final ThreadLocal DEPTH = ThreadLocal.withInitial(() -> 0); 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 3f236630..56b0e901 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 @@ -190,8 +190,6 @@ public final class UndertrialSpawnerBlockEntity extends BlockEntity implements T if (this.level == null) { return; } - // Match vanilla Trial Spawner interaction: override the next mob's entity id while - // preserving weighted potentials, ominous settings, and the trial's reward configuration. this.trialSpawner.getData().setEntityId(this.trialSpawner, this.level.random, entityType); this.markUpdated(); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/AntarchyGameClientState.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/AntarchyGameClientState.java index 62d4f4c9..7d9697f8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/AntarchyGameClientState.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/AntarchyGameClientState.java @@ -6,7 +6,6 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import net.minecraft.core.BlockPos; -/** Client state for Antarchy-owned games hosted by AntOS. */ public final class AntarchyGameClientState { private static final Map GAME_STATES = new ConcurrentHashMap<>(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/MoonSkyTracker.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/MoonSkyTracker.java index 08df86a3..9b5cc52b 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/MoonSkyTracker.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/MoonSkyTracker.java @@ -17,7 +17,6 @@ public final class MoonSkyTracker { private static final long MAX_AGE_MILLIS = 1500L; private static final double AIM_COSINE = Math.cos(Math.toRadians(PortalGunMoonMath.AIM_TOLERANCE_DEGREES)); private static Vec3 direction; - // Weak so a dimension change or logout doesn't pin the old client world in memory. private static WeakReference level = new WeakReference<>(null); private static long recordedAt; private static Consumer sender = payload -> {}; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunCrosshairRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunCrosshairRenderer.java index e568acf1..4d6acf31 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunCrosshairRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunCrosshairRenderer.java @@ -20,7 +20,6 @@ public final class PortalGunCrosshairRenderer { private static final int HALF_WIDTH = 17; private static final float MISSING_BRIGHTNESS = 0.3F; private static final float MISSING_ALPHA = 0.75F; - // Weak so a dimension change or logout doesn't pin the old client world in memory. private static WeakReference cachedLevel = new WeakReference<>(null); private static long cachedGameTime = Long.MIN_VALUE; private static UUID cachedGunId; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunIndicatorClientState.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunIndicatorClientState.java index 956e7d91..f5923617 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunIndicatorClientState.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/PortalGunIndicatorClientState.java @@ -12,7 +12,6 @@ import net.minecraft.client.multiplayer.ClientLevel; public final class PortalGunIndicatorClientState { private static final Map STATES = new HashMap<>(); - // Weak so a dimension change or logout doesn't pin the old client world in memory. private static WeakReference level = new WeakReference<>(null); private static long lastRequestTick = Long.MIN_VALUE; private static UUID lastRequestedGun; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntarchyComputerGames.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntarchyComputerGames.java index 391ae0b0..41cd5b6c 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntarchyComputerGames.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/game/AntarchyComputerGames.java @@ -8,14 +8,11 @@ import net.minecraft.resources.ResourceLocation; import java.util.function.IntPredicate; import java.util.function.Predicate; -/** Registers Antarchy's native games with the AntOS Games app. */ public final class AntarchyComputerGames { private AntarchyComputerGames() {} public static void register() { registerIfMissing(game("basilisk", "BASILISK", () -> { - // AntOS 1.2.1 creates game sessions without passing the computer position. - // Keep Basilisk playable without a position-bound score callback. BasiliskProgram program = new BasiliskProgram(true, 0, 0, score -> {}); return new GameSession(program::tick, program::render, program::keyPressed, ignored -> false); })); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerFrogModel.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerFrogModel.java index a71dfd60..24b9bbc2 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerFrogModel.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerFrogModel.java @@ -8,11 +8,6 @@ import net.minecraft.client.model.FrogModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.util.Mth; -/** - * Reuses vanilla Frog geometry ({@link FrogModel}/{@code ModelLayers.FROG}) for the Frog - * Glimmer variant instead of an ill-fitting GeckoLib placeholder mesh, with a simplified - * walk/idle animation (GlimmerEntity has no Frog-specific jump/tongue state). - */ public class GlimmerFrogModel extends EntityModel { private final ModelPart root; private final ModelPart head; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/AlphaMantisRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/AlphaMantisRenderer.java index 6ee5cedf..82a8e718 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/AlphaMantisRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/AlphaMantisRenderer.java @@ -9,7 +9,6 @@ public class AlphaMantisRenderer extends GeoEntityRenderer { public AlphaMantisRenderer(EntityRendererProvider.Context context) { super(context, new AlphaMantisModel()); this.shadowRadius = 1.5F; - // Mantis renders at 1.25x; the alpha is 1.5x bigger overall this.withScale(1.875F); } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ElythiaSkyRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ElythiaSkyRenderer.java index 1dec4295..d8013b2a 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ElythiaSkyRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ElythiaSkyRenderer.java @@ -74,7 +74,6 @@ public final class ElythiaSkyRenderer { float starBrightness = level.getStarBrightness(partialTick) * (1.0F - rainLevel); double timeDegrees = (level.getDayTime() + partialTick) * (360.0D / 24000.0D); - // Blend in a dark purple when it's night (starBrightness > 0) float nightPurpleR = 0.055F; float nightPurpleG = 0.010F; float nightPurpleB = 0.120F; @@ -169,10 +168,10 @@ public final class ElythiaSkyRenderer { private static float[] pickStarColor(Random random) { float roll = random.nextFloat(); - if (roll < 0.80F) return new float[]{1.0F, 1.0F, 1.0F}; // white - if (roll < 0.87F) return new float[]{0.85F, 0.60F, 1.00F}; // light purple - if (roll < 0.94F) return new float[]{1.00F, 0.95F, 0.50F}; // yellow - return new float[]{1.0F, 0.45F, 0.45F}; // red + if (roll < 0.80F) return new float[]{1.0F, 1.0F, 1.0F}; + if (roll < 0.87F) return new float[]{0.85F, 0.60F, 1.00F}; + if (roll < 0.94F) return new float[]{1.00F, 0.95F, 0.50F}; + return new float[]{1.0F, 0.45F, 0.45F}; } private static void renderSunrise(PoseStack poseStack, Matrix4f projectionMatrix, ClientLevel level, float partialTick, float rainLevel) { @@ -212,22 +211,18 @@ public final class ElythiaSkyRenderer { private static void renderCelestialBodies(Matrix4f modelViewMatrix, Matrix4f projectionMatrix, double timeDegrees, float rainLevel) { - // Purple sun float sun1Orbit = orbitAngle(timeDegrees, 1.0D, 0.0D); renderBodyGlow(modelViewMatrix, projectionMatrix, sun1Orbit, 0.0F, 0xD06BFF, rainLevel, 70.0F); renderTexturedBody(modelViewMatrix, projectionMatrix, sun1Orbit, 0.0F, 38.0F, 0xD06BFF, 1.0F, SUN_TEXTURE, false, 0, orbitAngle(timeDegrees, 0.8D, 0.0D)); - // Orange sub float sun2Orbit = orbitAngle(timeDegrees, 0.73D, 54.0D); renderBodyGlow(modelViewMatrix, projectionMatrix, sun2Orbit, -14.0F, 0xFF9A33, rainLevel, 70.0F); renderTexturedBody(modelViewMatrix, projectionMatrix, sun2Orbit, -14.0F, 16.0F, 0xFF9A33, 1.0F, SUN_TEXTURE, false, 0, orbitAngle(timeDegrees, -0.5D, 0.0D)); - // Dark green moon float moon2Orbit = orbitAngle(timeDegrees, 1.27D, 228.0D); renderBodyGlow(modelViewMatrix, projectionMatrix, moon2Orbit, 36.0F, 0x4FD84D, rainLevel, 78.0F); renderTexturedBody(modelViewMatrix, projectionMatrix, moon2Orbit, 36.0F, 14.0F, 0x4FD84D, 1.0F, MOON_TEXTURE, true, 1, orbitAngle(timeDegrees, 0.3D, 0.0D)); - // Light green moon float moon3Orbit = orbitAngle(timeDegrees, 0.38D, 122.0D); renderBodyGlow(modelViewMatrix, projectionMatrix, moon3Orbit, -34.0F, 0xA3FF8F, rainLevel, 78.0F); renderTexturedBody(modelViewMatrix, projectionMatrix, moon3Orbit, -34.0F, 12.0F, 0xA3FF8F, 1.0F, MOON_TEXTURE, true, 2, orbitAngle(timeDegrees, -0.6D, 0.0D)); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalBossRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalBossRenderer.java index cae52e7f..9f742665 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalBossRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalBossRenderer.java @@ -193,9 +193,6 @@ public class RoyalBossRenderer extends GeoEntityRenderer { float outerV = -time * 0.25F; float innerV = -time * 0.25F * 0.5F; - // Tremorzilla renders the beam in local +Z space. Keeping the mesh in that - // space is important: the beam textures are authored for these exact face - // coordinates and are not interchangeable with a world-space billboard. float yaw = (float) Math.atan2(dir.z, dir.x); float pitch = (float) Math.acos(dir.y); poseStack.pushPose(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalIndicatorRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalIndicatorRenderer.java index 44936b80..236a9990 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalIndicatorRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalIndicatorRenderer.java @@ -79,8 +79,6 @@ public final class RoyalIndicatorRenderer { out.addVertex(pose, right, top, depth).setUv(1.0F, 0.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, 1.0F); out.addVertex(pose, left, top, depth).setUv(0.0F, 0.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, 1.0F); - // Emit the reverse winding as well. The crown is viewed from every angle, and - // a single-sided quad can vanish when the renderer's culling state rejects it. out.addVertex(pose, left, top, depth).setUv(0.0F, 0.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, -1.0F); out.addVertex(pose, right, top, depth).setUv(1.0F, 0.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, -1.0F); out.addVertex(pose, right, bottom, depth).setUv(1.0F, 1.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, -1.0F); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TigerEyeCamouflageTextureResolver.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TigerEyeCamouflageTextureResolver.java index d79ed581..d937dcfa 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TigerEyeCamouflageTextureResolver.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TigerEyeCamouflageTextureResolver.java @@ -22,9 +22,6 @@ import net.minecraft.world.level.block.state.BlockState; public final class TigerEyeCamouflageTextureResolver { public record ResolvedTexture(ResourceLocation texture, int argbTint) {} - // PlayerModel's skin layout is always laid out on a 64x64 canvas, regardless of the - // block texture's actual size, so the generated overlay texture must match that grid - // for every body part to sample the block texture at the same pixel density. private static final int SKIN_SIZE = 64; private static final Map CACHE = new ConcurrentHashMap<>(); private static final ResourceLocation FALLBACK_TEXTURE = ResourceLocation.withDefaultNamespace("textures/block/stone.png"); @@ -102,7 +99,6 @@ public final class TigerEyeCamouflageTextureResolver { try (NativeImage sourceImage = NativeImage.read(stream)) { int tileWidth = sourceImage.getWidth(); - // Animated block textures stack frames vertically below a square first frame. int tileHeight = tileWidth <= sourceImage.getHeight() ? tileWidth : sourceImage.getHeight(); NativeImage canvas = new NativeImage(SKIN_SIZE, SKIN_SIZE, false); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/WindVortexRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/WindVortexRenderer.java index 8855b060..c7aaabcb 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/WindVortexRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/WindVortexRenderer.java @@ -94,9 +94,6 @@ public class WindVortexRenderer extends EntityRenderer { addVertex(consumer, pose, end.x + offset.x, end.y + offset.y, end.z + offset.z, red, green, blue, alpha); addVertex(consumer, pose, start.x + offset.x, start.y + offset.y, start.z + offset.z, red, green, blue, alpha); - // The lightning render type can cull one winding from some camera - // angles. Emit the opposite winding as well so every ribbon is - // visible from both sides. addVertex(consumer, pose, start.x + offset.x, start.y + offset.y, start.z + offset.z, red, green, blue, alpha); addVertex(consumer, pose, end.x + offset.x, end.y + offset.y, end.z + offset.z, red, green, blue, alpha); addVertex(consumer, pose, end.x - offset.x, end.y - offset.y, end.z - offset.z, red, green, blue, alpha); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/glimmer/GlimmerRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/glimmer/GlimmerRenderer.java index 62c5e00c..c49bd339 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/glimmer/GlimmerRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/glimmer/GlimmerRenderer.java @@ -48,9 +48,6 @@ public class GlimmerRenderer extends GeoEntityRenderer { float growth = entity.getGrowthScale(); poseStack.scale(growth, growth, growth); - // Compute body yaw directly from the entity's own tracked fields rather than trusting - // the ambient entityYaw parameter, so the body pose and the head-offset math below stay - // self-consistent. float bodyYaw = Mth.rotLerp(partialTick, entity.yBodyRotO, entity.yBodyRot); poseStack.mulPose(Axis.YP.rotationDegrees(180.0F - bodyYaw)); poseStack.scale(-1.0F, -1.0F, 1.0F); 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 3d543542..69dae02f 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 @@ -82,7 +82,6 @@ public final class QueenLocateCommand { return 0; } - /** Finds the nearest generated Queen spawn site without spawning her. Loads (and may generate) the checked chunks. */ public static NearestSite findNearestSite(ServerLevel thoraxis, int originX, int originZ) { int cellX = Math.floorDiv(originX, QueenTrailGrid.SPACING); int cellZ = Math.floorDiv(originZ, QueenTrailGrid.SPACING); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/AntarchyArchiveLocators.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/AntarchyArchiveLocators.java index 64feaaae..985d6354 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/AntarchyArchiveLocators.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/AntarchyArchiveLocators.java @@ -10,7 +10,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.phys.AABB; -/** Archive coordinate lookups for royals that live on grids rather than in vanilla structures. */ public final class AntarchyArchiveLocators { private AntarchyArchiveLocators() { } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/AntarchyGameSavedData.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/AntarchyGameSavedData.java index 5040b0ad..e12b0285 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/AntarchyGameSavedData.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/computer/AntarchyGameSavedData.java @@ -10,7 +10,6 @@ import net.minecraft.nbt.ListTag; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.saveddata.SavedData; -/** Persistent Antarchy game progress keyed by AntOS computer location. */ public final class AntarchyGameSavedData extends SavedData { private static final String ID = "antarchy_computer_games"; private final Map games = new HashMap<>(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodglassWardEffect.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodglassWardEffect.java index cbc03936..4b60ccdc 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodglassWardEffect.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodglassWardEffect.java @@ -21,7 +21,7 @@ public final class BloodglassWardEffect extends MobEffect { public void addAttributeModifiers(AttributeMap attributeMap, int amplifier) { AttributeInstance instance = attributeMap.getInstance(AntarchyObjects.BLOODGLASS_MAX_HEARTS.get()); if (instance == null) return; - instance.addTransientModifier( + instance.addOrUpdateTransientModifier( new AttributeModifier(MODIFIER_ID, amplifier + 1, AttributeModifier.Operation.ADD_VALUE) ); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/GrowthMobEffect.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/GrowthMobEffect.java index 3ae4fe5d..fa9a2190 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/GrowthMobEffect.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/GrowthMobEffect.java @@ -23,7 +23,7 @@ public final class GrowthMobEffect extends MobEffect { AttributeInstance instance = attributeMap.getInstance(Attributes.SCALE); if (instance == null) return; double amount = AntarchySettings.growthPotionDelta() * (amplifier + 1); - instance.addTransientModifier( + instance.addOrUpdateTransientModifier( new AttributeModifier(MODIFIER_ID, amount, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL) ); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/JudgmentMarkAccess.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/JudgmentMarkAccess.java index 3026c5bf..4b516bd6 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/JudgmentMarkAccess.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/JudgmentMarkAccess.java @@ -1,6 +1,5 @@ package com.craisinlord.antarchy.content.effect; -/** Synchronized, presentation-only state for the short-lived Royal Judgment mark. */ public interface JudgmentMarkAccess { boolean antarchy$isJudgmentMarked(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/JudgmentMarkManager.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/JudgmentMarkManager.java index 934cd075..962ce419 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/JudgmentMarkManager.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/JudgmentMarkManager.java @@ -14,14 +14,12 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -/** Server-owned, player-specific Judgment marks. The visible bit is synchronized by vanilla entity data. */ public final class JudgmentMarkManager { private static final Map MARKS = new WeakHashMap<>(); private JudgmentMarkManager() { } - /** Returns true when this owner had already marked this target before the current hit. */ public static boolean recordSuccessfulHit(Player owner, LivingEntity target) { if (!(owner instanceof ServerPlayer serverPlayer) || !(target.level() instanceof ServerLevel level) || owner.level() != target.level() || !hasGuardianArmor(owner) || !target.isAlive()) { @@ -66,7 +64,6 @@ public final class JudgmentMarkManager { return entity instanceof LivingEntity living && living.isAlive() ? living : null; } - /** Prunes marks from this target and updates the vanilla-synchronized render bit. */ public static void tickTarget(LivingEntity target) { if (!(target.level() instanceof ServerLevel level)) { return; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/RoyalBoundaryManager.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/RoyalBoundaryManager.java index dda752e4..94843b19 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/RoyalBoundaryManager.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/RoyalBoundaryManager.java @@ -23,7 +23,6 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; -/** Server-authoritative Royal Guardian chestplate field and temporary projectile arrest state. */ public final class RoyalBoundaryManager { private static final int ALLY_REFRESH_INTERVAL = 10; private static final DustParticleOptions ROYAL_GOLD = new DustParticleOptions(new Vector3f(1.0F, 0.72F, 0.12F), 1.15F); @@ -51,7 +50,6 @@ public final class RoyalBoundaryManager { return true; } - /** Called from ServerPlayer.tick; ends fields immediately when their owner can no longer sustain them. */ public static void tickOwner(ServerPlayer owner) { if (!(owner.level() instanceof ServerLevel level)) return; UUID ownerId = owner.getUUID(); @@ -92,7 +90,6 @@ public final class RoyalBoundaryManager { } } - /** Predicts this tick's movement so a fast projectile is arrested before its own collision pass. */ public static void prepareProjectile(Projectile projectile) { if (!(projectile.level() instanceof ServerLevel level) || projectile.isRemoved()) return; Map arrested = ARRESTED.get(level); @@ -111,7 +108,6 @@ public final class RoyalBoundaryManager { } } - /** Swept fallback for unusual projectiles and arrest-state progression. */ public static void tickProjectile(Projectile projectile) { if (!(projectile.level() instanceof ServerLevel level)) return; Map arrested = ARRESTED.get(level); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/RoyalVitalityPenaltyEffect.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/RoyalVitalityPenaltyEffect.java index 9df462f3..64c6e1a5 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/RoyalVitalityPenaltyEffect.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/RoyalVitalityPenaltyEffect.java @@ -21,7 +21,7 @@ public final class RoyalVitalityPenaltyEffect extends MobEffect { public void addAttributeModifiers(AttributeMap attributeMap, int amplifier) { AttributeInstance maxHealth = attributeMap.getInstance(Attributes.MAX_HEALTH); if (maxHealth == null) return; - maxHealth.addTransientModifier(new AttributeModifier( + maxHealth.addOrUpdateTransientModifier(new AttributeModifier( MODIFIER_ID, -0.5D, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/ShrinkMobEffect.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/ShrinkMobEffect.java index e69d2c27..109aa19c 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/ShrinkMobEffect.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/ShrinkMobEffect.java @@ -23,7 +23,7 @@ public final class ShrinkMobEffect extends MobEffect { AttributeInstance instance = attributeMap.getInstance(Attributes.SCALE); if (instance == null) return; double amount = -(AntarchySettings.shrinkingPotionDelta() * (amplifier + 1)); - instance.addTransientModifier( + instance.addOrUpdateTransientModifier( new AttributeModifier(MODIFIER_ID, amount, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL) ); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/FlytrapEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/FlytrapEntity.java index 29747e1f..421fd1cc 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/FlytrapEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/FlytrapEntity.java @@ -408,10 +408,6 @@ public class FlytrapEntity extends Monster implements GeoEntity { continue; } - // Put the entity on cooldown before hurting it, regardless of hurt()'s result: a - // shield or armor effect can absorb the damage and make hurt() return false without - // granting the vanilla invulnerability window, which would otherwise let this attack - // re-attempt damage on the same entity every single tick of the active window. this.sweepHitCooldowns.put(candidate.getUUID(), AntarchySettings.flytrapSweepHitCooldownTicks()); candidate.hurt(AntarchyDamageSources.flytrapMauling(serverLevel, this), (float) AntarchySettings.flytrapAttackDamage()); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java index 66b497ae..a1bd8d54 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java @@ -391,6 +391,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl if (this.isKnockedDown()) { this.tickKnockedDown(); } else if (this.isLeashed()) { + if (this.chargeTicksRemaining > 0 || this.isChargeAnimationActive()) { + this.endChargeState(); + } this.getNavigation().stop(); this.setTarget(null); this.updateAmbientAnimation(); @@ -483,6 +486,10 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl } private void tickCharge() { + if (this.chargeTicksRemaining <= 0) { + this.endChargeState(); + return; + } if (this.getAnimationState() != ANIM_CHARGE) { this.setAnimationState(ANIM_CHARGE); } @@ -909,6 +916,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl if (!this.isFlying() && !mountedCharge) { this.pendingChargeStart = true; this.requestFlightStart(); + if (this.getAnimationState() != ANIM_OPEN_WINGS) { + this.pendingChargeStart = false; + } return; } this.beginChargeStart(this.chargeDirection, this.pendingChargeDuration, mountedCharge); @@ -978,13 +988,23 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl serverLevel.sendParticles(ParticleTypes.CRIT, this.getX(), this.getY() + 0.8D, this.getZ(), 20, 2.0D, 0.6D, 2.0D, 0.08D); this.broadcastImpactShake(serverLevel); - if (this.onGround()) { + this.endChargeState(); + } + + private void endChargeState() { + this.chargeTicksRemaining = 0; + this.groundedMountedCharge = false; + this.noPhysics = false; + this.setAnimationState(this.isFlying() ? ANIM_FLY : ANIM_IDLE); + if (!this.isVehicle() && this.isFlying() && this.hasGroundBelow()) { this.requestFlightStop(); - } else { - this.updateAmbientAnimation(); } } + private boolean hasGroundBelow() { + return !this.level().noCollision(this, this.getBoundingBox().move(this.toWorld(0.0D, -0.2D, 0.0D))); + } + private void breakBlocksForChargeImpact(ServerLevel level) { if (!this.isHerculesBeetleGriefingEnabled(level)) { return; @@ -1423,6 +1443,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl this.chargeCooldown = tag.getInt("ChargeCooldown"); this.attackCooldown = tag.getInt("AttackCooldown"); this.combatCryDone = tag.getBoolean("CombatCryDone"); + if (this.isChargeAnimationActive()) { + this.setAnimationState(this.isFlying() ? ANIM_FLY : ANIM_IDLE); + } if (this.isKnockedDown() && this.getAnimationState() != ANIM_KNOCKED_DOWN_IDLE) { this.setAnimationState(ANIM_KNOCKED_DOWN_IDLE); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/MantisEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/MantisEntity.java index 3acf470c..52b2a1d3 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/MantisEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/MantisEntity.java @@ -149,12 +149,10 @@ public class MantisEntity extends Monster implements GeoEntity { boolean ignoreLightLevel = AntarchySettings.mantisIgnoreLightLevel(); - // Daytime overworld spawns can't pass the vanilla darkness check, so no light gate here if (level.getLevel().isDay() && level.getBiome(pos).is(AntarchyTags.Biomes.MANTIS_OVERWORLD_SPAWN_BIOMES)) { return atSurface && level.canSeeSky(pos); } - // Elythia meadow (and any future mantis_spawn_biomes): nighttime, no sky-access requirement if (level.getLevel().isNight() && level.getBiome(pos).is(AntarchyTags.Biomes.MANTIS_SPAWN_BIOMES)) { return atSurface && (ignoreLightLevel || Monster.checkMonsterSpawnRules(entityType, level, spawnReason, pos, random)); } @@ -184,7 +182,6 @@ public class MantisEntity extends Monster implements GeoEntity { HurtByTargetGoal hurtByTargetGoal = new HurtByTargetGoal(this); this.targetSelector.addGoal(1, hurtByTargetGoal); - // randomInterval lowered from default 10 to 5 for faster re-acquisition this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 5, true, false, null)); } 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 d89e64fe..e2cd8d29 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 @@ -88,7 +88,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { private boolean spawnedByKraken; - // Explosive impact (fired from the R.P.O. Launcher) private boolean explosiveImpact; private java.util.UUID explosiveLauncherId; private int explosiveArmTicks; @@ -140,9 +139,7 @@ public class OctopusBombEntity extends Monster implements GeoEntity { this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 20.0F)); this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); - // Only retaliate when hit — neutral otherwise this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); - // When spawned by Kraken and flying, target nearest player this.targetSelector.addGoal(2, new KrakenSummonTargetGoal(this)); } @@ -215,7 +212,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { if (this.attackCooldown > 0) this.attackCooldown--; if (this.inkSprayCooldown > 0) this.inkSprayCooldown--; - // Ink spray — always active regardless of aggro state this.tickInkSpray(); LivingEntity target = this.getTarget(); @@ -375,10 +371,9 @@ public class OctopusBombEntity extends Monster implements GeoEntity { float angle = this.random.nextFloat() * (float) (Math.PI * 2); this.wanderDx = Mth.cos(angle) * 0.015f; this.wanderDz = Mth.sin(angle) * 0.015f; - this.wanderDy = -0.01f + this.random.nextFloat() * 0.01f; // slight downward bias + this.wanderDy = -0.01f + this.random.nextFloat() * 0.01f; } - // Surface avoidance: if the block above is not water, push down float dy = this.wanderDy; if (!this.level().getFluidState(this.blockPosition().above()).is(net.minecraft.tags.FluidTags.WATER)) { dy = -0.03f; @@ -663,10 +658,6 @@ public class OctopusBombEntity extends Monster implements GeoEntity { } } - // ------------------------------------------------------------------------- - // Inner goal: only target players when spawned by Kraken in fly mode - // ------------------------------------------------------------------------- - private static final class KrakenSummonTargetGoal extends NearestAttackableTargetGoal { private final OctopusBombEntity octopus; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/RollyPollyEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/RollyPollyEntity.java index 36afd023..006e8833 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/RollyPollyEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/RollyPollyEntity.java @@ -84,7 +84,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { private static final int ANIM_ROLL_UP = 2; private static final int ANIM_UNROLL = 4; - // wheel_mode is 0.75s, normal_mode is ~0.42s private static final int ROLL_UP_TICKS = 15; private static final int UNROLL_TICKS = 9; private static final int DEFENSIVE_CURL_TICKS = 100; @@ -156,7 +155,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { this.goalSelector.addGoal(1, new PanicGoal(this, 1.4D) { @Override public boolean canUse() { - // Curled-up or tamed rolly pollies stand their ground return !RollyPollyEntity.this.isRolled() && !RollyPollyEntity.this.isTame() && super.canUse(); } }); @@ -318,7 +316,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { amount *= 0.25F; } boolean hurt = super.hurt(source, amount); - // Wild rolly pollies curl up defensively when attacked if (hurt && !this.level().isClientSide && !this.isTame() && this.isAlive() && !this.isRolled() && this.rollTransitionTicks <= 0) { this.defensiveCurlTicks = DEFENSIVE_CURL_TICKS; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ScorpionEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ScorpionEntity.java index f2189be2..6e38ac89 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ScorpionEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ScorpionEntity.java @@ -111,9 +111,6 @@ public class ScorpionEntity extends Monster implements GeoEntity { || spawnReason == MobSpawnType.COMMAND) { return true; } - // The Dream Dunes biome is the entire underside below Y=0. Its higher - // spawn weight is therefore targeted there without doubling the small - // surface-side Dream Dunes band as well. if (pos.getY() >= 0 && level.getBiome(pos).is(DREAM_DUNES) && random.nextBoolean()) { return false; } @@ -356,8 +353,6 @@ public class ScorpionEntity extends Monster implements GeoEntity { ScorpionEntity.this.getNavigation().stop(); return; } - // This goal overrides MeleeAttackGoal.tick, so the gravity mixin on the - // vanilla method cannot supply the inverted movement frame here. LivingEntity target = ScorpionEntity.this.getTarget(); if (target != null && ThoraxisUndersideManager.shouldInvertInUnderside(ScorpionEntity.this)) { ScorpionEntity.this.getNavigation().stop(); @@ -379,9 +374,6 @@ public class ScorpionEntity extends Monster implements GeoEntity { if (ScorpionEntity.this.isAttackLocked()) { return; } - // Inverted melee tick handling replaces vanilla MeleeAttackGoal.tick, - // so vanilla's internal attack timer is not advanced. The Scorpion's - // own cooldown already covers its wind-up and hit timing. if (this.canPerformAttack(enemy) && ScorpionEntity.this.attackCooldownTicks <= 0) { ScorpionEntity.this.beginAttack(enemy); return; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ToreterrorEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ToreterrorEntity.java index 253be8da..607121cc 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ToreterrorEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ToreterrorEntity.java @@ -774,11 +774,9 @@ public class ToreterrorEntity extends Monster implements GeoEntity { double dh = Math.sqrt(diff.x * diff.x + diff.z * diff.z); double dy = diff.y; double gravity = AntarchySettings.waterBombGravity(); - // Choose travel time based on horizontal distance at minSpeed, minimum 8 ticks double t = Math.max(8.0, dh / minSpeed); double vx = diff.x / t; double vz = diff.z / t; - // Compensate for gravity accumulating over t ticks double vy = dy / t + 0.5 * gravity * t; return new Vec3(vx, vy, vz); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/UpwardFallingBlockEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/UpwardFallingBlockEntity.java index ce769a7d..7c7c271d 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/UpwardFallingBlockEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/UpwardFallingBlockEntity.java @@ -46,10 +46,6 @@ public class UpwardFallingBlockEntity extends Entity { public UpwardFallingBlockEntity(EntityType type, Level level) { super(type, level); - // This entity has its own simple upward-flight and landing checks below. Do not - // send it through the normal entity collision solver: Thoraxis can create many of - // these at once while chunks are loading, and swept entity collision is needlessly - // expensive for a block that only collides with the block directly above it. this.noPhysics = true; } @@ -148,8 +144,6 @@ public class UpwardFallingBlockEntity extends Entity { BlockPos headPos = BlockPos.containing(getX(), getBoundingBox().maxY, getZ()); BlockState above = level().getBlockState(headPos); - // Leaves block the entity but can't hold scaffolding — drop as item, unless this - // instance is allowed to land on leaves like a normal falling block would if (above.is(BlockTags.LEAVES) && this.breaksOnLeaves) { dropAndRemove(blockState); return; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/WormHookProjectileEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/WormHookProjectileEntity.java index 1a37212a..c57da896 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/WormHookProjectileEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/WormHookProjectileEntity.java @@ -15,10 +15,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; -/** - * Thrown out by the worm hook item. Sticks into the first block it hits and stays there, - * anchoring a swing rope back to the thrower until the player detaches. - */ public class WormHookProjectileEntity extends ThrowableItemProjectile { private boolean stuck = false; 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 5210ac88..9d6847d4 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 @@ -302,8 +302,6 @@ public final class AntTeleportHelper { return safePos; } - // The bounded search can fail near rough or sparsely-generated terrain. - // Retry once with a wider radius before giving up. loadArrivalSearchArea(destination, preferredPos, EXPANDED_ARRIVAL_SEARCH_RADIUS); Vec3 expandedSafePos = findSafeArrivalPositionInYRange( player, destination, preferredPos, yRange[0], yRange[1], @@ -393,11 +391,6 @@ 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 rejected prematurely. - */ public static void loadArrivalSearchArea(ServerLevel destination, BlockPos preferredPos, int searchRadius) { ChunkPos center = new ChunkPos(preferredPos); int chunkRadius = (searchRadius >> 4) + 1; @@ -462,9 +455,6 @@ public final class AntTeleportHelper { } } - // 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; @@ -475,15 +465,10 @@ public final class AntTeleportHelper { } } - // Elythia arrivals must stay on the generated surface; a vertical scan - // can otherwise select an underground cave floor after a surface miss. if (elythia) { return null; } - // Heightmaps can be stale or unsuitable around structures, so retain a - // bounded exhaustive search as a final generated-terrain attempt in - // dimensions whose configured arrival ranges intentionally allow it. for (int radius = 0; radius <= searchRadius; radius++) { for (int xOff = -radius; xOff <= radius; xOff++) { for (int zOff = -radius; zOff <= radius; zOff++) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/RainbowAntEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/RainbowAntEntity.java index 0f9fd7a6..c813f26d 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/RainbowAntEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/RainbowAntEntity.java @@ -78,11 +78,6 @@ public class RainbowAntEntity extends BaseAntEntity implements GeoEntity { return this.hasActiveInfinityDestination() || super.requiresCustomPersistence(); } - /** - * Called on death. If this ant has already been activated (fed its reagent) and Infinity integration is - * enabled, looks for a nearby unlit obsidian Nether-portal frame and, if found, ignites it as a permanent - * physical Infinity Dimensions portal to this ant's assigned dimension. - */ public boolean tryIgniteInfinityPortalOnDeath() { if (!this.infinityActivated) { return false; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/TermiteEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/TermiteEntity.java index 591b0bc9..aaac6cc1 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/TermiteEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/ant/TermiteEntity.java @@ -260,7 +260,6 @@ public class TermiteEntity extends BaseAntEntity implements GeoEntity { } continue; } - // North/South faces (dz = ±r) for (int dx = -r; dx <= r; dx++) { candidate.set(ox + dx, oy + dy, oz - r); if (this.isValidWoodTarget(candidate)) { @@ -273,7 +272,6 @@ public class TermiteEntity extends BaseAntEntity implements GeoEntity { if (d < bestDistSq) { bestDistSq = d; bestPos = candidate.immutable(); } } } - // East/West faces (dx = ±r, corners already covered above) for (int dz = -r + 1; dz <= r - 1; dz++) { candidate.set(ox - r, oy + dy, oz + dz); if (this.isValidWoodTarget(candidate)) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/basilisk/BasiliskEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/basilisk/BasiliskEntity.java index d296b7c2..be1872b1 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/basilisk/BasiliskEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/basilisk/BasiliskEntity.java @@ -669,13 +669,11 @@ public class BasiliskEntity extends Monster implements GeoEntity { this.stopActiveMovement(); } - /** Scales turn rate by intended movement speed so the long body pivots tighter when slow and wider when fast. */ private static final class BasiliskMoveControl extends MoveControl { private BasiliskMoveControl(Mob mob) { super(mob); } - /** Call this to prevent the move control from reapplying speed this tick. */ public void halt() { this.operation = MoveControl.Operation.WAIT; } @@ -735,7 +733,6 @@ public class BasiliskEntity extends Monster implements GeoEntity { BasiliskEntity.this.getLookControl().setLookAt(target, 30.0F, 30.0F); } - // super handles path recalc and cooldown timer super.tick(); if (target != null && BasiliskEntity.this.isWithinMeleeAttackRange(target)) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java index 0db113ae..b8a9f5e6 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java @@ -113,7 +113,6 @@ public class BrutalflyEntity extends Monster implements GeoEntity { private double currentStrafeAngleOffset = this.random.nextDouble() * (Math.PI * 2.0D); private boolean spawnedDeathButterflies; - // Cocoon state (server-side) @Nullable BlockPos anchorPos; private int cocoonHits; @@ -312,7 +311,6 @@ public class BrutalflyEntity extends Monster implements GeoEntity { } if (this.getAnimationState() == ANIM_COCOON_IDLE) { - // Will be reset to COCOON after idle ticks counted down } else if (this.tickCount % 200 == 17 && this.random.nextFloat() < 0.4F) { this.setAnimationState(ANIM_COCOON_IDLE); this.cocoonAnimTicks = COCOON_IDLE_ANIM_TICKS; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAntBehavior.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAntBehavior.java index 45df06db..ce8c6235 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAntBehavior.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAntBehavior.java @@ -77,7 +77,6 @@ public class GlimmerAntBehavior implements GlimmerVariantBehavior { @Override public EntityDimensions adultDimensions() { - // Matches the real ant's hitbox. return EntityDimensions.scalable(0.6375F, 0.2125F); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAppleCowBehavior.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAppleCowBehavior.java index ccdf4d96..ff586fd3 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAppleCowBehavior.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAppleCowBehavior.java @@ -80,7 +80,6 @@ public class GlimmerAppleCowBehavior implements GlimmerVariantBehavior { @Override public EntityDimensions adultDimensions() { - // Matches the real Apple Cow's hitbox (extends vanilla Cow). return EntityDimensions.scalable(0.9F, 1.4F); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerCompanionSavedData.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerCompanionSavedData.java index ef75fe86..9ae2f2c4 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerCompanionSavedData.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerCompanionSavedData.java @@ -11,10 +11,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.saveddata.SavedData; -/** - * Tracks each player's current Glimmer companion so taming a new one despawns the old, - * even if the old companion is in a different loaded dimension. - */ public class GlimmerCompanionSavedData extends SavedData { private static final String ID = "antarchy_glimmer_companions"; private static final String ENTRIES_KEY = "Entries"; @@ -56,11 +52,6 @@ public class GlimmerCompanionSavedData extends SavedData { ); } - /** - * Records {@code newCompanion} as {@code owner}'s current Glimmer. Any previous - * companion found in a currently loaded dimension isn't removed - it just loses - * its owner and becomes a wild, re-tameable Glimmer again. - */ public static void replaceCompanion(MinecraftServer server, UUID owner, UUID newCompanion) { GlimmerCompanionSavedData data = get(server); UUID previous = data.companionByOwner.put(owner, newCompanion); @@ -80,10 +71,6 @@ public class GlimmerCompanionSavedData extends SavedData { } } - /** - * Removes {@code owner}'s companion record if it currently points at {@code companion}, - * used when that Glimmer is captured into a bottle rather than replaced by a new one. - */ public static void clearCompanion(MinecraftServer server, UUID owner, UUID companion) { GlimmerCompanionSavedData data = get(server); if (companion.equals(data.companionByOwner.get(owner))) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerEntity.java index 9c35ac44..009729e7 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerEntity.java @@ -147,7 +147,6 @@ public class GlimmerEntity extends TamableAnimal implements GeoEntity { @Override public void push(Entity entity) { - // no-op: Glimmers pass through other entities } @Override @@ -179,10 +178,6 @@ public class GlimmerEntity extends TamableAnimal implements GeoEntity { this.entityData.set(ABILITY_ANIM_TICKS, ticks); } - /** - * Ticks remaining in the daytime despawn fade-out, or 0 if not currently fading. - * Used client-side to fade the render alpha to nothing before the entity is removed. - */ public int getFadeTicks() { return this.entityData.get(FADE_TICKS); } @@ -499,10 +494,6 @@ public class GlimmerEntity extends TamableAnimal implements GeoEntity { return GlimmerVariant.random(this.random); } - /** - * Wild Glimmers are common in Glimmering Pools, but only rarely (and only at night) - * turn up in Ouranwood Forest, the Elythia Meadow, and the Peach Forest. - */ public static boolean checkGlimmerSpawnRules(EntityType type, ServerLevelAccessor level, MobSpawnType spawnType, BlockPos pos, net.minecraft.util.RandomSource random) { if (!net.minecraft.world.entity.animal.Animal.checkAnimalSpawnRules(type, level, spawnType, pos, random)) { @@ -601,12 +592,6 @@ public class GlimmerEntity extends TamableAnimal implements GeoEntity { } } - /** - * With {@code noPhysics} true, Glimmers never travel through vanilla's normal movement path, - * so the usual body-follows-head catch-up never runs and a stationary Glimmer looking around - * (LookAtPlayerGoal/RandomLookAroundGoal only move the head) ends up with its head rendered - * far past the model's body — this keeps the body snapped within {@link #getMaxHeadYRot()} of it. - */ private void clampBodyToHeadRotation() { float maxYaw = this.getMaxHeadYRot(); float delta = Mth.wrapDegrees(this.yHeadRot - this.yBodyRot); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFrogBehavior.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFrogBehavior.java index 6d2e1bd4..35c41112 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFrogBehavior.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFrogBehavior.java @@ -111,7 +111,6 @@ public class GlimmerFrogBehavior implements GlimmerVariantBehavior { @Override public EntityDimensions adultDimensions() { - // Matches vanilla Frog's real hitbox. return EntityDimensions.scalable(0.5F, 0.5F); } @@ -155,7 +154,6 @@ public class GlimmerFrogBehavior implements GlimmerVariantBehavior { pending.ticksRemaining--; if (pending.ticksRemaining == TONGUE_ANIM_TICKS - TONGUE_GRAB_TICK) { - // The tongue "catches" the target partway through the animation and reels it in. entity.playSound(SoundEvents.FROG_TONGUE, 1.0F, 1.0F); } if (pending.ticksRemaining <= TONGUE_ANIM_TICKS - TONGUE_GRAB_TICK) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariantBehavior.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariantBehavior.java index 771ec901..faaf9518 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariantBehavior.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariantBehavior.java @@ -10,11 +10,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; -/** - * Per-variant behavior for the composite {@link GlimmerEntity}: AI, model/texture selection, and sounds. - * One concrete implementation per {@link GlimmerVariant}, chosen via composition rather than subclassing - * so a single EntityType can be reliably reconstructed across save/load. - */ public interface GlimmerVariantBehavior { void registerGoals(GlimmerEntity entity); @@ -32,124 +27,62 @@ public interface GlimmerVariantBehavior { SoundEvent deathSound(); - /** - * Optional variant-specific interaction (e.g. shearing the Apple Cow variant for a Spirit Apple). - * Return null to fall through to the entity's default interaction handling. - */ @Nullable default InteractionResult onInteract(GlimmerEntity entity, Player player, ItemStack stack, InteractionHand hand) { return null; } - /** - * Optional per-tick hook for variant-specific server logic (e.g. the Basilisk's petrify gaze). - */ default void customTick(GlimmerEntity entity) { } - /** - * Optional hook fired after {@code entity} lands a successful hit on {@code target} - * (e.g. the Frog variant dropping Lumen Froglight when it kills a small Magma Cube). - */ default void onHurtTarget(GlimmerEntity entity, Entity target) { } - /** - * Called periodically (roughly once a second) while this Glimmer is tamed and its - * owner is nearby and loaded. Should (re)apply the variant's passive effect with a - * short duration so it naturally lapses if the owner leaves range. - */ default void tickPassive(GlimmerEntity entity, Player owner) { } - /** - * Called every server tick (not just the coarse refresh interval) while nearby, for - * passives that need finer-grained bookkeeping than a periodic effect refresh (e.g. - * the Apple Cow's exhaustion dampening). - */ default void tickPassiveEveryTick(GlimmerEntity entity, Player owner) { } - /** - * Called once the tick the owner leaves range (or the companion is otherwise no - * longer eligible) so any directly-applied (non-MobEffect) passive state can be undone. - */ default void clearPassive(GlimmerEntity entity, Player owner) { } - /** - * Animation (from this variant's own animation file) to play while - * {@link GlimmerEntity#playAbilityAnimation(int)} is active. Null plays no override. - */ @Nullable default software.bernie.geckolib.animation.RawAnimation abilityAnimation() { return null; } - /** - * Animation to play in place of the default walk loop while moving. Null uses the - * default walk animation (e.g. the Deer switches to its run clip while following its owner). - */ @Nullable default software.bernie.geckolib.animation.RawAnimation movingAnimation(GlimmerEntity entity) { return null; } - /** - * Animation to play while idle in place of the default idle loop. Null uses the - * shared Glimmer idle animation. - */ @Nullable default software.bernie.geckolib.animation.RawAnimation idleAnimation(GlimmerEntity entity) { return null; } - /** - * Navigation speed multiplier used while following the owner (see {@link GlimmerFollowOwnerGoal}). - */ default double followSpeedModifier() { return 1.15D; } - /** - * Shared action-bar feedback helper for ability-use messages. - */ default void sendAbilityMessage(Player owner, net.minecraft.network.chat.Component message) { owner.displayClientMessage(message, true); } - /** - * Called every server tick while the owner is nearby and the ability is off cooldown. - * Implementations should check their own trigger condition and, if it fires, perform - * the ability and call {@link GlimmerEntity#startAbilityCooldown()}. - */ default void tickAbilityCheck(GlimmerEntity entity, Player owner) { } - /** - * Cooldown duration for this variant's active ability, in ticks. - */ default int abilityCooldownTicks() { return 20 * 120; } - /** - * Per-tick shrink/growth-recovery rate used to decay {@link GlimmerEntity#getGrowthScale()} - * back toward 1.0 after an ability temporarily changes it. 0 means the variant never changes scale. - */ default double growthDecayPerTick() { return 0.0D; } - /** - * Hitbox size matching the real creature this variant is a "spirit" of, rather than - * a single hitbox shared by every variant. - */ EntityDimensions adultDimensions(); - /** - * Defaults to half the adult size, matching vanilla's typical baby scaling. - */ default EntityDimensions babyDimensions() { return this.adultDimensions().scale(0.5F); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java index 1758cb39..e7dbc50a 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java @@ -85,7 +85,6 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO private static final int ATTACK_SWING_RIGHT = 3; private static final int ATTACK_SLAM = 4; - // Synced animation state values private static final int ANIM_NONE = 0; private static final int ANIM_CRY = 1; private static final int ANIM_GRAB = 2; @@ -199,7 +198,6 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { - // idle_controller always loops idle; action_controller layers on top when active controllers.add(new AnimationController<>(this, "idle_controller", 0, state -> { if (this.getAnimationState() == ANIM_DEATH) { return PlayState.STOP; @@ -646,7 +644,6 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO } } - // swingRight=true means ATTACK_SWING_RIGHT, which knocks players to the Kraken's LEFT private void tickSwingAttack(boolean swingRight) { if (this.actionTicks == 10) { this.performSwing(swingRight); @@ -749,9 +746,6 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO return attackState == ATTACK_SLAM; } - // Determines left vs right based on which side the target is on relative to the Kraken. - // Kraken's right vector is forward x world-up. If target is on the Kraken's right side, - // use swing_right (which knocks them left). If on the left, use swing_left (knocks them right). private int resolveSwingDirection(LivingEntity target) { Vec3 forward = this.getViewVector(1.0F); Vec3 right = forward.cross(new Vec3(0, 1, 0)).normalize(); @@ -765,7 +759,6 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO float damage = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); Vec3 forward = this.getViewVector(1.0F); - // swingRight knocks to Kraken's left (-right), swingLeft knocks to Kraken's right (+right) Vec3 right = forward.cross(new Vec3(0, 1, 0)).normalize(); Vec3 knockDir = swingRight ? right.scale(-1) : right; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java index b88b3994..c8f26936 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java @@ -642,7 +642,6 @@ public class NightmareEntity extends Monster implements GeoEntity { return this.entityData.get(ANIMATION_STATE); } - /** Selects the looping flight pose for the isolated computer archive preview instance. */ public void setArchivePreviewFlying() { this.setAnimationState(ANIM_FLY); } 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 86242ae3..0c74df0a 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 @@ -105,7 +105,6 @@ public class KingEntity extends RoyalBossEntity { private static final double CHAIN_LIGHTNING_JUMP_RANGE = 9.0D; private static final int ICE_FREEZE_PER_TICK = 7; private static final int BEHAVIOR_SCORE_CAP = 12; - /** Keep the tree-bound patrol safely inside the authored tree footprint. */ private static final double TREE_ORBIT_RADIUS = 128.0D; private static final double TREE_ORBIT_ANGLE_STEP = 0.014D; private static final int TREE_ORBIT_PATH_SAMPLES = 16; @@ -994,8 +993,6 @@ public class KingEntity extends RoyalBossEntity { this.kingCombatWaypoint = null; this.playRoyalSound(AntarchySoundEvents.KING_ROAR.get(), 1.12F); } else { - // Keep Close Quarters from silently dissolving when the first ring is obstructed. - // The next aerial tick will retry the expanded landing search. this.kingLandingWaypoint = null; this.groundAssaultCooldownTicks = 100; this.kingLandingRetryTicks = LANDING_RETRY_TICKS; @@ -1077,9 +1074,6 @@ public class KingEntity extends RoyalBossEntity { if (this.level().noCollision(this, fallbackBox)) { return fallback; } - // Last resort: land directly beneath the King if the target ring is obstructed. - // This still gives Close Quarters a committed ground sequence instead of silently - // remaining airborne over difficult tree geometry. double directY = GravityApi.isGravityInverted(this) ? this.position().y - 0.1D : this.groundYBelow(this.getX(), this.getZ()) + 0.1D; @@ -1143,8 +1137,6 @@ public class KingEntity extends RoyalBossEntity { } } if (orbitWaypoint == null && treeBoundCombat) { - // If the tree blocks the next orbital lane, turn away and try the opposite side - // before falling back to a clear target-relative position. this.kingStrafeDirection *= -1; double angle = currentAngle + this.kingStrafeDirection * COMBAT_ORBIT_ANGLE_STEP; double x = target.getX() + Math.cos(angle) * range; @@ -1173,7 +1165,6 @@ public class KingEntity extends RoyalBossEntity { + this.random.nextInt(COMBAT_WAYPOINT_VARIANCE + 1); this.kingCombatProgressPosition = this.position(); this.kingCombatProgressTicks = 0; - // Keep a consistent orbit direction for several passes so movement reads as circling. } private void stabilizeKingRotation() { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBlackHoleEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBlackHoleEntity.java index cd00bdf7..0bad0db4 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBlackHoleEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalBlackHoleEntity.java @@ -248,7 +248,6 @@ public class RoyalBlackHoleEntity extends Entity implements GeoEntity, TimeDilat return AntarchySettings.queenBlackHoleBlockSuctionCap(); } - /** Returns the center of the animated black-hole cube in world coordinates. */ @Override public Vec3 timeDilationCenter() { return this.effectCenter(); 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 c4f75325..ddd59917 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 @@ -344,7 +344,6 @@ 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; } @@ -357,12 +356,10 @@ public abstract class RoyalBossEntity extends Monster implements GeoEntity, Mult return 1.3D; } - /** Prevents normal head/body scheduling while a bespoke movement sequence owns the boss. */ protected boolean blocksRoyalAttacksForMovement() { return false; } - /** Prevents new beam volleys while a bespoke attack has reserved the heads. */ protected boolean blocksRoyalBeamScheduling() { return false; } @@ -380,17 +377,14 @@ public abstract class RoyalBossEntity extends Monster implements GeoEntity, Mult protected void onRoyalPhaseTransitionCompleted(Phase nextPhase) { } - /** Allows a boss to tune its head-bite concurrency without changing the other royal boss. */ protected int maxConcurrentHeadAttacks(Phase phase) { return phase.maxConcurrentHeadAttacks(); } - /** Allows a boss to tune bite pacing without changing the other royal boss. */ protected int biteCooldownTicks(Phase phase) { return Math.max(10, Mth.floor(AntarchySettings.royalBossBiteCooldownTicks() * phase.cooldownScale())); } - /** Allows either royal boss to tune bite damage without changing the other. */ protected double biteDamageMultiplier() { return AntarchySettings.royalBossBiteDamageMultiplier(); } @@ -825,7 +819,6 @@ public abstract class RoyalBossEntity extends Monster implements GeoEntity, Mult return phase.maxConcurrentHeadAttacks(); } - /** Uses the beam controller's smoothed target point instead of the boss body's forward axis. */ protected boolean royalBeamUsesTrackedAim() { return false; } @@ -862,7 +855,6 @@ public abstract class RoyalBossEntity extends Monster implements GeoEntity, Mult this.onRoyalPhaseTransitionStarted(previousPhase, nextPhase); } - /** Returns the live players currently participating in the encounter. */ protected final List royalEncounterPlayers(ServerLevel level) { double range = Math.max(32.0D, this.getAttributeValue(Attributes.FOLLOW_RANGE)); LinkedHashSet players = new LinkedHashSet<>(this.bossEvent.getPlayers()); @@ -2009,7 +2001,8 @@ public abstract class RoyalBossEntity extends Monster implements GeoEntity, Mult if (source.is(DamageTypes.GENERIC_KILL)) { return super.hurt(source, amount); } - float cappedAmount = (float) Math.min(amount, AntarchySettings.royalBossMaxSingleHitDamage()); + float cap = (float) AntarchySettings.royalBossMaxSingleHitDamage(); + float cappedAmount = amount <= cap ? amount : cap + (amount - cap) * (float) AntarchySettings.royalBossHitOverflowRate(); return super.hurt(source, cappedAmount); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalElementalProjectileEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalElementalProjectileEntity.java index 2025b9c2..743d40a8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalElementalProjectileEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/RoyalElementalProjectileEntity.java @@ -68,7 +68,6 @@ public class RoyalElementalProjectileEntity extends ThrowableProjectile implemen return projectile; } - /** Solves a discrete ballistic lead against the projectile's drag and gravity. */ public static Vec3 aimDirection(Vec3 origin, LivingEntity target, RoyalBeamElement element) { double speed = element == RoyalBeamElement.ICE ? ICEBALL_SPEED : FIREBALL_SPEED; double gravity = element == RoyalBeamElement.ICE ? 0.006D : 0.018D; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/decree/StandYourGroundDecree.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/decree/StandYourGroundDecree.java index 1bc33fbd..36fdc3f3 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/decree/StandYourGroundDecree.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/decree/StandYourGroundDecree.java @@ -15,7 +15,6 @@ public final class StandYourGroundDecree implements RoyalDecree { } @Override public Evaluation evaluate(ServerLevel level, KingEntity king, LivingEntity target) { if (target instanceof net.minecraft.server.level.ServerPlayer player && player.isFallFlying()) { - // Gliding carries unavoidable momentum; begin measuring again from the landing point. this.anchors.put(target.getUUID(), target.position()); return Evaluation.COMPLIANT; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/trades/ComputerScientistTradeManager.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/trades/ComputerScientistTradeManager.java index db692bac..7a0e1dd1 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/trades/ComputerScientistTradeManager.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/trades/ComputerScientistTradeManager.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -/** Loads Computer Scientist offers from data/computer_scientist_trades/*.json. */ public final class ComputerScientistTradeManager extends SimpleJsonResourceReloadListener { private static final Gson GSON = new Gson(); private static final String DIRECTORY = "computer_scientist_trades"; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/trades/DrTrayaurusTradeManager.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/trades/DrTrayaurusTradeManager.java index 6ad087c1..b00665d9 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/trades/DrTrayaurusTradeManager.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/trades/DrTrayaurusTradeManager.java @@ -113,13 +113,6 @@ public final class DrTrayaurusTradeManager extends SimpleJsonResourceReloadListe } } - /** - * One side of a trade. {@code components} is optional: on {@code sell} it is a data component - * patch applied to the result (enchantments, custom name, ...); on {@code buy}/{@code second_buy} - * it is a component predicate the offered stack must match exactly for each listed component. - * It is kept as raw JSON and parsed per offer because components such as enchantments need - * registry access, which the reload listener does not have. - */ private record StackEntry(ResourceLocation itemId, int count, Optional components) { private static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( ResourceLocation.CODEC.fieldOf("item").forGetter(StackEntry::itemId), @@ -162,7 +155,6 @@ public final class DrTrayaurusTradeManager extends SimpleJsonResourceReloadListe if (this.components.isEmpty()) { return Optional.of(new ItemCost(item.get(), this.count)); } - // A predicate that fails to parse drops the trade rather than accepting any stack. return DataComponentPredicate.CODEC .parse(RegistryOps.create(JsonOps.INSTANCE, registries), this.components.get()) .resultOrPartial(message -> LOGGER.error("Dr. Trayaurus trade {}: bad components: {}", this.itemId, message)) diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/fluid/AntarchyFluidChecks.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/fluid/AntarchyFluidChecks.java index b79ae3af..4bdfb648 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/fluid/AntarchyFluidChecks.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/fluid/AntarchyFluidChecks.java @@ -51,11 +51,6 @@ public final class AntarchyFluidChecks { return BILE_VEIN_ID.equals(blockId); } - /** - * Bile always wins: worldgen foliage must not anchor on or near bile fluid or its solid - * bile_vein shell, since cyst/vein features can carve into a neighboring chunk after this - * chunk's vegetation has already been placed. - */ public static boolean hasBileNearby(LevelAccessor level, BlockPos center, int radius) { BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); for (int dx = -radius; dx <= radius; dx++) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/horde/CavarynCreatureSpawner.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/horde/CavarynCreatureSpawner.java index c41df699..1e36924d 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/horde/CavarynCreatureSpawner.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/horde/CavarynCreatureSpawner.java @@ -21,15 +21,6 @@ import net.minecraft.world.phys.AABB; import java.util.HashMap; import java.util.Map; -/** - * Tops up stink bug / rolly polly populations near players in Cavaryn. - * - * Vanilla's NaturalSpawner picks a spawn Y uniformly at random between the dimension's min_y - * and a column's heightmap top. In Cavaryn that range spans the full 208-block dimension height, - * but any given column's actual floor only occupies a sliver of that, so the vanilla algorithm - * almost never lands on real ground even though floor itself is common. This scans a column - * directly for a real floor spot instead. - */ public final class CavarynCreatureSpawner { private static final ResourceKey CAVARYN = ResourceKey.create( net.minecraft.core.registries.Registries.DIMENSION, diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BattleAxeItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BattleAxeItem.java index 9bea8321..4b351f40 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BattleAxeItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BattleAxeItem.java @@ -2,14 +2,24 @@ package com.craisinlord.antarchy.content.item; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.client.model.ResourceBackedGeoItemModel; +import com.craisinlord.antarchy.content.item.ultimate.UltimateToolHelper; +import java.util.List; import java.util.function.Consumer; import java.util.function.DoubleSupplier; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.ItemAttributeModifiers; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.client.GeoRenderProvider; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -40,6 +50,25 @@ public class BattleAxeItem extends AxeItem implements GeoItem { return createAttributes(this.tier, (float) this.attackDamage.getAsDouble(), (float) AntarchySettings.battleAxeAttackSpeed()); } + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + if (AntarchySettings.ultimateToolsVeinMiningEnabled()) { + tooltipComponents.add(Component.translatable("tooltip.antarchy.battle_axe_tree_felling").withStyle(ChatFormatting.GRAY)); + } + } + + @Override + public boolean mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, LivingEntity miningEntity) { + boolean result = super.mineBlock(stack, level, state, pos, miningEntity); + if (AntarchySettings.ultimateToolsVeinMiningEnabled() + && miningEntity instanceof ServerPlayer player + && !player.isShiftKeyDown()) { + UltimateToolHelper.mineTree(stack, level, state, pos, player, AntarchySettings.ultimateToolsTreeFellingMaxLogs()); + } + return result; + } + @Override public boolean isEnchantable(ItemStack stack) { return stack.getCount() == 1; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java index 8e7260ed..b8e075d6 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BigBerthaItem.java @@ -70,7 +70,6 @@ public class BigBerthaItem extends SwordItem implements GeoItem { private static final int TORETERROR_COOLDOWN_TICKS = 200; private static final int TORETERROR_SHAKE_TICKS = 25; - /** Client-side only: how many ticks of camera shake remain from a Toreterror landing. */ public static int clientShakeTicks = 0; private static final ResourceLocation ATTACK_RANGE_MODIFIER_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "big_bertha_attack_range"); private final Tier tier; @@ -178,7 +177,7 @@ public class BigBerthaItem extends SwordItem implements GeoItem { } if (isToreterrorJumping(stack) && player.getMainHandItem() == stack) { - player.fallDistance = 0.0F; // prevent fall damage during the crash-down + player.fallDistance = 0.0F; boolean launched = readInt(stack, TORETERROR_LAUNCHED_TAG) == 1; if (!launched && !player.onGround()) { CustomData.update(DataComponents.CUSTOM_DATA, stack, tag -> tag.putInt(TORETERROR_LAUNCHED_TAG, 1)); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BloodCrystalShardItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BloodCrystalShardItem.java index ed7c4409..32d425d4 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BloodCrystalShardItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BloodCrystalShardItem.java @@ -38,7 +38,6 @@ public class BloodCrystalShardItem extends Item { return InteractionResultHolder.fail(stack); } - // Restore armor shields first, then apple shields if (armorLost > 0) { access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() + 1); access.antarchy$setArmorShieldLostCount(armorLost - 1); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BrutalflyElytraItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BrutalflyElytraItem.java index 1dbfe747..92952a1f 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BrutalflyElytraItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BrutalflyElytraItem.java @@ -22,7 +22,6 @@ public final class BrutalflyElytraItem extends ElytraItem { private static final ResourceLocation ARMOR_MODIFIER_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "brutalfly_elytra_armor"); private static final ResourceLocation TOUGHNESS_MODIFIER_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "brutalfly_elytra_toughness"); - // Set by NeoForge client setup to return the actual bound key name public static Supplier FLAP_KEY_NAME = () -> Component.literal("Shift"); public BrutalflyElytraItem(Properties properties) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GravityGunItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GravityGunItem.java index 281a8312..b02cd738 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GravityGunItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GravityGunItem.java @@ -377,8 +377,6 @@ public class GravityGunItem extends Item implements GeoItem { Vec2 holdRotation = getHoldRotation(player); heldTarget.setNoGravity(true); - // Snap back only when the held entity has drifted badly; otherwise drive it with - // velocity so the client can interpolate the motion smoothly between server updates. if (movement.lengthSqr() > 16.0D) { heldTarget.moveTo(holdPosition.x, holdPosition.y, holdPosition.z, holdRotation.x, holdRotation.y); heldTarget.setDeltaMovement(Vec3.ZERO); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/MogglesCaveDetector.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/MogglesCaveDetector.java index 71ba9d85..43f5f5ee 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/MogglesCaveDetector.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/MogglesCaveDetector.java @@ -11,20 +11,10 @@ import java.util.HashSet; import java.util.Queue; import java.util.Set; -/** - * Client-side cave finder for Moggles. - * - *

Every {@link #SCAN_INTERVAL} ticks, BFS-maps the player's current connected - * air space, then scans outward to find the nearest underground air pocket that - * is NOT part of that space. The result is stored in {@link #caveTarget} and - * read each tick by the particle renderer. - */ public final class MogglesCaveDetector { private static final int SCAN_INTERVAL = 40; - /** How far to flood-fill the player's own air pocket before stopping. */ private static final int PLAYER_SPACE_LIMIT = 8; - /** Minimum number of air neighbors a candidate block must have (filters tiny cracks). */ private static final int MIN_AIR_NEIGHBORS = 2; private static volatile BlockPos caveTarget = null; @@ -36,7 +26,6 @@ public final class MogglesCaveDetector { return caveTarget; } - /** Call once per client tick while Moggles are equipped. */ public static void tick(Player player, Level level) { if (--cooldown > 0) return; cooldown = SCAN_INTERVAL; @@ -51,11 +40,10 @@ public final class MogglesCaveDetector { private static BlockPos scan(Player player, Level level) { BlockPos origin = player.blockPosition(); - // BFS through air from the player's feet to map their current open space. Set playerSpace = new HashSet<>(); Queue queue = new ArrayDeque<>(); - BlockPos eyePos = origin.above(); // also include the eye block + BlockPos eyePos = origin.above(); for (BlockPos seed : new BlockPos[]{origin, eyePos}) { if (level.isLoaded(seed) && level.getBlockState(seed).isAir()) { long key = seed.asLong(); @@ -77,7 +65,6 @@ public final class MogglesCaveDetector { } } - // Scan the wider radius for underground air NOT in the player's space. BlockPos nearest = null; double nearestDistSq = Double.MAX_VALUE; int r = (int) AntarchySettings.mogglesVisionRadius(); @@ -91,7 +78,7 @@ public final class MogglesCaveDetector { if (playerSpace.contains(key)) continue; if (!level.isLoaded(pos)) continue; if (!level.getBlockState(pos).isAir()) continue; - if (level.canSeeSky(pos)) continue; // ignore surface air + if (level.canSeeSky(pos)) continue; int airNeighbors = 0; for (Direction dir : Direction.values()) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianShieldItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianShieldItem.java index 6da112c8..197d39fa 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianShieldItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianShieldItem.java @@ -122,6 +122,6 @@ public class RoyalGuardianShieldItem extends ShieldItem { private static boolean isInCommandLookCone(Player player, Mob mob) { var direction = mob.getBoundingBox().getCenter().subtract(player.getEyePosition()).normalize(); - return player.getViewVector(1.0F).dot(direction) >= 0.9063078D; // 25-degree half-angle + return player.getViewVector(1.0F).dot(direction) >= 0.9063078D; } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordAbilities.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordAbilities.java index 6ec5b1c3..0a9684d9 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordAbilities.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordAbilities.java @@ -31,7 +31,6 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; -/** Player-safe kernels for the Royal Guardian Sword's King-derived elemental modes. */ public final class RoyalGuardianSwordAbilities { private static final ThreadLocal SECONDARY_DAMAGE_DEPTH = ThreadLocal.withInitial(() -> 0); private static final ThreadLocal MELEE_ATTACK = new ThreadLocal<>(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateAxeItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateAxeItem.java index dadea206..1ca8b8b7 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateAxeItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateAxeItem.java @@ -40,7 +40,7 @@ public class UltimateAxeItem extends AxeItem { @Override public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); - UltimateToolHelper.appendThreeByThreeTooltip(tooltipComponents); + UltimateToolHelper.appendModeTooltip(UltimateToolHelper.ToolKind.AXE, tooltipComponents); } @Override diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateCrossbowItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateCrossbowItem.java index f13590f5..d6bf3cb0 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateCrossbowItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateCrossbowItem.java @@ -31,7 +31,7 @@ import java.util.List; public class UltimateCrossbowItem extends CrossbowItem { private static final int MAX_ARROWS = 16; - private static final int FIRE_COOLDOWN_TICKS = 5; // 4 shots/sec + private static final int FIRE_COOLDOWN_TICKS = 5; private static final float SHOOTING_POWER = 3.15F; private static final double VANILLA_CROSSBOW_ARROW_DAMAGE = 7.0D; private static final String RESERVE_PROJECTILES_TAG = "UltimateCrossbowProjectiles"; @@ -110,11 +110,9 @@ public class UltimateCrossbowItem extends CrossbowItem { toFire.add(arrow); } - // Temporarily set only the arrows for this shot so performShooting fires exactly them stack.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.of(toFire)); this.performShooting(level, player, hand, stack, SHOOTING_POWER, 1.0F, null); - // performShooting clears CHARGED_PROJECTILES; restore remaining valid arrows if any saveLoadedProjectiles(stack, player.registryAccess(), all); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateHoeItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateHoeItem.java index 1829f893..f997ba02 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateHoeItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateHoeItem.java @@ -40,7 +40,7 @@ public class UltimateHoeItem extends HoeItem { @Override public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); - UltimateToolHelper.appendThreeByThreeTooltip(tooltipComponents); + UltimateToolHelper.appendModeTooltip(UltimateToolHelper.ToolKind.HOE, tooltipComponents); } @Override diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimatePickaxeItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimatePickaxeItem.java index e41a36a9..9a685758 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimatePickaxeItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimatePickaxeItem.java @@ -40,7 +40,7 @@ public class UltimatePickaxeItem extends PickaxeItem { @Override public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); - UltimateToolHelper.appendThreeByThreeTooltip(tooltipComponents); + UltimateToolHelper.appendModeTooltip(UltimateToolHelper.ToolKind.PICKAXE, tooltipComponents); } @Override diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateToolHelper.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateToolHelper.java index 72fca46f..19a5db23 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateToolHelper.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UltimateToolHelper.java @@ -3,13 +3,17 @@ package com.craisinlord.antarchy.content.item.ultimate; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.item.GiantFryingPanItem; import com.craisinlord.antarchy.content.item.GiantFryingPanToolHelper; +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.function.Function; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -25,12 +29,16 @@ import net.minecraft.world.item.Tier; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; public final class UltimateToolHelper { private static final String THREE_BY_THREE_TAG = "antarchy.ultimate_three_by_three"; + private static final String MINING_MODE_TAG = "antarchy.ultimate_mining_mode"; private static final ThreadLocal BREAKING_EXTRA_BLOCKS = ThreadLocal.withInitial(() -> false); private static final float GENERAL_MINING_MULTIPLIER = 1.1F; private static final float ULTIMATE_SHOVEL_MINING_SPEED = 24.0F; @@ -40,26 +48,40 @@ public final class UltimateToolHelper { public static InteractionResultHolder handleToggleUse(Level level, Player player, InteractionHand hand) { ItemStack stack = player.getItemInHand(hand); - if (!AntarchySettings.ultimateToolsThreeByThreeEnabled() || !player.isShiftKeyDown()) { + if (!player.isShiftKeyDown() || availableModes(toolKindOf(stack.getItem())).size() < 2) { return InteractionResultHolder.pass(stack); } - toggleThreeByThree(level, player, stack); + cycleMiningMode(level, player, stack); return InteractionResultHolder.sidedSuccess(stack, level.isClientSide); } public static InteractionResult handleToggleUseOn(UseOnContext context) { Player player = context.getPlayer(); - if (!AntarchySettings.ultimateToolsThreeByThreeEnabled() || player == null || !player.isShiftKeyDown()) { + if (player == null || !player.isShiftKeyDown() || availableModes(toolKindOf(context.getItemInHand().getItem())).size() < 2) { return InteractionResult.PASS; } - toggleThreeByThree(context.getLevel(), player, context.getItemInHand()); + cycleMiningMode(context.getLevel(), player, context.getItemInHand()); return InteractionResult.sidedSuccess(context.getLevel().isClientSide); } public static boolean isThreeByThreeEnabled(ItemStack stack) { - return stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag().getBoolean(THREE_BY_THREE_TAG); + return getMiningMode(stack) == MiningMode.THREE_BY_THREE; + } + + public static boolean isVeinEnabled(ItemStack stack) { + return getMiningMode(stack) == MiningMode.VEIN; + } + + public static MiningMode getMiningMode(ItemStack stack) { + CompoundTag tag = stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag(); + if (tag.contains(MINING_MODE_TAG)) { + int index = tag.getByte(MINING_MODE_TAG); + MiningMode[] modes = MiningMode.values(); + return index >= 0 && index < modes.length ? modes[index] : MiningMode.DEFAULT; + } + return tag.getBoolean(THREE_BY_THREE_TAG) ? MiningMode.THREE_BY_THREE : MiningMode.DEFAULT; } public static float getDestroySpeed(ToolKind toolKind, Tier tier, ItemStack stack, BlockState state, float defaultSpeed) { @@ -76,23 +98,127 @@ public final class UltimateToolHelper { return defaultSpeed * GENERAL_MINING_MULTIPLIER; } - public static void appendThreeByThreeTooltip(List tooltip) { - if (!AntarchySettings.ultimateToolsThreeByThreeEnabled()) { + public static void appendModeTooltip(ToolKind toolKind, List tooltip) { + List modes = availableModes(toolKind); + boolean area = modes.contains(MiningMode.THREE_BY_THREE); + boolean vein = modes.contains(MiningMode.VEIN); + String key; + if (area && vein) { + key = "tooltip.antarchy.ultimate_tools_3x3_vein"; + } else if (area) { + key = "tooltip.antarchy.ultimate_tools_3x3"; + } else if (vein) { + key = "tooltip.antarchy.ultimate_tools_vein"; + } else { return; } - tooltip.add(Component.translatable("tooltip.antarchy.ultimate_tools_3x3").withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable(key).withStyle(ChatFormatting.GRAY)); } public static void handleAreaMining(ToolKind toolKind, ItemStack stack, Level level, BlockState originState, BlockPos origin, LivingEntity entity) { - if (!AntarchySettings.ultimateToolsThreeByThreeEnabled() - || level.isClientSide + if (level.isClientSide || BREAKING_EXTRA_BLOCKS.get() - || !isThreeByThreeEnabled(stack) || !(entity instanceof ServerPlayer player)) { return; } - mineArea(toolKind, stack, level, originState, origin, player, 1); + MiningMode mode = getMiningMode(stack); + if (mode == MiningMode.DEFAULT || !availableModes(toolKind).contains(mode)) { + return; + } + if (mode == MiningMode.THREE_BY_THREE) { + mineArea(toolKind, stack, level, originState, origin, player, 1); + } else { + mineVein(toolKind, stack, level, originState, origin, player, veinLimit(originState)); + } + } + + public static int veinLimit(BlockState state) { + return state.is(BlockTags.LOGS) + ? AntarchySettings.ultimateToolsTreeFellingMaxLogs() + : AntarchySettings.ultimateToolsVeinMiningMaxBlocks(); + } + + public static void mineVein(ToolKind toolKind, ItemStack stack, Level level, BlockState originState, BlockPos origin, ServerPlayer player, int maxBlocks) { + if (level.isClientSide || BREAKING_EXTRA_BLOCKS.get() || maxBlocks <= 0 || !matchesToolKind(toolKind, originState)) { + return; + } + + breakAll(toolKind, stack, level, player, collectConnected(level, origin, originState.getBlock(), maxBlocks, false)); + } + + public static void mineTree(ItemStack stack, Level level, BlockState originState, BlockPos origin, ServerPlayer player, int maxBlocks) { + if (level.isClientSide || BREAKING_EXTRA_BLOCKS.get() || maxBlocks <= 0 || !originState.is(BlockTags.LOGS)) { + return; + } + + breakAll(ToolKind.AXE, stack, level, player, collectConnected(level, origin, originState.getBlock(), maxBlocks, true)); + } + + private static void breakAll(ToolKind toolKind, ItemStack stack, Level level, ServerPlayer player, List targets) { + if (targets.isEmpty()) { + return; + } + + BREAKING_EXTRA_BLOCKS.set(true); + try { + for (BlockPos targetPos : targets) { + if (!canBreak(toolKind, player, stack, level, targetPos, level.getBlockState(targetPos))) { + continue; + } + + player.gameMode.destroyBlock(targetPos); + if (stack.isEmpty()) { + break; + } + } + } finally { + BREAKING_EXTRA_BLOCKS.set(false); + } + } + + private static List collectConnected(Level level, BlockPos origin, Block block, int maxBlocks, boolean requireFoliage) { + List found = new ArrayList<>(); + Set visited = new HashSet<>(); + ArrayDeque queue = new ArrayDeque<>(); + visited.add(origin); + queue.add(origin); + boolean foliage = false; + + while (!queue.isEmpty() && found.size() < maxBlocks) { + BlockPos current = queue.poll(); + for (int dx = -1; dx <= 1 && found.size() < maxBlocks; dx++) { + for (int dy = -1; dy <= 1 && found.size() < maxBlocks; dy++) { + for (int dz = -1; dz <= 1 && found.size() < maxBlocks; dz++) { + if (dx == 0 && dy == 0 && dz == 0) { + continue; + } + + BlockPos next = current.offset(dx, dy, dz); + if (!visited.add(next) || !level.isLoaded(next)) { + continue; + } + + BlockState state = level.getBlockState(next); + if (state.is(block)) { + found.add(next); + queue.add(next); + } else if (requireFoliage && !foliage && isNaturalFoliage(state)) { + foliage = true; + } + } + } + } + } + + return requireFoliage && !foliage ? List.of() : found; + } + + private static boolean isNaturalFoliage(BlockState state) { + if (state.is(BlockTags.LEAVES)) { + return !state.hasProperty(BlockStateProperties.PERSISTENT) || !state.getValue(BlockStateProperties.PERSISTENT); + } + return state.is(BlockTags.WART_BLOCKS) || state.is(Blocks.SHROOMLIGHT); } public static void mineArea(ToolKind toolKind, ItemStack stack, Level level, BlockState originState, BlockPos origin, ServerPlayer player, int radius) { @@ -213,25 +339,47 @@ public final class UltimateToolHelper { HOE } - private static void toggleThreeByThree(Level level, Player player, ItemStack stack) { - boolean enabled = !isThreeByThreeEnabled(stack); + public enum MiningMode { + DEFAULT, + THREE_BY_THREE, + VEIN + } + + private static List availableModes(ToolKind toolKind) { + List modes = new ArrayList<>(3); + if (toolKind == null) { + return modes; + } + modes.add(MiningMode.DEFAULT); + if (AntarchySettings.ultimateToolsThreeByThreeEnabled()) { + modes.add(MiningMode.THREE_BY_THREE); + } + if (AntarchySettings.ultimateToolsVeinMiningEnabled() && (toolKind == ToolKind.PICKAXE || toolKind == ToolKind.AXE)) { + modes.add(MiningMode.VEIN); + } + return modes; + } + + private static void cycleMiningMode(Level level, Player player, ItemStack stack) { + List modes = availableModes(toolKindOf(stack.getItem())); + int current = modes.indexOf(getMiningMode(stack)); + MiningMode next = modes.get((current + 1) % modes.size()); CustomData.update(DataComponents.CUSTOM_DATA, stack, tag -> { - if (enabled) { - tag.putBoolean(THREE_BY_THREE_TAG, true); + tag.remove(THREE_BY_THREE_TAG); + if (next == MiningMode.DEFAULT) { + tag.remove(MINING_MODE_TAG); } else { - tag.remove(THREE_BY_THREE_TAG); + tag.putByte(MINING_MODE_TAG, (byte) next.ordinal()); } }); if (!level.isClientSide) { - player.displayClientMessage( - Component.translatable( - enabled - ? "message.antarchy.ultimate_tool.mode_3x3" - : "message.antarchy.ultimate_tool.mode_default" - ), - true - ); + String key = switch (next) { + case DEFAULT -> "message.antarchy.ultimate_tool.mode_default"; + case THREE_BY_THREE -> "message.antarchy.ultimate_tool.mode_3x3"; + case VEIN -> "message.antarchy.ultimate_tool.mode_vein"; + }; + player.displayClientMessage(Component.translatable(key), true); } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UtlimateShovelItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UtlimateShovelItem.java index d927fb37..c0138a0d 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UtlimateShovelItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/ultimate/UtlimateShovelItem.java @@ -44,7 +44,7 @@ public class UtlimateShovelItem extends ShovelItem { @Override public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); - UltimateToolHelper.appendThreeByThreeTooltip(tooltipComponents); + UltimateToolHelper.appendModeTooltip(UltimateToolHelper.ToolKind.SHOVEL, tooltipComponents); } @Override diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/minecart/AntimetalMinecartPhysics.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/minecart/AntimetalMinecartPhysics.java index 51dc3cdd..3267c556 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/minecart/AntimetalMinecartPhysics.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/minecart/AntimetalMinecartPhysics.java @@ -17,17 +17,6 @@ import net.minecraft.world.level.block.state.properties.RailShape; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; -/** - * A direct mirror of {@code AbstractMinecart.moveAlongTrack}/{@code getPos}/{@code getPosOffs}, - * adapted for ceiling-mounted track. The world-Y meaning of "ascending"/"descending" does not - * need to be sign-flipped anywhere here — lower world Y is lower world Y whether a rail rests on - * a floor or hangs from a ceiling. What actually differs from vanilla is: the rail sits near the - * top of its cell instead of near the bottom (see {@link AntimetalRailHelper#attachY}), support - * is required above instead of below, and the "which cell owns this position" disambiguation - * checks the cell above instead of the cell below. Everything else — the exit-projection math, - * the slope acceleration constant, the player-push nudge, using real collision-checked - * {@code Entity.move} rather than a hand-rolled collision test — is a straight port. - */ public final class AntimetalMinecartPhysics { private static final double SLOPE_ACCEL = 0.0078125D; private static final double MAX_RAIL_SPEED = 0.4D; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntarchyGameNetworkHandler.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntarchyGameNetworkHandler.java index f1d24486..e4a76e3e 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntarchyGameNetworkHandler.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntarchyGameNetworkHandler.java @@ -8,7 +8,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; -/** Handles Antarchy-specific game progress sent by AntOS game extensions. */ public final class AntarchyGameNetworkHandler { private static BiConsumer resultSender = (player, result) -> { }; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntarchyGameNetworking.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntarchyGameNetworking.java index 618336a4..97a750ac 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntarchyGameNetworking.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/AntarchyGameNetworking.java @@ -3,7 +3,6 @@ package com.craisinlord.antarchy.content.network; import net.minecraft.core.BlockPos; import java.util.function.Consumer; -/** Small Antarchy game-progress bridge over the AntOS computer session. */ public final class AntarchyGameNetworking { private static Consumer sender = payload -> { }; private AntarchyGameNetworking() { } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portal/RainbowPortalIgniter.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portal/RainbowPortalIgniter.java index ff83f8d7..bcb831a7 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portal/RainbowPortalIgniter.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portal/RainbowPortalIgniter.java @@ -13,12 +13,6 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; -/** - * Converts an unlit obsidian frame near a killed rainbow ant into a real, permanent Infinite Dimensions - * portal to that ant's assigned dimension. Lights the frame as a normal vanilla Nether portal first, then - * hands it to Infinity's own portal-creation pipeline (the same one used when a book is thrown into a lit - * portal), so the result behaves exactly like any other physical Infinity portal from then on. - */ public final class RainbowPortalIgniter { private static final int SEARCH_RADIUS = 2; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portalgun/PortalGunSavedData.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portalgun/PortalGunSavedData.java index 70b59cfc..8b351777 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portalgun/PortalGunSavedData.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portalgun/PortalGunSavedData.java @@ -170,7 +170,6 @@ public final class PortalGunSavedData extends SavedData { return clearMatching(server, record -> record.ownerId() != null && ownerIds.contains(record.ownerId())); } - /** Clears portal pairs for guns that an owner no longer has in their player inventory. */ public static int clearMissingGuns(ServerPlayer player) { PortalGunSavedData data = get(player.serverLevel().getServer()); if (data.pairs.isEmpty()) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/util/WormHookRope.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/util/WormHookRope.java index 6912b529..8cbe373b 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/util/WormHookRope.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/util/WormHookRope.java @@ -12,16 +12,6 @@ import net.minecraft.world.phys.Vec3; import java.util.ArrayList; import java.util.List; -/** - * Tracks the path of a taut rope from a fixed anchor point to a moving end point (the - * player's eyes), bending around block corners when the straight-line path would otherwise - * clip through terrain. The anchor never moves (the worm hook is stuck in a block), so this - * only needs to add/remove bends on the player's side of the rope. - * - * Ported from the corner-wrapping algorithm in Yyon's GrappleMod (GPL-3.0), adapted from a - * custom vector class to vanilla Vec3 and from a moving-hook/moving-player pair to a fixed - * anchor. - */ public final class WormHookRope { private static final double BEND_OFFSET = 0.05D; private static final double INTO_BLOCK = 0.05D; @@ -44,7 +34,6 @@ public final class WormHookRope { this.prevEnd = end; } - /** Recomputes the bend list for the current anchor/end positions. Anchor must stay constant. */ public void update(Entity context, Vec3 anchor, Vec3 end, double ropeLength) { this.ropeLength = ropeLength; Level level = context.level(); @@ -52,7 +41,6 @@ public final class WormHookRope { points.set(0, anchor); points.set(points.size() - 1, end); - // Unwind bends the rope has swung clear of. while (points.size() > 2) { int index = points.size() - 2; Vec3 closest = points.get(index); @@ -153,12 +141,10 @@ public final class WormHookRope { topSides.remove(index); } - /** The pivot point closest to the moving end: either the anchor, or the last bend before it. */ public Vec3 getPivot() { return points.get(points.size() - 2); } - /** Rope length used up getting from the anchor to the pivot (0 if the rope has no bends). */ public double getConsumedLength() { double dist = 0; for (int i = 0; i < points.size() - 2; i++) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/VillagePoolAdditions.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/VillagePoolAdditions.java index 25e38a0a..ca539662 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/VillagePoolAdditions.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/VillagePoolAdditions.java @@ -26,7 +26,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -/** Applies Antarchy-owned additions to existing vanilla jigsaw pools without replacing them. */ public final class VillagePoolAdditions { private static final Gson GSON = new Gson(); private static final String DIRECTORY = "structure_pool_additions"; @@ -101,8 +100,6 @@ public final class VillagePoolAdditions { templates.add(Pair.of(poolElement, weight)); accessor.integratedapi_setRawTemplates(templates); - // StructureTemplatePool caches its weighted list in addition to the raw entries. - // Keep both views synchronized so the new house is immediately eligible. ObjectArrayList expandedTemplates = new ObjectArrayList<>(accessor.integratedapi_getTemplates()); for (int i = 0; i < weight; i++) { expandedTemplates.add(poolElement); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java index fb05d06e..aff0b061 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java @@ -34,7 +34,7 @@ public class TermiteNestFeature extends SurfaceAntNestFeature { protected BlockPos resolveNestPos(WorldGenLevel level, BlockPos origin) { int x = origin.getX(); int z = origin.getZ(); - int startY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, x, z) - 1; + int startY = Math.min(origin.getY(), level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, x, z) - 1); int minY = level.getMinBuildHeight() + 1; for (int y = startY; y >= minY; y--) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/cavaryn/CavarynFoliageGuard.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/cavaryn/CavarynFoliageGuard.java index 71b280df..9495302c 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/cavaryn/CavarynFoliageGuard.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/cavaryn/CavarynFoliageGuard.java @@ -8,12 +8,6 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.VineBlock; import net.minecraft.world.level.block.state.BlockState; -/** - * Bile always wins on placement, but once a vine/creeproots/molting-vine column already exists, - * bile carving and oozing must not eat the block it's anchored to — otherwise a later-generated - * neighboring chunk's bile cyst/vein can undermine foliage placed earlier and leave it floating - * or pop it as a dropped item. - */ public final class CavarynFoliageGuard { private CavarynFoliageGuard() { } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/CoralSpikeFeature.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/CoralSpikeFeature.java index e8dfb1a9..131e30cb 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/CoralSpikeFeature.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/CoralSpikeFeature.java @@ -67,13 +67,13 @@ public class CoralSpikeFeature extends Feature { CoralSet[] coralSets = coralSets(); CoralSet coral = coralSets[random.nextInt(coralSets.length)]; - int baseRadius = 2 + random.nextInt(2); // 2-3 wide at base - int totalHeight = 20 + random.nextInt(15); // 20-34 blocks tall + int baseRadius = 2 + random.nextInt(2); + int totalHeight = 20 + random.nextInt(15); double curveAngle = random.nextDouble() * Math.PI * 2; double curveDX = Math.cos(curveAngle); double curveDZ = Math.sin(curveAngle); - double maxCurve = 4.0 + random.nextDouble() * 5.0; // 4-9 block lean at tip + double maxCurve = 4.0 + random.nextDouble() * 5.0; boolean placed = false; @@ -81,12 +81,10 @@ public class CoralSpikeFeature extends Feature { int blockY = floorY + dy; double progress = (double) dy / totalHeight; - // Quadratic lean -- slow at base, bending hard near tip double curveOffset = maxCurve * progress * progress; double centerX = origin.getX() + curveDX * curveOffset; double centerZ = origin.getZ() + curveDZ * curveOffset; - // Taper: full width for bottom 25%, then narrows sharply to a point double taperT = Math.max(0.0, (progress - 0.25) / 0.75); int radius = (int) Math.max(0, baseRadius * (1.0 - taperT * taperT * 1.3)); @@ -147,7 +145,6 @@ public class CoralSpikeFeature extends Feature { } } - // Floor scatter: coral plants, fans, and sea pickles around the base int decorCount = 10 + random.nextInt(12); for (int i = 0; i < decorCount; i++) { int fx = origin.getX() + random.nextInt(13) - 6; @@ -192,7 +189,6 @@ public class CoralSpikeFeature extends Feature { } } } else if (decorInWater) { - // Sea pickle cluster -- only underwater BlockState pickle = Blocks.SEA_PICKLE.defaultBlockState() .setValue(SeaPickleBlock.PICKLES, 1 + random.nextInt(4)); if (pickle.canSurvive(level, decorPos)) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java index e180c6e6..088140ee 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java @@ -16,11 +16,6 @@ import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.MultiNoiseBiomeSource; -/** - * Plain multi-noise biome source with one addition: everything at or above - * {@code cloud_sea_min_y} is the cloud sea. Below that line, biome selection is - * identical to {@code minecraft:multi_noise} over the same list minus the cloud sea entry. - */ public final class ElythiaBiomeSource extends BiomeSource { private static final ResourceKey CLOUD_SEA = ResourceKey.create( Registries.BIOME, @@ -47,7 +42,6 @@ public final class ElythiaBiomeSource extends BiomeSource { .filter(holder -> holder.is(CLOUD_SEA)) .findFirst() .orElse(null); - // Keep the cloud sea out of the noise search so terrain biomes resolve exactly as before. this.delegate = MultiNoiseBiomeSource.createFromList(new Climate.ParameterList<>( parameters.values().stream() .filter(entry -> !entry.getSecond().is(CLOUD_SEA)) diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaCloudFeature.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaCloudFeature.java index 276021ad..18c59645 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaCloudFeature.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaCloudFeature.java @@ -10,10 +10,6 @@ import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -/** - * Scatters solid puffs of {@link AntarchyObjects#CLOUD_BLOCK} sized and shaped - * anywhere from thin wispy veils to large, dense masses, with a softly feathered edge. - */ public final class ElythiaCloudFeature extends Feature { public ElythiaCloudFeature(Codec codec) { super(codec); @@ -76,9 +72,6 @@ public final class ElythiaCloudFeature extends Feature int yRange = Math.max(1, radiusY); int zRange = Math.max(1, radiusZ); BlockState cloud = AntarchyObjects.CLOUD_BLOCK.get().defaultBlockState(); - // Clouds are solid puffs, not hollow shells — only the outer rind is feathered for a - // soft, ragged edge. Wispy clouds get a lower edge-fill chance so they read as thin - // and sparse without turning the whole body into visible holes. float edgeFillChance = size == CloudSize.WISPY ? 0.55F : 0.85F; double edgeStart = 0.7D; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaRiverCarveFunction.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaRiverCarveFunction.java index 4c0ccf05..f5109e29 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaRiverCarveFunction.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaRiverCarveFunction.java @@ -5,21 +5,6 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.util.KeyDispatchDataCodec; import net.minecraft.world.level.levelgen.DensityFunction; -/** - * Custom density function that carves narrow river channels in Elythia. - * - * Logic: - * - Outside river-erosion territory (erosion <= EROSION_THRESHOLD): behaves identically - * to the original "-0.06 * erosion" term in elythia_surface.json. - * - Inside river-erosion territory (erosion > EROSION_THRESHOLD): additionally applies - * a strong negative carve when the ridges value is near 0, producing a narrow channel. - * The carve tapers quadratically from full depth at ridges=0 to zero at |ridges|=CHANNEL_HALF_WIDTH. - * - * Tuning: - * - EROSION_THRESHOLD: raise to make rivers rarer, lower to make them appear in more terrain - * - CHANNEL_HALF_WIDTH: controls channel width in blocks (wider noise band = wider river) - * - CHANNEL_DEPTH: controls how far below sea level the river floor sits - */ public record ElythiaRiverCarveFunction( DensityFunction erosion, DensityFunction ridges @@ -35,16 +20,9 @@ public record ElythiaRiverCarveFunction( public static final KeyDispatchDataCodec KEY_CODEC = KeyDispatchDataCodec.of(CODEC); - // Erosion must exceed this for river carving to engage private static final double EROSION_THRESHOLD = 0.70; - // Half-width of the channel in ridges-space. Ridges ranges roughly -1 to 1 across - // the landscape; this controls the physical width of the carved channel. private static final double CHANNEL_HALF_WIDTH = 0.08; - // Maximum density reduction applied at the center of the channel. - // ~0.35 pushes the terrain floor roughly 25 blocks below its normal level, - // landing below sea level (63) so the channel fills with water naturally. private static final double CHANNEL_DEPTH = 0.35; - // Matches the original elythia_surface.json erosion multiplier so non-river areas are unchanged private static final double BASE_EROSION_FACTOR = -0.06; @Override diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/FallenOuranwoodFeature.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/FallenOuranwoodFeature.java index d7a1861a..12d00cf8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/FallenOuranwoodFeature.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/FallenOuranwoodFeature.java @@ -31,8 +31,8 @@ public class FallenOuranwoodFeature extends Feature { BlockPos origin = context.origin(); Direction.Axis axis = random.nextBoolean() ? Direction.Axis.X : Direction.Axis.Z; - int length = 36 + random.nextInt(44); // 36–79 blocks long - int outerRadius = 1 + random.nextInt(3); // 1–3 (cross-section up to 7-wide) + int length = 36 + random.nextInt(44); + int outerRadius = 1 + random.nextInt(3); boolean hollow = outerRadius >= 2; Block ouranwoodLog = BuiltInRegistries.BLOCK.getOptional( @@ -46,7 +46,6 @@ public class FallenOuranwoodFeature extends Feature { BlockState woodState = AntarchyObjects.MOSSY_OURANWOOD_WOOD.get().defaultBlockState() .setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y); - // Pre-generate a smoothed damage profile along the length (0=solid, 1=gap) float[] damage = new float[length]; for (int i = 0; i < length; i++) damage[i] = random.nextFloat(); for (int pass = 0; pass < 4; pass++) { @@ -54,7 +53,6 @@ public class FallenOuranwoodFeature extends Feature { damage[i] = (damage[i - 1] + damage[i] * 2 + damage[i + 1]) / 4f; } } - // Bias upward so more sections are heavily damaged for (int i = 0; i < length; i++) damage[i] = damage[i] * damage[i]; int anchorY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, origin.getX(), origin.getZ()); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/FungalMushroomFeature.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/FungalMushroomFeature.java index a6da40dd..f0740df9 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/FungalMushroomFeature.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/FungalMushroomFeature.java @@ -39,7 +39,7 @@ public class FungalMushroomFeature extends Feature { double maxLean = 2.0 + random.nextDouble() * 3.5; int baseY = origin.getY(); - int stemOffset = stemSize == 2 ? 0 : -1; // center 3x3 on origin + int stemOffset = stemSize == 2 ? 0 : -1; BlockState stemPore = Blocks.MUSHROOM_STEM.defaultBlockState() .setValue(HugeMushroomBlock.NORTH, false) @@ -98,7 +98,6 @@ public class FungalMushroomFeature extends Feature { double nomRadius = baseCapRadius - cl; if (nomRadius < 0) break; - // The cap center also shifts slightly with lean for a drooping overhang feel double layerCapX = capCenterX + leanDX * cl * 0.3; double layerCapZ = capCenterZ + leanDZ * cl * 0.3; 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 09a56cea..1ad3b65f 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 @@ -30,7 +30,6 @@ import java.util.Set; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -/** Places the authored King's Tree as independently generated chunk slices on a fixed world grid. */ public final class KingsTreeGridFeature extends Feature { private static final Map> CLAIMED_TREE_KINGS = new WeakHashMap<>(); private static final ConcurrentLinkedQueue PENDING_KING_SPAWNS = new ConcurrentLinkedQueue<>(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/OuranwoodTreeFeature.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/OuranwoodTreeFeature.java index ed6b89b3..2b5fb7a6 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/OuranwoodTreeFeature.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/OuranwoodTreeFeature.java @@ -573,8 +573,6 @@ public class OuranwoodTreeFeature extends Feature { return; } - // The tick is scheduled here on the WorldGenLevel because onPlace() is never - // called during world generation, so the block cannot self-schedule. int squirrelCount = 1 + random.nextInt(3); BlockPos markerPos = floorBlocks.get(0); setBlock(level, markerPos, AntarchyObjects.SQUIRREL_NEST_BLOCK.get().defaultBlockState() @@ -687,13 +685,8 @@ public class OuranwoodTreeFeature extends Feature { } protected void placeCaterpillarChrysalis(WorldGenLevel level, BlockPos origin, OuranwoodTreeConfiguration config, RandomSource random, BlockPos canopyCenter, int canopyRadius, int canopyDepth) { - // Tree-grown chrysalis placement is intentionally disabled for now. } - /** - * Finds a log or leaf block in the canopy that has sufficient clear space beneath it. - * {@code clearBelow} is the vertical depth to check; {@code clearRadius} is the XZ half-width (0 = 1x1, 1 = 3x3). - */ protected @Nullable BlockPos findCanopyAnchor(WorldGenLevel level, RandomSource random, BlockPos canopyCenter, int canopyRadius, int canopyDepth, int clearBelow, int clearRadius, int attempts) { BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); int r = Math.max(1, canopyRadius - 1); @@ -831,7 +824,6 @@ public class OuranwoodTreeFeature extends Feature { int worldX = origin.getX() + x; int worldZ = origin.getZ() + z; - // Raise soil to form a mound around the base (from adaptTerrain) int currentTopY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, worldX, worldZ) - 1; int falloff = (int) Math.floor(Math.sqrt(distanceSq) / 2.1D); int desiredTopY = baseY - falloff + (distanceSq <= trunkRadiusSq ? 0 : random.nextInt(2)); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/AntarchyMixinErrorHandler.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/AntarchyMixinErrorHandler.java index 5fb18e7f..4cf18dca 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/AntarchyMixinErrorHandler.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/AntarchyMixinErrorHandler.java @@ -4,9 +4,6 @@ import org.spongepowered.asm.mixin.extensibility.IMixinConfig; import org.spongepowered.asm.mixin.extensibility.IMixinErrorHandler; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -/* - * Keeps bad mixins from hard-crashing startup. - */ public final class AntarchyMixinErrorHandler implements IMixinErrorHandler { private static final String BROKEN_MARVEL_STELLARIS_MIXIN = "net.tintankgames.marvel.mixin.integration.stellaris.DimensionOxygenManagerMixin"; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/AntarchyMixinPlugin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/AntarchyMixinPlugin.java index 6d5570af..9e83b798 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/AntarchyMixinPlugin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/AntarchyMixinPlugin.java @@ -7,9 +7,6 @@ import org.spongepowered.asm.mixin.Mixins; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -/* - * Mixin plugin for compat-gated mixins and optional deps. - */ public final class AntarchyMixinPlugin implements IMixinConfigPlugin { private static final AntarchyRangedAttackPatcher RANGED_ATTACK_PATCHER = new AntarchyRangedAttackPatcher(); @@ -42,14 +39,9 @@ public final class AntarchyMixinPlugin implements IMixinConfigPlugin { && classPresent("com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod"); } if (mixinClassName.startsWith("com.craisinlord.antarchy.mixins.compat.alexscaves.")) { - // The target class was found above. Checking the target itself avoids depending on - // whether a loader exposes Alex's Caves' entrypoint resource to this classloader. return true; } if (mixinClassName.endsWith(".VillagerTradesMixin")) { - // Trade registration is platform-driven on every supported loader now. Keeping the - // static VillagerTrades class-init mixin around risks touching AntarchyObjects before - // registration is finished on Fabric and duplicates trades on event-driven loaders. return false; } return true; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/DreamFireBlockMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/DreamFireBlockMixin.java index 9908e8c1..65d6a3fc 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/DreamFireBlockMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/DreamFireBlockMixin.java @@ -15,9 +15,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BaseFireBlock.class) -/* - * Lets dream fire pick the floor or ceiling variant from the same support tag. - */ public abstract class DreamFireBlockMixin { private static final ResourceLocation DREAM_FIRE_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "dream_fire"); private static final ResourceLocation DREAM_CEILING_FIRE_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "dream_fire_ceiling"); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/GlimmeringDamageImmunityMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/GlimmeringDamageImmunityMixin.java index 5d47f766..9706e504 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/GlimmeringDamageImmunityMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/GlimmeringDamageImmunityMixin.java @@ -13,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LivingEntity.class) public abstract class GlimmeringDamageImmunityMixin { - // Magic damage (potions, spells) is tagged bypasses_armor, so it's excluded @Inject(method = "hurt", at = @At("HEAD"), cancellable = true) private void antarchy$glimmeringIgnoresAttacks(DamageSource source, float amount, CallbackInfoReturnable cir) { LivingEntity self = (LivingEntity) (Object) this; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/GlimmeringPushableMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/GlimmeringPushableMixin.java index 8b5350ec..621e863c 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/GlimmeringPushableMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/GlimmeringPushableMixin.java @@ -9,8 +9,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -// LivingEntity.isPushable()/isPickable() are full overrides of Entity's versions (they don't call -// super), so this has to target LivingEntity directly, not Entity, or the injected code never runs. @Mixin(LivingEntity.class) public abstract class GlimmeringPushableMixin { @Inject(method = "isPushable", at = @At("RETURN"), cancellable = true) @@ -26,9 +24,6 @@ public abstract class GlimmeringPushableMixin { } } - // Projectiles (and entity-picking in general) skip targets that aren't isPickable(), so this - // is what actually lets arrows/tridents/etc. pass through a glimmering entity instead of - // colliding with it; the damage-immunity mixin alone only stopped the damage, not the impact. @Inject(method = "isPickable", at = @At("RETURN"), cancellable = true) private void antarchy$glimmeringNotPickable(CallbackInfoReturnable cir) { if (!cir.getReturnValueZ()) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/MantisClawWallClimbMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/MantisClawWallClimbMixin.java index 79e9f6be..e0df3585 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/MantisClawWallClimbMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/MantisClawWallClimbMixin.java @@ -1,5 +1,6 @@ package com.craisinlord.antarchy.mixins; +import com.craisinlord.antarchy.content.AntarchyTags; import com.craisinlord.antarchy.content.item.MantisClawItem; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; @@ -91,6 +92,7 @@ public abstract class MantisClawWallClimbMixin extends LivingEntity { Player player = (Player) (Object) this; return MantisClawItem.isDualWielding(player) && this.horizontalCollision + && !this.level().dimensionTypeRegistration().is(AntarchyTags.DimensionTypes.NO_MANTIS_CLIMB) && !this.onGround() && !this.isInWaterOrBubble() && !this.isPassenger() diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/PoiTypesMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/PoiTypesMixin.java index 4e212645..cd09077e 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/PoiTypesMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/PoiTypesMixin.java @@ -33,7 +33,6 @@ public abstract class PoiTypesMixin { BuiltInRegistries.POINT_OF_INTEREST_TYPE.getHolder(key) .ifPresent(holder -> callback.setReturnValue(Optional.of(holder))); } catch (IllegalStateException ignored) { - // Registration can be queried during bootstrap before loader bindings finish. } } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/RoyalGuardianPlayerAttackMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/RoyalGuardianPlayerAttackMixin.java index de94f6fe..2b4078b0 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/RoyalGuardianPlayerAttackMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/RoyalGuardianPlayerAttackMixin.java @@ -8,7 +8,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -/** Captures attack charge before vanilla resets the player's attack-strength ticker. */ @Mixin(Player.class) public abstract class RoyalGuardianPlayerAttackMixin { @Inject(method = "attack", at = @At("HEAD")) diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/ServerPlayerGameModeMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/ServerPlayerGameModeMixin.java index 1ae1efb7..6c92338b 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/ServerPlayerGameModeMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/ServerPlayerGameModeMixin.java @@ -14,9 +14,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ServerPlayerGameMode.class) -/* - * Keeps custom sapling stage updates synced like vanilla. - */ public abstract class ServerPlayerGameModeMixin { @Shadow protected ServerLevel level; @Shadow @Final protected ServerPlayer player; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/UndertrialSpawnPlacementsMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/UndertrialSpawnPlacementsMixin.java index e7d9235f..24ec01f8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/UndertrialSpawnPlacementsMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/UndertrialSpawnPlacementsMixin.java @@ -8,11 +8,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -/** - * Lets the Undertrial's vanilla TrialSpawner path spawn entities whose normal - * placement predicate assumes floor support. TrialSpawner already performs - * its own no-collision and obstruction checks before this method is reached. - */ @Mixin(SpawnPlacements.class) public abstract class UndertrialSpawnPlacementsMixin { @Inject(method = "checkSpawnRules", at = @At("RETURN"), cancellable = true) diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/client/GlimmeringTranslucencyMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/client/GlimmeringTranslucencyMixin.java index 68cd6180..54c2261b 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/client/GlimmeringTranslucencyMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/client/GlimmeringTranslucencyMixin.java @@ -18,8 +18,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LivingEntityRenderer.class) public abstract class GlimmeringTranslucencyMixin { - // Vertex-color alpha applied to the base skin render while glimmering, on top of the recolor - // overlay, so the body itself reads as see-through rather than just tinted. private static final int GLIMMERING_ALPHA = 0x40; @Unique diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/FallingBlockEntityBlockDataMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/FallingBlockEntityBlockDataMixin.java index 3bb32fb4..c45db07f 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/FallingBlockEntityBlockDataMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/FallingBlockEntityBlockDataMixin.java @@ -30,9 +30,6 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(FallingBlockEntity.class) -/* - * Preserves full block data on carried falling blocks. - */ public abstract class FallingBlockEntityBlockDataMixin { @Shadow public CompoundTag blockData; @Shadow public abstract BlockState getBlockState(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/PlayerAttackMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/PlayerAttackMixin.java index 0feef624..5eaca4ab 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/PlayerAttackMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/PlayerAttackMixin.java @@ -17,9 +17,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Player.class) -/* - * Fixes player attack checks under inverted gravity. - */ public abstract class PlayerAttackMixin { @Inject(method = "attack", at = @At("HEAD"), cancellable = true) private void antarchy$blockGravityGunMelee(Entity target, CallbackInfo ci) { @@ -34,9 +31,6 @@ public abstract class PlayerAttackMixin { } } - /* - * Primordial's full set bonus makes player melee knockback ignore the target's knockback resistance. - */ @WrapOperation(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V")) private void antarchy$ignorePrimordialKnockbackResistance(LivingEntity target, double strength, double x, double z, Operation original) { Player player = (Player) (Object) this; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/ServerChunkCacheAccessor.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/ServerChunkCacheAccessor.java index f70ce183..d5bb3c8e 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/ServerChunkCacheAccessor.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/ServerChunkCacheAccessor.java @@ -6,9 +6,6 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(ServerChunkCache.class) -/* - * Accessor for server chunk source internals used by gravity sync. - */ public interface ServerChunkCacheAccessor { @Accessor("chunkMap") ChunkMap antarchy$getChunkMap(); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/client/FallingBlockRendererBlockEntityMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/client/FallingBlockRendererBlockEntityMixin.java index 468f665e..465a1258 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/client/FallingBlockRendererBlockEntityMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/gravity/client/FallingBlockRendererBlockEntityMixin.java @@ -19,9 +19,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(FallingBlockRenderer.class) -/* - * Keeps falling block render data lined up with carried state. - */ public abstract class FallingBlockRendererBlockEntityMixin { @Inject( method = "render(Lnet/minecraft/world/entity/item/FallingBlockEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/de_de.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/de_de.json index 58b80592..80a33d43 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/de_de.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/de_de.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Auf 3x3-Abbau umgeschaltet", + "message.antarchy.ultimate_tool.mode_vein": "Auf Adernabbau umgeschaltet", "message.antarchy.ultimate_tool.mode_default": "Auf normalen Abbau umgeschaltet", "advancements.antarchy.hey_listen.title": "Hey, hör zu!", "advancements.antarchy.hey_listen.description": "Eine Reverie hat sich dir angeschlossen.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Rechtsklick, um dich drehend nach vorn zu bohren und Molevore-Blöcke zu durchdringen.", "tooltip.antarchy.big_bertha.mode.toreterror": "Rechtsklick, um in die Luft zu springen und mit einer Flächenschockwelle herabzustürzen.", "tooltip.antarchy.ultimate_tools_3x3": "Umschalt-Rechtsklick, um 3x3-Abbau umzuschalten.", + "tooltip.antarchy.ultimate_tools_vein": "Umschalt-Rechtsklick, um Adernabbau umzuschalten.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Umschalt-Rechtsklick wechselt zwischen 3x3-Abbau und Adernabbau.", + "tooltip.antarchy.battle_axe_tree_felling": "Fällt ganze Bäume. Schleichen, um einen einzelnen Stamm zu hacken.", "tooltip.antarchy.moggles.reveal": "Gewährt Nachtsicht und weist auf nahe Höhlen hin.", "tooltip.antarchy.moggles.underground": "Funktioniert nur, wenn du keinen freien Blick zum Himmel hast.", "tooltip.antarchy.cornea_ear.vision": "Gewährt %s Sekunden lang Nachtsicht.", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json index 796617bb..c3d1e8f3 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json @@ -801,6 +801,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Switched to 3x3 Mining", + "message.antarchy.ultimate_tool.mode_vein": "Switched to Vein Mining", "message.antarchy.ultimate_tool.mode_default": "Switched to Default Mining", "advancements.antarchy.hey_listen.title": "Hey Listen", "advancements.antarchy.hey_listen.description": "A Reverie has joined you.", @@ -839,6 +840,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Use to spin forward and drill through Molevore blocks.", "tooltip.antarchy.big_bertha.mode.toreterror": "Use to launch into the air and crash down with an AOE shockwave.", "tooltip.antarchy.ultimate_tools_3x3": "Shift + use to toggle 3x3 Mining.", + "tooltip.antarchy.ultimate_tools_vein": "Shift + use to toggle Vein Mining.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Shift + use to cycle 3x3 and Vein Mining.", + "tooltip.antarchy.battle_axe_tree_felling": "Fells whole trees. Sneak to chop a single log.", "tooltip.antarchy.moggles.reveal": "Gives night vision and points to nearby caves.", "tooltip.antarchy.moggles.underground": "Works only while you have no sky access.", "tooltip.antarchy.cornea_ear.vision": "Grants Night Vision for %s seconds.", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/es_es.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/es_es.json index 1951fd9c..d7e0d9f2 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/es_es.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/es_es.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Cambiado a minería 3x3", + "message.antarchy.ultimate_tool.mode_vein": "Cambiado a minería de vetas", "message.antarchy.ultimate_tool.mode_default": "Cambiado a minería normal", "advancements.antarchy.hey_listen.title": "¡Oye, escucha!", "advancements.antarchy.hey_listen.description": "Una Reverie se ha unido a ti.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Clic derecho para girar hacia delante y perforar bloques de Molevore.", "tooltip.antarchy.big_bertha.mode.toreterror": "Clic derecho para lanzarte al aire y caer con una onda de choque en área.", "tooltip.antarchy.ultimate_tools_3x3": "Mayús + clic derecho para alternar la minería 3x3.", + "tooltip.antarchy.ultimate_tools_vein": "Mayús + clic derecho para alternar la minería de vetas.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Mayús + clic derecho para alternar entre minería 3x3 y de vetas.", + "tooltip.antarchy.battle_axe_tree_felling": "Tala árboles enteros. Agáchate para cortar un solo tronco.", "tooltip.antarchy.moggles.reveal": "Otorga Visión nocturna y señala cuevas cercanas.", "tooltip.antarchy.moggles.underground": "Solo funciona cuando no tienes acceso al cielo.", "tooltip.antarchy.cornea_ear.vision": "Otorga Visión nocturna durante %s segundos.", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/fr_fr.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/fr_fr.json index a37b67e2..0226490c 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/fr_fr.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/fr_fr.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Mode minage 3x3 activé", + "message.antarchy.ultimate_tool.mode_vein": "Mode minage de filons activé", "message.antarchy.ultimate_tool.mode_default": "Mode minage normal activé", "advancements.antarchy.hey_listen.title": "Hé, écoute !", "advancements.antarchy.hey_listen.description": "Une Reverie vous a rejoint.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Clic droit pour tournoyer vers l’avant et forer les blocs de Molevore.", "tooltip.antarchy.big_bertha.mode.toreterror": "Clic droit pour bondir dans les airs et retomber avec une onde de choc de zone.", "tooltip.antarchy.ultimate_tools_3x3": "Maj + clic droit pour activer ou désactiver le minage 3x3.", + "tooltip.antarchy.ultimate_tools_vein": "Maj + clic droit pour activer ou désactiver le minage de filons.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Maj + clic droit pour alterner entre minage 3x3 et minage de filons.", + "tooltip.antarchy.battle_axe_tree_felling": "Abat des arbres entiers. Accroupis-toi pour couper une seule bûche.", "tooltip.antarchy.moggles.reveal": "Accorde Vision nocturne et indique les grottes proches.", "tooltip.antarchy.moggles.underground": "Fonctionne uniquement lorsque vous n’avez pas accès au ciel.", "tooltip.antarchy.cornea_ear.vision": "Accorde Vision nocturne pendant %s secondes.", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/it_it.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/it_it.json index 64146477..f505e11a 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/it_it.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/it_it.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Scavo 3×3 attivato", + "message.antarchy.ultimate_tool.mode_vein": "Scavo di vene attivato", "message.antarchy.ultimate_tool.mode_default": "Scavo normale attivato", "advancements.antarchy.hey_listen.title": "Ehi, ascolta!", "advancements.antarchy.hey_listen.description": "Una Reverie si è unita a te.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Fai clic destro per ruotare in avanti e perforare i blocchi di Molevore.", "tooltip.antarchy.big_bertha.mode.toreterror": "Fai clic destro per balzare in aria e schiantarti con un’onda d’urto ad area.", "tooltip.antarchy.ultimate_tools_3x3": "Maiusc + clic destro per attivare o disattivare lo scavo 3×3.", + "tooltip.antarchy.ultimate_tools_vein": "Maiusc + clic destro per attivare o disattivare lo scavo di vene.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Maiusc + clic destro per alternare scavo 3×3 e scavo di vene.", + "tooltip.antarchy.battle_axe_tree_felling": "Abbatte alberi interi. Accovacciati per tagliare un solo tronco.", "tooltip.antarchy.moggles.reveal": "Fornisce Visione notturna e indica le grotte vicine.", "tooltip.antarchy.moggles.underground": "Funziona solo quando non puoi vedere il cielo.", "tooltip.antarchy.cornea_ear.vision": "Conferisce Visione notturna per %s secondi.", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/ja_jp.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/ja_jp.json index 59161e75..9b76857b 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/ja_jp.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/ja_jp.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "モールヴォア", "message.antarchy.big_bertha.mode.toreterror": "トアテラー", "message.antarchy.ultimate_tool.mode_3x3": "3×3採掘に切り替えました", + "message.antarchy.ultimate_tool.mode_vein": "鉱脈採掘に切り替えました", "message.antarchy.ultimate_tool.mode_default": "通常採掘に切り替えました", "advancements.antarchy.hey_listen.title": "ねえ、聞いて!", "advancements.antarchy.hey_listen.description": "レヴェリーが仲間になりました。", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "右クリックで回転しながら前進し、モールヴォアブロックを掘り抜きます。", "tooltip.antarchy.big_bertha.mode.toreterror": "右クリックで空中へ飛び上がり、範囲衝撃波とともに落下します。", "tooltip.antarchy.ultimate_tools_3x3": "シフトキー+右クリックで3×3採掘を切り替えます。", + "tooltip.antarchy.ultimate_tools_vein": "シフトキー+右クリックで鉱脈採掘を切り替えます。", + "tooltip.antarchy.ultimate_tools_3x3_vein": "シフトキー+右クリックで3×3採掘と鉱脈採掘を切り替えます。", + "tooltip.antarchy.battle_axe_tree_felling": "木を丸ごと伐採します。スニーク中は原木を1つだけ切ります。", "tooltip.antarchy.moggles.reveal": "暗視を付与し、近くの洞窟を示します。", "tooltip.antarchy.moggles.underground": "空が見えない場所でのみ機能します。", "tooltip.antarchy.cornea_ear.vision": "%s秒間暗視を付与します。", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/ko_kr.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/ko_kr.json index 86001626..9eccad8c 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/ko_kr.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/ko_kr.json @@ -792,6 +792,7 @@ "message.antarchy.big_bertha.mode.molevore": "몰레보어", "message.antarchy.big_bertha.mode.toreterror": "토레테러", "message.antarchy.ultimate_tool.mode_3x3": "3x3 채굴 모드로 전환됨", + "message.antarchy.ultimate_tool.mode_vein": "광맥 채굴 모드로 전환됨", "message.antarchy.ultimate_tool.mode_default": "기본 채굴 모드로 전환됨", "advancements.antarchy.hey_listen.title": "야, 들어봐!", "advancements.antarchy.hey_listen.description": "레버리가 당신과 함께합니다.", @@ -830,6 +831,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "공격 시 추가 피해를 입히고 대상을 공중 높이 띄웁니다.", "tooltip.antarchy.big_bertha.mode.toreterror": "사용하여 앞으로 회전하며 몰레보어 블록을 뚫고 나아갑니다.", "tooltip.antarchy.ultimate_tools_3x3": "Shift + 사용: 3x3 채굴을 켜거나 끕니다.", + "tooltip.antarchy.ultimate_tools_vein": "Shift + 사용: 광맥 채굴을 켜거나 끕니다.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Shift + 사용: 3x3 채굴과 광맥 채굴을 전환합니다.", + "tooltip.antarchy.battle_axe_tree_felling": "나무 전체를 벱니다. 웅크리면 통나무 하나만 벱니다.", "tooltip.antarchy.moggles.reveal": "야간 시야를 부여하고 근처 동굴을 가리킵니다.", "tooltip.antarchy.moggles.underground": "하늘이 가려진 곳에서만 작동합니다.", "tooltip.antarchy.cornea_ear.vision": "%s초 동안 야간 시야를 부여합니다.", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/pt_br.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/pt_br.json index 487f343b..99325239 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/pt_br.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/pt_br.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "Molevore", "message.antarchy.big_bertha.mode.toreterror": "Toreterror", "message.antarchy.ultimate_tool.mode_3x3": "Alternado para Mineração 3x3", + "message.antarchy.ultimate_tool.mode_vein": "Alternado para Mineração de Veios", "message.antarchy.ultimate_tool.mode_default": "Alternado para Mineração Padrão", "advancements.antarchy.hey_listen.title": "Ei, Escute!", "advancements.antarchy.hey_listen.description": "Uma Reverie se juntou a você.", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "Clique com o botão direito para girar para a frente e perfurar blocos de Molevore.", "tooltip.antarchy.big_bertha.mode.toreterror": "Clique com o botão direito para se lançar ao ar e cair com uma onda de choque em área.", "tooltip.antarchy.ultimate_tools_3x3": "Shift + clique com o botão direito para alternar a Mineração 3x3.", + "tooltip.antarchy.ultimate_tools_vein": "Shift + clique com o botão direito para alternar a Mineração de Veios.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Shift + clique com o botão direito para alternar entre Mineração 3x3 e de Veios.", + "tooltip.antarchy.battle_axe_tree_felling": "Derruba árvores inteiras. Agache para cortar um único tronco.", "tooltip.antarchy.moggles.reveal": "Concede Visão Noturna e aponta para cavernas próximas.", "tooltip.antarchy.moggles.underground": "Funciona apenas quando você não tem acesso ao céu.", "tooltip.antarchy.cornea_ear.vision": "Concede Visão Noturna por %s segundos.", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/ru_ru.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/ru_ru.json index 23ae1ec1..5adb35f7 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/ru_ru.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/ru_ru.json @@ -488,6 +488,7 @@ "message.antarchy.big_bertha.mode.molevore": "Кротожор", "message.antarchy.big_bertha.mode.toreterror": "Тортеррор", "message.antarchy.ultimate_tool.mode_3x3": "Включено копание 3x3", + "message.antarchy.ultimate_tool.mode_vein": "Включена добыча жил", "message.antarchy.ultimate_tool.mode_default": "Включено обычное копание", "advancements.antarchy.hey_listen.title": "Эй, послушай", "advancements.antarchy.hey_listen.description": "К вам присоединилась грёза.", @@ -520,6 +521,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "ПКМ для рывка вперёд и бурения сквозь блоки кротожора.", "tooltip.antarchy.big_bertha.mode.toreterror": "ПКМ запускает вас в воздух и обрушивает вниз с ударной волной по площади.", "tooltip.antarchy.ultimate_tools_3x3": "Shift + ПКМ для переключения режима копания 3x3.", + "tooltip.antarchy.ultimate_tools_vein": "Shift + ПКМ для переключения добычи жил.", + "tooltip.antarchy.ultimate_tools_3x3_vein": "Shift + ПКМ переключает копание 3x3 и добычу жил.", + "tooltip.antarchy.battle_axe_tree_felling": "Срубает дерево целиком. Присядьте, чтобы срубить одно бревно.", "tooltip.antarchy.moggles.reveal": "Дают ночное зрение и указывают на ближайшие пещеры.", "tooltip.antarchy.moggles.underground": "Работает только если над вами нет открытого неба.", "tooltip.antarchy.cornea_ear.vision": "Даёт Ночное зрение на %s секунд.", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/zh_cn.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/zh_cn.json index 1fca91fa..378194e9 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/zh_cn.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/zh_cn.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "莫尔沃尔", "message.antarchy.big_bertha.mode.toreterror": "托尔泰罗尔", "message.antarchy.ultimate_tool.mode_3x3": "已切换至3×3挖掘", + "message.antarchy.ultimate_tool.mode_vein": "已切换至连锁挖矿", "message.antarchy.ultimate_tool.mode_default": "已切换至默认挖掘", "advancements.antarchy.hey_listen.title": "嘿,听着!", "advancements.antarchy.hey_listen.description": "一只雷弗里加入了你。", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "右键旋转向前并钻穿莫尔沃尔方块。", "tooltip.antarchy.big_bertha.mode.toreterror": "右键跃向空中并以范围冲击波砸落。", "tooltip.antarchy.ultimate_tools_3x3": "潜行键+右键切换3×3挖掘。", + "tooltip.antarchy.ultimate_tools_vein": "潜行键+右键切换连锁挖矿。", + "tooltip.antarchy.ultimate_tools_3x3_vein": "潜行键+右键在3×3挖掘与连锁挖矿之间切换。", + "tooltip.antarchy.battle_axe_tree_felling": "一次砍倒整棵树。潜行时只砍一块原木。", "tooltip.antarchy.moggles.reveal": "获得夜视并指向附近洞穴。", "tooltip.antarchy.moggles.underground": "仅在无法接触天空时生效。", "tooltip.antarchy.cornea_ear.vision": "获得%s秒夜视。", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/zh_tw.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/zh_tw.json index fb427e91..f73aff1c 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/zh_tw.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/zh_tw.json @@ -517,6 +517,7 @@ "message.antarchy.big_bertha.mode.molevore": "莫爾沃爾", "message.antarchy.big_bertha.mode.toreterror": "托爾泰羅爾", "message.antarchy.ultimate_tool.mode_3x3": "已切換至3×3挖掘", + "message.antarchy.ultimate_tool.mode_vein": "已切換至連鎖挖礦", "message.antarchy.ultimate_tool.mode_default": "已切換至預設挖掘", "advancements.antarchy.hey_listen.title": "嘿,聽著!", "advancements.antarchy.hey_listen.description": "一隻雷弗里加入了你。", @@ -549,6 +550,9 @@ "tooltip.antarchy.big_bertha.mode.molevore": "右鍵旋轉向前並鑽穿莫爾沃爾方塊。", "tooltip.antarchy.big_bertha.mode.toreterror": "右鍵躍向空中並以範圍衝擊波砸落。", "tooltip.antarchy.ultimate_tools_3x3": "潛行鍵+右鍵切換3×3挖掘。", + "tooltip.antarchy.ultimate_tools_vein": "潛行鍵+右鍵切換連鎖挖礦。", + "tooltip.antarchy.ultimate_tools_3x3_vein": "潛行鍵+右鍵在3×3挖掘與連鎖挖礦之間切換。", + "tooltip.antarchy.battle_axe_tree_felling": "一次砍倒整棵樹。潛行時只砍一塊原木。", "tooltip.antarchy.moggles.reveal": "獲得夜視並指向附近洞穴。", "tooltip.antarchy.moggles.underground": "僅在無法接觸天空時生效。", "tooltip.antarchy.cornea_ear.vision": "獲得%s秒夜視。", diff --git a/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/apple_cow.json b/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/apple_cow.json index a7437c82..b0d9a41a 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/apple_cow.json +++ b/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/apple_cow.json @@ -48,13 +48,35 @@ "function": "minecraft:furnace_smelt", "conditions": [ { - "condition": "minecraft:entity_properties", - "entity": "this", - "predicate": { - "flags": { - "is_on_fire": true + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + }, + { + "condition": "minecraft:entity_properties", + "entity": "direct_attacker", + "predicate": { + "equipment": { + "mainhand": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "#minecraft:smelts_loot" + } + ] + } + } + } + } } - } + ] } ] }, diff --git a/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/enchanted_golden_apple_cow.json b/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/enchanted_golden_apple_cow.json index a7437c82..b0d9a41a 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/enchanted_golden_apple_cow.json +++ b/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/enchanted_golden_apple_cow.json @@ -48,13 +48,35 @@ "function": "minecraft:furnace_smelt", "conditions": [ { - "condition": "minecraft:entity_properties", - "entity": "this", - "predicate": { - "flags": { - "is_on_fire": true + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + }, + { + "condition": "minecraft:entity_properties", + "entity": "direct_attacker", + "predicate": { + "equipment": { + "mainhand": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "#minecraft:smelts_loot" + } + ] + } + } + } + } } - } + ] } ] }, diff --git a/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/golden_apple_cow.json b/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/golden_apple_cow.json index a7437c82..b0d9a41a 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/golden_apple_cow.json +++ b/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/golden_apple_cow.json @@ -48,13 +48,35 @@ "function": "minecraft:furnace_smelt", "conditions": [ { - "condition": "minecraft:entity_properties", - "entity": "this", - "predicate": { - "flags": { - "is_on_fire": true + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + }, + { + "condition": "minecraft:entity_properties", + "entity": "direct_attacker", + "predicate": { + "equipment": { + "mainhand": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "#minecraft:smelts_loot" + } + ] + } + } + } + } } - } + ] } ] }, diff --git a/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/ouranwood_deer.json b/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/ouranwood_deer.json index 5bd5aaec..27dda19c 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/ouranwood_deer.json +++ b/common-1.21.1/src/main/resources/data/antarchy/loot_table/entities/ouranwood_deer.json @@ -48,13 +48,35 @@ "function": "minecraft:furnace_smelt", "conditions": [ { - "condition": "minecraft:entity_properties", - "entity": "this", - "predicate": { - "flags": { - "is_on_fire": true + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + }, + { + "condition": "minecraft:entity_properties", + "entity": "direct_attacker", + "predicate": { + "equipment": { + "mainhand": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "#minecraft:smelts_loot" + } + ] + } + } + } + } } - } + ] } ] }, diff --git a/common-1.21.1/src/main/resources/data/antarchy/worldgen/biome/cavaryn_moleworm_caves.json b/common-1.21.1/src/main/resources/data/antarchy/worldgen/biome/cavaryn_moleworm_caves.json index 869ded6c..76649eb1 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/worldgen/biome/cavaryn_moleworm_caves.json +++ b/common-1.21.1/src/main/resources/data/antarchy/worldgen/biome/cavaryn_moleworm_caves.json @@ -55,7 +55,8 @@ ], [ "antarchy:moleworm_caves_creepvine", - "antarchy:moleworm_caves_hanging_creeproots" + "antarchy:moleworm_caves_hanging_creeproots", + "antarchy:termite_nest" ], [] ], diff --git a/common-1.21.1/src/main/resources/data/antarchy/worldgen/biome/wormy_caves.json b/common-1.21.1/src/main/resources/data/antarchy/worldgen/biome/wormy_caves.json index 709f910c..a29b0c88 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/worldgen/biome/wormy_caves.json +++ b/common-1.21.1/src/main/resources/data/antarchy/worldgen/biome/wormy_caves.json @@ -52,7 +52,8 @@ "antarchy:wormy_caves_creepvine", "antarchy:wormy_caves_hanging_creeproots", "antarchy:wormy_caves_molting_vines", - "antarchy:wormy_caves_ground_molting_vines" + "antarchy:wormy_caves_ground_molting_vines", + "antarchy:termite_nest" ], [] ], diff --git a/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest.json b/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest.json index 81555f52..bd766f59 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest.json +++ b/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 24 + "chance": 8 }, { "type": "minecraft:in_square" diff --git a/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest_magma.json b/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest_magma.json index 850042eb..f8e3a1d2 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest_magma.json +++ b/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/red_ant_nest_magma.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 24 + "chance": 8 }, { "type": "minecraft:in_square" diff --git a/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest.json b/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest.json index 70a93fad..0b01f7bd 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest.json +++ b/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest.json @@ -3,14 +3,22 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 88 + "chance": 24 }, { "type": "minecraft:in_square" }, { - "type": "minecraft:heightmap", - "heightmap": "WORLD_SURFACE_WG" + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "min_inclusive": { + "absolute": 8 + }, + "max_inclusive": { + "absolute": 190 + } + } }, { "type": "minecraft:biome" diff --git a/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest_cavaryn.json b/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest_cavaryn.json index 933bd153..3136c852 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest_cavaryn.json +++ b/common-1.21.1/src/main/resources/data/antarchy/worldgen/placed_feature/termite_nest_cavaryn.json @@ -3,14 +3,22 @@ "placement": [ { "type": "minecraft:rarity_filter", - "chance": 44 + "chance": 16 }, { "type": "minecraft:in_square" }, { - "type": "minecraft:heightmap", - "heightmap": "WORLD_SURFACE_WG" + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "min_inclusive": { + "absolute": 8 + }, + "max_inclusive": { + "absolute": 190 + } + } }, { "type": "minecraft:biome" diff --git a/fabric-1.20.1/build.gradle b/fabric-1.20.1/build.gradle index 402c9825..47776dcc 100644 --- a/fabric-1.20.1/build.gradle +++ b/fabric-1.20.1/build.gradle @@ -35,7 +35,6 @@ repositories { } } -// Handle duplicates from common-1.20.1's resources tasks.withType(AbstractCopyTask).configureEach { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } @@ -45,9 +44,6 @@ java { withSourcesJar() } -// Add common-1.20.1's sources directly. Path is relative because fabric-1.20.1 is its -// own standalone Gradle build (Fabric Loom can't configure two different-Minecraft-version -// loom projects in the same Gradle invocation) — there is no `:common-1.20.1` project here. sourceSets { main { java { @@ -132,8 +128,6 @@ tasks.named('processResources', ProcessResources).configure { } } -// common-1.20.1's mixins.json ships refmap-free — inject the refmap key into fabric's -// own copy after copying (matches the fabric-1.21.1 / neoforge-1.21.1 convention). tasks.named('processResources', ProcessResources).configure { doLast { var commonMixinConfig = new File(destinationDir, 'antarchy-common.mixins.json') diff --git a/fabric-1.21.1/build.gradle b/fabric-1.21.1/build.gradle index c156da1b..977e8354 100644 --- a/fabric-1.21.1/build.gradle +++ b/fabric-1.21.1/build.gradle @@ -9,7 +9,6 @@ base { } version = "${mod_version}+1.21.1-fabric" -// Handle duplicates from common-1.21.1's resources tasks.withType(AbstractCopyTask).configureEach { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } @@ -19,7 +18,6 @@ java { withSourcesJar() } -// Add common-1.21.1's sources directly — this module compiles them itself. sourceSets { main { java { @@ -44,9 +42,6 @@ dependencies { if (providers.gradleProperty('antarchySodiumCompatTest').orNull == 'true') { modLocalRuntime(files("$rootDir/infinite_dimensions_jars/sodium-fabric-0.8.13+mc1.21.1.jar")) } - // Sodium — compile-only, for portal live views drawn through Sodium's renderer. Compiled - // against the NeoForge build (official Mojang mappings, matching this module's compile - // space; Sodium's own classes are identical across loaders). Never bundled. compileOnly(files(zipTree("$rootDir/infinite_dimensions_jars/sodium-neoforge-0.8.13+mc1.21.1.jar") .matching { include "META-INF/jarjar/net.caffeinemc.sodium-neoforge-*-mod.jar" })) modCompileOnly("curse.maven:intapi-${intapi_curseforge_id}:${intapi_curseforge_file_id_fabric}") @@ -62,25 +57,12 @@ dependencies { compileOnly(files("$rootDir/infinite_dimensions_jars/sable-neoforge-1.21.1-2.0.3.jar")) compileOnly(files("$rootDir/infinite_dimensions_jars/stellarview-1.21.1-0.5.3-neoforge.jar")) - // Cloth Config — optional, powers the in-game settings screen (AntarchyClothConfigScreenBuilder) - // via the Mod Menu integration below. compileOnly + modLocalRuntime only: never bundled or - // required at runtime in the shipped jar. Guarded by FabricLoader.isModLoaded("cloth-config") - // in AntarchyModMenuIntegration before any Cloth Config class is touched. Reuses the - // clothconfig_curseforge_id/clothconfig_curseforge_file_id pin already in gradle.properties. modCompileOnly("curse.maven:cloth-config-${clothconfig_curseforge_id}:${clothconfig_curseforge_file_id}") modLocalRuntime("curse.maven:cloth-config-${clothconfig_curseforge_id}:${clothconfig_curseforge_file_id}") - // Mod Menu — optional, provides the "modmenu" fabric.mod.json entrypoint - // (AntarchyModMenuIntegration). Same soft-dependency treatment as Cloth Config above; Fabric - // Loader only ever resolves the "modmenu" entrypoint if Mod Menu itself is installed and asks - // for it, so nothing here is touched when it's absent. Reuses the mod_menu version already - // pinned in gradle.properties. modCompileOnly "com.terraformersmc:modmenu:${mod_menu}" modLocalRuntime "com.terraformersmc:modmenu:${mod_menu}" - // Compile against the NeoForge jar (official Mojang mappings, matches this module's compile - // space) but load the real Fabric jar at runtime — sizeable_foliage's Fabric jar ships - // intermediary-mapped, which this compileOnly classpath can't resolve directly. compileOnly(files("$rootDir/sizeable_foliage_jars/sizeable_foliage-neoforge-1.21.1-1.0.0.jar")) modLocalRuntime(files("$rootDir/sizeable_foliage_jars/sizeable_foliage-fabric-1.21.1-1.0.0.jar")) @@ -118,8 +100,6 @@ tasks.named('processResources', ProcessResources).configure { } } -// common-1.21.1's mixins.json ships refmap-free (NeoForge needs no refmap), but Fabric -// does — inject the refmap key into fabric's own copy of the shared file after copying. tasks.named('processResources', ProcessResources).configure { doLast { ['antarchy-common.mixins.json'].each { configName -> diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java index 5fe59470..7b2c7678 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java @@ -77,24 +77,10 @@ public final class AntarchyConfigModuleFabric { } } - /** - * Exposes the reflection-based getter/setter binding map (see {@link #buildBindings()}) so - * other Fabric-side code — namely the optional Cloth Config screen builder — can reuse the - * exact same set of persisted settings the JSON files already round-trip, instead of - * hand-authoring a separate list. Read-only: callers get/set individual values through - * {@link SettingBinding#getValue()} / {@link SettingBinding#setValue(Object)}. - */ public static Map getBindings() { return SETTINGS; } - /** - * Re-serializes the current live value of every binding back to its JSON file. Intended for - * the optional Cloth Config screen's save handler: entries there update the live - * {@link AntarchySettings} fields immediately through their own save consumers (same as - * {@link SettingBinding#apply(Object)} does below), but nothing writes those changes to disk - * until this runs — mirrors the persistence tail of {@link #init()} above. - */ public static void persist() { Map normalized = new LinkedHashMap<>(); for (ConfigSection section : ConfigSection.values()) { @@ -159,10 +145,6 @@ public final class AntarchyConfigModuleFabric { }; } - /** - * Public so the optional Cloth Config screen builder (fabric.client package) can group - * entries into the same Mobs/Tools/Misc categories the JSON files already use. - */ public enum ConfigSection { MOBS("antarchy_mobs.json"), TOOLS("antarchy_tools.json"), @@ -176,14 +158,6 @@ public final class AntarchyConfigModuleFabric { } - /** - * Public so the optional Cloth Config screen builder (fabric.client package) can reuse this - * exact binding — the same getter/setter pair and JSON section the persistence layer above - * already drives — instead of a separate hand-authored entry list. The JSON-specific - * machinery (readValue/apply/toJson/getCurrentValue) stays private and is reused internally - * by the public getValue()/setValue() wrappers below, so there's exactly one code path for - * "what is this setting's current value" and "how do I change it". - */ public static final class SettingBinding { private final String name; private final Method getter; @@ -199,27 +173,22 @@ public final class AntarchyConfigModuleFabric { this.section = section; } - /** The AntarchySettings property name, e.g. {@code krakenHealth}. */ public String getName() { return name; } - /** Which of the three JSON files (Mobs/Tools/Misc) this setting persists to. */ public ConfigSection getSection() { return section; } - /** The primitive/String type of the setter's single parameter (boolean/int/double/float/String). */ public Class getType() { return setterType; } - /** The setting's current live value, boxed (Boolean/Integer/Double/Float/String). */ public Object getValue() { return getCurrentValue(); } - /** Applies a new value immediately via reflection, same as the JSON loader does at startup. */ public void setValue(Object value) { apply(value); } diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java index bcba4aa0..fe831ef0 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java @@ -102,10 +102,6 @@ public final class AntarchyFabricContent { builder.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.STRATOSHARK_FIN.get()), net.minecraft.world.item.alchemy.Potions.SLOW_FALLING); builder.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.SPRINGBUG_LEG.get()), Potions.LEAPING); builder.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.CORNEA_EAR.get()), net.minecraft.world.item.alchemy.Potions.NIGHT_VISION); - // Corn/syrup/root-beer are plain items, not Potion holders, so vanilla's Builder#expectPotion - // rejects them via registerItemRecipe/registerPotionRecipe. The actual output logic comes from - // PotionBrewingMixin -> CustomBrewingRecipes; brewing-stand slot validity for these custom items - // is handled by BrewingStandCustomIngredientMixin (Fabric doesn't expose Builder#addContainer). }); AntarchyFabricSounds.SOUND_EVENTS.register(); diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/BloodglassManager.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/BloodglassManager.java index 7d753916..05cd4c03 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/BloodglassManager.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/BloodglassManager.java @@ -97,9 +97,7 @@ public final class BloodglassManager { } } } else if (!fromIsBC) { - // Count BC pieces: explicitly include the new piece (to) since getItemBySlot(slot) - // may not reflect the new item yet when onEquipItem fires on Fabric. - int bcPieces = 1; // the piece being equipped now + int bcPieces = 1; for (EquipmentSlot s : new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}) { if (s == slot) continue; if (player.getItemBySlot(s).getItem() instanceof BloodCrystalArmorItem) bcPieces++; @@ -110,7 +108,6 @@ public final class BloodglassManager { access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); } } else { - // BC → BC swap: remove old slot, queue new one if (access.antarchy$getArmorShieldsActive() > 0) { access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); } else if (access.antarchy$getArmorShieldLostCount() > 0) { @@ -131,9 +128,6 @@ public final class BloodglassManager { - access.antarchy$getArmorShieldLostCount()); int targetCap = Math.min(amplifier + 1, cap); int currentCap = access.antarchy$getAppleShieldsActive() + access.antarchy$getAppleShieldLostCount(); - // Only grant newly-added capacity (e.g. first application, or a higher amplifier). - // A mere duration refresh of an already-active ward must not reset shields that are - // already lost, nor restart their recharge timer. if (targetCap > currentCap) { access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() + (targetCap - currentCap)); if (player instanceof ServerPlayer sp) syncBloodglass(sp); diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyClothConfigScreenBuilder.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyClothConfigScreenBuilder.java index 0853b5c5..5d755397 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyClothConfigScreenBuilder.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyClothConfigScreenBuilder.java @@ -12,19 +12,6 @@ import net.minecraft.network.chat.Component; import java.util.EnumMap; import java.util.Map; -/** - * Builds a Cloth Config screen directly from {@link AntarchyConfigModuleFabric}'s existing - * reflection-based binding map, so the screen and the on-disk JSON files stay in sync - * automatically — no separate hand-authored list of 350+ entries. - * - *

Only ever reached from {@link AntarchyModMenuIntegration#getModConfigScreenFactory()} after - * it has already confirmed Cloth Config is present, so every Cloth Config class referenced here - * is safe to touch. - * - *

Phase 1 scope (see the implementation plan): raw field names as labels, no min/max bounds, - * no tooltips, and fields backed by {@code ResourceKey} (the four dimension-identity - * settings) are skipped entirely rather than exposed with a widget that doesn't fit them. - */ public final class AntarchyClothConfigScreenBuilder { private AntarchyClothConfigScreenBuilder() { } diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyModMenuIntegration.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyModMenuIntegration.java index 48358e83..2b608c48 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyModMenuIntegration.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyModMenuIntegration.java @@ -4,34 +4,12 @@ import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; import net.fabricmc.loader.api.FabricLoader; -/** - * Optional Mod Menu integration entrypoint — declared under the "modmenu" key in - * fabric.mod.json, never referenced anywhere else in Antarchy's own code. - * - *

This class is only ever loaded/instantiated by Mod Menu itself. Fabric Loader resolves - * entrypoints lazily: it reads every mod's fabric.mod.json at startup, but a class named under - * "entrypoints" is not loaded until something explicitly calls - * {@code FabricLoader.getInstance().getEntrypointContainers("modmenu", ModMenuApi.class)} for - * that key — and only Mod Menu does that. So if Mod Menu isn't installed, this class is never - * touched at all, and "modmenu" is declared as a "suggests" (not "depends") dependency in - * fabric.mod.json precisely so Antarchy loads identically either way. - * - *

Mod Menu and Cloth Config are independently optional, so the one runtime guard this - * integration does need is below: if Mod Menu is present but Cloth Config isn't, building the - * real screen would touch Cloth Config classes that aren't on the classpath. - */ public final class AntarchyModMenuIntegration implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { if (!FabricLoader.getInstance().isModLoaded("cloth-config")) { - // Mod Menu always shows the config button once a non-null factory is returned, so - // there's no clean way to hide it conditionally — handing back the screen that was - // already open is the safest no-op fallback when Cloth Config isn't installed. return parent -> parent; } - // Method reference, not a direct call: this does not load AntarchyClothConfigScreenBuilder - // or touch any Cloth Config class until the player actually clicks the config button, - // which only happens after the isModLoaded check above has already passed. return AntarchyClothConfigScreenBuilder::build; } } diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodglassHudRenderer.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodglassHudRenderer.java index 9cd3c27a..b5dab9d2 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodglassHudRenderer.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodglassHudRenderer.java @@ -26,7 +26,6 @@ public final class BloodglassHudRenderer { if (mc.options.hideGui) return; Player player = mc.player; if (player == null || player.isDeadOrDying()) return; - // Don't show in creative or spectator — no health bar visible there if (player.isCreative() || player.isSpectator()) return; int total = BloodglassClientState.getShieldsMax(); @@ -36,21 +35,16 @@ public final class BloodglassHudRenderer { int w = mc.getWindow().getGuiScaledWidth(); int h = mc.getWindow().getGuiScaledHeight(); - // Vanilla health bar bottom row is at y = h - 39; each extra row (absorption, extra hearts) is 10px above. - // The armor protection icons sit one row above the bottom health row (h - 49). - // We place bloodglass hearts above both health+absorption stack AND the armor row. int maxHealth = Mth.ceil(player.getMaxHealth()); int absorption = Mth.ceil(player.getAbsorptionAmount()); int healthHearts = Mth.ceil(maxHealth / 2.0f); int absorptionHearts = Mth.ceil(absorption / 2.0f); int totalVanillaRows = Mth.ceil((healthHearts + absorptionHearts) / 10.0f); boolean hasArmor = player.getArmorValue() > 0; - // +1 to clear the armor icon row only when armor is actually equipped int baseTop = h - 39 - (totalVanillaRows * 10) - (hasArmor ? 10 : 0); int left = w / 2 - 91; - // Wrap across multiple rows if more than 10 bloodglass hearts for (int i = 0; i < total; i++) { int row = i / 10; int col = i % 10; diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraFallFlyingMixin.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraFallFlyingMixin.java index 5239a901..34c7b4d3 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraFallFlyingMixin.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraFallFlyingMixin.java @@ -11,9 +11,6 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(LivingEntity.class) public abstract class ElytraFallFlyingMixin { - /** - * Redirect to allow any ElytraItem subclass to sustain fall flying. - */ @Redirect( method = "updateFallFlying", at = @At( diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/AmendmentRareOresMixin.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/AmendmentRareOresMixin.java index e7be5675..08f59766 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/AmendmentRareOresMixin.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/AmendmentRareOresMixin.java @@ -12,12 +12,6 @@ import java.util.List; import java.util.Map; @Mixin(value = Amendment.class, remap = false) -/* - * Makes Antarchy's uranium/titanium ores and blocks much rarer in Infinite Dimensions' - * procedural dimensions. This is done natively via Infinity's own amendment system rather - * than relying on players editing infinity's config, keyed off the antarchy:infinity_dimension_rare_ores - * block tag so the list stays data-driven and native to Antarchy. - */ public class AmendmentRareOresMixin { @Inject(method = "getAmendmentList", at = @At("RETURN"), remap = false) private static void antarchy$addRareOreAmendment(CallbackInfoReturnable>> cir) { diff --git a/forge-1.20.1/build.gradle b/forge-1.20.1/build.gradle index d5dbc825..33e7cedd 100644 --- a/forge-1.20.1/build.gradle +++ b/forge-1.20.1/build.gradle @@ -38,7 +38,6 @@ base { archivesName = "${mod_id}-forge-1.20.1" } -// Handle duplicates from common-1.20.1 in all copy tasks tasks.withType(AbstractCopyTask).configureEach { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } @@ -78,9 +77,6 @@ minecraft { } } -// Add common-1.20.1's sources directly. Path is relative because forge-1.20.1 is its -// own Gradle build (ForgeGradle 6 can't run on the root's Gradle 9) — there is no -// `:common-1.20.1` project here. sourceSets { main { java { diff --git a/forge-1.20.1/gradle.properties b/forge-1.20.1/gradle.properties index cfad7a95..10d39a65 100644 --- a/forge-1.20.1/gradle.properties +++ b/forge-1.20.1/gradle.properties @@ -6,7 +6,7 @@ mod_name=Antarchy mod_description=ANTS! ANTS! ANTS! ANTS! mod_authors=CraisinLord mod_group_id=com.craisinlord -mod_version=2.2.6 +mod_version=2.2.9 mod_license=All Rights Reserved minecraft_version=1.20.1 diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyConfigModuleForge.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyConfigModuleForge.java index 39da2532..71473ff6 100644 --- a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyConfigModuleForge.java +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyConfigModuleForge.java @@ -154,6 +154,7 @@ public final class AntarchyConfigModuleForge { AntarchySettings.setRoyalBossKnockbackResistance(AntarchyMobsConfig.royalBossKnockbackResistance()); AntarchySettings.setRoyalBossStepHeight(AntarchyMobsConfig.royalBossStepHeight()); AntarchySettings.setRoyalBossMaxSingleHitDamage(AntarchyMobsConfig.royalBossMaxSingleHitDamage()); + AntarchySettings.setRoyalBossHitOverflowRate(AntarchyMobsConfig.royalBossHitOverflowRate()); AntarchySettings.setRoyalBossBiteReach(AntarchyMobsConfig.royalBossBiteReach()); AntarchySettings.setRoyalBossBiteDamageMultiplier(AntarchyMobsConfig.royalBossBiteDamageMultiplier()); AntarchySettings.setRoyalBossBiteCooldownTicks(AntarchyMobsConfig.royalBossBiteCooldownTicks()); @@ -439,6 +440,9 @@ public final class AntarchyConfigModuleForge { AntarchySettings.setUltimateHoeAttackSpeed(AntarchyToolsConfig.ultimateHoeAttackSpeed()); AntarchySettings.setUltimateToolEnchantability(AntarchyToolsConfig.ultimateToolEnchantability()); AntarchySettings.setUltimateToolsThreeByThreeEnabled(AntarchyToolsConfig.ultimateToolsThreeByThreeEnabled()); + AntarchySettings.setUltimateToolsVeinMiningEnabled(AntarchyToolsConfig.ultimateToolsVeinMiningEnabled()); + AntarchySettings.setUltimateToolsVeinMiningMaxBlocks(AntarchyToolsConfig.ultimateToolsVeinMiningMaxBlocks()); + AntarchySettings.setUltimateToolsTreeFellingMaxLogs(AntarchyToolsConfig.ultimateToolsTreeFellingMaxLogs()); AntarchySettings.setUltimateBowAttackDamage(AntarchyToolsConfig.ultimateBowAttackDamage()); AntarchySettings.setUltimateBowPlayerHeal(AntarchyToolsConfig.ultimateBowPlayerHeal()); diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMobsConfig.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMobsConfig.java index b993f2e9..c5cf78fd 100644 --- a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMobsConfig.java +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMobsConfig.java @@ -104,6 +104,7 @@ public final class AntarchyMobsConfig { private static final ForgeConfigSpec.DoubleValue ROYAL_BOSS_KNOCKBACK_RESISTANCE; private static final ForgeConfigSpec.DoubleValue ROYAL_BOSS_STEP_HEIGHT; private static final ForgeConfigSpec.DoubleValue ROYAL_BOSS_MAX_SINGLE_HIT_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ROYAL_BOSS_HIT_OVERFLOW_RATE; private static final ForgeConfigSpec.DoubleValue ROYAL_BOSS_BITE_REACH; private static final ForgeConfigSpec.DoubleValue ROYAL_BOSS_BITE_DAMAGE_MULTIPLIER; private static final ForgeConfigSpec.IntValue ROYAL_BOSS_BITE_COOLDOWN_TICKS; @@ -531,6 +532,7 @@ public final class AntarchyMobsConfig { ROYAL_BOSS_KNOCKBACK_RESISTANCE = b.comment("Base knockback resistance shared by King and Queen.").defineInRange("knockbackResistance", 1.0D, 0.0D, 1.0D); ROYAL_BOSS_STEP_HEIGHT = b.comment("Base step height shared by King and Queen.").defineInRange("stepHeight", 3.0D, 0.0D, 32.0D); ROYAL_BOSS_MAX_SINGLE_HIT_DAMAGE = b.comment("Maximum damage a single hit can deal to a Royal boss before later anti-burst systems are added.").defineInRange("maxSingleHitDamage", 250.0D, 1.0D, 32768.0D); + ROYAL_BOSS_HIT_OVERFLOW_RATE = b.comment("Share of damage above maxSingleHitDamage that still lands. 0 makes the cap a hard limit.").defineInRange("hitOverflowRate", 0.25D, 0.0D, 1.0D); ROYAL_BOSS_BITE_REACH = b.comment("Radius around each head anchor that a King or Queen bite can hit.").defineInRange("biteReach", 12.0D, 1.0D, 64.0D); ROYAL_BOSS_BITE_DAMAGE_MULTIPLIER = b.comment("Multiplier applied to base attack damage for King and Queen head bites.").defineInRange("biteDamageMultiplier", 1.6D, 0.0D, 32.0D); ROYAL_BOSS_BITE_COOLDOWN_TICKS = b.comment("Base cooldown in ticks between bites for a single King or Queen head (scaled down at later phases).").defineInRange("biteCooldownTicks", 45, 1, 1200); @@ -1046,6 +1048,7 @@ public final class AntarchyMobsConfig { static double royalBossKnockbackResistance() { return ROYAL_BOSS_KNOCKBACK_RESISTANCE.get(); } static double royalBossStepHeight() { return ROYAL_BOSS_STEP_HEIGHT.get(); } static double royalBossMaxSingleHitDamage() { return ROYAL_BOSS_MAX_SINGLE_HIT_DAMAGE.get(); } + static double royalBossHitOverflowRate() { return ROYAL_BOSS_HIT_OVERFLOW_RATE.get(); } static double royalBossBiteReach() { return ROYAL_BOSS_BITE_REACH.get(); } static double royalBossBiteDamageMultiplier() { return ROYAL_BOSS_BITE_DAMAGE_MULTIPLIER.get(); } static int royalBossBiteCooldownTicks() { return ROYAL_BOSS_BITE_COOLDOWN_TICKS.get(); } diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyToolsConfig.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyToolsConfig.java index 20f29b03..8ca5c132 100644 --- a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyToolsConfig.java +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyToolsConfig.java @@ -22,6 +22,9 @@ public final class AntarchyToolsConfig { private static final ForgeConfigSpec.DoubleValue ULTIMATE_HOE_ATTACK_SPEED; private static final ForgeConfigSpec.IntValue ULTIMATE_TOOL_ENCHANTABILITY; private static final ForgeConfigSpec.BooleanValue ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED; + private static final ForgeConfigSpec.BooleanValue ULTIMATE_TOOLS_VEIN_MINING_ENABLED; + private static final ForgeConfigSpec.IntValue ULTIMATE_TOOLS_VEIN_MINING_MAX_BLOCKS; + private static final ForgeConfigSpec.IntValue ULTIMATE_TOOLS_TREE_FELLING_MAX_LOGS; private static final ForgeConfigSpec.DoubleValue ULTIMATE_BOW_ATTACK_DAMAGE; private static final ForgeConfigSpec.DoubleValue ULTIMATE_BOW_PLAYER_HEAL; @@ -248,6 +251,11 @@ public final class AntarchyToolsConfig { ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED = b .comment("If false, Ultimate pickaxe, axe, shovel, and hoe lose their 3x3 mining mode and tooltip.") .define("threeByThreeEnabled", true); + ULTIMATE_TOOLS_VEIN_MINING_ENABLED = b + .comment("If false, the Ultimate Pickaxe and Axe lose Vein Mining and the Battle Axe stops felling trees.") + .define("veinMiningEnabled", true); + ULTIMATE_TOOLS_VEIN_MINING_MAX_BLOCKS = b.comment("Most extra blocks the Ultimate Pickaxe or Axe breaks in one Vein Mining swing. Logs use treeFellingMaxLogs instead.").defineInRange("veinMiningMaxBlocks", 64, 1, 1024); + ULTIMATE_TOOLS_TREE_FELLING_MAX_LOGS = b.comment("Most extra logs broken at once by Vein Mining on logs or by the Battle Axe.") .defineInRange("treeFellingMaxLogs", 128, 1, 1024); b.pop(); b.push("ultimateBow"); @@ -574,6 +582,9 @@ public final class AntarchyToolsConfig { static double ultimateHoeAttackSpeed() { return ULTIMATE_HOE_ATTACK_SPEED.get(); } static int ultimateToolEnchantability() { return ULTIMATE_TOOL_ENCHANTABILITY.get(); } static boolean ultimateToolsThreeByThreeEnabled() { return ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED.get(); } + static boolean ultimateToolsVeinMiningEnabled() { return ULTIMATE_TOOLS_VEIN_MINING_ENABLED.get(); } + static int ultimateToolsVeinMiningMaxBlocks() { return ULTIMATE_TOOLS_VEIN_MINING_MAX_BLOCKS.get(); } + static int ultimateToolsTreeFellingMaxLogs() { return ULTIMATE_TOOLS_TREE_FELLING_MAX_LOGS.get(); } static double ultimateBowAttackDamage() { return ULTIMATE_BOW_ATTACK_DAMAGE.get(); } static double ultimateBowPlayerHeal() { return ULTIMATE_BOW_PLAYER_HEAL.get(); } diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyKeyBindings.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyKeyBindings.java index 89dbb95f..935a8509 100644 --- a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyKeyBindings.java +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyKeyBindings.java @@ -36,6 +36,21 @@ public final class AntarchyKeyBindings { InputConstants.KEY_R, CATEGORY ); + public static final KeyMapping MOUNT_BEAM = new KeyMapping( + "key.antarchy.mount_beam", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + InputConstants.KEY_H, + CATEGORY + ); + + public static final KeyMapping MOUNT_SIGNATURE = new KeyMapping( + "key.antarchy.mount_signature", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + InputConstants.KEY_J, + CATEGORY + ); public static final KeyMapping TIGERS_EYE_CAMOUFLAGE = new KeyMapping( "key.antarchy.tigers_eye_camouflage", KeyConflictContext.IN_GAME, @@ -80,6 +95,8 @@ public final class AntarchyKeyBindings { event.register(BRUTALFLY_FLAP); event.register(MOUNT_SPECIAL); event.register(MOUNT_FLIGHT_TOGGLE); + event.register(MOUNT_BEAM); + event.register(MOUNT_SIGNATURE); event.register(TIGERS_EYE_CAMOUFLAGE); event.register(ROYAL_INVERSION_TOGGLE); event.register(ROYAL_BOUNDARY); @@ -91,6 +108,14 @@ public final class AntarchyKeyBindings { return MOUNT_FLIGHT_TOGGLE.isDown(); } + public static boolean isMountBeamPressed() { + return MOUNT_BEAM.isDown(); + } + + public static boolean isMountSignaturePressed() { + return MOUNT_SIGNATURE.isDown(); + } + public static boolean isMountSpecialPressed() { return MOUNT_SPECIAL.isDown(); } diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/RoyalMountClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/RoyalMountClientHandler.java index 97ccdd99..3b720635 100644 --- a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/RoyalMountClientHandler.java +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/RoyalMountClientHandler.java @@ -18,6 +18,8 @@ public final class RoyalMountClientHandler { private static boolean wasAttack; private static boolean wasSpecial; private static boolean wasFlightToggle; + private static boolean wasBeam; + private static boolean wasSignature; private static boolean wasAscend; private static boolean wasDescend; private static boolean wasUse; @@ -65,6 +67,18 @@ public final class RoyalMountClientHandler { } wasFlightToggle = flightToggle; + boolean beam = AntarchyKeyBindings.isMountBeamPressed(); + if (beam && !wasBeam) { + AntarchyForgeNetworkCore.sendToServer(new RoyalMountActionPayload(RoyalMountActionPayload.BEAM)); + } + wasBeam = beam; + + boolean signature = AntarchyKeyBindings.isMountSignaturePressed(); + if (signature && !wasSignature) { + AntarchyForgeNetworkCore.sendToServer(new RoyalMountActionPayload(RoyalMountActionPayload.SIGNATURE)); + } + wasSignature = signature; + boolean ascend = mc.options.keyJump.isDown(); boolean descend = mc.options.keyShift.isDown(); if (ascend != wasAscend || descend != wasDescend) { @@ -81,6 +95,8 @@ public final class RoyalMountClientHandler { wasAttack = false; wasSpecial = false; wasFlightToggle = false; + wasBeam = false; + wasSignature = false; wasAscend = false; wasDescend = false; } diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/compat/DroneFakePlayerConstructionMixin.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/compat/DroneFakePlayerConstructionMixin.java index 532e57a9..de666d8c 100644 --- a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/compat/DroneFakePlayerConstructionMixin.java +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/compat/DroneFakePlayerConstructionMixin.java @@ -13,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -/** Protects virtual position calls made before the drone constructor has finished. */ @Pseudo @Mixin(targets = "me.desht.pneumaticcraft.common.util.fakeplayer.DroneFakePlayer", remap = false) public abstract class DroneFakePlayerConstructionMixin extends FakePlayer { @@ -29,8 +28,6 @@ public abstract class DroneFakePlayerConstructionMixin extends FakePlayer { antarchy$droneConstructionComplete = true; } - // Explicit Mojmap/SRG selectors: the optional target is unavailable to the - // annotation processor, but its Minecraft overrides are reobfuscated by Forge. @Inject(method = {"position()Lnet/minecraft/world/phys/Vec3;", "m_20182_()Lnet/minecraft/world/phys/Vec3;"}, at = @At("HEAD"), cancellable = true, remap = false, require = 0) private void antarchy$positionDuringConstruction(CallbackInfoReturnable cir) { diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgePayloadHandlers.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgePayloadHandlers.java index 2b8fba24..69e56001 100644 --- a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgePayloadHandlers.java +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgePayloadHandlers.java @@ -102,6 +102,8 @@ public class AntarchyForgePayloadHandlers { case com.craisinlord.antarchy.content.network.RoyalMountActionPayload.FLIGHT_TOGGLE -> mount.toggleMountedFlight(player); case com.craisinlord.antarchy.content.network.RoyalMountActionPayload.BITE -> mount.handleMountedBite(player); case com.craisinlord.antarchy.content.network.RoyalMountActionPayload.SPIT -> mount.handleMountedSpit(player); + case com.craisinlord.antarchy.content.network.RoyalMountActionPayload.BEAM -> mount.handleMountedBeam(player); + case com.craisinlord.antarchy.content.network.RoyalMountActionPayload.SIGNATURE -> mount.handleMountedSignature(player); default -> { } } diff --git a/gradle.properties b/gradle.properties index f69e0be6..276b3cc7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.configureondemand=true minecraft_version_1_21_1=1.21.1 modid=antarchy mod_id=antarchy -mod_version=2.2.6 +mod_version=2.2.9 maven_group=com.craisinlord mixin_version=0.15.4+mixin.0.8.7 diff --git a/neoforge-1.21.1/build.gradle b/neoforge-1.21.1/build.gradle index 7277edc8..28453415 100644 --- a/neoforge-1.21.1/build.gradle +++ b/neoforge-1.21.1/build.gradle @@ -14,7 +14,6 @@ java { withSourcesJar() } -// Add common-1.21.1's sources directly — this module compiles them itself. sourceSets { main { java { @@ -49,9 +48,6 @@ dependencies { if (providers.gradleProperty('antarchySodiumCompatTest').orNull == 'true') { runtimeOnly(files(rootProject.file("infinite_dimensions_jars/sodium-neoforge-0.8.13+mc1.21.1.jar"))) } - // Sodium — compile-only, for portal live views drawn through Sodium's renderer - // (content/client/renderer/sodium, mixins/compat/sodium). Never bundled; that code only - // loads when Sodium is installed. The published jar nests the mod jar, so compile against it. compileOnly(files(zipTree(rootProject.file("infinite_dimensions_jars/sodium-neoforge-0.8.13+mc1.21.1.jar")) .matching { include "META-INF/jarjar/net.caffeinemc.sodium-neoforge-*-mod.jar" })) compileOnly(files(rootProject.file("infinite_dimensions_jars/antos-neoforge-1.21.1-${antos_version}.jar"))) @@ -76,11 +72,6 @@ dependencies { compileOnly "mezz.jei:jei-1.21.1-neoforge-api:${jei_version}" runtimeOnly "mezz.jei:jei-1.21.1-neoforge:${jei_version}" - // Configured — optional, gives players an in-game config screen for Antarchy's - // ModConfigSpec-based settings (AntarchyMobsConfig/AntarchyToolsConfig/AntarchyMiscConfig) - // with zero Java code on this side: NeoForge's own config system is auto-discovered. - // No compileOnly needed since nothing here references Configured's classes directly. - // Has no Modrinth release, hence cursemaven (repo already declared in the root build.gradle). runtimeOnly("curse.maven:configured-${configured_curseforge_id}:${configured_curseforge_file_id_neoforge}") implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixin_extras_1_21_1}")) diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java index fc5b0670..71abde3e 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java @@ -154,6 +154,7 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setRoyalBossKnockbackResistance(AntarchyMobsConfig.royalBossKnockbackResistance()); AntarchySettings.setRoyalBossStepHeight(AntarchyMobsConfig.royalBossStepHeight()); AntarchySettings.setRoyalBossMaxSingleHitDamage(AntarchyMobsConfig.royalBossMaxSingleHitDamage()); + AntarchySettings.setRoyalBossHitOverflowRate(AntarchyMobsConfig.royalBossHitOverflowRate()); AntarchySettings.setRoyalBossBiteReach(AntarchyMobsConfig.royalBossBiteReach()); AntarchySettings.setRoyalBossBiteDamageMultiplier(AntarchyMobsConfig.royalBossBiteDamageMultiplier()); AntarchySettings.setRoyalBossBiteCooldownTicks(AntarchyMobsConfig.royalBossBiteCooldownTicks()); @@ -439,6 +440,9 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setUltimateHoeAttackSpeed(AntarchyToolsConfig.ultimateHoeAttackSpeed()); AntarchySettings.setUltimateToolEnchantability(AntarchyToolsConfig.ultimateToolEnchantability()); AntarchySettings.setUltimateToolsThreeByThreeEnabled(AntarchyToolsConfig.ultimateToolsThreeByThreeEnabled()); + AntarchySettings.setUltimateToolsVeinMiningEnabled(AntarchyToolsConfig.ultimateToolsVeinMiningEnabled()); + AntarchySettings.setUltimateToolsVeinMiningMaxBlocks(AntarchyToolsConfig.ultimateToolsVeinMiningMaxBlocks()); + AntarchySettings.setUltimateToolsTreeFellingMaxLogs(AntarchyToolsConfig.ultimateToolsTreeFellingMaxLogs()); AntarchySettings.setUltimateBowAttackDamage(AntarchyToolsConfig.ultimateBowAttackDamage()); AntarchySettings.setUltimateBowPlayerHeal(AntarchyToolsConfig.ultimateBowPlayerHeal()); @@ -676,8 +680,6 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setPortalGunMoonBlockCap(AntarchyMiscConfig.portalGunMoonBlockCap()); - // Misc - AntarchySettings.setElythiaFireflyParticlesEnabled(AntarchyMiscConfig.elythiaFireflyParticlesEnabled()); AntarchySettings.setDreamSandFallingBlockGravityMultiplier(AntarchyMiscConfig.dreamSandFallingBlockGravityMultiplier()); diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMiscConfig.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMiscConfig.java index 92f04c40..f4d126ca 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMiscConfig.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMiscConfig.java @@ -5,24 +5,18 @@ import net.neoforged.neoforge.common.ModConfigSpec; public final class AntarchyMiscConfig { public static final ModConfigSpec SPEC; - // Elythia private static final ModConfigSpec.BooleanValue ELYTHIA_FIREFLY_PARTICLES_ENABLED; - // Dream Sand private static final ModConfigSpec.DoubleValue DREAM_SAND_FALLING_BLOCK_GRAVITY_MULTIPLIER; - // Ichor private static final ModConfigSpec.BooleanValue ICHOR_WITHER_ENABLED; - // Hushweed private static final ModConfigSpec.DoubleValue HUSHWEED_SPORE_LIFETIME_SECONDS; - // Infinite Dimensions private static final ModConfigSpec.BooleanValue DISABLE_INFINITY_BOOK_PORTAL_CREATION; private static final ModConfigSpec.BooleanValue RAINBOW_ANTS_LEAD_TO_INFINITY_DIMENSIONS; private static final ModConfigSpec.DoubleValue RAINBOW_ANT_INFINITY_EASTER_EGG_CHANCE; - // Permanent portals private static final ModConfigSpec.BooleanValue PERMANENT_PORTALS_ENABLED; private static final ModConfigSpec.BooleanValue PERMANENT_PORTALS_FLINT_AND_STEEL_ENABLED; private static final ModConfigSpec.BooleanValue ELYTHIA_PORTAL_ENABLED; @@ -42,7 +36,6 @@ public final class AntarchyMiscConfig { private static final ModConfigSpec.IntValue PORTAL_GUN_MOON_PORTAL_SECONDS; private static final ModConfigSpec.IntValue PORTAL_GUN_MOON_BLOCK_CAP; - // Diamond Minecart private static final ModConfigSpec.BooleanValue DIAMOND_MINECART_ENABLED; private static final ModConfigSpec.BooleanValue DIAMOND_MINECART_PLACES_RAILS; private static final ModConfigSpec.DoubleValue DIAMOND_MINECART_CRUISE_SPEED; @@ -53,11 +46,9 @@ public final class AntarchyMiscConfig { private static final ModConfigSpec.BooleanValue DIAMOND_MINECART_MOB_DAMAGE_ENABLED; private static final ModConfigSpec.DoubleValue DIAMOND_MINECART_MAX_MOB_DAMAGE; - // Hoverboard private static final ModConfigSpec.DoubleValue HOVERBOARD_MAX_SPEED; private static final ModConfigSpec.DoubleValue HOVERBOARD_ACCELERATION; - // World / misc toggles private static final ModConfigSpec.BooleanValue DUPLICATOR_TREE_ENABLED; private static final ModConfigSpec.BooleanValue GLOW_VINES_UNDER_LEAVES; private static final ModConfigSpec.BooleanValue SWING_THROUGH_GRASS_ENABLED; @@ -69,8 +60,6 @@ public final class AntarchyMiscConfig { ModConfigSpec.Builder b = new ModConfigSpec.Builder(); - // Elythia - b.push("elythia"); ELYTHIA_FIREFLY_PARTICLES_ENABLED = b .comment("Whether firefly ambient particles appear at night in the Elythia dimension.") @@ -78,15 +67,11 @@ public final class AntarchyMiscConfig { b.pop(); - // Dream Sand - b.push("dreamSand"); DREAM_SAND_FALLING_BLOCK_GRAVITY_MULTIPLIER = b.comment("Multiplier applied to dream sand's falling-block gravity, i.e. how slowly it falls as a block.").defineInRange("fallingBlockGravityMultiplier", 0.4D, 0.0D, 16.0D); b.pop(); - // Ichor - b.push("ichor"); ICHOR_WITHER_ENABLED = b .comment("If true, players submerged in ichor receive a Wither effect.") @@ -94,8 +79,6 @@ public final class AntarchyMiscConfig { b.pop(); - // Hushweed - b.push("hushweed"); HUSHWEED_SPORE_LIFETIME_SECONDS = b .comment("How long (in seconds) a Hushweed spore projectile stays alive before disappearing.") @@ -103,8 +86,6 @@ public final class AntarchyMiscConfig { b.pop(); - // Infinity Dimensions - b.push("infinityDimensions"); DISABLE_INFINITY_BOOK_PORTAL_CREATION = b .comment("If true, book and quills cannot be thrown into nether portals to create random dimensions.") @@ -124,8 +105,6 @@ public final class AntarchyMiscConfig { b.pop(); - // Permanent Portals - b.push("permanentPortals"); PERMANENT_PORTALS_ENABLED = b.comment("Master toggle for sacrifice-activated permanent portals.").define("permanentPortalsEnabled", true); PERMANENT_PORTALS_FLINT_AND_STEEL_ENABLED = b.comment("Whether flint and steel can ignite permanent portal frames.").define("permanentPortalsFlintAndSteelEnabled", false); @@ -151,8 +130,6 @@ public final class AntarchyMiscConfig { b.pop(); - // Diamond Minecart - b.push("diamondMinecart"); DIAMOND_MINECART_ENABLED = b.comment("Master toggle for the diamond minecart's custom propulsion and rail-laying behavior.") .define("enabled", true); DIAMOND_MINECART_PLACES_RAILS = b.comment("Whether the cart automatically places normal rails from the rider's inventory.") .define("placesRails", true); @@ -166,16 +143,12 @@ public final class AntarchyMiscConfig { b.pop(); - // Hoverboard - b.push("hoverboard"); HOVERBOARD_MAX_SPEED = b.comment("Maximum hoverboard speed in blocks/tick while moving forward.").defineInRange("maxSpeed", 6.0D, 0.05D, 12.0D); HOVERBOARD_ACCELERATION = b.comment("Hoverboard speed gained per tick while moving forward. Lower values take longer to reach top speed.").defineInRange("acceleration", 0.05D, 0.001D, 1.0D); b.pop(); - // World / visual toggles - b.push("world"); DUPLICATOR_TREE_ENABLED = b.comment("If false, duplicator trees do not generate and duplicator saplings produce nothing.").define("duplicatorTreeEnabled", true); GLOW_VINES_UNDER_LEAVES = b.comment("Whether glow vines can be placed and survive when attached under leaf blocks.") .define("glowVinesUnderLeaves", true); 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 55c654d7..3ea7b984 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 @@ -6,8 +6,6 @@ public final class AntarchyMobsConfig { public static final ModConfigSpec SPEC; - // Ants - private static final ModConfigSpec.BooleanValue ANTS_STEAL_FROM_CHESTS; private static final ModConfigSpec.BooleanValue BROWN_ANT_REQUIRES_REAGENT; @@ -40,36 +38,26 @@ public final class AntarchyMobsConfig { - // Easter Bunny - private static final ModConfigSpec.BooleanValue EASTER_BUNNY_ENABLED; private static final ModConfigSpec.IntValue EASTER_BUNNY_NATURAL_SPAWN_CHANCE_PERCENT; - // Wasp - private static final ModConfigSpec.DoubleValue WASP_HEALTH; private static final ModConfigSpec.DoubleValue WASP_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue WASP_MOVEMENT_SPEED; - // Bomber - private static final ModConfigSpec.DoubleValue BOMBER_HEALTH; private static final ModConfigSpec.DoubleValue BOMBER_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BOMBER_EXPLOSION_DAMAGE; private static final ModConfigSpec.DoubleValue BOMBER_EXPLOSION_RADIUS; - // Springbug - private static final ModConfigSpec.DoubleValue SPRINGBUG_HEALTH; private static final ModConfigSpec.DoubleValue SPRINGBUG_POUNCE_DAMAGE; private static final ModConfigSpec.DoubleValue SPRINGBUG_CAMOUFLAGE_ALPHA; - // Emperor Scorpion - private static final ModConfigSpec.DoubleValue EMPEROR_SCORPION_HEALTH; private static final ModConfigSpec.DoubleValue EMPEROR_SCORPION_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue EMPEROR_SCORPION_MOVEMENT_SPEED; @@ -99,8 +87,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue SCORPION_KNOCKBACK_RESISTANCE; - // Kraken - private static final ModConfigSpec.DoubleValue KRAKEN_HEALTH; private static final ModConfigSpec.DoubleValue KRAKEN_ATTACK_DAMAGE; private static final ModConfigSpec.BooleanValue KRAKEN_SQUID_SPAWN_ENABLED; @@ -115,8 +101,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue KRAKEN_BOSS_BAR_RANGE; private static final ModConfigSpec.DoubleValue KRAKEN_LIGHTNING_DAMAGE_PHASE_ONE; - // Royal Bosses - private static final ModConfigSpec.DoubleValue KING_HEALTH; private static final ModConfigSpec.DoubleValue QUEEN_HEALTH; private static final ModConfigSpec.DoubleValue KING_ATTACK_DAMAGE; @@ -128,6 +112,7 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue ROYAL_BOSS_KNOCKBACK_RESISTANCE; private static final ModConfigSpec.DoubleValue ROYAL_BOSS_STEP_HEIGHT; private static final ModConfigSpec.DoubleValue ROYAL_BOSS_MAX_SINGLE_HIT_DAMAGE; + private static final ModConfigSpec.DoubleValue ROYAL_BOSS_HIT_OVERFLOW_RATE; private static final ModConfigSpec.DoubleValue ROYAL_BOSS_BITE_REACH; private static final ModConfigSpec.DoubleValue ROYAL_BOSS_BITE_DAMAGE_MULTIPLIER; private static final ModConfigSpec.IntValue ROYAL_BOSS_BITE_COOLDOWN_TICKS; @@ -152,8 +137,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue KING_FIREBALL_DAMAGE, KING_FIREBALL_RADIUS, KING_ICEBALL_DAMAGE, KING_ICEBALL_RADIUS, KING_ICE_SPIKE_DAMAGE; private static final ModConfigSpec.IntValue KING_FIREBALL_COOLDOWN_TICKS, KING_ICEBALL_COOLDOWN_TICKS, KING_ICE_SPIKE_COOLDOWN_TICKS, KING_ELEMENTAL_TERRAIN_CAP; - // Royal mounts - private static final ModConfigSpec.IntValue ROYAL_EGG_HATCH_CHANCE; private static final ModConfigSpec.DoubleValue ROYAL_BOLT_DAMAGE; private static final ModConfigSpec.DoubleValue PRINCE_HEALTH; @@ -172,8 +155,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue PRINCESS_FOLLOW_RANGE; - // Brutalfly - private static final ModConfigSpec.DoubleValue BRUTALFLY_HEALTH; private static final ModConfigSpec.DoubleValue BRUTALFLY_SWIPE_DAMAGE; private static final ModConfigSpec.DoubleValue BRUTALFLY_SPIT_DAMAGE; @@ -185,8 +166,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue BRUTALFLY_FLYING_SPEED; - // Mantis - private static final ModConfigSpec.DoubleValue MANTIS_HEALTH; private static final ModConfigSpec.DoubleValue MANTIS_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue MANTIS_MOVEMENT_SPEED; @@ -194,8 +173,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.BooleanValue MANTIS_IGNORE_LIGHT_LEVEL; - // Alpha Mantis - private static final ModConfigSpec.DoubleValue ALPHA_MANTIS_HEALTH; private static final ModConfigSpec.DoubleValue ALPHA_MANTIS_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ALPHA_MANTIS_MOVEMENT_SPEED; @@ -205,8 +182,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue ALPHA_MANTIS_DAMAGE_RANGE; - // Rolly Polly - private static final ModConfigSpec.DoubleValue ROLLY_POLLY_HEALTH; private static final ModConfigSpec.DoubleValue ROLLY_POLLY_MOVEMENT_SPEED; private static final ModConfigSpec.DoubleValue ROLLY_POLLY_ROLL_SPEED_MULTIPLIER; @@ -217,16 +192,12 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue ROLLY_POLLY_ROLLED_ARMOR_BONUS; - // Flytrap - private static final ModConfigSpec.DoubleValue FLYTRAP_HEALTH; private static final ModConfigSpec.DoubleValue FLYTRAP_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue FLYTRAP_GRAB_DAMAGE; private static final ModConfigSpec.IntValue FLYTRAP_SWEEP_HIT_COOLDOWN_TICKS; - // Caterpillar - private static final ModConfigSpec.DoubleValue CATERPILLAR_HEALTH; private static final ModConfigSpec.DoubleValue CATERPILLAR_MOVEMENT_SPEED; private static final ModConfigSpec.DoubleValue CATERPILLAR_PUPATION_TIME_SECONDS; @@ -267,13 +238,9 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue OCTOPUS_BOMB_ATTACK_DAMAGE; - // Ant Dance - private static final ModConfigSpec.DoubleValue ANT_DANCE_RADIUS; - // Reverie - private static final ModConfigSpec.DoubleValue REVERIE_HEALTH; private static final ModConfigSpec.DoubleValue REVERIE_INTEREST_RADIUS; private static final ModConfigSpec.DoubleValue REVERIE_ABANDON_PLAYER_DISTANCE; @@ -288,8 +255,6 @@ public final class AntarchyMobsConfig { 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; private static final ModConfigSpec.DoubleValue NIGHTMARE_MOVEMENT_SPEED; @@ -303,8 +268,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.BooleanValue DIMENSIONAL_TEARS_SPAWN_NATURALLY; - // Basilisk - private static final ModConfigSpec.BooleanValue BASILISK_PETRIFYING_GAZE_ENABLED; private static final ModConfigSpec.IntValue BASILISK_SPAWN_MAX_LIGHT_LEVEL; private static final ModConfigSpec.DoubleValue BASILISK_HEALTH; @@ -328,8 +291,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.IntValue BASILISK_PREY_PETRIFY_TICKS; - // Toreterror - private static final ModConfigSpec.DoubleValue TORETERROR_HEALTH; private static final ModConfigSpec.DoubleValue TORETERROR_DAMAGE_RANGE; private static final ModConfigSpec.DoubleValue TORETERROR_JUMP_ATTACK_DAMAGE; @@ -343,14 +304,10 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue WATER_BOMB_KNOCKBACK; - // Crawling Blight - private static final ModConfigSpec.DoubleValue CRAWLING_BLIGHT_HEALTH; private static final ModConfigSpec.DoubleValue CRAWLING_BLIGHT_ATTACK_DAMAGE; - // Skulking Fright - private static final ModConfigSpec.DoubleValue SKULKING_FRIGHT_HEALTH; private static final ModConfigSpec.DoubleValue SKULKING_FRIGHT_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue MANTICORE_HEALTH; @@ -361,8 +318,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.IntValue QUEEN_MANTICORE_SUMMON_COUNT; private static final ModConfigSpec.DoubleValue QUEEN_MANTICORE_SUMMON_RANGE; - // Jerry - private static final ModConfigSpec.DoubleValue JERRY_INFANT_HEALTH; private static final ModConfigSpec.DoubleValue JERRY_INFANT_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue JERRY_MATURE_HEALTH; @@ -373,37 +328,25 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue JERRY_GAMMA_ATTACK_DAMAGE; - // Cheep - private static final ModConfigSpec.DoubleValue CHEEP_HEALTH; private static final ModConfigSpec.DoubleValue CHEEP_ATTACK_DAMAGE; - // Dorrie - private static final ModConfigSpec.DoubleValue DORRIE_HEALTH; - // Ouranwood Deer - private static final ModConfigSpec.DoubleValue OURANWOOD_DEER_HEALTH; - // Glimmer - private static final ModConfigSpec.DoubleValue GLIMMER_HEALTH; - // Hercules Beetle - private static final ModConfigSpec.DoubleValue HERCULES_BEETLE_HEALTH; private static final ModConfigSpec.DoubleValue HERCULES_BEETLE_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue HERCULES_BEETLE_CHARGE_DAMAGE; private static final ModConfigSpec.DoubleValue HERCULES_BEETLE_DAMAGE_RANGE; - // Lucid - private static final ModConfigSpec.DoubleValue LUCID_ATTACK_RANGE; private static final ModConfigSpec.DoubleValue LUCID_PEARL_INVERTED_DURATION_SECONDS; private static final ModConfigSpec.DoubleValue LUCID_HEALTH; @@ -412,8 +355,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue LUCID_FLYING_SPEED; private static final ModConfigSpec.DoubleValue LUCID_KNOCKBACK_RESISTANCE; - // Vortex - private static final ModConfigSpec.DoubleValue VORTEX_HEALTH; private static final ModConfigSpec.DoubleValue VORTEX_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue VORTEX_MOVEMENT_SPEED; @@ -431,8 +372,6 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue VORTEX_LENS_LAUNCH_STRENGTH; - // Dread effect - private static final ModConfigSpec.BooleanValue DREAD_HALLUCINATION_SOUNDS_ENABLED; private static final ModConfigSpec.DoubleValue DREAD_HALLUCINATION_SOUND_MIN_INTERVAL; private static final ModConfigSpec.DoubleValue DREAD_HALLUCINATION_SOUND_MAX_INTERVAL; @@ -444,8 +383,6 @@ public final class AntarchyMobsConfig { ModConfigSpec.Builder b = new ModConfigSpec.Builder(); - // Ants (shared) - ANTS_STEAL_FROM_CHESTS = b .comment("Whether ants will steal edible items from nearby chest inventories.") .define("antsStealFromChests", true); @@ -527,8 +464,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Easter Bunny - b.push("easterBunny"); EASTER_BUNNY_ENABLED = b .comment( @@ -545,8 +480,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Wasp - b.push("wasp"); WASP_HEALTH = b.comment("Base max health.") .defineInRange("health", 16.0D, 1.0D, 32768.0D); WASP_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 4.0D, 0.0D, 1024.0D); @@ -554,8 +487,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Bomber - b.push("bomber"); BOMBER_HEALTH = b.comment("Base max health.") .defineInRange("health", 10.0D, 1.0D, 32768.0D); BOMBER_ATTACK_DAMAGE = b.comment("Direct damage dealt on contact before detonation.") .defineInRange("attackDamage", 4.0D, 0.0D, 1024.0D); @@ -564,8 +495,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Springbug - b.push("springbug"); SPRINGBUG_HEALTH = b.comment("Base max health.").defineInRange("health", 100.0D, 1.0D, 32768.0D); SPRINGBUG_POUNCE_DAMAGE = b.comment("Damage dealt on a successful pounce latch.").defineInRange("pounceDamage", 2.0D, 0.0D, 1024.0D); @@ -573,8 +502,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Emperor Scorpion - b.push("emperorScorpion"); EMPEROR_SCORPION_HEALTH = b.comment("Base max health.").defineInRange("health", 300.0D, 1.0D, 32768.0D); EMPEROR_SCORPION_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 28.0D, 0.0D, 1024.0D); @@ -612,8 +539,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Kraken - b.push("kraken"); 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); @@ -642,6 +567,7 @@ public final class AntarchyMobsConfig { ROYAL_BOSS_KNOCKBACK_RESISTANCE = b.comment("Base knockback resistance shared by King and Queen.").defineInRange("knockbackResistance", 1.0D, 0.0D, 1.0D); ROYAL_BOSS_STEP_HEIGHT = b.comment("Base step height shared by King and Queen.").defineInRange("stepHeight", 3.0D, 0.0D, 32.0D); ROYAL_BOSS_MAX_SINGLE_HIT_DAMAGE = b.comment("Maximum damage a single hit can deal to a Royal boss before later anti-burst systems are added.").defineInRange("maxSingleHitDamage", 250.0D, 1.0D, 32768.0D); + ROYAL_BOSS_HIT_OVERFLOW_RATE = b.comment("Share of damage above maxSingleHitDamage that still lands. 0 makes the cap a hard limit.").defineInRange("hitOverflowRate", 0.25D, 0.0D, 1.0D); ROYAL_BOSS_BITE_REACH = b.comment("Radius around each head anchor that a King or Queen bite can hit.").defineInRange("biteReach", 12.0D, 1.0D, 64.0D); ROYAL_BOSS_BITE_DAMAGE_MULTIPLIER = b.comment("Multiplier applied to base attack damage for King and Queen head bites.").defineInRange("biteDamageMultiplier", 1.6D, 0.0D, 32.0D); ROYAL_BOSS_BITE_COOLDOWN_TICKS = b.comment("Base cooldown in ticks between bites for a single King or Queen head (scaled down at later phases).").defineInRange("biteCooldownTicks", 45, 1, 1200); @@ -718,8 +644,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Brutalfly - b.push("brutalfly"); BRUTALFLY_HEALTH = b.comment("Base max health.") .defineInRange("health", 200.0D, 1.0D, 32768.0D); BRUTALFLY_SWIPE_DAMAGE = b.comment("Damage dealt by a claw swipe.") .defineInRange("swipeDamage", 15.0D, 0.0D, 1024.0D); @@ -733,8 +657,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Mantis - b.push("mantis"); MANTIS_HEALTH = b.comment("Base max health.") .defineInRange("health", 50.0D, 1.0D, 32768.0D); MANTIS_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 9.0D, 0.0D, 1024.0D); @@ -744,8 +666,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Alpha Mantis - b.push("alphaMantis"); ALPHA_MANTIS_HEALTH = b.comment("Base max health.") .defineInRange("health", 250.0D, 1.0D, 32768.0D); ALPHA_MANTIS_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 18.0D, 0.0D, 1024.0D); @@ -757,8 +677,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Rolly Polly - b.push("rollyPolly"); ROLLY_POLLY_HEALTH = b.comment("Base max health.") .defineInRange("health", 25.0D, 1.0D, 32768.0D); ROLLY_POLLY_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.3D, 0.0D, 10.0D); @@ -771,8 +689,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Flytrap - b.push("flytrap"); FLYTRAP_HEALTH = b.comment("Base max health.") .defineInRange("health", 80.0D, 1.0D, 32768.0D); FLYTRAP_ATTACK_DAMAGE = b.comment("Damage dealt by the sweep attack.") .defineInRange("attackDamage", 10.0D, 0.0D, 1024.0D); @@ -783,8 +699,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Caterpillar - b.push("caterpillar"); CATERPILLAR_HEALTH = b.defineInRange("health", 6.0D, 0.1D, 32768.0D); CATERPILLAR_MOVEMENT_SPEED = b.defineInRange("movementSpeed", 0.24D, 0.0D, 10.0D); @@ -850,8 +764,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Ant Dance - b.push("antDance"); ANT_DANCE_RADIUS = b .comment("Radius in blocks where ants will dance around a playing jukebox.") @@ -859,8 +771,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Reverie - b.push("reverie"); REVERIE_HEALTH = b.comment("Base max health.") .defineInRange("health", 20.0D, 1.0D, 1024.0D); REVERIE_INTEREST_RADIUS = b.comment("How far the Reverie notices and starts following a player.") .defineInRange("interestRadius", 16.0D, 1.0D, 64.0D); @@ -876,8 +786,6 @@ public final class AntarchyMobsConfig { REVERIE_DUPLICATION_COOLDOWN_TICKS = b.comment("Cooldown in ticks before Blood Crystal can duplicate the Reverie again.") .defineInRange("duplicationCooldownTicks", 6000, 20, 24000); b.pop(); - // Nightmare - b.push("nightmare"); NIGHTMARE_HEALTH = b.comment("Base max health.").defineInRange("health", 180.0D, 1.0D, 32768.0D); NIGHTMARE_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 16.0D, 0.0D, 1024.0D); @@ -896,8 +804,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Basilisk - b.push("basilisk"); BASILISK_PETRIFYING_GAZE_ENABLED = b .comment("If false, the Basilisk will not use its petrifying gaze and will never apply the Paralyzed effect.") @@ -927,8 +833,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Lucid - b.push("lucid"); LUCID_ATTACK_RANGE = b .comment("Attack range in blocks. The Lucid fires its gravity blast when a target enters this radius.") @@ -943,8 +847,6 @@ public final class AntarchyMobsConfig { LUCID_KNOCKBACK_RESISTANCE = b.comment("Base knockback resistance.").defineInRange("knockbackResistance", 0.5D, 0.0D, 1.0D); b.pop(); - // Vortex - b.push("vortex"); VORTEX_HEALTH = b.comment("Base max health.").defineInRange("health", 70.0D, 1.0D, 32768.0D); VORTEX_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 4.0D, 0.0D, 1024.0D); @@ -964,8 +866,6 @@ public final class AntarchyMobsConfig { b.pop(); - // Dread effect - b.push("dread"); b.push("hallucinationSounds"); @@ -980,7 +880,7 @@ public final class AntarchyMobsConfig { DREAD_HALLUCINATION_MOB_MAX_INTERVAL = b.comment("Maximum seconds between apparition spawns.").defineInRange("maxIntervalSeconds", 16.0D, 0.1D, 300.0D); b.pop(); - b.pop(); // dread + b.pop(); b.push("crawlingBlight"); CRAWLING_BLIGHT_HEALTH = b.comment("Base max health.").defineInRange("health", 15.0D, 1.0D, 32768.0D); @@ -1195,6 +1095,7 @@ public final class AntarchyMobsConfig { static double royalBossKnockbackResistance() { return ROYAL_BOSS_KNOCKBACK_RESISTANCE.get(); } static double royalBossStepHeight() { return ROYAL_BOSS_STEP_HEIGHT.get(); } static double royalBossMaxSingleHitDamage() { return ROYAL_BOSS_MAX_SINGLE_HIT_DAMAGE.get(); } + static double royalBossHitOverflowRate() { return ROYAL_BOSS_HIT_OVERFLOW_RATE.get(); } static double royalBossBiteReach() { return ROYAL_BOSS_BITE_REACH.get(); } static double royalBossBiteDamageMultiplier() { return ROYAL_BOSS_BITE_DAMAGE_MULTIPLIER.get(); } static int royalBossBiteCooldownTicks() { return ROYAL_BOSS_BITE_COOLDOWN_TICKS.get(); } diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java index 0fb6941f..21919af2 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java @@ -6,16 +6,12 @@ public final class AntarchyToolsConfig { public static final ModConfigSpec SPEC; - // Basilisk Dagger - private static final ModConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_SPEED; private static final ModConfigSpec.IntValue BASILISK_DAGGER_POISON_DURATION_TICKS; private static final ModConfigSpec.IntValue BASILISK_DAGGER_POISON_AMPLIFIER; - // Ultimate Tools - private static final ModConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_SPEED; private static final ModConfigSpec.DoubleValue ULTIMATE_PICKAXE_ATTACK_DAMAGE; @@ -28,10 +24,11 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue ULTIMATE_HOE_ATTACK_SPEED; 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_VEIN_MINING_ENABLED; + private static final ModConfigSpec.IntValue ULTIMATE_TOOLS_VEIN_MINING_MAX_BLOCKS; + private static final ModConfigSpec.IntValue ULTIMATE_TOOLS_TREE_FELLING_MAX_LOGS; - // Ultimate Bow - private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_PLAYER_HEAL; private static final ModConfigSpec.DoubleValue ULTIMATE_BOW_DRAW_SPEED_MULTIPLIER; @@ -39,22 +36,16 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.IntValue ULTIMATE_BOW_ENCHANTABILITY; - // Ultimate Crossbow - private static final ModConfigSpec.DoubleValue ULTIMATE_CROSSBOW_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ULTIMATE_CROSSBOW_CHARGE_SPEED_MULTIPLIER; private static final ModConfigSpec.IntValue ULTIMATE_CROSSBOW_ENCHANTABILITY; - // Ultimate Mace - private static final ModConfigSpec.DoubleValue ULTIMATE_MACE_DAMAGE_MULTIPLIER; private static final ModConfigSpec.DoubleValue ULTIMATE_MACE_ATTACK_SPEED; private static final ModConfigSpec.IntValue ULTIMATE_MACE_ENCHANTABILITY; - // Ultimate Armor - private static final ModConfigSpec.BooleanValue ULTIMATE_ARMOR_COMES_ENCHANTED; private static final ModConfigSpec.IntValue ULTIMATE_ARMOR_ENCHANTABILITY; private static final ModConfigSpec.IntValue ULTIMATE_HELMET_ARMOR_VALUE; @@ -114,14 +105,10 @@ public final class AntarchyToolsConfig { ROYAL_GUARDIAN_BOUNDARY_DROP_TICKS, ROYAL_GUARDIAN_BOUNDARY_PROJECTILE_CAP; - // Battle Axe - private static final ModConfigSpec.DoubleValue BATTLE_AXE_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BATTLE_AXE_ATTACK_SPEED; - // Big Bertha - private static final ModConfigSpec.DoubleValue BIG_BERTHA_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue BIG_BERTHA_REACH_BONUS; private static final ModConfigSpec.DoubleValue BIG_BERTHA_ATTACK_SPEED; @@ -160,8 +147,6 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_KATANA_DASH_COOLDOWN_TICKS; - // Nightmare Gear - private static final ModConfigSpec.IntValue NIGHTMARE_HELMET_ARMOR_VALUE; private static final ModConfigSpec.IntValue NIGHTMARE_CHESTPLATE_ARMOR_VALUE; private static final ModConfigSpec.IntValue NIGHTMARE_LEGGINGS_ARMOR_VALUE; @@ -181,14 +166,10 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue NIGHTMARE_SWORD_SCALING_FACTOR; - // Fallen King's Crown - private static final ModConfigSpec.IntValue FALLEN_KING_CROWN_ARMOR_VALUE; private static final ModConfigSpec.DoubleValue FALLEN_KING_CROWN_ARMOR_TOUGHNESS; - // Blood Crystal Armor - private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_ARMOR_SHIELD_RECHARGE_TICKS; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_SHIELD_COUNT; private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_DURATION_TICKS; @@ -205,8 +186,6 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.IntValue BLOOD_CRYSTAL_BOOTS_DURABILITY; - // Squidzooka - private static final ModConfigSpec.DoubleValue SQUIDZOOKA_COOLDOWN_SECONDS; private static final ModConfigSpec.DoubleValue SQUIDZOOKA_LAUNCH_VELOCITY; private static final ModConfigSpec.DoubleValue RPO_LAUNCHER_COOLDOWN_SECONDS; @@ -215,8 +194,6 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue RPO_LAUNCHER_EXPLOSION_RADIUS; - // Size Rays - private static final ModConfigSpec.BooleanValue SIZE_CHANGING_RAYS_ENABLED; private static final ModConfigSpec.DoubleValue SIZE_RAY_COOLDOWN_SECONDS; private static final ModConfigSpec.DoubleValue SIZE_RAY_MIN_SCALE; @@ -226,8 +203,6 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue GROWTH_POTION_DELTA; - // Gravity Gun - private static final ModConfigSpec.BooleanValue GRAVITY_GUN_ENABLED; private static final ModConfigSpec.BooleanValue GRAVITY_GUN_BLOCKS_ENABLED; private static final ModConfigSpec.BooleanValue GRAVITY_GUN_ENTITIES_ENABLED; @@ -251,17 +226,9 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue EYE_OF_THE_STORM_SURGE_RETURN_STRENGTH; private static final ModConfigSpec.DoubleValue EYE_OF_THE_STORM_SURGE_DAMAGE; - // Critter Cage - private static final ModConfigSpec.DoubleValue CRITTER_CAGE_MAX_CAPTURABLE_WIDTH; private static final ModConfigSpec.DoubleValue CRITTER_CAGE_MAX_CAPTURABLE_HEIGHT; - // Miner's Dream - - - - // Miscellaneous items / consumables - private static final ModConfigSpec.DoubleValue DUCT_TAPE_REPAIR_PERCENT_PER_USE; private static final ModConfigSpec.DoubleValue POTENT_NYXITE_INVERTED_DURATION_SECONDS; private static final ModConfigSpec.IntValue CORNEA_EAR_NIGHT_VISION_SECONDS; @@ -271,7 +238,6 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.IntValue AMERICAN_REGENERATION_DURATION_TICKS; private static final ModConfigSpec.IntValue AMERICAN_REGENERATION_AMPLIFIER; - // Moggles private static final ModConfigSpec.DoubleValue MOGGLES_VISION_RADIUS; @@ -279,8 +245,6 @@ public final class AntarchyToolsConfig { ModConfigSpec.Builder b = new ModConfigSpec.Builder(); - // Basilisk Dagger - b.push("basiliskDagger"); BASILISK_DAGGER_ATTACK_DAMAGE = b.comment("Attack damage.") .defineInRange("attackDamage", 6.0D, 0.0D, 1024.0D); BASILISK_DAGGER_ATTACK_SPEED = b.comment("Attack speed.") .defineInRange("attackSpeed", -1.8D, -10.0D, 10.0D); @@ -289,8 +253,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Ultimate Tools - b.push("ultimateTools"); ULTIMATE_SWORD_ATTACK_DAMAGE = b.comment("Attack damage of the Ultimate Sword.") .defineInRange("swordAttackDamage", 30.0D, 0.0D, 1024.0D); ULTIMATE_SWORD_ATTACK_SPEED = b.comment("Attack speed of the Ultimate Sword.") .defineInRange("swordAttackSpeed", -2.4D, -10.0D, 10.0D); @@ -306,11 +268,14 @@ public final class AntarchyToolsConfig { ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED = b .comment("If false, Ultimate pickaxe, axe, shovel, and hoe lose their 3x3 mining mode and tooltip.") .define("threeByThreeEnabled", true); + ULTIMATE_TOOLS_VEIN_MINING_ENABLED = b + .comment("If false, the Ultimate Pickaxe and Axe lose Vein Mining and the Battle Axe stops felling trees.") + .define("veinMiningEnabled", true); + ULTIMATE_TOOLS_VEIN_MINING_MAX_BLOCKS = b.comment("Most extra blocks the Ultimate Pickaxe or Axe breaks in one Vein Mining swing. Logs use treeFellingMaxLogs instead.").defineInRange("veinMiningMaxBlocks", 64, 1, 1024); + ULTIMATE_TOOLS_TREE_FELLING_MAX_LOGS = b.comment("Most extra logs broken at once by Vein Mining on logs or by the Battle Axe.") .defineInRange("treeFellingMaxLogs", 128, 1, 1024); b.pop(); - // Ultimate Bow - b.push("ultimateBow"); ULTIMATE_BOW_ATTACK_DAMAGE = b.comment("Damage dealt to non-player targets.") .defineInRange("attackDamage", 18.0D, 0.0D, 1024.0D); ULTIMATE_BOW_PLAYER_HEAL = b.comment("Health restored to players hit by arrows from this bow.") .defineInRange("playerHeal", 8.0D, 0.0D, 1024.0D); @@ -320,8 +285,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Ultimate Crossbow - b.push("ultimateCrossbow"); ULTIMATE_CROSSBOW_ATTACK_DAMAGE = b.comment("Damage dealt by projectiles fired from the Ultimate Crossbow.").defineInRange("attackDamage", 8.0D, 0.0D, 1024.0D); ULTIMATE_CROSSBOW_CHARGE_SPEED_MULTIPLIER = b @@ -334,8 +297,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Ultimate Mace - b.push("ultimateMace"); ULTIMATE_MACE_DAMAGE_MULTIPLIER = b.comment("Multiplier on both base damage and smash bonus. 1.5 = 50% stronger than a normal mace.").defineInRange("damageMultiplier", 1.5D, 0.1D, 16.0D); ULTIMATE_MACE_ATTACK_SPEED = b.comment("Attack speed of the Ultimate Mace.") .defineInRange("attackSpeed", -3.4D, -10.0D, 10.0D); @@ -343,8 +304,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Ultimate Armor - b.push("ultimateArmor"); ULTIMATE_ARMOR_COMES_ENCHANTED = b.comment("If true, newly crafted Ultimate Armor has Protection, Fire Protection, Projectile Protection, and Blast Protection.").define("comesEnchanted", true); ULTIMATE_ARMOR_ENCHANTABILITY = b.comment("Enchantability for all Ultimate Armor pieces.") .defineInRange("enchantability", 10, 0, 100); @@ -422,16 +381,12 @@ public final class AntarchyToolsConfig { b.pop(); - // Battle Axe - b.push("battleAxe"); BATTLE_AXE_ATTACK_DAMAGE = b.comment("Attack damage of the Battle Axe.").defineInRange("attackDamage", 46.0D, 0.0D, 4096.0D); BATTLE_AXE_ATTACK_SPEED = b.comment("Attack speed of the Battle Axe.") .defineInRange("attackSpeed", -3.1D, -10.0D, 10.0D); b.pop(); - // Big Bertha - b.push("bigBertha"); BIG_BERTHA_ATTACK_DAMAGE = b.comment("Attack damage of Big Bertha.") .defineInRange("attackDamage", 55.0D, 0.0D, 4096.0D); BIG_BERTHA_REACH_BONUS = b.comment("Extra attack range in blocks while held in main hand.") .defineInRange("reachBonus", 3.0D, 0.0D, 32.0D); @@ -484,8 +439,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Nightmare Gear - b.push("nightmareArmor"); NIGHTMARE_HELMET_ARMOR_VALUE = b.comment("Armor points of the Nightmare Helmet. (Netherite default: 3)") .defineInRange("helmetArmor", 3, 0, 100); NIGHTMARE_CHESTPLATE_ARMOR_VALUE = b.comment("Armor points of the Nightmare Chestplate. (Netherite default: 8)") .defineInRange("chestplateArmor", 8, 0, 100); @@ -525,8 +478,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Blood Crystal Armor - b.push("bloodCrystalArmor"); BLOOD_CRYSTAL_ARMOR_SHIELD_RECHARGE_TICKS = b.comment("Ticks (20/s) for each armor Bloodglass Shield to recharge after shattering. Default: 600 (30s).").defineInRange("armorShieldRechargeTicks", 600, 1, 72000); BLOOD_CRYSTAL_APPLE_SHIELD_COUNT = b.comment("Number of Bloodglass Shields granted by a Blood Crystal Apple (Bloodglass Ward level). Default: 2.").defineInRange("appleShieldCount", 2, 1, 8); @@ -545,8 +496,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Squidzooka - b.push("squidzooka"); SQUIDZOOKA_COOLDOWN_SECONDS = b.comment("Cooldown in seconds after firing. Set to 0 to disable.").defineInRange("cooldownSeconds", 1.0D, 0.0D, 3600.0D); SQUIDZOOKA_LAUNCH_VELOCITY = b.comment("Initial launch velocity applied to the Missile Squid.") .defineInRange("launchVelocity", 2.1D, 0.1D, 20.0D); @@ -560,8 +509,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Size Rays - b.push("sizeRays"); SIZE_CHANGING_RAYS_ENABLED = b .comment( @@ -578,8 +525,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Gravity Gun - b.push("gravityGun"); GRAVITY_GUN_ENABLED = b.comment("Master toggle for the Gravity Gun.") .define("enabled", true); GRAVITY_GUN_BLOCKS_ENABLED = b.comment("If false, the Gravity Gun cannot grab blocks.") .define("blocksEnabled", true); @@ -609,8 +554,6 @@ public final class AntarchyToolsConfig { b.pop(); - // Critter Cage - b.push("critterCage"); CRITTER_CAGE_MAX_CAPTURABLE_WIDTH = b.comment("Maximum capturable entity width/depth based on the live hitbox, in blocks.").defineInRange("maxCapturableWidth", 1.65D, 0.1D, 64.0D); CRITTER_CAGE_MAX_CAPTURABLE_HEIGHT = b.comment("Maximum capturable entity height based on the live hitbox, in blocks.").defineInRange("maxCapturableHeight", 1.65D, 0.1D, 64.0D); @@ -618,8 +561,6 @@ public final class AntarchyToolsConfig { - // Miscellaneous items / consumables - b.push("ductTape"); DUCT_TAPE_REPAIR_PERCENT_PER_USE = b .comment("Fraction of max durability repaired per use. 0.25 = 25% per application.") @@ -672,6 +613,9 @@ public final class AntarchyToolsConfig { static double ultimateHoeAttackSpeed() { return ULTIMATE_HOE_ATTACK_SPEED.get(); } static int ultimateToolEnchantability() { return ULTIMATE_TOOL_ENCHANTABILITY.get(); } static boolean ultimateToolsThreeByThreeEnabled() { return ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED.get(); } + static boolean ultimateToolsVeinMiningEnabled() { return ULTIMATE_TOOLS_VEIN_MINING_ENABLED.get(); } + static int ultimateToolsVeinMiningMaxBlocks() { return ULTIMATE_TOOLS_VEIN_MINING_MAX_BLOCKS.get(); } + static int ultimateToolsTreeFellingMaxLogs() { return ULTIMATE_TOOLS_TREE_FELLING_MAX_LOGS.get(); } static double ultimateBowAttackDamage() { return ULTIMATE_BOW_ATTACK_DAMAGE.get(); } static double ultimateBowPlayerHeal() { return ULTIMATE_BOW_PLAYER_HEAL.get(); } diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/MogglesClientRenderer.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/MogglesClientRenderer.java index 91550903..059e1fb4 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/MogglesClientRenderer.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/MogglesClientRenderer.java @@ -30,13 +30,11 @@ public final class MogglesClientRenderer { return; } - // Run cave BFS (internally rate-limited to every 40 ticks). MogglesCaveDetector.tick(player, level); BlockPos target = MogglesCaveDetector.getCaveTarget(); if (target == null) return; - // Spawn particle trail toward the cave every 2 ticks. if (level.getGameTime() % 2 != 0) return; Vec3 eye = player.getEyePosition(); diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/content/fluid/AntiwaterFluid.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/content/fluid/AntiwaterFluid.java index 61d1829a..f44b24f3 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/content/fluid/AntiwaterFluid.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/content/fluid/AntiwaterFluid.java @@ -115,58 +115,6 @@ public abstract class AntiwaterFluid extends BaseFlowingFluid { return net.minecraft.world.level.material.Fluids.EMPTY.defaultFluidState(); } - /* - @Override - protected void spread(Level level, BlockPos pos, FluidState state) { - if (state.isEmpty()) { - return; - } - if (!state.isSource() && !this.isFlowingStateValid(level, pos, state)) { - level.setBlockAndUpdate(pos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()); - this.scheduleCleanup(level, pos); - return; - } - - BlockState blockState = level.getBlockState(pos); - int nextAmount = state.getAmount() - 1; - - BlockPos abovePos = pos.above(); - BlockState aboveState = level.getBlockState(abovePos); - FluidState aboveFluid = level.getFluidState(abovePos); - - if (!aboveState.isSolid() && !aboveFluid.getType().isSame(this)) { - FluidState upwardState = this.getFlowing(8, false); - if (this.canSpreadTo(level, pos, blockState, Direction.UP, abovePos, aboveState, aboveFluid, upwardState.getType())) { - this.spreadTo(level, abovePos, aboveState, Direction.UP, upwardState); - } - } - - if (!this.canHangAt(level, pos)) { - return; - } - - if (nextAmount <= 0) { - return; - } - - for (Direction direction : Direction.Plane.HORIZONTAL) { - BlockPos targetPos = pos.relative(direction); - BlockState targetState = level.getBlockState(targetPos); - FluidState targetFluid = targetState.getFluidState(); - if (!this.canSpreadHorizontallyInto(level, targetPos)) { - continue; - } - - FluidState horizontalState = this.getFlowing(Math.min(nextAmount, MAX_HORIZONTAL_SPREAD_AMOUNT), false); - if (!this.canSpreadTo(level, pos, blockState, direction, targetPos, targetState, targetFluid, horizontalState.getType())) { - continue; - } - - this.spreadTo(level, targetPos, targetState, direction, horizontalState); - } - } - */ - @Override protected void spread(Level level, BlockPos pos, FluidState state) { if (state.isEmpty()) { @@ -317,7 +265,6 @@ public abstract class AntiwaterFluid extends BaseFlowingFluid { BlockState aboveState = level.getBlockState(abovePos); FluidState aboveFluid = level.getFluidState(abovePos); - // Antiwater flowing into water solidifies rather than displacing it if (aboveFluid.getFluidType() == NeoForgeMod.WATER_TYPE.value()) { BlockState result = state.isSource() ? AntarchyNeoforgeBlocks.ANTIMETAL.get().defaultBlockState() diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/entity/ParalyzedMobFreezeMixin.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/entity/ParalyzedMobFreezeMixin.java index 8c421e28..97367feb 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/entity/ParalyzedMobFreezeMixin.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/entity/ParalyzedMobFreezeMixin.java @@ -8,9 +8,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Mob.class) -/* - * Stops mob AI movement while paralyzed. - */ public abstract class ParalyzedMobFreezeMixin { @Inject(method = "serverAiStep", at = @At("HEAD")) private void antarchy$freezeAiWhileParalyzed(CallbackInfo ci) { diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/AmendmentRareOresMixin.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/AmendmentRareOresMixin.java index 8769a77b..a9d9b655 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/AmendmentRareOresMixin.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/AmendmentRareOresMixin.java @@ -12,12 +12,6 @@ import java.util.List; import java.util.Map; @Mixin(value = Amendment.class, remap = false) -/* - * Makes Antarchy's uranium/titanium ores and blocks much rarer in Infinite Dimensions' - * procedural dimensions. This is done natively via Infinity's own amendment system rather - * than relying on players editing infinity's config, keyed off the antarchy:infinity_dimension_rare_ores - * block tag so the list stays data-driven and native to Antarchy. - */ public class AmendmentRareOresMixin { @Inject(method = "getAmendmentList", at = @At("RETURN"), remap = false) private static void antarchy$addRareOreAmendment(CallbackInfoReturnable>> cir) { diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/PortalCreatorMixin.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/PortalCreatorMixin.java index 75e8b163..94cebbc1 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/PortalCreatorMixin.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/PortalCreatorMixin.java @@ -14,9 +14,6 @@ import net.codexarchonic.infinity.util.teleport.PortalCreator; import net.minecraft.server.level.ServerLevel; @Mixin(value = PortalCreator.class, remap = false) -/* - * Blocks Infinity portal creation when the config says no - */ public interface PortalCreatorMixin { @Inject( method = "tryCreatePortalFromItem(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/item/ItemEntity;)V", diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/ShaderPayloadRepeatSkipMixin.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/ShaderPayloadRepeatSkipMixin.java new file mode 100644 index 00000000..063a744c --- /dev/null +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/ShaderPayloadRepeatSkipMixin.java @@ -0,0 +1,32 @@ +package com.craisinlord.antarchy.neoforge.mixins.infinity; + +import net.codexarchonic.infinity.registry.payload.s2c.ShaderS2CPayload; +import net.codexarchonic.infinity.util.loading.ShaderLoader; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.nbt.CompoundTag; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.lang.ref.WeakReference; + +@Mixin(value = ShaderS2CPayload.class, remap = false) +public class ShaderPayloadRepeatSkipMixin { + @Unique + private static WeakReference antarchy$lastEmptyLevel = new WeakReference<>(null); + + @Redirect(method = "lambda$receive$0", at = @At(value = "INVOKE", + target = "Lnet/codexarchonic/infinity/util/loading/ShaderLoader;reloadShaders(Lnet/minecraft/client/Minecraft;Lnet/minecraft/nbt/CompoundTag;Z)V"), + remap = false) + private void antarchy$skipRepeatedEmptyReload(Minecraft minecraft, CompoundTag shader, boolean iridescence) { + boolean empty = shader.isEmpty() && !iridescence; + ClientLevel level = minecraft.level; + if (empty && level != null && antarchy$lastEmptyLevel.get() == level) { + return; + } + antarchy$lastEmptyLevel = new WeakReference<>(empty ? level : null); + ShaderLoader.reloadShaders(minecraft, shader, iridescence); + } +} diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java index 21b80546..554ae42a 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java @@ -648,9 +648,6 @@ public final class AntarchyNeoForgeEvents { - access.antarchy$getArmorShieldsActive() - access.antarchy$getArmorShieldLostCount()) ); int currentCap = access.antarchy$getAppleShieldsActive() + access.antarchy$getAppleShieldLostCount(); - // Only grant newly-added capacity (e.g. first application, or a higher amplifier). - // A mere duration refresh of an already-active ward must not reset shields that are - // already lost, nor restart their recharge timer. if (targetCap > currentCap) { access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() + (targetCap - currentCap)); syncBloodglass((ServerPlayer) player); @@ -748,7 +745,6 @@ public final class AntarchyNeoForgeEvents { BloodglassAccess access = (BloodglassAccess) player; if (fromIsBC && !toIsBC) { - // Unequipped BC armor, remove one shield slot if (access.antarchy$getArmorShieldsActive() > 0) { access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); } else if (access.antarchy$getArmorShieldLostCount() > 0) { @@ -758,7 +754,6 @@ public final class AntarchyNeoForgeEvents { } } } else if (!fromIsBC && toIsBC) { - // Newly equipped BC armor,only add if not already accounted for (by respawn init) int bcPieces = countBCArmorPieces(player); int currentTotal = access.antarchy$getArmorShieldsActive() + access.antarchy$getArmorShieldLostCount(); if (currentTotal < bcPieces) { @@ -766,8 +761,6 @@ public final class AntarchyNeoForgeEvents { access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); } } else if (fromIsBC) { - // BC armor replaced with another BC armor (or same after re-equip sequence) - // Remove old shield, start recharging new one and reset timer if (access.antarchy$getArmorShieldsActive() > 0) { access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); } else if (access.antarchy$getArmorShieldLostCount() > 0) { @@ -811,7 +804,6 @@ public final class AntarchyNeoForgeEvents { int totalActive = access.antarchy$getTotalShieldsActive(); if (totalActive <= 0) return; - // Consume apple shields first, then armor shields if (access.antarchy$getAppleShieldsActive() > 0) { access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() - 1); access.antarchy$setAppleShieldLostCount(access.antarchy$getAppleShieldLostCount() + 1); @@ -858,8 +850,6 @@ public final class AntarchyNeoForgeEvents { return; } - // Shared item code now scales arrow base damage directly so attribute and projectile - // modifiers stay in the damage pipeline. Leave non-player hits untouched here. } static void handleUltimateCrossbowDamage(LivingIncomingDamageEvent event) { diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java index 65d25465..978e6036 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java @@ -892,7 +892,6 @@ public final class AntarchyNeoforgeBlocks { public static final DeferredBlock STAR_CORAL_WALL_FAN = BLOCKS.register("star_coral_wall_fan", () -> new com.craisinlord.antarchy.content.block.StarCoralWallFanBlock(DEAD_STAR_CORAL_WALL_FAN.get(), BlockBehaviour.Properties.ofFullCopy(Blocks.TUBE_CORAL_WALL_FAN).lightLevel(state -> 8))); - // Block entity types public static final DeferredHolder, BlockEntityType> ROYAL_EGG_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("royal_egg", () -> BlockEntityType.Builder.of( com.craisinlord.antarchy.content.block.entity.RoyalEggBlockEntity::new, diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java index 6f923881..965025b3 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java @@ -48,7 +48,6 @@ public final class AntarchyNeoforgeItems { static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Antarchy.MODID); private static final DeferredRegister ARMOR_MATERIALS = DeferredRegister.create(Registries.ARMOR_MATERIAL, Antarchy.MODID); - // Tier constants public static final Tier ULTIMATE_TIER = new SimpleToolTier( 3072, 10.5F, @@ -218,7 +217,6 @@ public final class AntarchyNeoforgeItems { 0.0F )); - // Block items public static final DeferredItem DUPLICATOR_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.DUPLICATOR_LOG); public static final DeferredItem OURANWOOD_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.OURANWOOD_LOG); public static final DeferredItem OURANWOOD_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.OURANWOOD_WOOD); @@ -1124,7 +1122,6 @@ public final class AntarchyNeoforgeItems { () -> new KrakensGraspItem( new Item.Properties().stacksTo(1).durability(250).rarity(Rarity.EPIC).fireResistant())); - // Spawn eggs public static final DeferredItem EASTER_BUNNY_SPAWN_EGG = ITEMS.register("easter_bunny_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.EASTER_BUNNY, 0xFFF2B2, 0xFF85B5, new Item.Properties())); public static final DeferredItem DORRIE_SPAWN_EGG = ITEMS.register("dorrie_spawn_egg", diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java index bc171f62..0c64d2ca 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java @@ -171,7 +171,6 @@ public final class AntarchyNeoforgeMisc { () -> new MenuType<>(com.craisinlord.antarchy.content.menu.GiantFryingPanMenu::new, FeatureFlags.DEFAULT_FLAGS) ); - // Mob effects public static final DeferredHolder DREAD = MOB_EFFECTS.register("dread", DreadMobEffect::new); public static final DeferredHolder BLEEDING = MOB_EFFECTS.register("bleeding", BleedingMobEffect::new); public static final DeferredHolder BLOOD_MOON = MOB_EFFECTS.register("blood_moon", BloodMoonMobEffect::new); @@ -186,7 +185,6 @@ public final class AntarchyNeoforgeMisc { public static final DeferredHolder SHRINKING_EFFECT = MOB_EFFECTS.register("shrinking", ShrinkMobEffect::new); public static final DeferredHolder GROWTH_EFFECT = MOB_EFFECTS.register("growth", GrowthMobEffect::new); - // Potions public static final DeferredHolder INVERSION = POTIONS.register("inversion", () -> new Potion(new MobEffectInstance(AnthologyEffects.inverted(), 600))); public static final DeferredHolder LONG_INVERSION = POTIONS.register("long_inversion", @@ -228,7 +226,6 @@ public final class AntarchyNeoforgeMisc { public static final DeferredHolder EXTREME_GROWING = POTIONS.register("extreme_growing", () -> new Potion("growing", new MobEffectInstance(GROWTH_EFFECT, 600, 2))); - // Fluids public static final DeferredHolder BILE = FLUIDS.register("bile", () -> new BaseFlowingFluid.Source(bileProperties())); public static final DeferredHolder FLOWING_BILE = FLUIDS.register("flowing_bile", @@ -246,7 +243,6 @@ public final class AntarchyNeoforgeMisc { public static final DeferredHolder FLOWING_LUMEN = FLUIDS.register("flowing_lumen", () -> new BaseFlowingFluid.Flowing(lumenProperties())); - // Particle types public static final DeferredHolder, SimpleParticleType> DREAM_FIRE_FLAME = PARTICLE_TYPES.register("dream_fire_flame", () -> new SimpleParticleType(true)); public static final DeferredHolder, SimpleParticleType> BUG_SPRAY_PARTICLE = PARTICLE_TYPES.register("bug_spray", @@ -292,7 +288,6 @@ public final class AntarchyNeoforgeMisc { public static final DeferredHolder, ParticleType> INVERTED_GEYSER_ERUPTION = PARTICLE_TYPES.register("inverted_geyser_eruption", () -> particleType(InvertedGeyserParticleOptions::codec, InvertedGeyserParticleOptions::streamCodec)); - // Features public static final DeferredHolder, RedAntNestFeature> RED_ANT_NEST_FEATURE = FEATURES.register("red_ant_nest", () -> new RedAntNestFeature(SimpleBlockConfiguration.CODEC)); public static final DeferredHolder, BrownAntNestFeature> BROWN_ANT_NEST_FEATURE = FEATURES.register("brown_ant_nest", @@ -455,13 +450,11 @@ public final class AntarchyNeoforgeMisc { public static final DeferredHolder, ThoraxisIchorLakeFeature> THORAXIS_ICHOR_LAKE = FEATURES.register("thoraxis_ichor_lake", () -> new ThoraxisIchorLakeFeature(NoneFeatureConfiguration.CODEC)); - // Biome sources public static final DeferredHolder, MapCodec> ELYTHIA_BIOME_SOURCE = BIOME_SOURCES.register("elythia_biome_source", () -> ElythiaBiomeSource.CODEC); public static final DeferredHolder, MapCodec> THORAXIS_BIOME_SOURCE = BIOME_SOURCES.register("thoraxis_biome_source", () -> ThoraxisBiomeSource.CODEC); - // Density function public static final DeferredHolder, MapCodec> ELYTHIA_RIVER_CARVE = DENSITY_FUNCTION_TYPES.register("elythia_river_carve", () -> ElythiaRiverCarveFunction.CODEC); diff --git a/neoforge-1.21.1/src/main/resources/antarchy-neoforge.mixins.json b/neoforge-1.21.1/src/main/resources/antarchy-neoforge.mixins.json index 12f078df..f2c7a752 100644 --- a/neoforge-1.21.1/src/main/resources/antarchy-neoforge.mixins.json +++ b/neoforge-1.21.1/src/main/resources/antarchy-neoforge.mixins.json @@ -15,6 +15,7 @@ "infinity.WarpLogicMixin" ], "client": [ + "infinity.ShaderPayloadRepeatSkipMixin" ], "injectors": { "defaultRequire": 1 diff --git a/settings.gradle b/settings.gradle index e5ba5dc9..c6689520 100644 --- a/settings.gradle +++ b/settings.gradle @@ -19,18 +19,4 @@ include("test-suite") include("common-1.20.1") -// fabric-1.20.1 and forge-1.20.1 are intentionally NOT included here — each lives as -// its own standalone Gradle build. forge-1.20.1 must be standalone because ForgeGradle 6 -// isn't Gradle 9 compatible. fabric-1.20.1 must be standalone because Fabric Loom -// registers a build-wide "tinyRemapperService" that isn't classloader-safe across two -// fabric-loom projects targeting different Minecraft versions in the same Gradle -// invocation — configuring fabric-1.20.1 and fabric-1.21.1 together reliably throws -// "LoomGradleExtensionImpl_Decorated cannot be cast to LoomGradleExtension". -// Two ways to access either: -// 1. CLI from root — `./gradlew forge1201Build` / `fabric120Build` (and RunClient / -// RunServer / Assemble / Clean) delegate via Exec — see build.gradle. -// 2. IDE — in IntelliJ's Gradle tool window, click `+` → Link Gradle Project → -// pick forge-1.20.1/build.gradle or fabric-1.20.1/build.gradle. Each appears as -// its own root in the sidebar with a full Tasks tree and run configs. - rootProject.name = "Antarchy"