From e4b7b76cff12bfa26949dba837b3621a94a5891e Mon Sep 17 00:00:00 2001 From: craisinlord Date: Sun, 19 Jul 2026 02:11:55 -0500 Subject: [PATCH] added back rolly polly, fixed various issues, antiwater sponge behavior, expiremental settings disabled natively, farbic keybind conflict fix natively --- .../antarchy/config/AntarchySettings.java | 81 +++++- .../antarchy/config/ConfigResetGuard.java | 2 +- .../antarchy/content/AntarchySoundEvents.java | 11 +- .../antarchy/content/AntarchyTags.java | 1 + .../antarchy/content/entity/BedBugEntity.java | 2 +- .../content/entity/EmperorScorpionEntity.java | 15 +- .../content/entity/HerculesBeetleEntity.java | 2 +- .../content/entity/HushProjectileEntity.java | 36 ++- .../content/entity/LurkingTerrorEntity.java | 2 +- .../antarchy/content/entity/MantisEntity.java | 2 +- .../content/entity/RollyPollyEntity.java | 256 ++++++++++-------- .../content/entity/StinkBugEntity.java | 2 +- .../antarchy/content/item/CorneaEarItem.java | 2 + .../network/RollyPollyRollPayload.java | 20 -- .../worldgen/ants/TermiteNestFeature.java | 46 ++++ .../cavaryn/CavarynBileVeinFeature.java | 41 ++- .../mixins/DreamSandFallingSpeedMixin.java | 27 ++ ...ExperimentalSettingsLevelSummaryMixin.java | 18 ++ .../antarchy/mixins/SpongeAntiwaterMixin.java | 76 ++++++ .../ExperimentalSettingsPopupMixin.java | 22 ++ .../resources/antarchy-common.mixins.json | 4 + .../resources/assets/antarchy/lang/de_de.json | 3 + .../resources/assets/antarchy/lang/en_us.json | 3 + .../resources/assets/antarchy/lang/es_es.json | 3 + .../resources/assets/antarchy/lang/fr_fr.json | 3 + .../resources/assets/antarchy/lang/it_it.json | 3 + .../resources/assets/antarchy/lang/ja_jp.json | 3 + .../resources/assets/antarchy/lang/ko_kr.json | 3 + .../resources/assets/antarchy/lang/pt_br.json | 3 + .../resources/assets/antarchy/lang/zh_cn.json | 3 + .../resources/assets/antarchy/lang/zh_tw.json | 3 + .../resources/assets/antarchy/sounds.json | 24 ++ .../sounds/mob/rolly_polly/nromal_mode.ogg | Bin 0 -> 6486 bytes .../antarchy/sounds/mob/rolly_polly/roll1.ogg | Bin 0 -> 13284 bytes .../sounds/mob/rolly_polly/wheel_mode.ogg | Bin 0 -> 10322 bytes .../cornea/cornea_stalk_stage2_emissive.png | Bin 0 -> 1598 bytes .../cornea_stalk_stage2_emissive.png.mcmeta | 5 + .../antarchy/loot_table/entities/bed_bug.json | 39 +++ .../data/antarchy/tags/fluid/antiwater.json | 7 + .../cornea_stalk_cluster.json | 4 +- .../patch_ceiling_cornea_stalk_cluster.json | 4 +- .../worldgen/placed_feature/corn_patch.json | 2 +- .../placed_feature/star_coral_patch.json | 2 +- .../minecraft/tags/entity_type/arthropod.json | 1 + .../fabric/AntarchyConfigModuleFabric.java | 2 + .../antarchy/fabric/AntarchyFabric.java | 2 +- .../fabric/AntarchyFabricContent.java | 5 +- .../AntarchyFabricDispenserBehaviors.java | 59 ++++ .../antarchy/fabric/AntarchyFabricEvents.java | 4 + .../client/AntarchyFabricClientBootstrap.java | 3 +- .../fabric/client/AntarchyKeyBindings.java | 8 - .../client/KeybindingConflictFixStore.java | 40 +++ .../client/RollyPollyClientHandler.java | 29 -- .../fabric/mixin/DreamSandMovementMixin.java | 99 +++++++ .../client/KeybindingConflictFixMixin.java | 68 +++++ .../network/AntarchyFabricNetworking.java | 9 - .../registry/AntarchyFabricEntities.java | 10 +- .../AntarchyFabricEntityAttributes.java | 2 +- .../fabric/registry/AntarchyFabricItems.java | 4 +- .../fabric/registry/AntarchyFabricSounds.java | 3 + .../AntarchyFabricSpawnPlacements.java | 2 +- .../resources/antarchy-fabric.mixins.json | 2 + .../AntarchyConfigModuleNeoforge.java | 6 + .../antarchy/neoforge/AntarchyMiscConfig.java | 6 + .../antarchy/neoforge/AntarchyMobsConfig.java | 18 +- .../antarchy/neoforge/AntarchyNeoforge.java | 5 +- .../neoforge/AntarchyToolsConfig.java | 4 +- .../neoforge/client/AntarchyKeyBindings.java | 9 - .../client/AntarchyNeoForgeClient.java | 2 +- .../client/RollyPollyClientHandler.java | 36 --- .../network/RollyPollyNetworking.java | 31 --- .../AntarchyNeoforgeCreativeModeTabs.java | 2 +- .../registry/AntarchyNeoforgeEntites.java | 10 +- .../AntarchyNeoforgeEntityAttributes.java | 2 +- .../registry/AntarchyNeoforgeItems.java | 4 +- .../AntarchyNeoforgePayloadHandlers.java | 1 - .../registry/AntarchyNeoforgeSounds.java | 3 + .../AntarchyNeoforgeSpawnPlacements.java | 2 +- .../golden_apple_cow_spawns.json | 2 +- 79 files changed, 952 insertions(+), 328 deletions(-) delete mode 100644 common/src/main/java/com/craisinlord/antarchy/content/network/RollyPollyRollPayload.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/mixins/DreamSandFallingSpeedMixin.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/mixins/ExperimentalSettingsLevelSummaryMixin.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/mixins/SpongeAntiwaterMixin.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/mixins/client/ExperimentalSettingsPopupMixin.java create mode 100644 common/src/main/resources/assets/antarchy/sounds/mob/rolly_polly/nromal_mode.ogg create mode 100644 common/src/main/resources/assets/antarchy/sounds/mob/rolly_polly/roll1.ogg create mode 100644 common/src/main/resources/assets/antarchy/sounds/mob/rolly_polly/wheel_mode.ogg create mode 100644 common/src/main/resources/assets/antarchy/textures/block/cornea/cornea_stalk_stage2_emissive.png create mode 100644 common/src/main/resources/assets/antarchy/textures/block/cornea/cornea_stalk_stage2_emissive.png.mcmeta create mode 100644 common/src/main/resources/data/antarchy/loot_table/entities/bed_bug.json create mode 100644 common/src/main/resources/data/antarchy/tags/fluid/antiwater.json create mode 100644 fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricDispenserBehaviors.java create mode 100644 fabric/src/main/java/com/craisinlord/antarchy/fabric/client/KeybindingConflictFixStore.java delete mode 100644 fabric/src/main/java/com/craisinlord/antarchy/fabric/client/RollyPollyClientHandler.java create mode 100644 fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamSandMovementMixin.java create mode 100644 fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/KeybindingConflictFixMixin.java delete mode 100644 neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/RollyPollyClientHandler.java delete mode 100644 neoforge/src/main/java/com/craisinlord/antarchy/neoforge/network/RollyPollyNetworking.java diff --git a/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java b/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java index e46f1c26..c69b958b 100644 --- a/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java +++ b/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java @@ -18,6 +18,8 @@ public final class AntarchySettings { private static boolean glowingTorchflowers = true; private static boolean glowVinesUnderLeaves = true; private static boolean swingThroughGrassEnabled = true; + private static boolean fabricKeybindingConflictFixEnabled = true; + private static boolean experimentalSettingsPopupDisabled = true; private static boolean sizeChangingRaysEnabled = true; private static double sizeRayMinScale = 0.1D; private static double sizeRayMaxScale = 10.0D; @@ -49,11 +51,11 @@ public final class AntarchySettings { private static double ultimateCrossbowAttackDamage = 8.0D; private static double ultimateCrossbowChargeSpeedMultiplier = 0.25D; private static double ultimateMaceDamageMultiplier = 1.5D; - private static double battleAxeAttackDamage = 44.0D; + private static double battleAxeAttackDamage = 46.0D; private static double bigBerthaAttackDamage = 55.0D; private static double bigBerthaReachBonus = 3.0D; private static double bigBerthaAttackSpeed = -3.0D; - private static double attitudeAdjusterBaseDamage = 40.0D; + private static double attitudeAdjusterBaseDamage = 47.0D; private static boolean attitudeAdjusterBreaksBlocks = true; private static double krakensGraspAttackDamage = 16.0D; private static double krakensGraspAttackSpeed = -2.9D; @@ -119,11 +121,15 @@ public final class AntarchySettings { private static double alphaMantisFlyingSpeed = 0.77D; private static int alphaMantisSummonIntervalTicks = 300; private static int alphaMantisMaxMinions = 4; - private static double rollyPollyHealth = 12.0D; + private static double rollyPollyHealth = 25.0D; private static double rollyPollyMovementSpeed = 0.3D; private static double rollyPollyRollSpeedMultiplier = 2.2D; private static double rollyPollyTumbleDamage = 1.0D; private static int rollyPollyTameChance = 3; + private static double rollyPollyBowlingDamage = 3.0D; + private static double rollyPollyBowlingKnockback = 0.8D; + private static double rollyPollyArmor = 2.0D; + private static double rollyPollyRolledArmorBonus = 16.0D; private static double krakenProjectileDamageTakenMultiplier = 0.5D; private static boolean krakenSquidSpawnEnabled = true; private static boolean krakenMassSpawnEnabled = true; @@ -168,6 +174,7 @@ public final class AntarchySettings { private static double dreamSandGravityMultiplier = 0.45D; private static double dreamSandFallDamageMultiplier = 0.35D; private static double dreamSandEffectDurationSeconds = 7.0D; + private static double dreamSandFallingBlockGravityMultiplier = 0.4D; private static boolean ichorWitherEnabled = true; private static int nightmareHelmetArmorValue = 3; private static int nightmareChestplateArmorValue = 8; @@ -273,7 +280,7 @@ public final class AntarchySettings { private static double emperorScorpionMovementSpeed = 0.384D; private static double emperorScorpionArmor = 22.0D; private static double emperorScorpionKnockbackResistance = 0.8D; - private static double emperorScorpionFollowRange = 40.0D; + private static double emperorScorpionFollowRange = 80.0D; private static int emperorScorpionXpReward = 25; private static int emperorScorpionClawAnimTicks = 23; private static int emperorScorpionClawHitTick = 12; @@ -284,7 +291,9 @@ public final class AntarchySettings { private static int emperorScorpionPoisonTicks = 300; private static int emperorScorpionWeaknessTicks = 120; private static int emperorScorpionSummonIntervalTicks = 140; - private static int emperorScorpionMaxSummonedScorpions = 8; + private static int emperorScorpionMaxSummonedScorpions = 4; + private static int emperorScorpionMaxNearbyScorpions = 3; + private static int emperorScorpionHardenCooldownTicks = 2400; private static double scorpionHealth = 30.0D; private static double scorpionAttackDamage = 5.0D; private static double scorpionMovementSpeed = 0.29D; @@ -581,6 +590,14 @@ public final class AntarchySettings { return swingThroughGrassEnabled; } + public static boolean fabricKeybindingConflictFixEnabled() { + return fabricKeybindingConflictFixEnabled; + } + + public static boolean experimentalSettingsPopupDisabled() { + return experimentalSettingsPopupDisabled; + } + public static boolean sizeChangingRaysEnabled() { return sizeChangingRaysEnabled; } @@ -904,6 +921,22 @@ public final class AntarchySettings { return rollyPollyTameChance; } + public static double rollyPollyBowlingDamage() { + return rollyPollyBowlingDamage; + } + + public static double rollyPollyBowlingKnockback() { + return rollyPollyBowlingKnockback; + } + + public static double rollyPollyArmor() { + return rollyPollyArmor; + } + + public static double rollyPollyRolledArmorBonus() { + return rollyPollyRolledArmorBonus; + } + public static double waspHealth() { return waspHealth; } @@ -1111,6 +1144,14 @@ public final class AntarchySettings { swingThroughGrassEnabled = value; } + public static void setFabricKeybindingConflictFixEnabled(boolean value) { + fabricKeybindingConflictFixEnabled = value; + } + + public static void setExperimentalSettingsPopupDisabled(boolean value) { + experimentalSettingsPopupDisabled = value; + } + public static void setSizeChangingRaysEnabled(boolean value) { sizeChangingRaysEnabled = value; } @@ -1438,6 +1479,22 @@ public final class AntarchySettings { rollyPollyTameChance = value; } + public static void setRollyPollyBowlingDamage(double value) { + rollyPollyBowlingDamage = value; + } + + public static void setRollyPollyBowlingKnockback(double value) { + rollyPollyBowlingKnockback = value; + } + + public static void setRollyPollyArmor(double value) { + rollyPollyArmor = value; + } + + public static void setRollyPollyRolledArmorBonus(double value) { + rollyPollyRolledArmorBonus = value; + } + public static void setKrakenProjectileDamageTakenMultiplier(double value) { krakenProjectileDamageTakenMultiplier = value; } @@ -1671,6 +1728,14 @@ public final class AntarchySettings { dreamSandEffectDurationSeconds = value; } + public static double dreamSandFallingBlockGravityMultiplier() { + return dreamSandFallingBlockGravityMultiplier; + } + + public static void setDreamSandFallingBlockGravityMultiplier(double value) { + dreamSandFallingBlockGravityMultiplier = value; + } + public static boolean ichorWitherEnabled() { return ichorWitherEnabled; } @@ -2075,6 +2140,12 @@ public final class AntarchySettings { public static int emperorScorpionMaxSummonedScorpions() { return emperorScorpionMaxSummonedScorpions; } public static void setEmperorScorpionMaxSummonedScorpions(int value) { emperorScorpionMaxSummonedScorpions = value; } + public static int emperorScorpionMaxNearbyScorpions() { return emperorScorpionMaxNearbyScorpions; } + public static void setEmperorScorpionMaxNearbyScorpions(int value) { emperorScorpionMaxNearbyScorpions = value; } + + public static int emperorScorpionHardenCooldownTicks() { return emperorScorpionHardenCooldownTicks; } + public static void setEmperorScorpionHardenCooldownTicks(int value) { emperorScorpionHardenCooldownTicks = value; } + public static double scorpionHealth() { return scorpionHealth; } public static void setScorpionHealth(double value) { scorpionHealth = value; } diff --git a/common/src/main/java/com/craisinlord/antarchy/config/ConfigResetGuard.java b/common/src/main/java/com/craisinlord/antarchy/config/ConfigResetGuard.java index c0ef9b88..b348355f 100644 --- a/common/src/main/java/com/craisinlord/antarchy/config/ConfigResetGuard.java +++ b/common/src/main/java/com/craisinlord/antarchy/config/ConfigResetGuard.java @@ -6,7 +6,7 @@ import java.nio.file.Files; import java.nio.file.Path; public final class ConfigResetGuard { - public static final int RESET_GENERATION = 2; + public static final int RESET_GENERATION = 3; private static final String MARKER_FILE_NAME = ".config_generation"; private ConfigResetGuard() { diff --git a/common/src/main/java/com/craisinlord/antarchy/content/AntarchySoundEvents.java b/common/src/main/java/com/craisinlord/antarchy/content/AntarchySoundEvents.java index af9c2c0b..b2090f4b 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/AntarchySoundEvents.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/AntarchySoundEvents.java @@ -156,6 +156,9 @@ public final class AntarchySoundEvents { public static Supplier SPIT_BUG_HURT = (Supplier) UNBOUND; public static Supplier SPIT_BUG_SPIT = (Supplier) UNBOUND; public static Supplier BRUTALFLY_SPIT = (Supplier) UNBOUND; + public static Supplier ROLLY_POLLY_WHEEL_MODE = (Supplier) UNBOUND; + public static Supplier ROLLY_POLLY_NORMAL_MODE = (Supplier) UNBOUND; + public static Supplier ROLLY_POLLY_ROLL = (Supplier) UNBOUND; private AntarchySoundEvents() { } @@ -307,7 +310,10 @@ public final class AntarchySoundEvents { Supplier jumpyBugJump, Supplier spitBugHurt, Supplier spitBugSpit, - Supplier brutalflySpit + Supplier brutalflySpit, + Supplier rollyPollyWheelMode, + Supplier rollyPollyNormalMode, + Supplier rollyPollyRoll ) { SQUIDZOOKA_FIRE = squidzookaFire; SHRINK_RAY_SOUND = shrinkRaySound; @@ -456,5 +462,8 @@ public final class AntarchySoundEvents { SPIT_BUG_HURT = spitBugHurt; SPIT_BUG_SPIT = spitBugSpit; BRUTALFLY_SPIT = brutalflySpit; + ROLLY_POLLY_WHEEL_MODE = rollyPollyWheelMode; + ROLLY_POLLY_NORMAL_MODE = rollyPollyNormalMode; + ROLLY_POLLY_ROLL = rollyPollyRoll; } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java index a3e4083e..356b94b3 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java @@ -114,6 +114,7 @@ public final class AntarchyTags { public static final class Fluids { public static final TagKey LUMEN = TagKey.create(Registries.FLUID, id("lumen")); public static final TagKey GIANT_LILY_PAD_SUPPORTING_FLUIDS = TagKey.create(Registries.FLUID, id("giant_lily_pad_supporting_fluids")); + public static final TagKey ANTIWATER = TagKey.create(Registries.FLUID, id("antiwater")); private Fluids() { } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/BedBugEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/BedBugEntity.java index bf3a3307..4369d4be 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/BedBugEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/BedBugEntity.java @@ -324,7 +324,7 @@ public class BedBugEntity extends Animal implements GeoEntity { return state.setAndContinue(BITE_ANIM); } - if (this.getDeltaMovement().horizontalDistanceSqr() > 0.003D) { + if (state.isMoving()) { state.getController().setAnimationSpeed(1.15D); return state.setAndContinue(WALK_ANIM); } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/EmperorScorpionEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/EmperorScorpionEntity.java index 258f42eb..b30a6741 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/EmperorScorpionEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/EmperorScorpionEntity.java @@ -106,7 +106,7 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity { private int attackAnimTicks; private int clawCooldownTicks; private int stingCooldownTicks; - private int hardenCooldownTicks = AntarchySettings.emperorScorpionSummonIntervalTicks(); + private int hardenCooldownTicks = AntarchySettings.emperorScorpionHardenCooldownTicks(); private int hardenCastTicks; private int hardenCastSpawnTicks; private int hardenStateTicks; @@ -331,7 +331,8 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity { switch (this.getHardenPhase()) { case CASTING -> { if (this.hardenCastTicks % this.hardenCastSpawnTicks == 0 - && this.hardenSummonedScorpions < AntarchySettings.emperorScorpionMaxSummonedScorpions()) { + && this.hardenSummonedScorpions < AntarchySettings.emperorScorpionMaxSummonedScorpions() + && this.countNearbyScorpionMinions() < AntarchySettings.emperorScorpionMaxNearbyScorpions()) { this.summonScorpionMinion(); this.hardenSummonedScorpions++; if (this.hardenSummonedScorpions >= AntarchySettings.emperorScorpionMaxSummonedScorpions()) { @@ -407,6 +408,16 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity { this.setAggressive(false); } + private static final double NEARBY_SCORPION_CHECK_RADIUS = 24.0D; + + private int countNearbyScorpionMinions() { + return this.level().getEntitiesOfClass( + ScorpionEntity.class, + this.getBoundingBox().inflate(NEARBY_SCORPION_CHECK_RADIUS), + Entity::isAlive + ).size(); + } + private void summonScorpionMinion() { if (!(this.level() instanceof ServerLevel serverLevel)) { return; diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java index 4cd5c7d3..a50cc0fe 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/HerculesBeetleEntity.java @@ -318,7 +318,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl this.flightCooldown--; } - if (this.isFlying() && this.tickCount % 16 == 0) { + if (this.isFlying() && this.tickCount % 32 == 0) { this.playSound(AntarchySoundEvents.MANTIS_FLY_LOOP.get(), 0.5F, 0.85F + this.random.nextFloat() * 0.1F); } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/HushProjectileEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/HushProjectileEntity.java index bb336669..0ab9206f 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/HushProjectileEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/HushProjectileEntity.java @@ -2,6 +2,7 @@ package com.craisinlord.antarchy.content.entity; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.AntarchyTags; import java.util.UUID; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.nbt.CompoundTag; @@ -9,6 +10,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; @@ -20,10 +22,13 @@ import net.minecraft.world.phys.Vec3; public class HushProjectileEntity extends ThrowableItemProjectile { private static final int DREAD_DURATION_TICKS = 300; private static final double TRAVEL_SPEED = 0.27D; + private static final int RETARGET_GRACE_TICKS = 60; + private static final double RETARGET_SEARCH_RADIUS = 16.0D; private static final DustParticleOptions HUSH_PARTICLES = new DustParticleOptions(new org.joml.Vector3f(1.0F, 0.05F, 0.05F), 1.0F); private static final String TARGET_UUID_KEY = "HushTarget"; private UUID targetUuid; + private int retargetGraceTicksRemaining; public HushProjectileEntity(EntityType entityType, Level level) { super(entityType, level); @@ -85,9 +90,23 @@ public class HushProjectileEntity extends ThrowableItemProjectile { this.getBoundingBox().inflate(48.0D), entity -> entity.isAlive() && entity.getUUID().equals(this.targetUuid) ).stream().findFirst().orElse(null); + if (target == null) { - this.discard(); - return; + target = this.findReplacementTarget(); + if (target != null) { + this.targetUuid = target.getUUID(); + this.retargetGraceTicksRemaining = 0; + } else { + if (this.retargetGraceTicksRemaining <= 0) { + this.retargetGraceTicksRemaining = RETARGET_GRACE_TICKS; + } + if (--this.retargetGraceTicksRemaining <= 0) { + this.discard(); + } + return; + } + } else { + this.retargetGraceTicksRemaining = 0; } Vec3 toTarget = target.getEyePosition().subtract(this.position()); @@ -101,6 +120,19 @@ public class HushProjectileEntity extends ThrowableItemProjectile { this.setDeltaMovement(this.getDeltaMovement().lerp(desired, 0.1D)); } + private LivingEntity findReplacementTarget() { + return this.level().getEntitiesOfClass( + LivingEntity.class, + this.getBoundingBox().inflate(RETARGET_SEARCH_RADIUS), + entity -> entity.isAlive() + && !entity.getUUID().equals(this.targetUuid) + && entity.getType().is(AntarchyTags.Entities.HUSHWEED_TARGETS) + && (!(entity instanceof Player player) || (!player.isCreative() && !player.isSpectator()))) + .stream() + .min(java.util.Comparator.comparingDouble(this::distanceToSqr)) + .orElse(null); + } + @Override protected void onHitEntity(EntityHitResult result) { super.onHitEntity(result); diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/LurkingTerrorEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/LurkingTerrorEntity.java index 1a8754fa..71b029de 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/LurkingTerrorEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/LurkingTerrorEntity.java @@ -165,7 +165,7 @@ public class LurkingTerrorEntity extends Monster implements GeoEntity { @Override public void tick() { super.tick(); - if (!this.level().isClientSide() && !this.onGround() && this.tickCount % 40 == 0) { + if (!this.level().isClientSide() && !this.onGround() && this.tickCount % 80 == 0) { this.playSound(AntarchySoundEvents.LURKING_TERROR_FLY_LOOP.get(), 0.45F, 0.95F + this.random.nextFloat() * 0.1F); } if (!this.level().isClientSide() && attackAnimTicks > 0) attackAnimTicks--; diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/MantisEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/MantisEntity.java index ea348ed5..f81d7eaa 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/MantisEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/MantisEntity.java @@ -206,7 +206,7 @@ public class MantisEntity extends Monster implements GeoEntity { if (this.flyBurstTicks > 0) { this.flyBurstTicks--; - if (this.flyBurstTicks % 8 == 0) { + if (this.flyBurstTicks % 16 == 0) { this.playSound(AntarchySoundEvents.MANTIS_FLY_LOOP.get(), 0.45F, 0.95F + this.random.nextFloat() * 0.1F); } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/RollyPollyEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/RollyPollyEntity.java index fb01ed32..bef51ef8 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/RollyPollyEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/RollyPollyEntity.java @@ -1,5 +1,6 @@ package com.craisinlord.antarchy.content.entity; +import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.AntarchyTags; import com.craisinlord.antarchy.content.AntarchySoundEvents; @@ -12,25 +13,27 @@ import net.minecraft.nbt.CompoundTag; 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.tags.BlockTags; +import net.minecraft.tags.DamageTypeTags; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvents; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.AgeableMob; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.TamableAnimal; +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.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.FollowOwnerGoal; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; import net.minecraft.world.entity.ai.goal.MoveToBlockGoal; @@ -38,6 +41,8 @@ import net.minecraft.world.entity.ai.goal.PanicGoal; import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; import net.minecraft.world.entity.ai.goal.TemptGoal; import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.OwnerHurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.OwnerHurtTargetGoal; import net.minecraft.world.entity.ai.util.DefaultRandomPos; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -77,7 +82,9 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { private static final int ROLL_UP_TICKS = 15; private static final int UNROLL_TICKS = 9; private static final int DEFENSIVE_CURL_TICKS = 100; - private static final int TUMBLE_DAMAGE_INTERVAL_TICKS = 30; + private static final int ROLL_SOUND_INTERVAL_TICKS = 25; + private static final ResourceLocation ROLLED_ARMOR_MODIFIER_ID = + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "rolly_polly_rolled_armor"); private static final EntityDataAccessor ANIMATION_STATE = SynchedEntityData.defineId(RollyPollyEntity.class, EntityDataSerializers.INT); @@ -89,8 +96,8 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { private int rollTransitionTicks; private boolean unrolling; private int defensiveCurlTicks; - private int tumbleTicks; private boolean hasCompost; + private int rollSoundCooldown; public RollyPollyEntity(EntityType entityType, Level level) { super(entityType, level); @@ -108,6 +115,8 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { return Mob.createMobAttributes() .add(Attributes.MAX_HEALTH, AntarchySettings.rollyPollyHealth()) .add(Attributes.MOVEMENT_SPEED, AntarchySettings.rollyPollyMovementSpeed()) + .add(Attributes.ATTACK_DAMAGE, AntarchySettings.rollyPollyBowlingDamage()) + .add(Attributes.ARMOR, AntarchySettings.rollyPollyArmor()) .add(Attributes.FOLLOW_RANGE, 16.0D); } @@ -128,24 +137,28 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { return !RollyPollyEntity.this.isRolled() && !RollyPollyEntity.this.isTame() && super.canUse(); } }); - this.goalSelector.addGoal(2, new FertilizeCropGoal()); - this.goalSelector.addGoal(3, new EatCompostItemGoal()); - this.goalSelector.addGoal(4, new SnuggleOnBedGoal()); - this.goalSelector.addGoal(5, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyTags.Items.ROLLY_POLLY_FOOD), false) { + this.goalSelector.addGoal(2, new BowlingAttackGoal()); + this.goalSelector.addGoal(3, new FertilizeCropGoal()); + this.goalSelector.addGoal(4, new EatCompostItemGoal()); + this.goalSelector.addGoal(5, new SnuggleOnBedGoal()); + this.goalSelector.addGoal(6, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyTags.Items.ROLLY_POLLY_FOOD), false) { @Override public boolean canUse() { return !RollyPollyEntity.this.isRolled() && super.canUse(); } }); - this.goalSelector.addGoal(6, new RollingStrollGoal()); - this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D) { + this.goalSelector.addGoal(7, new FollowOwnerGoal(this, 1.1D, 10.0F, 2.0F)); + this.goalSelector.addGoal(8, new RollingStrollGoal()); + this.goalSelector.addGoal(9, new WaterAvoidingRandomStrollGoal(this, 1.0D) { @Override public boolean canUse() { - return !RollyPollyEntity.this.isRolled() && !RollyPollyEntity.this.isVehicle() && super.canUse(); + return !RollyPollyEntity.this.isRolled() && super.canUse(); } }); - this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(11, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new OwnerHurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); } @Override @@ -198,13 +211,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { return InteractionResult.sidedSuccess(this.level().isClientSide); } - if (this.isTame() && stack.isEmpty() && !player.isShiftKeyDown() && !player.isPassengerOfSameVehicle(this)) { - if (!this.level().isClientSide) { - player.startRiding(this); - } - return InteractionResult.sidedSuccess(this.level().isClientSide); - } - return super.mobInteract(player, hand); } @@ -235,34 +241,36 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { this.entityData.set(ROLLED, rolled); } - /** Toggles wheel mode; called from the ridden-roll keybind payload. */ - public void handleRollToggle(ServerPlayer player) { - if (!this.isTame() || this.getControllingPassenger() != player) { - return; - } - if (this.rollTransitionTicks > 0) { - return; - } - if (this.isRolled()) { - this.startUnroll(); - } else { - this.startRollUp(); - } - } - private void startRollUp() { this.setRolled(true); this.unrolling = false; this.rollTransitionTicks = ROLL_UP_TICKS; this.setAnimationState(ANIM_ROLL_UP); - this.playSound(SoundEvents.ARMADILLO_ROLL, 0.8F, 1.0F); + this.playSound(AntarchySoundEvents.ROLLY_POLLY_WHEEL_MODE.get(), 0.8F, 1.0F); + this.applyRolledArmorBonus(); } private void startUnroll() { this.unrolling = true; this.rollTransitionTicks = UNROLL_TICKS; this.setAnimationState(ANIM_UNROLL); - this.playSound(SoundEvents.ARMADILLO_UNROLL_START, 0.8F, 1.0F); + this.playSound(AntarchySoundEvents.ROLLY_POLLY_NORMAL_MODE.get(), 0.8F, 1.0F); + this.removeRolledArmorBonus(); + } + + private void applyRolledArmorBonus() { + AttributeInstance armor = this.getAttribute(Attributes.ARMOR); + if (armor != null && armor.getModifier(ROLLED_ARMOR_MODIFIER_ID) == null) { + armor.addTransientModifier(new AttributeModifier( + ROLLED_ARMOR_MODIFIER_ID, AntarchySettings.rollyPollyRolledArmorBonus(), AttributeModifier.Operation.ADD_VALUE)); + } + } + + private void removeRolledArmorBonus() { + AttributeInstance armor = this.getAttribute(Attributes.ARMOR); + if (armor != null) { + armor.removeModifier(ROLLED_ARMOR_MODIFIER_ID); + } } @Override @@ -272,14 +280,14 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { private void stopDefensiveCurl() { this.defensiveCurlTicks = 0; - if (this.isRolled() && !this.isVehicle()) { + if (this.isRolled()) { this.startUnroll(); } } @Override public boolean hurt(DamageSource source, float amount) { - if (this.isRolled()) { + if (this.isRolled() && source.is(DamageTypeTags.IS_PROJECTILE)) { amount *= 0.25F; } boolean hurt = super.hurt(source, amount); @@ -313,29 +321,27 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { if (this.defensiveCurlTicks > 0) { this.defensiveCurlTicks--; this.getNavigation().stop(); - if (this.defensiveCurlTicks <= 0 && this.isRolled() && !this.isVehicle()) { + if (this.defensiveCurlTicks <= 0 && this.isRolled()) { this.startUnroll(); } } - this.tickTumbleDamage(); + this.tickRollSound(); } - private void tickTumbleDamage() { - if (!this.isRolled() || this.rollTransitionTicks > 0 - || !(this.getControllingPassenger() instanceof Player rider)) { - this.tumbleTicks = 0; + private void tickRollSound() { + if (!this.isRolled() || this.rollTransitionTicks > 0 || this.getDeltaMovement().horizontalDistanceSqr() <= 0.003D) { + this.rollSoundCooldown = 0; return; } - boolean moving = this.getDeltaMovement().horizontalDistanceSqr() > 0.003D; - boolean helmeted = !rider.getItemBySlot(EquipmentSlot.HEAD).isEmpty(); - if (!moving || helmeted) { + + if (this.rollSoundCooldown > 0) { + this.rollSoundCooldown--; return; } - if (++this.tumbleTicks >= TUMBLE_DAMAGE_INTERVAL_TICKS) { - this.tumbleTicks = 0; - rider.hurt(this.damageSources().generic(), (float) AntarchySettings.rollyPollyTumbleDamage()); - } + + this.rollSoundCooldown = ROLL_SOUND_INTERVAL_TICKS; + this.playSound(AntarchySoundEvents.ROLLY_POLLY_ROLL.get(), 0.7F, 0.9F + this.random.nextFloat() * 0.2F); } private int getAnimationState() { @@ -346,70 +352,15 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { this.entityData.set(ANIMATION_STATE, state); } - @Override - @Nullable - public LivingEntity getControllingPassenger() { - if (!this.isTame()) { - return null; - } - Entity passenger = this.getFirstPassenger(); - return passenger instanceof LivingEntity living ? living : null; - } - - @Override - public boolean canAddPassenger(Entity passenger) { - return this.getPassengers().isEmpty(); - } - - @Override - protected void positionRider(Entity passenger, MoveFunction moveFunction) { - if (this.hasPassenger(passenger)) { - // When rolled the rider tucks into the center of the ball; otherwise sits on the shell - double yOffset = this.isRolled() ? -0.25D : 0.45D; - moveFunction.accept(passenger, this.getX(), this.getY() + yOffset, this.getZ()); - } - } - @Override public void travel(Vec3 travelVector) { - if (this.defensiveCurlTicks > 0 && !this.isVehicle()) { + if (this.defensiveCurlTicks > 0) { super.travel(Vec3.ZERO); return; } super.travel(travelVector); } - @Override - protected void tickRidden(Player player, Vec3 travelVector) { - super.tickRidden(player, travelVector); - this.setRot(player.getYHeadRot(), player.getXRot() * 0.5F); - this.yRotO = this.yBodyRot = this.yHeadRot = this.getYRot(); - } - - @Override - protected Vec3 getRiddenInput(Player player, Vec3 travelVector) { - if (this.rollTransitionTicks > 0) { - // Hold still while rolling up / unrolling - return Vec3.ZERO; - } - float forward = player.zza; - float strafe = player.xxa * 0.5F; - if (forward < 0.0F) { - forward *= 0.4F; - } - if (this.isRolled()) { - // Rolling is fast but drifty - strafe *= 0.35F; - } - return new Vec3(strafe, 0.0D, forward); - } - - @Override - protected float getRiddenSpeed(Player player) { - return (float) (this.getAttributeValue(Attributes.MOVEMENT_SPEED) - * (this.isRolled() ? AntarchySettings.rollyPollyRollSpeedMultiplier() : 1.0D)); - } - @Override public boolean causeFallDamage(float fallDistance, float multiplier, DamageSource damageSource) { if (this.isRolled()) { @@ -483,7 +434,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { public boolean canUse() { if (RollyPollyEntity.this.hasCompost || RollyPollyEntity.this.isRolled() - || RollyPollyEntity.this.isVehicle() || RollyPollyEntity.this.defensiveCurlTicks > 0) { return false; } @@ -500,7 +450,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { public boolean canContinueToUse() { return !RollyPollyEntity.this.hasCompost && !RollyPollyEntity.this.isRolled() - && !RollyPollyEntity.this.isVehicle() && this.targetItem != null && this.targetItem.isAlive() && isCompostable(this.targetItem.getItem()); @@ -571,7 +520,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { public boolean canUse() { return RollyPollyEntity.this.hasCompost && !RollyPollyEntity.this.isRolled() - && !RollyPollyEntity.this.isVehicle() && RollyPollyEntity.this.defensiveCurlTicks <= 0 && super.canUse(); } @@ -579,7 +527,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { @Override public boolean canContinueToUse() { return RollyPollyEntity.this.hasCompost - && !RollyPollyEntity.this.isVehicle() && super.canContinueToUse(); } @@ -653,6 +600,84 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { } } + private class BowlingAttackGoal extends Goal { + private static final double CHARGE_SPEED = 1.3D; + private static final double HIT_RANGE_SQR = 1.75D * 1.75D; + private static final int ATTACK_COOLDOWN_TICKS = 20; + + private int attackCooldown; + + BowlingAttackGoal() { + this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); + } + + @Override + public boolean canUse() { + LivingEntity target = RollyPollyEntity.this.getTarget(); + return RollyPollyEntity.this.isTame() + && target != null + && target.isAlive(); + } + + @Override + public boolean canContinueToUse() { + return this.canUse(); + } + + @Override + public void start() { + this.attackCooldown = 0; + if (!RollyPollyEntity.this.isRolled() && RollyPollyEntity.this.rollTransitionTicks <= 0) { + RollyPollyEntity.this.startRollUp(); + } + } + + @Override + public void stop() { + RollyPollyEntity.this.getNavigation().stop(); + if (RollyPollyEntity.this.isRolled() && RollyPollyEntity.this.rollTransitionTicks <= 0) { + RollyPollyEntity.this.startUnroll(); + } + } + + @Override + public void tick() { + LivingEntity target = RollyPollyEntity.this.getTarget(); + if (target == null) { + return; + } + + RollyPollyEntity.this.getLookControl().setLookAt(target, 30.0F, 30.0F); + + if (this.attackCooldown > 0) { + this.attackCooldown--; + } + + if (!RollyPollyEntity.this.isRolled() || RollyPollyEntity.this.rollTransitionTicks > 0) { + return; + } + + RollyPollyEntity.this.getNavigation().moveTo(target, CHARGE_SPEED); + + if (this.attackCooldown <= 0 && RollyPollyEntity.this.distanceToSqr(target) <= HIT_RANGE_SQR) { + this.attackCooldown = ATTACK_COOLDOWN_TICKS; + this.performBowlingHit(target); + } + } + + private void performBowlingHit(LivingEntity target) { + boolean hurt = target.hurt(RollyPollyEntity.this.damageSources().mobAttack(RollyPollyEntity.this), (float) RollyPollyEntity.this.getAttributeValue(Attributes.ATTACK_DAMAGE)); + if (!hurt) { + return; + } + + double dx = RollyPollyEntity.this.getX() - target.getX(); + double dz = RollyPollyEntity.this.getZ() - target.getZ(); + target.knockback(AntarchySettings.rollyPollyBowlingKnockback(), dx, dz); + RollyPollyEntity.this.playSound(AntarchySoundEvents.ROLLY_POLLY_ROLL.get(), 1.0F, 0.8F + RollyPollyEntity.this.random.nextFloat() * 0.2F); + } + } + private class RollingStrollGoal extends Goal { @Nullable private Vec3 targetPos; @@ -668,7 +693,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { @Override public boolean canUse() { if (RollyPollyEntity.this.isRolled() - || RollyPollyEntity.this.isVehicle() || RollyPollyEntity.this.defensiveCurlTicks > 0 || RollyPollyEntity.this.hasCompost || RollyPollyEntity.this.rollTransitionTicks > 0) { @@ -685,7 +709,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { public boolean canContinueToUse() { return !this.finished && this.rollingTicks < this.maxRollingTicks - && !RollyPollyEntity.this.isVehicle() && !RollyPollyEntity.this.hasCompost; } @@ -739,7 +762,7 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { @Override public boolean canUse() { - if (!RollyPollyEntity.this.isTame() || RollyPollyEntity.this.isVehicle()) { + if (!RollyPollyEntity.this.isTame()) { return false; } if (!(RollyPollyEntity.this.getOwner() instanceof Player player) || !player.isSleeping()) { @@ -763,7 +786,6 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity { @Override public boolean canContinueToUse() { return RollyPollyEntity.this.isTame() - && !RollyPollyEntity.this.isVehicle() && this.ownerPlayer != null && this.ownerPlayer.isSleeping() && this.bedPos != null; diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/StinkBugEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/StinkBugEntity.java index eb16a6fb..7663e78a 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/StinkBugEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/StinkBugEntity.java @@ -88,7 +88,7 @@ public class StinkBugEntity extends Animal implements GeoEntity { if (this.fartAnimationTicks > 0) { this.fartAnimationTicks--; if (this.fartAnimationTicks == FART_RELEASE_TICKS && this.pendingFartBurst && !this.level().isClientSide()) { - this.playSound(AntarchySoundEvents.STINK_BUG_FART.get(), 0.85F, 0.9F + this.random.nextFloat() * 0.1F); + this.playSound(AntarchySoundEvents.STINK_BUG_FART.get(), 1.7F, 0.9F + this.random.nextFloat() * 0.1F); StinkyBehavior.emitBurst(this, STINK_BURST_PARTICLES); StinkyBehavior.applyBurstStinkyEffect(this, STINK_BURST_RADIUS, STINK_BURST_DURATION_TICKS); this.pendingFartBurst = false; diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/CorneaEarItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/CorneaEarItem.java index 2f799797..74bf618d 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/item/CorneaEarItem.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/CorneaEarItem.java @@ -10,6 +10,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundSource; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionResult; import net.minecraft.world.effect.MobEffectInstance; @@ -58,6 +59,7 @@ public final class CorneaEarItem extends Item { } level.setBlock(plantPos, stalkState, Block.UPDATE_ALL); + level.playSound(null, plantPos, stalkState.getSoundType().getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); ItemStack stack = context.getItemInHand(); Player player = context.getPlayer(); if (player == null || !player.getAbilities().instabuild) { diff --git a/common/src/main/java/com/craisinlord/antarchy/content/network/RollyPollyRollPayload.java b/common/src/main/java/com/craisinlord/antarchy/content/network/RollyPollyRollPayload.java deleted file mode 100644 index ab9c97da..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/network/RollyPollyRollPayload.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.craisinlord.antarchy.content.network; - -import com.craisinlord.antarchy.Antarchy; -import io.netty.buffer.ByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; - -/** C2S: the rider pressed the roll keybind — toggle the rolly polly's wheel mode. */ -public record RollyPollyRollPayload() implements CustomPacketPayload { - public static final Type TYPE = - new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "rolly_polly_roll")); - public static final StreamCodec STREAM_CODEC = - StreamCodec.unit(new RollyPollyRollPayload()); - - @Override - public Type type() { - return TYPE; - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java index dc49f044..03869782 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/ants/TermiteNestFeature.java @@ -1,10 +1,56 @@ package com.craisinlord.antarchy.content.worldgen.ants; +import com.craisinlord.antarchy.Antarchy; import com.mojang.serialization.Codec; +import java.util.Optional; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +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.levelgen.feature.configurations.SimpleBlockConfiguration; public class TermiteNestFeature extends SurfaceAntNestFeature { + private static final ResourceLocation MYRMITE_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "myrmite"); + private static final ResourceLocation BROODSTONE_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "broodstone"); + public TermiteNestFeature(Codec codec) { super(codec); } + + @Override + protected boolean isValidNestGround(BlockState nestGroundState) { + return super.isValidNestGround(nestGroundState) + || nestGroundState.is(getBlock(MYRMITE_ID)) + || nestGroundState.is(getBlock(BROODSTONE_ID)); + } + + @Override + protected void decorateAroundNest(WorldGenLevel level, BlockPos center, RandomSource random) { + for (int xOffset = -1; xOffset <= 1; xOffset++) { + for (int zOffset = -1; zOffset <= 1; zOffset++) { + if (xOffset == 0 && zOffset == 0) { + continue; + } + + if (Math.abs(xOffset) == 1 && Math.abs(zOffset) == 1 && random.nextBoolean()) { + continue; + } + + BlockPos targetPos = center.offset(xOffset, 0, zOffset); + BlockState targetState = level.getBlockState(targetPos); + if (this.isValidNestGround(targetState)) { + level.setBlock(targetPos, Blocks.ROOTED_DIRT.defaultBlockState(), 2); + } + } + } + } + + private static Block getBlock(ResourceLocation id) { + Optional block = BuiltInRegistries.BLOCK.getOptional(id); + return block.orElse(null); + } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/cavaryn/CavarynBileVeinFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/cavaryn/CavarynBileVeinFeature.java index 5cf07aa4..409e8996 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/cavaryn/CavarynBileVeinFeature.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/cavaryn/CavarynBileVeinFeature.java @@ -29,6 +29,8 @@ public final class CavarynBileVeinFeature extends Feature codec) { super(codec); @@ -36,21 +38,25 @@ public final class CavarynBileVeinFeature extends Feature context) { - Block bileVeinBlock = getBlock(BILE_VEIN_ID); - Block bileBlock = getBlock(BILE_ID); - if (bileVeinBlock == null || !(bileBlock instanceof LiquidBlock)) { + try { + Block bileVeinBlock = getBlock(BILE_VEIN_ID); + Block bileBlock = getBlock(BILE_ID); + if (bileVeinBlock == null || !(bileBlock instanceof LiquidBlock)) { + return false; + } + + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + + BlockPos start = findStart(level, context.origin(), random); + if (start == null) { + return false; + } + + return growVeinNetwork(level, start, bileVeinBlock, bileBlock, random); + } catch (RuntimeException exception) { return false; } - - WorldGenLevel level = context.level(); - RandomSource random = context.random(); - - BlockPos start = findStart(level, context.origin(), random); - if (start == null) { - return false; - } - - return growVeinNetwork(level, start, bileVeinBlock, bileBlock, random); } private static BlockPos findStart(WorldGenLevel level, BlockPos origin, RandomSource random) { @@ -81,12 +87,12 @@ public final class CavarynBileVeinFeature extends Feature MAX_DISTANCE_FROM_START_SQR) { + break; + } + if (visited.contains(current)) { current = current.relative(biasedNextDir(dir, random)); continue; diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/DreamSandFallingSpeedMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/DreamSandFallingSpeedMixin.java new file mode 100644 index 00000000..d9194987 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/DreamSandFallingSpeedMixin.java @@ -0,0 +1,27 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(FallingBlockEntity.class) +public abstract class DreamSandFallingSpeedMixin { + private static final ResourceLocation DREAM_SAND_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "dream_sand"); + + @Shadow public abstract BlockState getBlockState(); + + @Inject(method = "getDefaultGravity", at = @At("RETURN"), cancellable = true) + private void antarchy$slowDreamSandFall(CallbackInfoReturnable cir) { + if (BuiltInRegistries.BLOCK.getKey(this.getBlockState().getBlock()).equals(DREAM_SAND_ID)) { + cir.setReturnValue(cir.getReturnValue() * AntarchySettings.dreamSandFallingBlockGravityMultiplier()); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/ExperimentalSettingsLevelSummaryMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/ExperimentalSettingsLevelSummaryMixin.java new file mode 100644 index 00000000..791d6f25 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/ExperimentalSettingsLevelSummaryMixin.java @@ -0,0 +1,18 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.config.AntarchySettings; +import net.minecraft.world.level.storage.LevelSummary; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = LevelSummary.class, priority = 1001) +public abstract class ExperimentalSettingsLevelSummaryMixin { + @Inject(method = "isExperimental", at = @At("RETURN"), cancellable = true) + private void antarchy$hideExperimentalStatus(CallbackInfoReturnable cir) { + if (AntarchySettings.experimentalSettingsPopupDisabled()) { + cir.setReturnValue(false); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/SpongeAntiwaterMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/SpongeAntiwaterMixin.java new file mode 100644 index 00000000..7da73f8a --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/SpongeAntiwaterMixin.java @@ -0,0 +1,76 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.AntarchyTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BucketPickup; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.SpongeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(SpongeBlock.class) +public abstract class SpongeAntiwaterMixin { + private static final int MAX_DEPTH = 6; + private static final int MAX_COUNT = 65; + private static final Direction[] ALL_DIRECTIONS = Direction.values(); + + @Inject(method = "tryAbsorbWater", at = @At("TAIL")) + private void antarchy$tryAbsorbAntiwater(Level level, BlockPos pos, CallbackInfo ci) { + if (!level.getBlockState(pos).is(Blocks.SPONGE)) { + return; + } + + if (antarchy$removeAntiwaterBreadthFirstSearch(level, pos) > 1) { + level.setBlock(pos, Blocks.WET_SPONGE.defaultBlockState(), 2); + level.playSound(null, pos, SoundEvents.SPONGE_ABSORB, SoundSource.BLOCKS, 1.0F, 1.0F); + } + } + + private static int antarchy$removeAntiwaterBreadthFirstSearch(Level level, BlockPos origin) { + return BlockPos.breadthFirstTraversal( + origin, + MAX_DEPTH, + MAX_COUNT, + (pos, consumer) -> { + for (Direction direction : ALL_DIRECTIONS) { + consumer.accept(pos.relative(direction)); + } + }, + pos -> antarchy$tryRemoveAntiwaterAt(level, origin, pos) + ); + } + + private static boolean antarchy$tryRemoveAntiwaterAt(Level level, BlockPos origin, BlockPos pos) { + if (pos.equals(origin)) { + return true; + } + + BlockState state = level.getBlockState(pos); + FluidState fluidState = level.getFluidState(pos); + if (!fluidState.is(AntarchyTags.Fluids.ANTIWATER)) { + return false; + } + + Block block = state.getBlock(); + if (block instanceof BucketPickup bucketPickup && !bucketPickup.pickupBlock(null, level, pos, state).isEmpty()) { + return true; + } + + if (block instanceof LiquidBlock) { + level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); + return true; + } + + return false; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/client/ExperimentalSettingsPopupMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/client/ExperimentalSettingsPopupMixin.java new file mode 100644 index 00000000..a0e89d51 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/client/ExperimentalSettingsPopupMixin.java @@ -0,0 +1,22 @@ +package com.craisinlord.antarchy.mixins.client; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.mojang.serialization.Lifecycle; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen; +import net.minecraft.client.gui.screens.worldselection.WorldOpenFlows; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(WorldOpenFlows.class) +public abstract class ExperimentalSettingsPopupMixin { + @Inject(method = "confirmWorldCreation", at = @At("HEAD"), cancellable = true) + private static void antarchy$skipExperimentalSettingsPopup(Minecraft minecraft, CreateWorldScreen screen, Lifecycle lifecycle, Runnable callback, boolean skipWarnings, CallbackInfo ci) { + if (AntarchySettings.experimentalSettingsPopupDisabled() && lifecycle == Lifecycle.experimental() && !skipWarnings) { + callback.run(); + ci.cancel(); + } + } +} diff --git a/common/src/main/resources/antarchy-common.mixins.json b/common/src/main/resources/antarchy-common.mixins.json index 475b8ecc..e0632c81 100644 --- a/common/src/main/resources/antarchy-common.mixins.json +++ b/common/src/main/resources/antarchy-common.mixins.json @@ -10,6 +10,7 @@ "BlockEntityTypeSignMixin", "BloodglassMixin", "DreamFireBlockMixin", + "DreamSandFallingSpeedMixin", "DreamSandLowGravityMixin", "FireVisualBaseFireBlockMixin", "FireVisualEntityMixin", @@ -18,11 +19,13 @@ "FrogVariantBootstrapMixin", "GlowSquidLumenSpawnMixin", "GlowVinesUnderLeavesMixin", + "ExperimentalSettingsLevelSummaryMixin", "NightmareSwordDamageMixin", "PotionBrewingMixin", "VillagerTradesMixin", "WaterlilyLumenMixin", "ServerPlayerGameModeMixin", + "SpongeAntiwaterMixin", "SquidzookaEnchantMixin", "SquidzookaMultishotMixin", "gravity.AbstractArrowGravityMixin", @@ -61,6 +64,7 @@ "client.ElytraModelAccessor", "client.FrogRendererElythiaMixin", "client.GameRendererSwingThroughGrassMixin", + "client.ExperimentalSettingsPopupMixin", "client.KrakensGraspChargePoseMixin", "client.LightningBoltRendererMixin", "client.MountedVehicleCameraMixin", diff --git a/common/src/main/resources/assets/antarchy/lang/de_de.json b/common/src/main/resources/assets/antarchy/lang/de_de.json index fe1d96ec..7ea2f918 100644 --- a/common/src/main/resources/assets/antarchy/lang/de_de.json +++ b/common/src/main/resources/assets/antarchy/lang/de_de.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "Stinkwanze furzt", "subtitles.antarchy.stink_bug_idle": "Stinkwanze ist zu hören", "subtitles.antarchy.rolly_polly_idle": "Rollassel ist zu hören", + "subtitles.antarchy.rolly_polly_wheel_mode": "Rollassel rollt sich ein", + "subtitles.antarchy.rolly_polly_normal_mode": "Rollassel rollt sich aus", + "subtitles.antarchy.rolly_polly_roll": "Rollassel rollt", "subtitles.antarchy.hercules_beetle_idle": "Herkuleskäfer ist zu hören", "subtitles.antarchy.hercules_beetle_hurt": "Herkuleskäfer wird verletzt", "subtitles.antarchy.hercules_beetle_attack": "Herkuleskäfer greift an", diff --git a/common/src/main/resources/assets/antarchy/lang/en_us.json b/common/src/main/resources/assets/antarchy/lang/en_us.json index 5cd093a0..2e11bea9 100644 --- a/common/src/main/resources/assets/antarchy/lang/en_us.json +++ b/common/src/main/resources/assets/antarchy/lang/en_us.json @@ -925,6 +925,9 @@ "subtitles.antarchy.stink_bug_fart": "Stink Bug farts", "subtitles.antarchy.stink_bug_idle": "Stink Bug idles", "subtitles.antarchy.rolly_polly_idle": "Rolly Polly idles", + "subtitles.antarchy.rolly_polly_wheel_mode": "Rolly Polly curls up", + "subtitles.antarchy.rolly_polly_normal_mode": "Rolly Polly uncurls", + "subtitles.antarchy.rolly_polly_roll": "Rolly Polly rolls", "subtitles.antarchy.hercules_beetle_idle": "Hercules Beetle idles", "subtitles.antarchy.hercules_beetle_hurt": "Hercules Beetle hurts", "subtitles.antarchy.hercules_beetle_attack": "Hercules Beetle attacks", diff --git a/common/src/main/resources/assets/antarchy/lang/es_es.json b/common/src/main/resources/assets/antarchy/lang/es_es.json index 1b7899d2..20a0869f 100644 --- a/common/src/main/resources/assets/antarchy/lang/es_es.json +++ b/common/src/main/resources/assets/antarchy/lang/es_es.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "Chinche apestosa se tira un pedo", "subtitles.antarchy.stink_bug_idle": "Chinche apestosa hace ruido", "subtitles.antarchy.rolly_polly_idle": "Cochinilla hace ruido", + "subtitles.antarchy.rolly_polly_wheel_mode": "La cochinilla se enrolla", + "subtitles.antarchy.rolly_polly_normal_mode": "La cochinilla se desenrolla", + "subtitles.antarchy.rolly_polly_roll": "La cochinilla rueda", "subtitles.antarchy.hercules_beetle_idle": "Escarabajo hércules hace ruido", "subtitles.antarchy.hercules_beetle_hurt": "Escarabajo hércules recibe daño", "subtitles.antarchy.hercules_beetle_attack": "Escarabajo hércules ataca", diff --git a/common/src/main/resources/assets/antarchy/lang/fr_fr.json b/common/src/main/resources/assets/antarchy/lang/fr_fr.json index f32de39b..f1ce6514 100644 --- a/common/src/main/resources/assets/antarchy/lang/fr_fr.json +++ b/common/src/main/resources/assets/antarchy/lang/fr_fr.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "Punaise puante pète", "subtitles.antarchy.stink_bug_idle": "Punaise puante se fait entendre", "subtitles.antarchy.rolly_polly_idle": "Cloporte se fait entendre", + "subtitles.antarchy.rolly_polly_wheel_mode": "Le cloporte s'enroule", + "subtitles.antarchy.rolly_polly_normal_mode": "Le cloporte se déroule", + "subtitles.antarchy.rolly_polly_roll": "Le cloporte roule", "subtitles.antarchy.hercules_beetle_idle": "Scarabée Hercule se fait entendre", "subtitles.antarchy.hercules_beetle_hurt": "Scarabée Hercule est blessé", "subtitles.antarchy.hercules_beetle_attack": "Scarabée Hercule attaque", diff --git a/common/src/main/resources/assets/antarchy/lang/it_it.json b/common/src/main/resources/assets/antarchy/lang/it_it.json index d5726af2..8f81036a 100644 --- a/common/src/main/resources/assets/antarchy/lang/it_it.json +++ b/common/src/main/resources/assets/antarchy/lang/it_it.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "La cimice puzzolente scoreggia", "subtitles.antarchy.stink_bug_idle": "La cimice puzzolente emette un verso", "subtitles.antarchy.rolly_polly_idle": "Il porcellino di terra emette un verso", + "subtitles.antarchy.rolly_polly_wheel_mode": "Il porcellino di terra si arrotola", + "subtitles.antarchy.rolly_polly_normal_mode": "Il porcellino di terra si srotola", + "subtitles.antarchy.rolly_polly_roll": "Il porcellino di terra rotola", "subtitles.antarchy.hercules_beetle_idle": "Lo scarabeo Ercole emette un verso", "subtitles.antarchy.hercules_beetle_hurt": "Lo scarabeo Ercole si ferisce", "subtitles.antarchy.hercules_beetle_attack": "Lo scarabeo Ercole attacca", diff --git a/common/src/main/resources/assets/antarchy/lang/ja_jp.json b/common/src/main/resources/assets/antarchy/lang/ja_jp.json index f00641bb..fa29e9fa 100644 --- a/common/src/main/resources/assets/antarchy/lang/ja_jp.json +++ b/common/src/main/resources/assets/antarchy/lang/ja_jp.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "カメムシが屁をする", "subtitles.antarchy.stink_bug_idle": "カメムシが鳴く", "subtitles.antarchy.rolly_polly_idle": "ダンゴムシが鳴く", + "subtitles.antarchy.rolly_polly_wheel_mode": "ダンゴムシが丸まる", + "subtitles.antarchy.rolly_polly_normal_mode": "ダンゴムシが伸びる", + "subtitles.antarchy.rolly_polly_roll": "ダンゴムシが転がる", "subtitles.antarchy.hercules_beetle_idle": "ヘラクレスオオカブトが鳴く", "subtitles.antarchy.hercules_beetle_hurt": "ヘラクレスオオカブトが傷つく", "subtitles.antarchy.hercules_beetle_attack": "ヘラクレスオオカブトが攻撃する", diff --git a/common/src/main/resources/assets/antarchy/lang/ko_kr.json b/common/src/main/resources/assets/antarchy/lang/ko_kr.json index 8fdaf453..482c2f4e 100644 --- a/common/src/main/resources/assets/antarchy/lang/ko_kr.json +++ b/common/src/main/resources/assets/antarchy/lang/ko_kr.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "노린재 방귀를 뀝니다", "subtitles.antarchy.stink_bug_idle": "노린재 소리를 냅니다", "subtitles.antarchy.rolly_polly_idle": "공벌레 소리를 냅니다", + "subtitles.antarchy.rolly_polly_wheel_mode": "공벌레가 몸을 맙니다", + "subtitles.antarchy.rolly_polly_normal_mode": "공벌레가 몸을 폅니다", + "subtitles.antarchy.rolly_polly_roll": "공벌레가 구릅니다", "subtitles.antarchy.hercules_beetle_idle": "헤라클레스장수풍뎅이 소리를 냅니다", "subtitles.antarchy.hercules_beetle_hurt": "헤라클레스장수풍뎅이 다칩니다", "subtitles.antarchy.hercules_beetle_attack": "헤라클레스장수풍뎅이 공격합니다", diff --git a/common/src/main/resources/assets/antarchy/lang/pt_br.json b/common/src/main/resources/assets/antarchy/lang/pt_br.json index c889f9f5..ed9225e4 100644 --- a/common/src/main/resources/assets/antarchy/lang/pt_br.json +++ b/common/src/main/resources/assets/antarchy/lang/pt_br.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "Percevejo-fedorento solta pum", "subtitles.antarchy.stink_bug_idle": "Percevejo-fedorento faz barulho", "subtitles.antarchy.rolly_polly_idle": "Tatuzinho-de-jardim faz barulho", + "subtitles.antarchy.rolly_polly_wheel_mode": "Tatuzinho-de-jardim se enrola", + "subtitles.antarchy.rolly_polly_normal_mode": "Tatuzinho-de-jardim se desenrola", + "subtitles.antarchy.rolly_polly_roll": "Tatuzinho-de-jardim rola", "subtitles.antarchy.hercules_beetle_idle": "Besouro-hércules faz barulho", "subtitles.antarchy.hercules_beetle_hurt": "Besouro-hércules se machuca", "subtitles.antarchy.hercules_beetle_attack": "Besouro-hércules ataca", diff --git a/common/src/main/resources/assets/antarchy/lang/zh_cn.json b/common/src/main/resources/assets/antarchy/lang/zh_cn.json index 206dd81e..6ee17d2c 100644 --- a/common/src/main/resources/assets/antarchy/lang/zh_cn.json +++ b/common/src/main/resources/assets/antarchy/lang/zh_cn.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "臭屁虫放屁", "subtitles.antarchy.stink_bug_idle": "臭屁虫发出动静", "subtitles.antarchy.rolly_polly_idle": "鼠妇发出动静", + "subtitles.antarchy.rolly_polly_wheel_mode": "鼠妇蜷缩起来", + "subtitles.antarchy.rolly_polly_normal_mode": "鼠妇展开身体", + "subtitles.antarchy.rolly_polly_roll": "鼠妇滚动", "subtitles.antarchy.hercules_beetle_idle": "赫拉克勒斯甲虫发出动静", "subtitles.antarchy.hercules_beetle_hurt": "赫拉克勒斯甲虫受伤", "subtitles.antarchy.hercules_beetle_attack": "赫拉克勒斯甲虫攻击", diff --git a/common/src/main/resources/assets/antarchy/lang/zh_tw.json b/common/src/main/resources/assets/antarchy/lang/zh_tw.json index 0cd92756..4b28e833 100644 --- a/common/src/main/resources/assets/antarchy/lang/zh_tw.json +++ b/common/src/main/resources/assets/antarchy/lang/zh_tw.json @@ -924,6 +924,9 @@ "subtitles.antarchy.stink_bug_fart": "臭屁蟲放屁", "subtitles.antarchy.stink_bug_idle": "臭屁蟲發出動靜", "subtitles.antarchy.rolly_polly_idle": "鼠婦發出動靜", + "subtitles.antarchy.rolly_polly_wheel_mode": "鼠婦蜷縮起來", + "subtitles.antarchy.rolly_polly_normal_mode": "鼠婦展開身體", + "subtitles.antarchy.rolly_polly_roll": "鼠婦滾動", "subtitles.antarchy.hercules_beetle_idle": "赫拉克勒斯甲蟲發出動靜", "subtitles.antarchy.hercules_beetle_hurt": "赫拉克勒斯甲蟲受傷", "subtitles.antarchy.hercules_beetle_attack": "赫拉克勒斯甲蟲攻擊", diff --git a/common/src/main/resources/assets/antarchy/sounds.json b/common/src/main/resources/assets/antarchy/sounds.json index 381cf565..03bfe42d 100644 --- a/common/src/main/resources/assets/antarchy/sounds.json +++ b/common/src/main/resources/assets/antarchy/sounds.json @@ -660,6 +660,30 @@ } ] }, + "rolly_polly_wheel_mode": { + "subtitle": "subtitles.antarchy.rolly_polly_wheel_mode", + "sounds": [ + { + "name": "antarchy:mob/rolly_polly/wheel_mode" + } + ] + }, + "rolly_polly_normal_mode": { + "subtitle": "subtitles.antarchy.rolly_polly_normal_mode", + "sounds": [ + { + "name": "antarchy:mob/rolly_polly/nromal_mode" + } + ] + }, + "rolly_polly_roll": { + "subtitle": "subtitles.antarchy.rolly_polly_roll", + "sounds": [ + { + "name": "antarchy:mob/rolly_polly/roll1" + } + ] + }, "thoraxis_nightmare_wastes_ambient": { "subtitle": "subtitles.antarchy.thoraxis_nightmare_wastes_ambient", "sounds": [ diff --git a/common/src/main/resources/assets/antarchy/sounds/mob/rolly_polly/nromal_mode.ogg b/common/src/main/resources/assets/antarchy/sounds/mob/rolly_polly/nromal_mode.ogg new file mode 100644 index 0000000000000000000000000000000000000000..06bb33b517cb862c21c559a3e5a2cec81f982466 GIT binary patch literal 6486 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 Hj==u`gX%Sa literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/antarchy/sounds/mob/rolly_polly/wheel_mode.ogg b/common/src/main/resources/assets/antarchy/sounds/mob/rolly_polly/wheel_mode.ogg new file mode 100644 index 0000000000000000000000000000000000000000..374adaff35ad78082f473060b7149df4315f808d GIT binary patch literal 10322 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 NOFUBG*_Aoq{{VxfL6`sl literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/antarchy/textures/block/cornea/cornea_stalk_stage2_emissive.png b/common/src/main/resources/assets/antarchy/textures/block/cornea/cornea_stalk_stage2_emissive.png new file mode 100644 index 0000000000000000000000000000000000000000..69ddcc72942979d5c09e9847b0bac78d0bd2e2ee GIT binary patch literal 1598 zcmV-E2EqA>P)G z#oubp)Qo3+oONCu;@_^W?)sF204}QOQINZ5&U{gUTZfA=0VmEqp-UP#-Pt1Jebn&1RPYJKXvRA*Y5oI+{5l} z1cI@?|MrX17Rjq`zA%09{4~A(PYY`#-NNb#Z{57v2Ie1j#?wFidurROZ%!l7`S@_N z?K#^(1-k;{oJL?Wr$P2H=mf_EjdM?#K*@p{8P`0wOAQ3t^Z9)+57sXU6jXH|2$-WJ zP!qSW?}NEktxsILxWU;1%d0Vdh!_LG%2zIbSBna8A`#?Ro4;-4<2-F0ygGC18eSjnr*V+YvwAUtEKhPp`76ek1b|$2? zE3y3rACgYM0hv^_1SGIAf@&K9cB*r%kq~tC_XAtyts|_6z6z z*i!i$fkA-=*#{NHAX`U>E>)U?QYnwVj|E+~YfC0`(AVX;Eq*(6%N}pRH9J z?4TqNJQkMf6L8dh;6SCYuFicxgTRttp@GtszQGX!X%nA5yAyB#X9d9#mZQK51K&cv6Oe!`kovA*2W1B80gz}xfSLeyupsbNCRGy>$X>&OK-z1Q9XjNY zIST?QD(g&0EBNx>53on+F}*xJEm2)2?t?6~E#a8^Ain7>BW zNQ}FYJl&BN42^){g~1cT%xAqsWjm>>zaLn4_3sZ5ss#jqgg)l$L(hQIAZNe_=~rzh zs0R1=PMN?Kf*RS+SXal3L z3lWv>yrfZ$K~8S^oq*%|KDc|Bi$_o(;u^Y$YZD&lKV entityType = ((SpawnEggItem) stack.getItem()).getType(stack); + + try { + entityType.spawn(source.level(), stack, null, source.pos().relative(direction), MobSpawnType.DISPENSER, direction != Direction.UP, false); + } catch (Exception exception) { + Antarchy.LOGGER.error("Error while dispensing spawn egg from dispenser at {}", source.pos(), exception); + return ItemStack.EMPTY; + } + + stack.shrink(1); + source.level().gameEvent(null, GameEvent.ENTITY_PLACE, source.pos()); + return stack; + } + }; + + private AntarchyFabricDispenserBehaviors() { + } + + public static void register() { + registerSpawnEggs(); + registerPotions(); + } + + private static void registerSpawnEggs() { + for (var holder : AntarchyFabricItems.ITEMS.getEntries()) { + Item item = holder.get(); + if (item instanceof SpawnEggItem) { + DispenserBlock.registerBehavior(item, SPAWN_EGG_BEHAVIOR); + } + } + } + + private static void registerPotions() { + DispenserBlock.registerProjectileBehavior(Items.SPLASH_POTION); + DispenserBlock.registerProjectileBehavior(Items.LINGERING_POTION); + } +} diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java index cb9d4ba4..4ae7cd7e 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java @@ -25,6 +25,7 @@ import net.fabricmc.fabric.api.event.player.AttackEntityCallback; import net.minecraft.server.level.ServerPlayer; import com.craisinlord.antarchy.content.SquidzookaDispenseBehavior; import com.craisinlord.antarchy.content.RpoLauncherDispenseBehavior; +import com.craisinlord.antarchy.content.SizeRayDispenseBehavior; import com.craisinlord.antarchy.content.WaterCannonDispenseBehavior; import net.minecraft.world.level.block.ComposterBlock; import net.minecraft.world.level.block.DispenserBlock; @@ -58,6 +59,9 @@ public final class AntarchyFabricEvents { DispenserBlock.registerBehavior(AntarchyFabricItems.SQUIDZOOKA.get(), new SquidzookaDispenseBehavior()); DispenserBlock.registerBehavior(AntarchyFabricItems.RPO_LAUNCHER.get(), new RpoLauncherDispenseBehavior()); DispenserBlock.registerBehavior(AntarchyFabricItems.WATER_CANNON.get(), new WaterCannonDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyFabricItems.SHRINK_RAY.get(), new SizeRayDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyFabricItems.GROWTH_RAY.get(), new SizeRayDispenseBehavior()); + AntarchyFabricDispenserBehaviors.register(); ComposterBlock.COMPOSTABLES.put(AntarchyFabricBlocks.UMBRAL_MOSS_BLOCK.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyFabricBlocks.UMBRAL_MOSS_CARPET.get().asItem(), 0.3f); diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java index 94b1f241..05a18146 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java @@ -135,7 +135,7 @@ public final class AntarchyFabricClientBootstrap { EntityRendererRegistry.register(AntarchyFabricEntities.OURANWOOD_DEER.get(), com.craisinlord.antarchy.content.client.renderer.OuranwoodDeerRenderer::new); EntityRendererRegistry.register(AntarchyFabricEntities.GLIMMER.get(), com.craisinlord.antarchy.content.client.renderer.glimmer.GlimmerRenderer::new); EntityRendererRegistry.register(AntarchyFabricEntities.ELKA.get(), com.craisinlord.antarchy.content.client.renderer.ElkaRenderer::new); -// EntityRendererRegistry.register(AntarchyFabricEntities.ROLLY_POLLY.get(), RollyPollyRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.ROLLY_POLLY.get(), com.craisinlord.antarchy.content.client.renderer.RollyPollyRenderer::new); EntityRendererRegistry.register(AntarchyFabricEntities.TERMITE.get(), TermiteRenderer::new); EntityRendererRegistry.register(AntarchyFabricEntities.CREEPING_HORROR.get(), CreepingHorrorRenderer::new); EntityRendererRegistry.register(AntarchyFabricEntities.LURKING_TERROR.get(), LurkingTerrorRenderer::new); @@ -448,7 +448,6 @@ public final class AntarchyFabricClientBootstrap { ScorpionWhipTetherRenderHandler.tick(); DorrieJumpClientHandler.tick(); HerculesBeetleClientHandler.tick(); - RollyPollyClientHandler.tick(); }); BigBerthaClientHandler.register(); diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyKeyBindings.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyKeyBindings.java index a5d945d6..592f64ea 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyKeyBindings.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyKeyBindings.java @@ -31,20 +31,12 @@ public final class AntarchyKeyBindings { CATEGORY ); - public static final KeyMapping ROLLY_POLLY_ROLL = new KeyMapping( - "key.antarchy.rolly_polly_roll", - InputConstants.Type.KEYSYM, - GLFW.GLFW_KEY_R, - CATEGORY - ); - private AntarchyKeyBindings() {} public static void register() { KeyBindingHelper.registerKeyBinding(BRUTALFLY_FLAP); KeyBindingHelper.registerKeyBinding(DORRIE_CHARGE_JUMP); KeyBindingHelper.registerKeyBinding(HERCULES_BEETLE_CHARGE); - KeyBindingHelper.registerKeyBinding(ROLLY_POLLY_ROLL); } public static boolean isBrutalflyFlapPressed() { diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/KeybindingConflictFixStore.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/KeybindingConflictFixStore.java new file mode 100644 index 00000000..ee5e3766 --- /dev/null +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/KeybindingConflictFixStore.java @@ -0,0 +1,40 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.mojang.blaze3d.platform.InputConstants; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.minecraft.client.KeyMapping; + +public final class KeybindingConflictFixStore { + private static final Map> MAPPINGS = new HashMap<>(); + + private KeybindingConflictFixStore() { + } + + public static void add(InputConstants.Key key, KeyMapping mapping) { + List mappings = MAPPINGS.computeIfAbsent(key, ignored -> new ArrayList<>()); + if (!mappings.contains(mapping)) { + mappings.add(mapping); + } + } + + public static void clear() { + MAPPINGS.clear(); + } + + public static List others(InputConstants.Key key, KeyMapping active) { + List mappings = MAPPINGS.get(key); + if (mappings == null || mappings.size() < 2) { + return List.of(); + } + List others = new ArrayList<>(mappings.size() - 1); + for (KeyMapping mapping : mappings) { + if (mapping != active) { + others.add(mapping); + } + } + return others; + } +} diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/RollyPollyClientHandler.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/RollyPollyClientHandler.java deleted file mode 100644 index f8bc1c44..00000000 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/RollyPollyClientHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.craisinlord.antarchy.fabric.client; - -import com.craisinlord.antarchy.content.entity.RollyPollyEntity; -import com.craisinlord.antarchy.content.network.RollyPollyRollPayload; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; - -public final class RollyPollyClientHandler { - private static boolean wasPressingRoll; - - private RollyPollyClientHandler() { - } - - public static void tick() { - Minecraft mc = Minecraft.getInstance(); - LocalPlayer player = mc.player; - if (player == null || mc.screen != null || !(player.getVehicle() instanceof RollyPollyEntity)) { - wasPressingRoll = false; - return; - } - - boolean pressingRoll = AntarchyKeyBindings.ROLLY_POLLY_ROLL.isDown(); - if (pressingRoll && !wasPressingRoll) { - ClientPlayNetworking.send(new RollyPollyRollPayload()); - } - wasPressingRoll = pressingRoll; - } -} diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamSandMovementMixin.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamSandMovementMixin.java new file mode 100644 index 00000000..66f9f874 --- /dev/null +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamSandMovementMixin.java @@ -0,0 +1,99 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyTags; +import com.craisinlord.antarchy.content.movement.DreamSandLowGravityAccess; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(LivingEntity.class) +public abstract class DreamSandMovementMixin { + @Inject(method = "jumpFromGround", at = @At("TAIL")) + private void antarchy$handleDreamSandJump(CallbackInfo ci) { + LivingEntity self = (LivingEntity) (Object) this; + if (self.level().isClientSide()) return; + + DreamSandLowGravityAccess access = (DreamSandLowGravityAccess) self; + if (!AntarchySettings.dreamSandEnabled() || antarchy$isDreamSandLowGravityBlacklisted(self)) { + access.antarchy$clearDreamSandLowGravity(); + } else if (antarchy$isStandingOnDreamSand(self)) { + self.setDeltaMovement( + self.getDeltaMovement().x, + self.getDeltaMovement().y * AntarchySettings.dreamSandJumpVelocityMultiplier(), + self.getDeltaMovement().z + ); + access.antarchy$setDreamSandLowGravityActive(true); + access.antarchy$setDreamSandLowGravityTicksRemaining((int) Math.max(1L, Math.round(AntarchySettings.dreamSandEffectDurationSeconds() * 20.0D))); + access.antarchy$setDreamSandLandingGraceTicks(0); + } + } + + @Inject(method = "tick", at = @At("TAIL")) + private void antarchy$tickDreamSandLowGravity(CallbackInfo ci) { + LivingEntity self = (LivingEntity) (Object) this; + if (self.level().isClientSide()) return; + + DreamSandLowGravityAccess access = (DreamSandLowGravityAccess) self; + int landingGraceTicks = access.antarchy$getDreamSandLandingGraceTicks(); + if (landingGraceTicks > 0) { + access.antarchy$setDreamSandLandingGraceTicks(landingGraceTicks - 1); + } + + if (!AntarchySettings.dreamSandEnabled() || antarchy$isDreamSandLowGravityBlacklisted(self) || !access.antarchy$isDreamSandLowGravityActive()) { + return; + } + + int remainingTicks = access.antarchy$getDreamSandLowGravityTicksRemaining(); + if (remainingTicks > 0) { + access.antarchy$setDreamSandLowGravityTicksRemaining(remainingTicks - 1); + } + if (access.antarchy$getDreamSandLowGravityTicksRemaining() <= 0) { + access.antarchy$clearDreamSandLowGravity(); + return; + } + + if (antarchy$isOnSolidGround(self)) { + access.antarchy$setDreamSandLowGravityActive(false); + access.antarchy$setDreamSandLowGravityTicksRemaining(0); + access.antarchy$setDreamSandLandingGraceTicks(2); + } else if (!self.onGround() && self.getDeltaMovement().y < 0.0D) { + self.setDeltaMovement( + self.getDeltaMovement().x, + self.getDeltaMovement().y * AntarchySettings.dreamSandGravityMultiplier(), + self.getDeltaMovement().z + ); + } + } + + @Inject(method = "causeFallDamage", at = @At("HEAD"), cancellable = true) + private void antarchy$handleDreamSandFall(float fallDistance, float multiplier, DamageSource source, CallbackInfoReturnable cir) { + LivingEntity self = (LivingEntity) (Object) this; + DreamSandLowGravityAccess access = (DreamSandLowGravityAccess) self; + if (!AntarchySettings.dreamSandEnabled() + || antarchy$isDreamSandLowGravityBlacklisted(self) + || (!access.antarchy$isDreamSandLowGravityActive() && access.antarchy$getDreamSandLandingGraceTicks() <= 0)) { + return; + } + + self.resetFallDistance(); + cir.setReturnValue(false); + } + + private static boolean antarchy$isOnSolidGround(LivingEntity livingEntity) { + return livingEntity.onGround() && livingEntity.getBlockStateOn().blocksMotion(); + } + + private static boolean antarchy$isStandingOnDreamSand(LivingEntity livingEntity) { + return livingEntity.level().getBlockState(livingEntity.getOnPosLegacy()).is(AntarchyFabricBlocks.DREAM_SAND.get()); + } + + private static boolean antarchy$isDreamSandLowGravityBlacklisted(LivingEntity livingEntity) { + return livingEntity.getType().is(AntarchyTags.Entities.DREAM_SAND_LOW_GRAVITY_BLACKLIST); + } +} diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/KeybindingConflictFixMixin.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/KeybindingConflictFixMixin.java new file mode 100644 index 00000000..c9e59b6f --- /dev/null +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/KeybindingConflictFixMixin.java @@ -0,0 +1,68 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.fabric.client.KeybindingConflictFixStore; +import com.mojang.blaze3d.platform.InputConstants; +import java.util.Map; +import net.minecraft.client.KeyMapping; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +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.callback.CallbackInfo; + +@Mixin(KeyMapping.class) +public abstract class KeybindingConflictFixMixin { + @Shadow @Final private static Map MAP; + @Shadow @Final private static Map ALL; + @Shadow private InputConstants.Key key; + @Shadow private boolean isDown; + @Shadow private int clickCount; + + @Inject(method = "(Ljava/lang/String;Lcom/mojang/blaze3d/platform/InputConstants$Type;ILjava/lang/String;)V", at = @At("TAIL")) + private void antarchy$addInitialMapping(String name, InputConstants.Type type, int key, String category, CallbackInfo ci) { + KeybindingConflictFixStore.add(this.key, (KeyMapping) (Object) this); + } + + @Inject(method = "resetMapping", at = @At("TAIL")) + private static void antarchy$rebuildMappings(CallbackInfo ci) { + KeybindingConflictFixStore.clear(); + for (KeyMapping mapping : ALL.values()) { + KeybindingConflictFixStore.add(((KeybindingConflictFixMixin) (Object) mapping).key, mapping); + } + } + + @Inject(method = "click", at = @At("TAIL")) + private static void antarchy$clickConflicts(InputConstants.Key key, CallbackInfo ci) { + if (!AntarchySettings.fabricKeybindingConflictFixEnabled()) { + return; + } + KeyMapping active = MAP.get(key); + for (KeyMapping mapping : KeybindingConflictFixStore.others(key, active)) { + ((KeybindingConflictFixMixin) (Object) mapping).antarchy$click(); + } + } + + @Inject(method = "set", at = @At("TAIL")) + private static void antarchy$setConflicts(InputConstants.Key key, boolean down, CallbackInfo ci) { + if (!AntarchySettings.fabricKeybindingConflictFixEnabled()) { + return; + } + KeyMapping active = MAP.get(key); + for (KeyMapping mapping : KeybindingConflictFixStore.others(key, active)) { + ((KeybindingConflictFixMixin) (Object) mapping).antarchy$setDown(down); + } + } + + @Unique + private void antarchy$click() { + this.clickCount++; + } + + @Unique + private void antarchy$setDown(boolean down) { + this.isDown = down; + } +} diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java index ed500544..0c81b210 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java @@ -88,7 +88,6 @@ public final class AntarchyFabricNetworking { PayloadTypeRegistry.playC2S().register(HerculesBeetleJumpInputPayload.TYPE, HerculesBeetleJumpInputPayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(HerculesBeetleMountedAttackPayload.TYPE, HerculesBeetleMountedAttackPayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(HerculesBeetleMountedChargePayload.TYPE, HerculesBeetleMountedChargePayload.STREAM_CODEC); - PayloadTypeRegistry.playC2S().register(com.craisinlord.antarchy.content.network.RollyPollyRollPayload.TYPE, com.craisinlord.antarchy.content.network.RollyPollyRollPayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(MultipartAttackPayload.TYPE, MultipartAttackPayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(MultipartInteractPayload.TYPE, MultipartInteractPayload.STREAM_CODEC); } @@ -116,8 +115,6 @@ public final class AntarchyFabricNetworking { context.server().execute(() -> handleHerculesBeetleMountedAttack(context.player(), payload))); ServerPlayNetworking.registerGlobalReceiver(HerculesBeetleMountedChargePayload.TYPE, (payload, context) -> context.server().execute(() -> handleHerculesBeetleMountedCharge(context.player(), payload))); - ServerPlayNetworking.registerGlobalReceiver(com.craisinlord.antarchy.content.network.RollyPollyRollPayload.TYPE, (payload, context) -> - context.server().execute(() -> handleRollyPollyRoll(context.player()))); ServerPlayNetworking.registerGlobalReceiver(MultipartAttackPayload.TYPE, (payload, context) -> context.server().execute(() -> handleMultipartAttack(context.player(), payload))); ServerPlayNetworking.registerGlobalReceiver(MultipartInteractPayload.TYPE, (payload, context) -> @@ -397,12 +394,6 @@ public final class AntarchyFabricNetworking { } } - private static void handleRollyPollyRoll(ServerPlayer player) { - if (player.getVehicle() instanceof com.craisinlord.antarchy.content.entity.RollyPollyEntity rollyPolly) { - rollyPolly.handleRollToggle(player); - } - } - public static void triggerHerculesBeetleImpactShake(int durationTicks) { HerculesBeetleImpactShakeClientState.trigger(durationTicks); } diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntities.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntities.java index f93a9ac2..af2c704d 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntities.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntities.java @@ -278,11 +278,11 @@ public final class AntarchyFabricEntities { () -> buildAntType(com.craisinlord.antarchy.content.entity.ant.TermiteEntity::new, MobCategory.CREATURE, "termite")); -// public static final DeferredHolder, EntityType> ROLLY_POLLY = ENTITY_TYPES.register("rolly_polly", -// () -> EntityType.Builder.of(RollyPollyEntity::new, MobCategory.CREATURE) -// .sized(0.95F, 0.85F) -// .clientTrackingRange(10) -// .build("rolly_polly")); + public static final DeferredHolder, EntityType> ROLLY_POLLY = ENTITY_TYPES.register("rolly_polly", + () -> EntityType.Builder.of(RollyPollyEntity::new, MobCategory.CREATURE) + .sized(0.95F, 0.85F) + .clientTrackingRange(10) + .build("rolly_polly")); public static final DeferredHolder, EntityType> MOLEWORM = ENTITY_TYPES.register("moleworm", diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntityAttributes.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntityAttributes.java index eb79d2ce..cd20fd82 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntityAttributes.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntityAttributes.java @@ -303,7 +303,7 @@ public final class AntarchyFabricEntityAttributes { FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.SPIT_BUG.get(), com.craisinlord.antarchy.content.entity.SpitBugEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.MANTIS.get(), MantisEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.ALPHA_MANTIS.get(), AlphaMantisEntity.createAttributes().build()); -// FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.ROLLY_POLLY.get(), RollyPollyEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.ROLLY_POLLY.get(), RollyPollyEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.TRIFFID.get(), TriffidEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.LUCID.get(), LucidEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.SCORPION.get(), ScorpionEntity.createAttributes().build()); diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java index e7f8b303..a10e7dfc 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java @@ -1436,8 +1436,8 @@ public final class AntarchyFabricItems { () -> new DeferredSpawnEggItem(AntarchyFabricEntities.ALPHA_MANTIS, 0x8FDD6C, 0x2F5D22, new Item.Properties())); -// public static final DeferredItem ROLLY_POLLY_SPAWN_EGG = ITEMS.register("rolly_polly_spawn_egg", -// () -> new DeferredSpawnEggItem(AntarchyFabricEntities.ROLLY_POLLY, 0x7284A3, 0xBCC8DB, new Item.Properties())); + public static final DeferredItem ROLLY_POLLY_SPAWN_EGG = ITEMS.register("rolly_polly_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.ROLLY_POLLY, 0x7284A3, 0xBCC8DB, new Item.Properties())); public static final DeferredItem MOLEVORE_SPAWN_EGG = ITEMS.register("molevore_spawn_egg", diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java index 88c3f313..00a1839e 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java @@ -635,6 +635,9 @@ public final class AntarchyFabricSounds { public static final DeferredHolder ROLLY_POLLY_IDLE = registerSoundEvent("rolly_polly_idle"); + public static final DeferredHolder ROLLY_POLLY_WHEEL_MODE = registerSoundEvent("rolly_polly_wheel_mode"); + public static final DeferredHolder ROLLY_POLLY_NORMAL_MODE = registerSoundEvent("rolly_polly_normal_mode"); + public static final DeferredHolder ROLLY_POLLY_ROLL = registerSoundEvent("rolly_polly_roll"); public static final DeferredHolder CREEPING_HORROR_GROWL = registerSoundEvent("creeping_horror_growl"); diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSpawnPlacements.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSpawnPlacements.java index 63916156..3d8245fa 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSpawnPlacements.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSpawnPlacements.java @@ -294,7 +294,7 @@ public final class AntarchyFabricSpawnPlacements { SpawnPlacements.register(AntarchyFabricEntities.CREEPING_HORROR.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.CreepingHorrorEntity::canSpawn); SpawnPlacements.register(AntarchyFabricEntities.LURKING_TERROR.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.LurkingTerrorEntity::canSpawn); SpawnPlacements.register(AntarchyFabricEntities.TERMITE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); -// SpawnPlacements.register(AntarchyFabricEntities.ROLLY_POLLY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.RollyPollyEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.ROLLY_POLLY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.RollyPollyEntity::canSpawn); } } diff --git a/fabric/src/main/resources/antarchy-fabric.mixins.json b/fabric/src/main/resources/antarchy-fabric.mixins.json index 2a161455..acbb192d 100644 --- a/fabric/src/main/resources/antarchy-fabric.mixins.json +++ b/fabric/src/main/resources/antarchy-fabric.mixins.json @@ -14,6 +14,7 @@ "BloodglassEffectMixin", "BloodglassRespawnMixin", "DreamCampfireBlockEntityMixin", + "DreamSandMovementMixin", "JumpyBootsFallDamageMixin", "entity.MultipartEntityLevelRegistryMixin", "WoodTypeInvoker", @@ -24,6 +25,7 @@ "client.DuctTapeInputMixin", "client.AntiwaterFogMixin", "client.GravityGunMouseScrollMixin", + "client.KeybindingConflictFixMixin", "client.CrossbowArmPoseMixin", "client.MultipartClientSpawnMixin", "client.MultipartEntityLevelRegistryMixin" diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java index 36c98bd3..ecc5c49a 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java @@ -124,6 +124,10 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setRollyPollyRollSpeedMultiplier(AntarchyMobsConfig.rollyPollyRollSpeedMultiplier()); AntarchySettings.setRollyPollyTumbleDamage(AntarchyMobsConfig.rollyPollyTumbleDamage()); AntarchySettings.setRollyPollyTameChance(AntarchyMobsConfig.rollyPollyTameChance()); + AntarchySettings.setRollyPollyBowlingDamage(AntarchyMobsConfig.rollyPollyBowlingDamage()); + AntarchySettings.setRollyPollyBowlingKnockback(AntarchyMobsConfig.rollyPollyBowlingKnockback()); + AntarchySettings.setRollyPollyArmor(AntarchyMobsConfig.rollyPollyArmor()); + AntarchySettings.setRollyPollyRolledArmorBonus(AntarchyMobsConfig.rollyPollyRolledArmorBonus()); AntarchySettings.setTriffidHealth(AntarchyMobsConfig.triffidHealth()); AntarchySettings.setTriffidAttackDamage(AntarchyMobsConfig.triffidAttackDamage()); @@ -390,6 +394,8 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setGlowingTorchflowers(AntarchyMiscConfig.glowingTorchflowers()); AntarchySettings.setGlowVinesUnderLeaves(AntarchyMiscConfig.glowVinesUnderLeaves()); AntarchySettings.setSwingThroughGrassEnabled(AntarchyMiscConfig.swingThroughGrassEnabled()); + AntarchySettings.setFabricKeybindingConflictFixEnabled(AntarchyMiscConfig.fabricKeybindingConflictFixEnabled()); + AntarchySettings.setExperimentalSettingsPopupDisabled(AntarchyMiscConfig.experimentalSettingsPopupDisabled()); AntarchySettings.setEntitySpecificFireOverlayEnabled(AntarchyMiscConfig.entitySpecificFireOverlayEnabled()); AntarchySettings.setBloodCrystalArmorShieldRechargeTicks(AntarchyToolsConfig.bloodCrystalArmorShieldRechargeTicks()); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMiscConfig.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMiscConfig.java index 04369feb..aae5a0dc 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMiscConfig.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMiscConfig.java @@ -48,6 +48,8 @@ public final class AntarchyMiscConfig { private static final ModConfigSpec.BooleanValue GLOWING_TORCHFLOWERS; private static final ModConfigSpec.BooleanValue GLOW_VINES_UNDER_LEAVES; private static final ModConfigSpec.BooleanValue SWING_THROUGH_GRASS_ENABLED; + private static final ModConfigSpec.BooleanValue FABRIC_KEYBINDING_CONFLICT_FIX_ENABLED; + private static final ModConfigSpec.BooleanValue EXPERIMENTAL_SETTINGS_POPUP_DISABLED; private static final ModConfigSpec.BooleanValue ENTITY_SPECIFIC_FIRE_OVERLAY_ENABLED; static { @@ -140,6 +142,8 @@ public final class AntarchyMiscConfig { GLOWING_TORCHFLOWERS = b.comment("Whether fully-grown torchflower blocks emit light.") .define("glowingTorchflowers", true); GLOW_VINES_UNDER_LEAVES = b.comment("Whether glow vines can be placed and survive when attached under leaf blocks.") .define("glowVinesUnderLeaves", true); SWING_THROUGH_GRASS_ENABLED = b.comment("If true, empty collision plants like grass do not block melee target picking.") .define("swingThroughGrassEnabled", true); + FABRIC_KEYBINDING_CONFLICT_FIX_ENABLED = b.define("fabricKeybindingConflictFixEnabled", true); + EXPERIMENTAL_SETTINGS_POPUP_DISABLED = b.define("experimentalSettingsPopupDisabled", true); ENTITY_SPECIFIC_FIRE_OVERLAY_ENABLED = b.comment("If true, burning entities use soul fire / dream fire overlays where appropriate.") .define("entitySpecificFireOverlayEnabled", true); b.pop(); @@ -162,6 +166,8 @@ public final class AntarchyMiscConfig { static boolean glowingTorchflowers() { return GLOWING_TORCHFLOWERS.get(); } static boolean glowVinesUnderLeaves() { return GLOW_VINES_UNDER_LEAVES.get(); } static boolean swingThroughGrassEnabled() { return SWING_THROUGH_GRASS_ENABLED.get(); } + static boolean fabricKeybindingConflictFixEnabled() { return FABRIC_KEYBINDING_CONFLICT_FIX_ENABLED.get(); } + static boolean experimentalSettingsPopupDisabled() { return EXPERIMENTAL_SETTINGS_POPUP_DISABLED.get(); } static boolean entitySpecificFireOverlayEnabled() { return ENTITY_SPECIFIC_FIRE_OVERLAY_ENABLED.get(); } static double hushweedSporeLifetimeSeconds() { return HUSHWEED_SPORE_LIFETIME_SECONDS.get(); } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java index f153b6c5..2d66fcba 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java @@ -108,6 +108,10 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue ROLLY_POLLY_ROLL_SPEED_MULTIPLIER; private static final ModConfigSpec.DoubleValue ROLLY_POLLY_TUMBLE_DAMAGE; private static final ModConfigSpec.IntValue ROLLY_POLLY_TAME_CHANCE; + private static final ModConfigSpec.DoubleValue ROLLY_POLLY_BOWLING_DAMAGE; + private static final ModConfigSpec.DoubleValue ROLLY_POLLY_BOWLING_KNOCKBACK; + private static final ModConfigSpec.DoubleValue ROLLY_POLLY_ARMOR; + private static final ModConfigSpec.DoubleValue ROLLY_POLLY_ROLLED_ARMOR_BONUS; // Triffid @@ -414,11 +418,15 @@ public final class AntarchyMobsConfig { // Rolly Polly b.push("rollyPolly"); - ROLLY_POLLY_HEALTH = b.comment("Base max health.") .defineInRange("health", 12.0D, 1.0D, 32768.0D); + 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); - ROLLY_POLLY_ROLL_SPEED_MULTIPLIER = b.comment("Speed multiplier while rolled up and ridden.") .defineInRange("rollSpeedMultiplier", 2.2D, 0.1D, 20.0D); - ROLLY_POLLY_TUMBLE_DAMAGE = b.comment("Damage dealt to a helmetless rider while rolling. 0 disables.") .defineInRange("tumbleDamage", 1.0D, 0.0D, 1024.0D); + ROLLY_POLLY_ROLL_SPEED_MULTIPLIER = b.comment("Speed multiplier while rolled up.") .defineInRange("rollSpeedMultiplier", 2.2D, 0.1D, 20.0D); + ROLLY_POLLY_TUMBLE_DAMAGE = b.comment("Unused (riding removed). Retained for config compatibility.") .defineInRange("tumbleDamage", 1.0D, 0.0D, 1024.0D); ROLLY_POLLY_TAME_CHANCE = b.comment("Taming succeeds with a 1-in-N chance per food item.") .defineInRange("tameChance", 3, 1, 100); + ROLLY_POLLY_BOWLING_DAMAGE = b.comment("Damage dealt by a tamed rolly polly's rolling bowling attack.") .defineInRange("bowlingDamage", 3.0D, 0.0D, 1024.0D); + ROLLY_POLLY_BOWLING_KNOCKBACK = b.comment("Knockback strength of a tamed rolly polly's rolling bowling attack.") .defineInRange("bowlingKnockback", 0.8D, 0.0D, 20.0D); + ROLLY_POLLY_ARMOR = b.comment("Base armor value.") .defineInRange("armor", 2.0D, 0.0D, 100.0D); + ROLLY_POLLY_ROLLED_ARMOR_BONUS = b.comment("Additional armor gained while rolled up.") .defineInRange("rolledArmorBonus", 16.0D, 0.0D, 100.0D); b.pop(); @@ -663,6 +671,10 @@ public final class AntarchyMobsConfig { static double rollyPollyRollSpeedMultiplier() { return ROLLY_POLLY_ROLL_SPEED_MULTIPLIER.get(); } static double rollyPollyTumbleDamage() { return ROLLY_POLLY_TUMBLE_DAMAGE.get(); } static int rollyPollyTameChance() { return ROLLY_POLLY_TAME_CHANCE.get(); } + static double rollyPollyBowlingDamage() { return ROLLY_POLLY_BOWLING_DAMAGE.get(); } + static double rollyPollyBowlingKnockback() { return ROLLY_POLLY_BOWLING_KNOCKBACK.get(); } + static double rollyPollyArmor() { return ROLLY_POLLY_ARMOR.get(); } + static double rollyPollyRolledArmorBonus() { return ROLLY_POLLY_ROLLED_ARMOR_BONUS.get(); } static double triffidHealth() { return TRIFFID_HEALTH.get(); } static double triffidAttackDamage() { return TRIFFID_ATTACK_DAMAGE.get(); } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java index 129ac179..4b3f0739 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java @@ -173,7 +173,10 @@ public class AntarchyNeoforge { AntarchyNeoforgeSounds.JUMPY_BUG_JUMP, AntarchyNeoforgeSounds.SPIT_BUG_HURT, AntarchyNeoforgeSounds.SPIT_BUG_SPIT, - AntarchyNeoforgeSounds.BRUTALFLY_SPIT + AntarchyNeoforgeSounds.BRUTALFLY_SPIT, + AntarchyNeoforgeSounds.ROLLY_POLLY_WHEEL_MODE, + AntarchyNeoforgeSounds.ROLLY_POLLY_NORMAL_MODE, + AntarchyNeoforgeSounds.ROLLY_POLLY_ROLL ); bindCommonObjects(); ScorpionWhipTetherSync.setSink((player, targetId) -> PacketDistributor.sendToPlayersTrackingEntityAndSelf( diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java index fd05a416..5e48ba93 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java @@ -305,7 +305,7 @@ public final class AntarchyToolsConfig { // Battle Axe b.push("battleAxe"); - BATTLE_AXE_ATTACK_DAMAGE = b.comment("Attack damage of the Battle Axe.").defineInRange("attackDamage", 44.0D, 0.0D, 4096.0D); + 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(); @@ -324,7 +324,7 @@ public final class AntarchyToolsConfig { b.pop(); b.push("attitudeAdjuster"); - ATTITUDE_ADJUSTER_BASE_DAMAGE = b.comment("Base attack damage of the Attitude Adjuster.").defineInRange("baseDamage", 40.0D, 0.0D, 4096.0D); + ATTITUDE_ADJUSTER_BASE_DAMAGE = b.comment("Base attack damage of the Attitude Adjuster.").defineInRange("baseDamage", 47.0D, 0.0D, 4096.0D); ATTITUDE_ADJUSTER_BREAKS_BLOCKS = b.comment("If true, player ground slams can break a small patch of blocks on impact.").define("breaksBlocks", true); b.pop(); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyKeyBindings.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyKeyBindings.java index 8560fb9b..a73ff650 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyKeyBindings.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyKeyBindings.java @@ -37,14 +37,6 @@ public final class AntarchyKeyBindings { CATEGORY ); - public static final KeyMapping ROLLY_POLLY_ROLL = new KeyMapping( - "key.antarchy.rolly_polly_roll", - KeyConflictContext.IN_GAME, - InputConstants.Type.KEYSYM, - InputConstants.KEY_R, - CATEGORY - ); - private AntarchyKeyBindings() {} @SubscribeEvent @@ -52,6 +44,5 @@ public final class AntarchyKeyBindings { event.register(BRUTALFLY_FLAP); event.register(DORRIE_CHARGE_JUMP); event.register(HERCULES_BEETLE_CHARGE); - event.register(ROLLY_POLLY_ROLL); } } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java index 606a7889..0fb72b54 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java @@ -139,7 +139,7 @@ public final class AntarchyNeoForgeClient { event.registerEntityRenderer(AntarchyNeoforgeEntites.OURANWOOD_DEER.get(), context -> new com.craisinlord.antarchy.content.client.renderer.OuranwoodDeerRenderer(context)); event.registerEntityRenderer(AntarchyNeoforgeEntites.GLIMMER.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.glimmer.GlimmerRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.ELKA.get(), context -> new com.craisinlord.antarchy.content.client.renderer.ElkaRenderer(context)); -// event.registerEntityRenderer(AntarchyNeoforgeEntites.ROLLY_POLLY.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.RollyPollyRenderer(context))); + event.registerEntityRenderer(AntarchyNeoforgeEntites.ROLLY_POLLY.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.RollyPollyRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.TERMITE.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.TermiteRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.CREEPING_HORROR.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.CreepingHorrorRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.LURKING_TERROR.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.LurkingTerrorRenderer(context))); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/RollyPollyClientHandler.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/RollyPollyClientHandler.java deleted file mode 100644 index e636a92b..00000000 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/RollyPollyClientHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.craisinlord.antarchy.neoforge.client; - -import com.craisinlord.antarchy.Antarchy; -import com.craisinlord.antarchy.content.entity.RollyPollyEntity; -import com.craisinlord.antarchy.content.network.RollyPollyRollPayload; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.ClientTickEvent; -import net.neoforged.neoforge.network.PacketDistributor; - -@EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) -public final class RollyPollyClientHandler { - private static boolean wasPressingRoll; - - private RollyPollyClientHandler() { - } - - @SubscribeEvent - public static void onClientTick(ClientTickEvent.Post event) { - Minecraft mc = Minecraft.getInstance(); - LocalPlayer player = mc.player; - if (player == null || mc.screen != null || !(player.getVehicle() instanceof RollyPollyEntity)) { - wasPressingRoll = false; - return; - } - - boolean pressingRoll = AntarchyKeyBindings.ROLLY_POLLY_ROLL.isDown(); - if (pressingRoll && !wasPressingRoll) { - PacketDistributor.sendToServer(new RollyPollyRollPayload()); - } - wasPressingRoll = pressingRoll; - } -} diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/network/RollyPollyNetworking.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/network/RollyPollyNetworking.java deleted file mode 100644 index 778bee23..00000000 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/network/RollyPollyNetworking.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.craisinlord.antarchy.neoforge.network; - -import com.craisinlord.antarchy.content.entity.RollyPollyEntity; -import com.craisinlord.antarchy.content.network.RollyPollyRollPayload; -import net.minecraft.server.level.ServerPlayer; -import net.neoforged.neoforge.network.handling.IPayloadContext; -import net.neoforged.neoforge.network.registration.PayloadRegistrar; - -public final class RollyPollyNetworking { - private RollyPollyNetworking() { - } - - public static void register(PayloadRegistrar registrar) { - registrar.playToServer( - RollyPollyRollPayload.TYPE, - RollyPollyRollPayload.STREAM_CODEC, - RollyPollyNetworking::handleRollToggle - ); - } - - private static void handleRollToggle(RollyPollyRollPayload payload, IPayloadContext context) { - context.enqueueWork(() -> { - if (!(context.player() instanceof ServerPlayer player)) { - return; - } - if (player.getVehicle() instanceof RollyPollyEntity rollyPolly) { - rollyPolly.handleRollToggle(player); - } - }); - } -} diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java index e4c2bbc2..d280e27b 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java @@ -63,7 +63,7 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.MOLEWORM_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.MANTIS_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.ALPHA_MANTIS_SPAWN_EGG.get()); -// event.accept(AntarchyNeoforgeItems.ROLLY_POLLY_SPAWN_EGG.get()); + event.accept(AntarchyNeoforgeItems.ROLLY_POLLY_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.MOLEVORE_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.TRIFFID_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.APPLE_COW_SPAWN_EGG.get()); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java index 06349069..5908cab6 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java @@ -107,11 +107,11 @@ public final class AntarchyNeoforgeEntites { .sized(4.25F, 3.35F) .clientTrackingRange(10) .build("alpha_mantis")); -// public static final DeferredHolder, EntityType> ROLLY_POLLY = ENTITY_TYPES.register("rolly_polly", -// () -> EntityType.Builder.of(RollyPollyEntity::new, MobCategory.CREATURE) -// .sized(0.95F, 0.85F) -// .clientTrackingRange(10) -// .build("rolly_polly")); + public static final DeferredHolder, EntityType> ROLLY_POLLY = ENTITY_TYPES.register("rolly_polly", + () -> EntityType.Builder.of(RollyPollyEntity::new, MobCategory.CREATURE) + .sized(0.95F, 0.85F) + .clientTrackingRange(10) + .build("rolly_polly")); public static final DeferredHolder, EntityType> OURANWOOD_BOAT_ENTITY = ENTITY_TYPES.register("ouranwood_boat", () -> EntityType.Builder.of(OuranwoodBoatEntity::new, MobCategory.MISC) .sized(1.375F, 0.5625F) diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java index 4b568753..ba13ab9b 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java @@ -46,7 +46,7 @@ public class AntarchyNeoforgeEntityAttributes { AntarchySettings.termiteMovementSpeed(), AntarchySettings.termiteAttackDamage() ).build()); -// event.put(AntarchyNeoforgeEntites.ROLLY_POLLY.get(), RollyPollyEntity.createAttributes().build()); + event.put(AntarchyNeoforgeEntites.ROLLY_POLLY.get(), RollyPollyEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.DR_TRAYAURUS.get(), Villager.createAttributes().build()); event.put(AntarchyNeoforgeEntites.CLOUD_SHARK.get(), CloudSharkEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.KRAKEN.get(), KrakenEntity.createAttributes().build()); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java index a08489e7..404577c3 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java @@ -711,8 +711,8 @@ public final class AntarchyNeoforgeItems { () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MANTIS, 0xF8F8F2, 0x63B44A, new Item.Properties())); public static final DeferredItem ALPHA_MANTIS_SPAWN_EGG = ITEMS.register("alpha_mantis_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.ALPHA_MANTIS, 0x8FDD6C, 0x2F5D22, new Item.Properties().rarity(Rarity.UNCOMMON))); -// public static final DeferredItem ROLLY_POLLY_SPAWN_EGG = ITEMS.register("rolly_polly_spawn_egg", -// () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.ROLLY_POLLY, 0x7284A3, 0xBCC8DB, new Item.Properties())); + public static final DeferredItem ROLLY_POLLY_SPAWN_EGG = ITEMS.register("rolly_polly_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.ROLLY_POLLY, 0x7284A3, 0xBCC8DB, new Item.Properties())); public static final DeferredItem MOLEVORE_SPAWN_EGG = ITEMS.register("molevore_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEVORE, 0x4A4A4A, 0x6B4A2B, new Item.Properties().rarity(Rarity.UNCOMMON))); public static final DeferredItem TRIFFID_SPAWN_EGG = ITEMS.register("triffid_spawn_egg", diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgePayloadHandlers.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgePayloadHandlers.java index 5db65355..c98e10cc 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgePayloadHandlers.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgePayloadHandlers.java @@ -24,7 +24,6 @@ public class AntarchyNeoforgePayloadHandlers { JumpyBootsNetworking.register(registrar); DorrieJumpNetworking.register(registrar); HerculesBeetleNetworking.register(registrar); - com.craisinlord.antarchy.neoforge.network.RollyPollyNetworking.register(registrar); registrar.playToClient( com.craisinlord.antarchy.content.network.BloodglassStatePayload.TYPE, com.craisinlord.antarchy.content.network.BloodglassStatePayload.STREAM_CODEC, diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java index 6c54accf..11675cac 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSounds.java @@ -137,6 +137,9 @@ public final class AntarchyNeoforgeSounds { public static final DeferredHolder STINK_BUG_FART = registerSoundEvent("stink_bug_fart"); public static final DeferredHolder STINK_BUG_IDLE = registerSoundEvent("stink_bug_idle"); public static final DeferredHolder ROLLY_POLLY_IDLE = registerSoundEvent("rolly_polly_idle"); + public static final DeferredHolder ROLLY_POLLY_WHEEL_MODE = registerSoundEvent("rolly_polly_wheel_mode"); + public static final DeferredHolder ROLLY_POLLY_NORMAL_MODE = registerSoundEvent("rolly_polly_normal_mode"); + public static final DeferredHolder ROLLY_POLLY_ROLL = registerSoundEvent("rolly_polly_roll"); public static final DeferredHolder CREEPING_HORROR_GROWL = registerSoundEvent("creeping_horror_growl"); public static final DeferredHolder CREEPING_HORROR_HURT = registerSoundEvent("creeping_horror_hurt"); public static final DeferredHolder CREEPING_HORROR_BITE = registerSoundEvent("creeping_horror_bite"); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSpawnPlacements.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSpawnPlacements.java index 85f1feb2..678491f3 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSpawnPlacements.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSpawnPlacements.java @@ -53,7 +53,7 @@ public class AntarchyNeoforgeSpawnPlacements { event.register(AntarchyNeoforgeEntites.CREEPING_HORROR.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CreepingHorrorEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.LURKING_TERROR.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, LurkingTerrorEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.TERMITE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); -// event.register(AntarchyNeoforgeEntites.ROLLY_POLLY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.RollyPollyEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); + event.register(AntarchyNeoforgeEntites.ROLLY_POLLY.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.RollyPollyEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.CHEEP.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, AbstractFish::checkSurfaceWaterAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.DORRIE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.OURANWOOD_DEER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); diff --git a/neoforge/src/main/resources/data/antarchy/neoforge/biome_modifier/golden_apple_cow_spawns.json b/neoforge/src/main/resources/data/antarchy/neoforge/biome_modifier/golden_apple_cow_spawns.json index bb996235..fae16f0e 100644 --- a/neoforge/src/main/resources/data/antarchy/neoforge/biome_modifier/golden_apple_cow_spawns.json +++ b/neoforge/src/main/resources/data/antarchy/neoforge/biome_modifier/golden_apple_cow_spawns.json @@ -4,7 +4,7 @@ "spawners": [ { "type": "antarchy:golden_apple_cow", - "weight": 3, + "weight": 1, "minCount": 1, "maxCount": 3 }