From c478e560f9e074c722c21d7f9116d4b6b5ec66d6 Mon Sep 17 00:00:00 2001 From: craisinlord Date: Thu, 2 Jul 2026 00:51:53 -0500 Subject: [PATCH] fix sign crash, no more holes in elythia, brutalfly cacoon perf improvements, shake hanlder perf fix, herc beetle improvements, new triffifd texture, new spit bug, new lurking terror --- .../antarchy/config/AntarchySettings.java | 2 +- .../antarchy/content/AntarchyObjects.java | 4 + .../block/BrutalflyCocoonSpawnerBlock.java | 46 ++ .../client/CameraShakeClientState.java | 58 +++ .../content/entity/AppleCowEntity.java | 76 +--- .../antarchy/content/entity/DorrieEntity.java | 6 - .../content/entity/HerculesBeetleEntity.java | 43 +- .../content/entity/StinkBugEntity.java | 17 +- .../content/entity/ToreterrorEntity.java | 12 +- .../entity/brutalfly/BrutalflyEntity.java | 17 +- .../flying_squirrel/FlyingSquirrelEntity.java | 14 +- .../entity/nightmare/NightmareEntity.java | 8 + .../elythia/BrutalflyCocoonFeature.java | 77 +--- .../elythia/OuranwoodCocoonTreeFeature.java | 19 +- .../antarchy/mixins/BlockEntitySignMixin.java | 37 -- .../mixins/BlockEntityTypeSignMixin.java | 76 ++++ .../resources/antarchy-common.mixins.json | 2 +- .../animations/spit_bug.animation.json | 405 +++++++++++++++++- .../animations/stink_bug.animation.json | 3 +- .../animations/triffid.animation.json | 46 +- .../blockstates/brutalfly_cocoon_spawner.json | 7 + .../antarchy/geo/lurking_terror.geo.json | 8 +- .../assets/antarchy/geo/spit_bug.geo.json | 111 +++-- .../block/brutalfly_cocoon_spawner.json | 5 + .../textures/entity/lurking_terror.png | Bin 5684 -> 5045 bytes .../antarchy/textures/entity/scorpion.png | Bin 3082 -> 2395 bytes .../antarchy/textures/entity/spit_bug.png | Bin 13145 -> 9538 bytes .../antarchy/textures/entity/triffid.png | Bin 9969 -> 7207 bytes .../data/antarchy/dimension/elythia.json | 2 +- .../worldgen/biome/elythia_lush_caves.json | 3 +- .../worldgen/biome/elythia_meadow.json | 14 +- .../worldgen/biome/elythia_ocean.json | 9 +- .../worldgen/biome/ouranwood_forest.json | 12 +- .../density_function/elythia_surface.json | 2 +- .../worldgen/noise_settings/elythia.json | 18 +- .../elythia_large_tuff_boulders.json | 2 +- .../placed_feature/elythia_tuff_boulders.json | 2 +- .../fabric/AntarchyFabricContent.java | 15 +- .../antarchy/fabric/OuranwoodWoodTypes.java | 17 + .../fabric/mixin/WoodTypeInvoker.java | 13 + .../fabric/mixin/client/CameraShakeMixin.java | 40 +- .../resources/antarchy-fabric.mixins.json | 2 +- .../antarchy/neoforge/AntarchyNeoforge.java | 1 + .../neoforge/AntarchyToolsConfig.java | 4 +- .../neoforge/client/CameraShakeHandler.java | 38 +- .../client/NightmareCameraShakeHandler.java | 52 --- .../registry/AntarchyNeoforgeBlocks.java | 2 + .../registry/AntarchyNeoforgeItems.java | 4 +- .../AntarchyNeoforgeSpawnPlacements.java | 2 + 49 files changed, 906 insertions(+), 447 deletions(-) create mode 100644 common/src/main/java/com/craisinlord/antarchy/content/block/BrutalflyCocoonSpawnerBlock.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/content/client/CameraShakeClientState.java delete mode 100644 common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntitySignMixin.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntityTypeSignMixin.java create mode 100644 common/src/main/resources/assets/antarchy/blockstates/brutalfly_cocoon_spawner.json create mode 100644 common/src/main/resources/assets/antarchy/models/block/brutalfly_cocoon_spawner.json create mode 100644 fabric/src/main/java/com/craisinlord/antarchy/fabric/OuranwoodWoodTypes.java create mode 100644 fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/WoodTypeInvoker.java delete mode 100644 neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/NightmareCameraShakeHandler.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 4830cb70..9102e4ea 100644 --- a/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java +++ b/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java @@ -145,7 +145,7 @@ public final class AntarchySettings { private static double nightmareSwordBaseDamage = 15.0D; - private static double nightmareSwordScalingFactor = 1.0D; + private static double nightmareSwordScalingFactor = 1.5D; private static boolean basiliskPetrifyingGazeEnabled = true; private static int basiliskSpawnMaxLightLevel = 5; private static double basiliskHealth = 150.0D; diff --git a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java index 64ce3fb2..b139b9da 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java @@ -225,6 +225,8 @@ public final class AntarchyObjects { @SuppressWarnings("unchecked") public static Supplier SQUIRREL_NEST_BLOCK = (Supplier) UNBOUND; @SuppressWarnings("unchecked") + public static Supplier BRUTALFLY_COCOON_SPAWNER = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") public static Supplier> ANT_NEST_BLOCK_ENTITY = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") public static Supplier> DREAM_CAMPFIRE_BLOCK_ENTITY = (Supplier>) UNBOUND; @@ -324,6 +326,7 @@ public final class AntarchyObjects { Supplier waspNest, Supplier hushweed, Supplier squirrelNestBlock, + Supplier brutalflyCocoonSpawner, Supplier> antNestBlockEntity, Supplier> dreamCampfireBlockEntity, Supplier> waspNestBlockEntity, @@ -417,6 +420,7 @@ public final class AntarchyObjects { WASP_NEST = waspNest; HUSHWEED = hushweed; SQUIRREL_NEST_BLOCK = squirrelNestBlock; + BRUTALFLY_COCOON_SPAWNER = brutalflyCocoonSpawner; ANT_NEST_BLOCK_ENTITY = antNestBlockEntity; DREAM_CAMPFIRE_BLOCK_ENTITY = dreamCampfireBlockEntity; WASP_NEST_BLOCK_ENTITY = waspNestBlockEntity; diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/BrutalflyCocoonSpawnerBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/BrutalflyCocoonSpawnerBlock.java new file mode 100644 index 00000000..75d35d4b --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/BrutalflyCocoonSpawnerBlock.java @@ -0,0 +1,46 @@ +package com.craisinlord.antarchy.content.block; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; + +public class BrutalflyCocoonSpawnerBlock extends Block { + + public BrutalflyCocoonSpawnerBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Override + protected RenderShape getRenderShape(BlockState state) { + return RenderShape.INVISIBLE; + } + + @Override + protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + level.setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL); + + BrutalflyEntity brutalfly = AntarchyObjects.BRUTALFLY.get().create(level); + if (brutalfly == null) { + return; + } + + BlockPos anchor = pos.above(); + brutalfly.moveTo( + anchor.getX() + 0.5D, + anchor.getY() - 1.5D, + anchor.getZ() + 0.5D, + random.nextFloat() * 360.0F, + 0.0F + ); + brutalfly.setCocooned(true, anchor); + brutalfly.setHealth(brutalfly.getMaxHealth()); + level.addFreshEntity(brutalfly); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/CameraShakeClientState.java b/common/src/main/java/com/craisinlord/antarchy/content/client/CameraShakeClientState.java new file mode 100644 index 00000000..4cd02941 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/CameraShakeClientState.java @@ -0,0 +1,58 @@ +package com.craisinlord.antarchy.content.client; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.function.BooleanSupplier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.Vec3; + +public final class CameraShakeClientState { + public static final double TORETERROR_RANGE = 48.0D; + public static final float TORETERROR_STRENGTH = 1.0F; + public static final double NIGHTMARE_RANGE = 32.0D; + public static final float NIGHTMARE_STRENGTH = 1.35F; + + private record Source(double range, float strength, BooleanSupplier active) { + } + + private static final Map SOURCES = new HashMap<>(); + + private CameraShakeClientState() { + } + + public static void register(LivingEntity entity, double range, float strength, BooleanSupplier active) { + SOURCES.putIfAbsent(entity, new Source(range, strength, active)); + } + + public static float getStrength(Vec3 cameraPos) { + if (SOURCES.isEmpty()) { + return 0.0F; + } + + float total = 0.0F; + Iterator> iterator = SOURCES.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + LivingEntity entity = entry.getKey(); + Source source = entry.getValue(); + if (entity.isRemoved() || !entity.isAlive() || !source.active().getAsBoolean()) { + iterator.remove(); + continue; + } + + double distance = Math.sqrt(cameraPos.distanceToSqr(entity.position().add(0.0D, entity.getBbHeight() * 0.5D, 0.0D))); + if (distance > source.range()) { + continue; + } + + total += (float) ((1.0D - distance / source.range()) * source.strength()); + } + + return total; + } + + public static void clear() { + SOURCES.clear(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/AppleCowEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/AppleCowEntity.java index 13ddc3d6..301f1961 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/AppleCowEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/AppleCowEntity.java @@ -13,7 +13,6 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.Shearable; -import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.entity.player.Player; @@ -21,7 +20,6 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -47,7 +45,7 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable private static final String NAP_COOLDOWN_KEY = "NapCooldown"; private static final String QUIRK_TICKS_KEY = "QuirkTicks"; private static final String SHEARED_KEY = "Sheared"; - private static final String GRASS_EAT_TICKS_KEY = "GrassEatTicks"; + private static final String REGROW_TICKS_KEY = "RegrowTicks"; private static final String MAIN_CONTROLLER = "main_controller"; private static final String SLEEP_TRANSITION_CONTROLLER = "sleep_transition_controller"; private static final String START_SLEEP_TRIGGER = "start_sleep"; @@ -60,7 +58,7 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable private static final int DAY_NAP_MAX_TICKS = 20 * 60 * 2; private static final int DAY_NAP_COOLDOWN_TICKS = 20 * 60 * 10; private static final int NIGHT_NAP_COOLDOWN_TICKS = 20 * 60 * 8; - private static final int GRASS_REGROW_TICKS = 20 * 60 * 3; + private static final int APPLE_REGROW_TICKS = 20 * 60 * 3; private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk"); private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle"); @@ -73,7 +71,7 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable private int sleepTicksRemaining; private int napCooldownTicks; private int idleAnimationCycleTicks; - private int grassEatTicks; + private int regrowTicks; protected AppleCowEntity(EntityType entityType, Level level) { super(entityType, level); @@ -92,7 +90,6 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new AppleCowSleepGoal()); - this.goalSelector.addGoal(1, new AppleCowGrazeGoal()); } @Override @@ -148,8 +145,12 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable return; } - if (!this.isSheared()) { - this.grassEatTicks = 0; + if (this.isSheared()) { + this.regrowTicks++; + if (this.regrowTicks >= APPLE_REGROW_TICKS) { + this.setSheared(false); + this.regrowTicks = 0; + } } if (this.shouldStartNap()) { @@ -190,7 +191,7 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable tag.putInt(NAP_COOLDOWN_KEY, this.napCooldownTicks); tag.putInt(QUIRK_TICKS_KEY, this.getQuirkTicks()); tag.putBoolean(SHEARED_KEY, this.isSheared()); - tag.putInt(GRASS_EAT_TICKS_KEY, this.grassEatTicks); + tag.putInt(REGROW_TICKS_KEY, this.regrowTicks); } @Override @@ -201,7 +202,7 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable this.napCooldownTicks = tag.contains(NAP_COOLDOWN_KEY) ? tag.getInt(NAP_COOLDOWN_KEY) : randomNapCooldown(); this.setQuirkTicks(tag.getInt(QUIRK_TICKS_KEY)); this.setSheared(tag.getBoolean(SHEARED_KEY)); - this.grassEatTicks = tag.getInt(GRASS_EAT_TICKS_KEY); + this.regrowTicks = tag.getInt(REGROW_TICKS_KEY); } public boolean isSleeping() { @@ -346,7 +347,7 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable } this.setSheared(true); - this.grassEatTicks = 0; + this.regrowTicks = 0; this.stopCowSleeping(); this.playSound(SoundEvents.SHEEP_SHEAR, 1.0F, 1.0F); this.spawnAtLocation(new ItemStack(this.shearDropItem(), 2), this.getBbHeight() * 0.66F); @@ -389,57 +390,4 @@ public abstract class AppleCowEntity extends Cow implements GeoEntity, Shearable AppleCowEntity.this.applySleepStillness(); } } - - private final class AppleCowGrazeGoal extends Goal { - private AppleCowGrazeGoal() { - this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); - } - - @Override - public boolean canUse() { - return AppleCowEntity.this.isSheared() - && AppleCowEntity.this.isOnGrassBlock() - && AppleCowEntity.this.isEligibleForSleep() - && AppleCowEntity.this.random.nextInt(20) == 0; - } - - @Override - public boolean canContinueToUse() { - return AppleCowEntity.this.isSheared() - && AppleCowEntity.this.isOnGrassBlock() - && AppleCowEntity.this.grassEatTicks < GRASS_REGROW_TICKS; - } - - @Override - public void start() { - AppleCowEntity.this.getNavigation().stop(); - } - - @Override - public void tick() { - AppleCowEntity.this.getNavigation().stop(); - if (!AppleCowEntity.this.level().isClientSide && AppleCowEntity.this.isSheared() && AppleCowEntity.this.isOnGrassBlock()) { - AppleCowEntity.this.grassEatTicks++; - if (AppleCowEntity.this.grassEatTicks >= GRASS_REGROW_TICKS) { - AppleCowEntity.this.setSheared(false); - AppleCowEntity.this.grassEatTicks = 0; - AppleCowEntity.this.playSound(SoundEvents.GENERIC_EAT, 0.7F, 1.0F + AppleCowEntity.this.random.nextFloat() * 0.2F); - } else if (AppleCowEntity.this.grassEatTicks % 40 == 0) { - AppleCowEntity.this.playSound(SoundEvents.GENERIC_EAT, 0.4F, 1.0F + AppleCowEntity.this.random.nextFloat() * 0.15F); - } - } - } - - @Override - public void stop() { - if (!AppleCowEntity.this.isSheared()) { - AppleCowEntity.this.grassEatTicks = 0; - } - } - } - - private boolean isOnGrassBlock() { - BlockPos below = this.blockPosition().below(); - return this.level().getBlockState(below).is(Blocks.GRASS_BLOCK); - } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/DorrieEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/DorrieEntity.java index 821d7bd9..8fa42815 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/DorrieEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/DorrieEntity.java @@ -275,9 +275,6 @@ public class DorrieEntity extends Animal implements GeoEntity { setJumpCharge((int) ((chargeTicks / (float) MAX_CHARGE_TICKS) * 100)); } - // Surface buoyancy: when in water and not mid-leap, push toward the waterline. - // Stronger upward force when fully submerged, gentle when at the surface so - // Dorrie glides on top rather than diving or bouncing. if (this.isInWater() && !isLeaping) { Vec3 mov = this.getDeltaMovement(); double push = this.isUnderWater() ? 0.07D : 0.015D; @@ -311,9 +308,6 @@ public class DorrieEntity extends Animal implements GeoEntity { if (power > 0.05F) { Vec3 look = this.getLookAngle(); Vec3 current = this.getDeltaMovement(); - // Add to existing momentum — no direction snap. The rider already has - // forward speed, so the jump just launches them upward and slightly - // accelerates in the direction they're already facing. double forwardAdd = power * 0.5D; double vertical = 0.55D + power * 0.9D; this.setDeltaMovement( 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 4cc98fb1..9c0bffee 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 @@ -142,8 +142,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl private static final double FLY_ATTACK_RANGE = 5.5D; private static final double CHARGE_TRIGGER_RANGE = 12.0D; private static final int MAX_BROKEN_BLOCKS = 32; + private static final int MAX_SUFFOCATION_BLOCKS = 12; private static final EntityDimensions DEFAULT_DIMENSIONS = EntityDimensions.scalable(3.0F, 4.0F); - private static final double MOUNTED_FLYING_SPEED_MULTIPLIER = 0.14D; + private static final double MOUNTED_FLYING_SPEED_MULTIPLIER = 0.06D; private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); private final ServerBossEvent bossEvent = @@ -314,6 +315,10 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl this.flightCooldown--; } + if (!this.level().isClientSide && !this.isKnockedDown() && this.isInWall()) { + this.breakBlocksForSuffocation(); + } + if (this.isKnockedDown()) { this.tickKnockedDown(); } else if (this.chargeTicksRemaining > 0 || this.getAnimationState() == ANIM_CHARGE) { @@ -469,6 +474,10 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl this.setAnimationState(ANIM_FLY); return; } + if (!this.onGround()) { + this.setAnimationState(ANIM_FLY); + return; + } if (this.getControllingPassenger() instanceof Player rider && (Math.abs(rider.zza) > 0.05F || Math.abs(rider.xxa) > 0.05F)) { this.setAnimationState(ANIM_WALK); @@ -482,7 +491,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl @Override protected Vec3 getRiddenInput(Player player, Vec3 travelVector) { if (!this.isFlying()) { - return new Vec3(player.xxa * 0.35D, 0.0D, player.zza); + return new Vec3(player.xxa * 0.22D, 0.0D, player.zza); } double vertical = 0.0D; @@ -495,7 +504,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl vertical -= 0.16D; } - return new Vec3(player.xxa * 0.35D, vertical, player.zza); + return new Vec3(player.xxa * 0.22D, vertical, player.zza); } @Override @@ -873,6 +882,34 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl } } + private void breakBlocksForSuffocation() { + if (!(this.level() instanceof ServerLevel serverLevel) || !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + return; + } + + AABB box = this.getBoundingBox().inflate(0.15D, 0.15D, 0.15D); + int broken = 0; + for (BlockPos pos : BlockPos.betweenClosed( + BlockPos.containing(box.minX, box.minY, box.minZ), + BlockPos.containing(box.maxX, box.maxY, box.maxZ) + )) { + if (broken >= MAX_SUFFOCATION_BLOCKS) { + break; + } + BlockState state = serverLevel.getBlockState(pos); + BlockEntity blockEntity = serverLevel.getBlockEntity(pos); + if (state.isAir() + || state.is(AntarchyTags.Blocks.HERCULES_BEETLE_CHARGE_IMMUNE_BLOCKS) + || blockEntity != null + || state.getDestroySpeed(serverLevel, pos) < 0.0F) { + continue; + } + if (serverLevel.destroyBlock(pos, true, this)) { + broken++; + } + } + } + private boolean blocksChargePath(Vec3 nextPosition) { if (!(this.level() instanceof ServerLevel serverLevel)) { return false; 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 4bf9242e..d54e175e 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 @@ -34,10 +34,14 @@ import software.bernie.geckolib.animation.RawAnimation; import software.bernie.geckolib.util.GeckoLibUtil; public class StinkBugEntity extends Animal implements GeoEntity { + private static final String MAIN_CONTROLLER = "main_controller"; + private static final String FART_CONTROLLER = "fart_controller"; + private static final String FART_TRIGGER = "fart"; private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle"); private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk"); private static final RawAnimation FART_ANIM = RawAnimation.begin().thenPlay("fart"); private static final int FART_ANIMATION_TICKS = 30; + private static final int FART_RELEASE_TICKS = 6; private static final int STINK_BURST_PARTICLES = 32; private static final double STINK_BURST_RADIUS = 8.0D; private static final int STINK_BURST_DURATION_TICKS = 1200; @@ -81,7 +85,7 @@ public class StinkBugEntity extends Animal implements GeoEntity { if (this.fartAnimationTicks > 0) { this.fartAnimationTicks--; - if (this.fartAnimationTicks == 0 && this.pendingFartBurst && !this.level().isClientSide()) { + if (this.fartAnimationTicks == FART_RELEASE_TICKS && this.pendingFartBurst && !this.level().isClientSide()) { StinkyBehavior.emitBurst(this, STINK_BURST_PARTICLES); StinkyBehavior.applyBurstStinkyEffect(this, STINK_BURST_RADIUS, STINK_BURST_DURATION_TICKS); this.pendingFartBurst = false; @@ -112,7 +116,9 @@ public class StinkBugEntity extends Animal implements GeoEntity { @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { - controllers.add(new AnimationController<>(this, "main_controller", 2, this::mainAnimController)); + controllers.add(new AnimationController<>(this, MAIN_CONTROLLER, 2, this::mainAnimController)); + controllers.add(new AnimationController<>(this, FART_CONTROLLER, 0, state -> PlayState.STOP) + .triggerableAnim(FART_TRIGGER, FART_ANIM)); } @Override @@ -121,15 +127,14 @@ public class StinkBugEntity extends Animal implements GeoEntity { } private PlayState mainAnimController(AnimationState animationState) { - if (this.fartAnimationTicks > 0) { - animationState.setAnimation(FART_ANIM); - return PlayState.CONTINUE; - } animationState.setAnimation(animationState.isMoving() ? WALK_ANIM : IDLE_ANIM); return PlayState.CONTINUE; } private void triggerFartAnimation() { this.fartAnimationTicks = FART_ANIMATION_TICKS; + if (!this.level().isClientSide()) { + this.triggerAnim(FART_CONTROLLER, FART_TRIGGER); + } } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/ToreterrorEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/ToreterrorEntity.java index ce093a57..19138391 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/ToreterrorEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/ToreterrorEntity.java @@ -207,7 +207,17 @@ public class ToreterrorEntity extends Monster implements GeoEntity { @Override public void tick() { super.tick(); - if (this.level().isClientSide) return; + if (this.level().isClientSide) { + if (this.isJumpShaking()) { + com.craisinlord.antarchy.content.client.CameraShakeClientState.register( + this, + com.craisinlord.antarchy.content.client.CameraShakeClientState.TORETERROR_RANGE, + com.craisinlord.antarchy.content.client.CameraShakeClientState.TORETERROR_STRENGTH, + this::isJumpShaking + ); + } + return; + } if (this.shootCooldown > 0) this.shootCooldown--; if (this.jumpCooldown > 0) this.jumpCooldown--; diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java index ceab548f..295ede68 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/brutalfly/BrutalflyEntity.java @@ -83,6 +83,7 @@ public class BrutalflyEntity extends Monster implements GeoEntity { private static final int SWIPE_TICKS = 18; private static final float SWIPE_KNOCKBACK = 2.8F; private static final int COCOON_HIT_THRESHOLD = 3; + private static final int COCOON_HIT_COOLDOWN_TICKS = 60; private static final int COCOON_HIT_ANIM_TICKS = 30; private static final int COCOON_HATCH_ANIM_TICKS = 40; private static final int COCOON_IDLE_ANIM_TICKS = 70; @@ -111,6 +112,7 @@ public class BrutalflyEntity extends Monster implements GeoEntity { @Nullable BlockPos anchorPos; private int cocoonHits; + private int cocoonHitCooldownTicks; private boolean isHatching; private int cocoonAnimTicks; private boolean pendingHatchAnim; @@ -261,6 +263,10 @@ public class BrutalflyEntity extends Monster implements GeoEntity { } private void tickCocoon() { + if (this.cocoonHitCooldownTicks > 0) { + this.cocoonHitCooldownTicks--; + } + // Pin position to hang from anchor if (this.anchorPos != null) { this.setPos(this.anchorPos.getX() + 0.5, this.anchorPos.getY() - 1.5, this.anchorPos.getZ() + 0.5); @@ -319,6 +325,8 @@ public class BrutalflyEntity extends Monster implements GeoEntity { this.entityData.set(IS_COCOONED, false); this.isHatching = false; this.anchorPos = null; + this.cocoonHits = 0; + this.cocoonHitCooldownTicks = 0; this.refreshDimensions(); this.setAnimationState(ANIM_FLY); Player nearbyPlayer = this.level().getNearestPlayer(this, 48.0D); @@ -344,6 +352,10 @@ public class BrutalflyEntity extends Monster implements GeoEntity { this.anchorPos = anchor; this.refreshDimensions(); if (cocooned) { + this.cocoonHits = 0; + this.cocoonHitCooldownTicks = 0; + this.isHatching = false; + this.pendingHatchAnim = false; this.setAnimationState(ANIM_COCOON); } } @@ -355,9 +367,10 @@ public class BrutalflyEntity extends Monster implements GeoEntity { } if (this.isCocooned() && !this.isHatching) { - if (this.level().isClientSide || this.hurtTime > 0) return false; + if (this.level().isClientSide || this.cocoonHitCooldownTicks > 0) return false; this.hurtTime = this.hurtDuration; this.cocoonHits++; + this.cocoonHitCooldownTicks = COCOON_HIT_COOLDOWN_TICKS; if (this.cocoonHits >= COCOON_HIT_THRESHOLD) { this.startHatching(); } else { @@ -706,6 +719,7 @@ public class BrutalflyEntity extends Monster implements GeoEntity { super.addAdditionalSaveData(tag); tag.putBoolean("IsCocooned", this.isCocooned()); tag.putInt("CocoonHits", this.cocoonHits); + tag.putInt("CocoonHitCooldown", this.cocoonHitCooldownTicks); if (this.anchorPos != null) { tag.putInt("AnchorX", this.anchorPos.getX()); tag.putInt("AnchorY", this.anchorPos.getY()); @@ -723,6 +737,7 @@ public class BrutalflyEntity extends Monster implements GeoEntity { } this.setCocooned(true, anchor); this.cocoonHits = tag.getInt("CocoonHits"); + this.cocoonHitCooldownTicks = tag.getInt("CocoonHitCooldown"); } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/flying_squirrel/FlyingSquirrelEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/flying_squirrel/FlyingSquirrelEntity.java index 4bde8a0f..1c7dcc9f 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/flying_squirrel/FlyingSquirrelEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/flying_squirrel/FlyingSquirrelEntity.java @@ -1137,11 +1137,16 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity { } public void collectNut(ItemEntity itemEntity) { + ItemStack itemStack = itemEntity.getItem(); + if (itemStack.isEmpty()) { + itemEntity.discard(); + return; + } + this.startPickupAnimation(); - ItemStack particleStack = itemEntity.getItem().copy(); + ItemStack particleStack = itemStack.copy(); particleStack.setCount(1); - ItemStack itemStack = itemEntity.getItem(); itemStack.shrink(1); if (itemStack.isEmpty()) { itemEntity.discard(); @@ -1667,6 +1672,11 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity { @Override public void tick() { if (this.targetNut != null) { + if (!this.targetNut.isAlive() || this.targetNut.getItem().isEmpty()) { + this.targetNut = null; + return; + } + FlyingSquirrelEntity.this.getLookControl().setLookAt(this.targetNut, 30.0F, 30.0F); if (--this.repathDelay <= 0 && !FlyingSquirrelEntity.this.isGliding()) { diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java index 6eaef628..cf8808fb 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/nightmare/NightmareEntity.java @@ -216,6 +216,14 @@ public class NightmareEntity extends Monster implements GeoEntity { if (this.level().isClientSide) { this.tickClientParticles(); this.updateFlightRotation(); + if (this.isRoaring()) { + com.craisinlord.antarchy.content.client.CameraShakeClientState.register( + this, + com.craisinlord.antarchy.content.client.CameraShakeClientState.NIGHTMARE_RANGE, + com.craisinlord.antarchy.content.client.CameraShakeClientState.NIGHTMARE_STRENGTH, + this::isRoaring + ); + } return; } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/BrutalflyCocoonFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/BrutalflyCocoonFeature.java index e68f0827..bb0aa81c 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/BrutalflyCocoonFeature.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/BrutalflyCocoonFeature.java @@ -1,25 +1,20 @@ package com.craisinlord.antarchy.content.worldgen.elythia; import com.craisinlord.antarchy.content.AntarchyObjects; -import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyEntity; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.WorldGenRegion; import net.minecraft.tags.BlockTags; 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.Heightmap; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class BrutalflyCocoonFeature extends Feature { - private static final Logger LOGGER = LoggerFactory.getLogger(BrutalflyCocoonFeature.class); private static final int MAX_ANCHOR_Y = 160; private static final int COCOON_CLEAR_RADIUS = 1; private static final int COCOON_CLEAR_MIN_Y_OFFSET = -16; @@ -33,22 +28,11 @@ public class BrutalflyCocoonFeature extends Feature { @Override public boolean place(FeaturePlaceContext context) { WorldGenLevel level = context.level(); - ServerLevel serverLevel; - if (level instanceof WorldGenRegion region) { - serverLevel = region.getLevel(); - } else if (level instanceof ServerLevel sl) { - serverLevel = sl; - } else { - return false; - } - RandomSource random = context.random(); BlockPos origin = context.origin(); int chunkX = origin.getX() & ~15; int chunkZ = origin.getZ() & ~15; BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); - int failNoLog = 0; - int failClearBelow = 0; for (int attempt = 0; attempt < 12; attempt++) { int x = chunkX + 1 + random.nextInt(14); @@ -59,49 +43,21 @@ public class BrutalflyCocoonFeature extends Feature { } int searchTopY = Math.min(MAX_ANCHOR_Y, level.getMaxBuildHeight() - 2); - boolean foundLog = false; for (int y = searchTopY; y > groundY + 12; y--) { pos.set(x, y, z); if (!level.getBlockState(pos).is(BlockTags.LOGS)) { continue; } - foundLog = true; BlockPos anchor = pos.immutable(); - BlockPos blocker = findCocoonBlocker(level, anchor); - if (blocker != null) { - failClearBelow++; - LOGGER.info( - "[BrutalflyCocoon] chamber failed at log ({},{},{}) blocked by {} ({}) at {}", - x, - y, - z, - level.getBlockState(blocker), - level.getBlockState(blocker).getBlock(), - blocker - ); + if (findCocoonBlocker(level, anchor) != null) { continue; } - if (spawnCocoonedBrutalfly(serverLevel, level, anchor, random)) { - LOGGER.info("[BrutalflyCocoon] SUCCESS at ({},{},{})", x, y, z); - return true; - } - return false; - } - - if (!foundLog) { - failNoLog++; + return placeCocoonSpawner(level, anchor); } } - LOGGER.info( - "[BrutalflyCocoon] FAILED for chunk ({},{}): no-log={}, chamber={}", - chunkX >> 4, - chunkZ >> 4, - failNoLog, - failClearBelow - ); return false; } @@ -113,30 +69,23 @@ public class BrutalflyCocoonFeature extends Feature { return findCocoonBlocker(level, anchor) == null; } - static boolean spawnCocoonedBrutalfly(ServerLevel serverLevel, WorldGenLevel level, BlockPos anchor, RandomSource random) { + static boolean placeCocoonSpawner(WorldGenLevel level, BlockPos anchor) { if (!canUseAnchor(level, anchor)) { return false; } clearCocoonVolume(level, anchor); - BrutalflyEntity brutalfly = AntarchyObjects.BRUTALFLY.get().create(serverLevel); - if (brutalfly == null) { - return false; - } - - brutalfly.moveTo( - anchor.getX() + 0.5, - anchor.getY() - 15.0, - anchor.getZ() + 0.5, - random.nextFloat() * 360.0F, - 0.0F - ); - brutalfly.setCocooned(true, anchor); - brutalfly.setHealth(brutalfly.getMaxHealth()); - serverLevel.addFreshEntity(brutalfly); + setCocoonSpawnerMarker(level, anchor); return true; } + static void setCocoonSpawnerMarker(WorldGenLevel level, BlockPos anchor) { + Block marker = AntarchyObjects.BRUTALFLY_COCOON_SPAWNER.get(); + BlockPos markerPos = anchor.below(); + level.setBlock(markerPos, marker.defaultBlockState(), 19); + level.scheduleTick(markerPos, marker, 20); + } + static @org.jetbrains.annotations.Nullable BlockPos findCocoonBlocker(WorldGenLevel level, BlockPos anchor) { if (!hasCanopySupport(level, anchor)) { return anchor; @@ -173,7 +122,7 @@ public class BrutalflyCocoonFeature extends Feature { } pos.set(anchor.getX() + dx, worldY, anchor.getZ() + dz); - level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); + level.setBlock(pos, Blocks.AIR.defaultBlockState(), 19); } } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/OuranwoodCocoonTreeFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/OuranwoodCocoonTreeFeature.java index 7fca2748..942edd7e 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/OuranwoodCocoonTreeFeature.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/OuranwoodCocoonTreeFeature.java @@ -1,11 +1,8 @@ package com.craisinlord.antarchy.content.worldgen.elythia; -import com.craisinlord.antarchy.content.AntarchyObjects; -import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyEntity; import com.mojang.serialization.Codec; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; @@ -19,16 +16,14 @@ public class OuranwoodCocoonTreeFeature extends OuranwoodTreeFeature { @Override public boolean place(FeaturePlaceContext context) { if (!super.place(context)) return false; - spawnGuaranteedCocoon(context.level(), context.origin(), context.config(), context.random()); + placeGuaranteedCocoon(context.level(), context.origin(), context.config(), context.random()); return true; } - private void spawnGuaranteedCocoon(WorldGenLevel level, BlockPos origin, OuranwoodTreeConfiguration config, RandomSource random) { - if (!(level.getLevel() instanceof ServerLevel serverLevel)) return; - + private void placeGuaranteedCocoon(WorldGenLevel level, BlockPos origin, OuranwoodTreeConfiguration config, RandomSource random) { Direction dir = Direction.Plane.HORIZONTAL.getRandomDirection(random); int branchY = 10 + random.nextInt(8); - int branchLength = 4 + random.nextInt(3); // 4–6 logs out from the trunk + int branchLength = 4 + random.nextInt(3); for (int i = 1; i <= branchLength; i++) { BlockPos p = origin.above(branchY).relative(dir, i); @@ -37,12 +32,6 @@ public class OuranwoodCocoonTreeFeature extends OuranwoodTreeFeature { BlockPos anchor = origin.above(branchY).relative(dir, branchLength); BrutalflyCocoonFeature.clearCocoonVolume(level, anchor); - BrutalflyEntity brutalfly = AntarchyObjects.BRUTALFLY.get().create(serverLevel); - if (brutalfly == null) return; - brutalfly.moveTo(anchor.getX() + 0.5, anchor.getY() - 15.0, anchor.getZ() + 0.5, - random.nextFloat() * 360.0F, 0.0F); - brutalfly.setCocooned(true, anchor); - brutalfly.setHealth(brutalfly.getMaxHealth()); - serverLevel.addFreshEntity(brutalfly); + BrutalflyCocoonFeature.setCocoonSpawnerMarker(level, anchor); } } diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntitySignMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntitySignMixin.java deleted file mode 100644 index 141359d5..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntitySignMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.craisinlord.antarchy.mixins; - -import com.craisinlord.antarchy.Antarchy; -import java.util.Optional; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.state.BlockState; -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(net.minecraft.world.level.block.entity.BlockEntity.class) -public abstract class BlockEntitySignMixin { - private static final ResourceLocation OURANWOOD_SIGN_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "ouranwood_sign"); - private static final ResourceLocation OURANWOOD_WALL_SIGN_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "ouranwood_wall_sign"); - private static final ResourceLocation OURANWOOD_HANGING_SIGN_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "ouranwood_hanging_sign"); - private static final ResourceLocation OURANWOOD_WALL_HANGING_SIGN_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "ouranwood_wall_hanging_sign"); - - @Inject(method = "validateBlockState", at = @At("HEAD"), cancellable = true) - private static void antarchy$skipOuranwoodSignValidation(BlockState state, CallbackInfo ci) { - if (isOuranwoodSign(state)) { - ci.cancel(); - } - } - - private static boolean isOuranwoodSign(BlockState state) { - return matches(state, OURANWOOD_SIGN_ID) - || matches(state, OURANWOOD_WALL_SIGN_ID) - || matches(state, OURANWOOD_HANGING_SIGN_ID) - || matches(state, OURANWOOD_WALL_HANGING_SIGN_ID); - } - - private static boolean matches(BlockState state, ResourceLocation id) { - return BuiltInRegistries.BLOCK.getOptional(id).map(state::is).orElse(false); - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntityTypeSignMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntityTypeSignMixin.java new file mode 100644 index 00000000..de6f8f78 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntityTypeSignMixin.java @@ -0,0 +1,76 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BlockEntityType.class) +public abstract class BlockEntityTypeSignMixin { + @Unique + private static Block antarchy$ouranwoodSign; + @Unique + private static Block antarchy$ouranwoodWallSign; + @Unique + private static Block antarchy$ouranwoodHangingSign; + @Unique + private static Block antarchy$ouranwoodWallHangingSign; + + @Inject(method = "isValid", at = @At("HEAD"), cancellable = true) + private void antarchy$allowOuranwoodSigns(BlockState state, CallbackInfoReturnable cir) { + Object self = this; + if (self == BlockEntityType.SIGN) { + if (state.is(antarchy$sign()) || state.is(antarchy$wallSign())) { + cir.setReturnValue(true); + } + } else if (self == BlockEntityType.HANGING_SIGN) { + if (state.is(antarchy$hangingSign()) || state.is(antarchy$wallHangingSign())) { + cir.setReturnValue(true); + } + } + } + + @Unique + private static Block antarchy$sign() { + if (antarchy$ouranwoodSign == null) { + antarchy$ouranwoodSign = antarchy$resolve("ouranwood_sign"); + } + return antarchy$ouranwoodSign; + } + + @Unique + private static Block antarchy$wallSign() { + if (antarchy$ouranwoodWallSign == null) { + antarchy$ouranwoodWallSign = antarchy$resolve("ouranwood_wall_sign"); + } + return antarchy$ouranwoodWallSign; + } + + @Unique + private static Block antarchy$hangingSign() { + if (antarchy$ouranwoodHangingSign == null) { + antarchy$ouranwoodHangingSign = antarchy$resolve("ouranwood_hanging_sign"); + } + return antarchy$ouranwoodHangingSign; + } + + @Unique + private static Block antarchy$wallHangingSign() { + if (antarchy$ouranwoodWallHangingSign == null) { + antarchy$ouranwoodWallHangingSign = antarchy$resolve("ouranwood_wall_hanging_sign"); + } + return antarchy$ouranwoodWallHangingSign; + } + + @Unique + private static Block antarchy$resolve(String path) { + return BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path)); + } +} diff --git a/common/src/main/resources/antarchy-common.mixins.json b/common/src/main/resources/antarchy-common.mixins.json index 24677f3c..e738a860 100644 --- a/common/src/main/resources/antarchy-common.mixins.json +++ b/common/src/main/resources/antarchy-common.mixins.json @@ -5,7 +5,7 @@ "compatibilityLevel": "JAVA_21", "mixins": [ "AccessorRangedAttribute", - "BlockEntitySignMixin", + "BlockEntityTypeSignMixin", "BloodglassMixin", "DreamFireBlockMixin", "DreamSandLowGravityMixin", diff --git a/common/src/main/resources/assets/antarchy/animations/spit_bug.animation.json b/common/src/main/resources/assets/antarchy/animations/spit_bug.animation.json index fb501241..04f7b81c 100644 --- a/common/src/main/resources/assets/antarchy/animations/spit_bug.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/spit_bug.animation.json @@ -1562,6 +1562,28 @@ "lerp_mode": "catmullrom" } } + }, + "jaw": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.1667": { + "vector": [12.5, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + }, + "0.3333": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [12.5, 0, 0] + }, + "0.5833": { + "vector": [0, 0, 0] + } + } } } }, @@ -1578,22 +1600,28 @@ }, "0.25": { "post": { - "vector": [-5, 0, 0] + "vector": [-25, 0, 0] }, "lerp_mode": "catmullrom" }, - "0.5": { + "0.4167": { "post": { "vector": [2.5, 0, 0] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.6667": { "post": { "vector": [2.5, 0, 0] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 0] @@ -1610,17 +1638,23 @@ }, "0.25": { "post": { - "vector": [0, 1, 2] + "vector": [0, 1, 10] }, "lerp_mode": "catmullrom" }, - "0.5": { + "0.4167": { "post": { "vector": [0, 0, -1] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.6667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { "post": { "vector": [0, 0, 0] }, @@ -1642,6 +1676,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [7.1226, 29.2189, 14.3589] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [7.1226, 29.2189, 14.3589] @@ -1658,6 +1698,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, 10] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 10] @@ -1674,6 +1720,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, 10] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 10] @@ -1690,6 +1742,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, -32.5] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, -32.5] @@ -1706,12 +1764,35 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [-25, 25, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [-25, 25, 0] }, "lerp_mode": "catmullrom" } + }, + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.1667": { + "vector": [1, 1, 1] + }, + "0.25": { + "vector": [1, 0.3, 1] + }, + "0.4583": { + "vector": [1, 1, 1] + }, + "1.0": { + "vector": [1, 1, 1] + } } }, "rightGrip": { @@ -1728,18 +1809,24 @@ }, "lerp_mode": "catmullrom" }, - "0.5": { + "0.4167": { "post": { "vector": [0, -20, 0] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.6667": { "post": { "vector": [0, -20, 0] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, -10, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, -10, 0] @@ -1756,6 +1843,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, -11.5, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, -11.5, 0] @@ -1772,12 +1865,35 @@ }, "lerp_mode": "catmullrom" }, + "0.5417": { + "post": { + "vector": [-13.01658, -61.28435, 22.32925] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [-7.1226, -29.2189, 14.3589] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [-7.1226, -29.2189, 14.3589] }, "lerp_mode": "catmullrom" } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 9, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } } }, "frontRightKnee": { @@ -1788,6 +1904,18 @@ }, "lerp_mode": "catmullrom" }, + "0.25": { + "post": { + "vector": [0, 0, 55] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 10] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 10] @@ -1804,6 +1932,18 @@ }, "lerp_mode": "catmullrom" }, + "0.25": { + "post": { + "vector": [0, 0, -35] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 10] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 10] @@ -1820,6 +1960,18 @@ }, "lerp_mode": "catmullrom" }, + "0.5417": { + "post": { + "vector": [0, 0, -5] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, -32.5] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, -32.5] @@ -1836,12 +1988,32 @@ }, "lerp_mode": "catmullrom" }, + "0.1667": { + "post": { + "vector": [-25, -25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [-25, -25, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [-25, -25, 0] }, "lerp_mode": "catmullrom" } + }, + "scale": { + "0.25": { + "vector": [1, 0.3, 1] + }, + "0.4583": { + "vector": [1, 1, 1] + } } }, "leftGrip": { @@ -1858,18 +2030,24 @@ }, "lerp_mode": "catmullrom" }, - "0.5": { + "0.4167": { "post": { "vector": [0, 20, 0] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.6667": { "post": { "vector": [0, 20, 0] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 10, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 10, 0] @@ -1886,6 +2064,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 60, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 60, 0] @@ -1908,12 +2092,18 @@ }, "lerp_mode": "catmullrom" }, - "0.5": { + "0.4167": { "post": { "vector": [41.8878, 17.5, -5] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [5, 17.5, -5] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [5, 17.5, -5] @@ -1936,12 +2126,18 @@ }, "lerp_mode": "catmullrom" }, - "0.625": { + "0.5417": { "post": { "vector": [32.5, 0, 0] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [-30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [-30, 0, 0] @@ -1958,18 +2154,24 @@ }, "lerp_mode": "catmullrom" }, - "0.375": { + "0.2917": { "post": { "vector": [-37.5, 0, 0] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.6667": { "post": { "vector": [59.72, 0, 0] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [40, 0, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [40, 0, 0] @@ -1984,18 +2186,24 @@ }, "lerp_mode": "catmullrom" }, - "0.375": { + "0.2917": { "post": { "vector": [0, 0, 5] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.6667": { "post": { "vector": [0, 0, -1] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 0] @@ -2012,6 +2220,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, -60, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, -60, 0] @@ -2034,12 +2248,18 @@ }, "lerp_mode": "catmullrom" }, - "0.5": { + "0.4167": { "post": { "vector": [41.8878, -17.5, 5] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [5, -17.5, 5] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [5, -17.5, 5] @@ -2062,12 +2282,18 @@ }, "lerp_mode": "catmullrom" }, - "0.625": { + "0.5417": { "post": { "vector": [32.5, 0, 0] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [-30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [-30, 0, 0] @@ -2084,18 +2310,24 @@ }, "lerp_mode": "catmullrom" }, - "0.375": { + "0.2917": { "post": { "vector": [-37.5, 0, 0] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.6667": { "post": { "vector": [59.72, 0, 0] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [40, 0, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [40, 0, 0] @@ -2110,18 +2342,24 @@ }, "lerp_mode": "catmullrom" }, - "0.375": { + "0.2917": { "post": { "vector": [0, 0, 5] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.6667": { "post": { "vector": [0, 0, -1] }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 0] @@ -2138,12 +2376,35 @@ }, "lerp_mode": "catmullrom" }, + "0.5417": { + "post": { + "vector": [-13.01658, 61.28435, -22.32925] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [-7.1226, 29.2189, -14.3589] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [-7.1226, 29.2189, -14.3589] }, "lerp_mode": "catmullrom" } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 9, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } } }, "frontLeftKnee": { @@ -2154,6 +2415,18 @@ }, "lerp_mode": "catmullrom" }, + "0.25": { + "post": { + "vector": [0, 0, -55] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, -10] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, -10] @@ -2170,6 +2443,18 @@ }, "lerp_mode": "catmullrom" }, + "0.25": { + "post": { + "vector": [0, 0, 35] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, -10] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, -10] @@ -2186,6 +2471,18 @@ }, "lerp_mode": "catmullrom" }, + "0.5417": { + "post": { + "vector": [0, 0, 5] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 32.5] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 32.5] @@ -2202,6 +2499,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [7.1226, -29.2189, -14.3589] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [7.1226, -29.2189, -14.3589] @@ -2218,6 +2521,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, -10] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, -10] @@ -2234,6 +2543,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, -10] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, -10] @@ -2250,6 +2565,12 @@ }, "lerp_mode": "catmullrom" }, + "0.9167": { + "post": { + "vector": [0, 0, 32.5] + }, + "lerp_mode": "catmullrom" + }, "1.0": { "post": { "vector": [0, 0, 32.5] @@ -2257,6 +2578,46 @@ "lerp_mode": "catmullrom" } } + }, + "jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-11.86, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } } } } diff --git a/common/src/main/resources/assets/antarchy/animations/stink_bug.animation.json b/common/src/main/resources/assets/antarchy/animations/stink_bug.animation.json index f75c3604..df0cdfa8 100644 --- a/common/src/main/resources/assets/antarchy/animations/stink_bug.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/stink_bug.animation.json @@ -487,7 +487,6 @@ } }, "fart": { - "loop": true, "animation_length": 1.5, "bones": { "root": { @@ -946,4 +945,4 @@ } } } -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/antarchy/animations/triffid.animation.json b/common/src/main/resources/assets/antarchy/animations/triffid.animation.json index 4ce900dd..1f68650e 100644 --- a/common/src/main/resources/assets/antarchy/animations/triffid.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/triffid.animation.json @@ -9,11 +9,11 @@ "rotation": { "0.0": { "post": { - "vector": [0, 0, 0] + "vector": [-2.5, 0, 0] }, "lerp_mode": "catmullrom" }, - "1.0": { + "1.9167": { "post": { "vector": [10, 0, 0] }, @@ -21,7 +21,7 @@ }, "4.0": { "post": { - "vector": [0, 0, 0] + "vector": [-2.5, 0, 0] }, "lerp_mode": "catmullrom" } @@ -31,11 +31,11 @@ "rotation": { "0.0": { "post": { - "vector": [0, 0, 0] + "vector": [-5, 0, 0] }, "lerp_mode": "catmullrom" }, - "2.0": { + "1.5": { "post": { "vector": [12.5, 0, 0] }, @@ -43,7 +43,7 @@ }, "4.0": { "post": { - "vector": [0, 0, 0] + "vector": [-5, 0, 0] }, "lerp_mode": "catmullrom" } @@ -53,25 +53,19 @@ "rotation": { "0.0": { "post": { - "vector": [-2.5, 0, 0] + "vector": [-7.5, 0, 0] }, "lerp_mode": "catmullrom" }, - "1.6667": { + "2.2083": { "post": { "vector": [10, 0, 0] }, "lerp_mode": "catmullrom" }, - "2.7917": { - "post": { - "vector": [15, 0, 0] - }, - "lerp_mode": "catmullrom" - }, "4.0": { "post": { - "vector": [-2.5, 0, 0] + "vector": [-7.5, 0, 0] }, "lerp_mode": "catmullrom" } @@ -80,6 +74,12 @@ "head": { "rotation": { "0.0": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.5417": { "post": { "vector": [10, 0, 0] }, @@ -87,7 +87,7 @@ }, "4.0": { "post": { - "vector": [10, 0, 0] + "vector": [-10, 0, 0] }, "lerp_mode": "catmullrom" } @@ -101,7 +101,7 @@ }, "lerp_mode": "catmullrom" }, - "2.0": { + "0.875": { "post": { "vector": [0, 0, 55] }, @@ -1252,6 +1252,12 @@ }, "lerp_mode": "catmullrom" }, + "0.5": { + "post": { + "vector": [0, 0, 94.72] + }, + "lerp_mode": "catmullrom" + }, "0.75": { "post": { "vector": [0, 0, 45] @@ -1554,6 +1560,12 @@ }, "lerp_mode": "catmullrom" }, + "0.5": { + "post": { + "vector": [0, 0, -94.72] + }, + "lerp_mode": "catmullrom" + }, "0.75": { "post": { "vector": [0, 0, -45] diff --git a/common/src/main/resources/assets/antarchy/blockstates/brutalfly_cocoon_spawner.json b/common/src/main/resources/assets/antarchy/blockstates/brutalfly_cocoon_spawner.json new file mode 100644 index 00000000..b349b3c7 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/brutalfly_cocoon_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "antarchy:block/brutalfly_cocoon_spawner" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/geo/lurking_terror.geo.json b/common/src/main/resources/assets/antarchy/geo/lurking_terror.geo.json index a58c99ac..d42c4716 100644 --- a/common/src/main/resources/assets/antarchy/geo/lurking_terror.geo.json +++ b/common/src/main/resources/assets/antarchy/geo/lurking_terror.geo.json @@ -6,9 +6,9 @@ "identifier": "geometry.lurkingterror", "texture_width": 128, "texture_height": 128, - "visible_bounds_width": 7, - "visible_bounds_height": 3.5, - "visible_bounds_offset": [0, 1.25, 0] + "visible_bounds_width": 8, + "visible_bounds_height": 4.5, + "visible_bounds_offset": [0, 1.75, 0] }, "bones": [ { @@ -96,7 +96,7 @@ "parent": "tailmiddle", "pivot": [0, 6, 35], "cubes": [ - {"origin": [-5, 1, 35], "size": [10, 10, 14], "uv": [0, 26]} + {"origin": [-5, 1, 35], "size": [10, 10, 14], "uv": [49, 95]} ] }, { diff --git a/common/src/main/resources/assets/antarchy/geo/spit_bug.geo.json b/common/src/main/resources/assets/antarchy/geo/spit_bug.geo.json index 11b4322d..ee5d6389 100644 --- a/common/src/main/resources/assets/antarchy/geo/spit_bug.geo.json +++ b/common/src/main/resources/assets/antarchy/geo/spit_bug.geo.json @@ -20,32 +20,37 @@ "parent": "root", "pivot": [0, 36, 0], "cubes": [ - {"origin": [-9.5, 36, -18], "size": [19, 18, 37], "uv": [0, 124]}, - {"origin": [-9.5, 54, -39], "size": [19, 7, 63], "uv": [0, 0]}, - {"origin": [-9.5, 44, 19], "size": [19, 10, 5], "uv": [112, 175]}, - {"origin": [-3.5, 52, -52], "size": [7, 7, 13], "uv": [0, 179]}, - {"origin": [-1.5, 47, -51], "size": [3, 5, 0], "uv": [58, 207]}, - {"origin": [-5.5, 59, -45], "size": [11, 2, 6], "uv": [108, 190]}, - {"origin": [-12.5, 36, -16], "size": [3, 18, 33], "uv": [112, 124]}, - {"origin": [9.5, 36, -16], "size": [3, 18, 33], "uv": [146, 70]}, - {"origin": [-9.5, 36, -26], "size": [19, 4, 8], "uv": [164, 45]}, - {"origin": [-11.5, 36, -30], "size": [2, 6, 14], "uv": [76, 179]}, - {"origin": [-10.5, 36, -35], "size": [3, 7, 5], "uv": [168, 196]}, - {"origin": [-8.5, 38, -51], "size": [2, 5, 16], "uv": [40, 179]}, - {"origin": [6.5, 38, -51], "size": [2, 5, 16], "uv": [40, 179], "mirror": true}, - {"origin": [7.5, 36, -35], "size": [3, 7, 5], "uv": [168, 196], "mirror": true}, - {"origin": [9.5, 36, -30], "size": [2, 6, 14], "uv": [76, 179], "mirror": true}, - {"origin": [-9.5, 50, -35], "size": [3, 4, 17], "uv": [160, 175]}, - {"origin": [6.5, 50, -35], "size": [3, 4, 17], "uv": [160, 175], "mirror": true}, - {"origin": [-7.5, 49, -39], "size": [5, 5, 4], "uv": [184, 196]}, - {"origin": [-3.5, 49, -51], "size": [2, 3, 12], "uv": [184, 157]}, - {"origin": [1.5, 49, -51], "size": [2, 3, 12], "uv": [184, 157], "mirror": true}, - {"origin": [2.5, 49, -39], "size": [5, 5, 4], "uv": [184, 196], "mirror": true}, - {"origin": [-6, 36, -35], "size": [12, 1, 9], "uv": [184, 136]}, - {"origin": [-11.5, 32, -35], "size": [23, 4, 50], "uv": [0, 70]}, - {"origin": [-8.5, 34, -53], "size": [17, 4, 18], "uv": [164, 0]}, - {"origin": [-5.5, 38, -52], "size": [11, 5, 0], "uv": [227, 32]}, - {"origin": [-8.5, 29, -53], "size": [17, 5, 0], "uv": [189, 22]} + {"origin": [-11.5, 36, -18], "size": [23, 18, 37], "inflate": -0.05, "uv": [0, 103]}, + {"origin": [-9.5, 54, -35], "size": [19, 7, 59], "uv": [0, 0]}, + {"origin": [-7.5, 54, -52], "size": [15, 7, 17], "uv": [112, 28]}, + {"origin": [-6.5, 42, -51.75], "size": [3, 12, 5], "uv": [34, 23]}, + {"origin": [3.5, 42, -51.75], "size": [3, 12, 5], "uv": [34, 23], "mirror": true}, + {"origin": [-7.5, 52, -52], "size": [15, 2, 0], "uv": [0, 24]}, + {"origin": [-7.5, 44, -52], "size": [0, 10, 17], "uv": [5, 29]}, + {"origin": [-9.5, 47, -35], "size": [2, 7, 0], "uv": [37, 16]}, + {"origin": [-9.5, 45, -35], "size": [0, 9, 17], "uv": [0, 18]}, + {"origin": [9.5, 45, -35], "size": [0, 9, 17], "uv": [0, 18], "mirror": true}, + {"origin": [7.5, 47, -35], "size": [2, 7, 0], "uv": [37, 16], "mirror": true}, + {"origin": [7.5, 44, -52], "size": [0, 10, 17], "uv": [5, 29], "mirror": true}, + {"origin": [-11.5, 32.1, -18], "size": [23, 4, 33], "inflate": -0.05, "uv": [0, 66]} + ] + }, + { + "name": "jaw", + "parent": "body", + "pivot": [-3.07143, 33.92857, -16], + "cubes": [ + {"origin": [-8.5, 32, -51], "size": [17, 2, 18], "uv": [97, 0]}, + {"origin": [-11.5, 30, -33], "size": [23, 4, 17], "uv": [79, 66]}, + {"origin": [-11.5, 34, -33], "size": [0, 8, 17], "uv": [0, -17]}, + {"origin": [-11.5, 34, -33], "size": [3, 8, 0], "uv": [0, 8]}, + {"origin": [8.5, 34, -33], "size": [3, 8, 0], "uv": [0, 8], "mirror": true}, + {"origin": [11.5, 34, -33], "size": [0, 8, 17], "uv": [0, -17], "mirror": true}, + {"origin": [-8.5, 34, -51], "size": [0, 8, 18], "uv": [0, -2]}, + {"origin": [-4.5, 32.5, -52.575], "size": [3, 8, 4], "pivot": [-3, 36.5, -50.575], "rotation": [22.5, 0, 0], "uv": [35, 0]}, + {"origin": [1.5, 32.5, -52.575], "size": [3, 8, 4], "pivot": [3, 36.5, -50.575], "rotation": [22.5, 0, 0], "uv": [35, 0], "mirror": true}, + {"origin": [-8.5, 34, -51], "size": [17, 8, 0], "uv": [0, 26]}, + {"origin": [8.5, 34, -51], "size": [0, 8, 18], "uv": [0, -2], "mirror": true} ] }, { @@ -53,7 +58,7 @@ "parent": "body", "pivot": [-11, 45.5, -17], "cubes": [ - {"origin": [-12, 45.5, -19], "size": [3, 3, 3], "uv": [142, 190]} + {"origin": [-12, 45.5, -19], "size": [3, 3, 3], "uv": [83, 114]} ] }, { @@ -61,33 +66,27 @@ "parent": "body", "pivot": [11, 45.5, -17], "cubes": [ - {"origin": [9, 45.5, -19], "size": [3, 3, 3], "uv": [142, 190], "mirror": true} + {"origin": [9, 45.5, -19], "size": [3, 3, 3], "uv": [83, 114], "mirror": true} ] }, { "name": "rightGrip", "parent": "body", "pivot": [-11.5, 54, -16], - "rotation": [0, 0, 90], - "cubes": [ - {"origin": [-15.5, 53, -28], "size": [8, 3, 12], "uv": [184, 121]} - ] + "rotation": [0, 0, 90] }, { "name": "leftGrip", "parent": "body", "pivot": [11.5, 54, -16], - "rotation": [0, 0, -90], - "cubes": [ - {"origin": [7.5, 53, -28], "size": [8, 3, 12], "uv": [184, 121], "mirror": true} - ] + "rotation": [0, 0, -90] }, { "name": "backRightThigh", "parent": "root", "pivot": [-11.5, 37, 10], "cubes": [ - {"origin": [-20.5, 33, 8], "size": [9, 4, 4], "uv": [142, 196]} + {"origin": [-20.5, 33, 8], "size": [9, 4, 4], "uv": [83, 120]} ] }, { @@ -96,7 +95,7 @@ "pivot": [-20.5, 37, 10], "rotation": [0, 0, -90], "cubes": [ - {"origin": [-34.5, 32, 7], "size": [14, 5, 6], "inflate": 0.025, "uv": [184, 146]} + {"origin": [-34.5, 32, 7], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]} ] }, { @@ -105,7 +104,7 @@ "pivot": [-34.5, 32, 10], "rotation": [0, 0, 90], "cubes": [ - {"origin": [-53.5, 32, 8], "size": [19, 4, 4], "uv": [164, 57]} + {"origin": [-53.5, 32, 8], "size": [19, 4, 4], "uv": [97, 20]} ] }, { @@ -114,8 +113,8 @@ "pivot": [-53.5, 32, 10], "rotation": [0, 0, -90], "cubes": [ - {"origin": [-67.5, 30, 9], "size": [14, 2, 2], "inflate": 0.025, "uv": [164, 65]}, - {"origin": [-76.5, 30, 10], "size": [9, 2, 0], "uv": [146, 121]} + {"origin": [-67.5, 30, 9], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]}, + {"origin": [-76.5, 30, 10], "size": [9, 2, 0], "uv": [97, 32]} ] }, { @@ -123,7 +122,7 @@ "parent": "root", "pivot": [11.5, 37, 10], "cubes": [ - {"origin": [11.5, 33, 8], "size": [9, 4, 4], "uv": [142, 196]} + {"origin": [11.5, 33, 8], "size": [9, 4, 4], "uv": [83, 120]} ] }, { @@ -132,7 +131,7 @@ "pivot": [20.5, 37, 10], "rotation": [0, 0, 90], "cubes": [ - {"origin": [20.5, 32, 7], "size": [14, 5, 6], "inflate": 0.025, "uv": [184, 146]} + {"origin": [20.5, 32, 7], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]} ] }, { @@ -141,7 +140,7 @@ "pivot": [34.5, 32, 10], "rotation": [0, 0, -90], "cubes": [ - {"origin": [34.5, 32, 8], "size": [19, 4, 4], "uv": [164, 57]} + {"origin": [34.5, 32, 8], "size": [19, 4, 4], "uv": [97, 20]} ] }, { @@ -150,8 +149,8 @@ "pivot": [53.5, 32, 10], "rotation": [0, 0, 90], "cubes": [ - {"origin": [53.5, 30, 9], "size": [14, 2, 2], "inflate": 0.025, "uv": [164, 65]}, - {"origin": [67.5, 30, 10], "size": [9, 2, 0], "uv": [146, 121], "mirror": true} + {"origin": [53.5, 30, 9], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]}, + {"origin": [67.5, 30, 10], "size": [9, 2, 0], "uv": [97, 32], "mirror": true} ] }, { @@ -159,7 +158,7 @@ "parent": "root", "pivot": [-11.5, 37, -10], "cubes": [ - {"origin": [-20.5, 33, -12], "size": [9, 4, 4], "uv": [142, 196]} + {"origin": [-20.5, 33, -12], "size": [9, 4, 4], "uv": [83, 120]} ] }, { @@ -168,7 +167,7 @@ "pivot": [-20.5, 37, -10], "rotation": [0, 0, -90], "cubes": [ - {"origin": [-34.5, 32, -13], "size": [14, 5, 6], "inflate": 0.025, "uv": [184, 146]} + {"origin": [-34.5, 32, -13], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]} ] }, { @@ -177,7 +176,7 @@ "pivot": [-34.5, 32, -10], "rotation": [0, 0, 90], "cubes": [ - {"origin": [-53.5, 32, -12], "size": [19, 4, 4], "uv": [164, 57]} + {"origin": [-53.5, 32, -12], "size": [19, 4, 4], "uv": [97, 20]} ] }, { @@ -186,8 +185,8 @@ "pivot": [-53.5, 32, -10], "rotation": [0, 0, -90], "cubes": [ - {"origin": [-67.5, 30, -11], "size": [14, 2, 2], "inflate": 0.025, "uv": [164, 65]}, - {"origin": [-76.5, 30, -10], "size": [9, 2, 0], "uv": [146, 121]} + {"origin": [-67.5, 30, -11], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]}, + {"origin": [-76.5, 30, -10], "size": [9, 2, 0], "uv": [97, 32]} ] }, { @@ -195,7 +194,7 @@ "parent": "root", "pivot": [11.5, 37, -10], "cubes": [ - {"origin": [11.5, 33, -12], "size": [9, 4, 4], "uv": [142, 196]} + {"origin": [11.5, 33, -12], "size": [9, 4, 4], "uv": [83, 120]} ] }, { @@ -204,7 +203,7 @@ "pivot": [20.5, 37, -10], "rotation": [0, 0, 90], "cubes": [ - {"origin": [20.5, 32, -13], "size": [14, 5, 6], "inflate": 0.025, "uv": [184, 146]} + {"origin": [20.5, 32, -13], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]} ] }, { @@ -213,7 +212,7 @@ "pivot": [34.5, 32, -10], "rotation": [0, 0, -90], "cubes": [ - {"origin": [34.5, 32, -12], "size": [19, 4, 4], "uv": [164, 57]} + {"origin": [34.5, 32, -12], "size": [19, 4, 4], "uv": [97, 20]} ] }, { @@ -222,8 +221,8 @@ "pivot": [53.5, 32, -10], "rotation": [0, 0, 90], "cubes": [ - {"origin": [53.5, 30, -11], "size": [14, 2, 2], "inflate": 0.025, "uv": [164, 65]}, - {"origin": [67.5, 30, -10], "size": [9, 2, 0], "uv": [146, 121], "mirror": true} + {"origin": [53.5, 30, -11], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]}, + {"origin": [67.5, 30, -10], "size": [9, 2, 0], "uv": [97, 32], "mirror": true} ] } ] diff --git a/common/src/main/resources/assets/antarchy/models/block/brutalfly_cocoon_spawner.json b/common/src/main/resources/assets/antarchy/models/block/brutalfly_cocoon_spawner.json new file mode 100644 index 00000000..0ca69bbc --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/brutalfly_cocoon_spawner.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/oak_log" + } +} diff --git a/common/src/main/resources/assets/antarchy/textures/entity/lurking_terror.png b/common/src/main/resources/assets/antarchy/textures/entity/lurking_terror.png index 78b4ae0d5b03967f20517a01d9c5653f163319b8..ce78a92552f932b63bd1ab48f2d6b4d4b2eb73f9 100644 GIT binary patch literal 5045 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 diff --git a/common/src/main/resources/assets/antarchy/textures/entity/scorpion.png b/common/src/main/resources/assets/antarchy/textures/entity/scorpion.png index cce310d1b275bb6d2d5b63b273f28a739b4dfdc1..b2a66d43edc6816e7588b6b5d1e50ddc2da24ccd 100644 GIT binary patch delta 2385 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 DiHmtj delta 3077 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 a?ID1e%!jr-rDM;38o$ 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 new TorchflowerBushBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.PEONY) .lightLevel(state -> AntarchySettings.glowingTorchflowers() ? 15 : 0))); public static final DeferredBlock OURANWOOD_SIGN = BLOCKS.register("ouranwood_sign", - () -> new net.minecraft.world.level.block.StandingSignBlock(net.minecraft.world.level.block.state.properties.WoodType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SIGN))); + () -> new net.minecraft.world.level.block.StandingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SIGN))); public static final DeferredBlock OURANWOOD_WALL_SIGN = BLOCKS.register("ouranwood_wall_sign", - () -> new net.minecraft.world.level.block.WallSignBlock(net.minecraft.world.level.block.state.properties.WoodType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_SIGN))); + () -> new net.minecraft.world.level.block.WallSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_SIGN))); public static final DeferredBlock OURANWOOD_HANGING_SIGN = BLOCKS.register("ouranwood_hanging_sign", - () -> new net.minecraft.world.level.block.CeilingHangingSignBlock(net.minecraft.world.level.block.state.properties.WoodType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_HANGING_SIGN))); + () -> new net.minecraft.world.level.block.CeilingHangingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_HANGING_SIGN))); public static final DeferredBlock OURANWOOD_WALL_HANGING_SIGN = BLOCKS.register("ouranwood_wall_hanging_sign", - () -> new net.minecraft.world.level.block.WallHangingSignBlock(net.minecraft.world.level.block.state.properties.WoodType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_HANGING_SIGN))); + () -> new net.minecraft.world.level.block.WallHangingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_HANGING_SIGN))); public static final DeferredBlock DUPLICATOR_SAPLING = BLOCKS.register("duplicator_sapling", () -> new DuplicatorSaplingBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_SAPLING).randomTicks().noCollission())); public static final DeferredBlock DUCT_TAPE = BLOCKS.register("duct_tape", @@ -701,6 +701,8 @@ public final class AntarchyFabricContent { () -> new WaspNestBlock(AntarchyFabricContent::waspNestBlockEntityType, BlockBehaviour.Properties.ofFullCopy(Blocks.BEE_NEST))); public static final DeferredBlock OURANWOOD_SQUIRREL_NEST = BLOCKS.register("ouranwood_squirrel_nest", () -> new com.craisinlord.antarchy.content.block.OuranwoodSquirrelNestBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COARSE_DIRT).noLootTable())); + public static final DeferredBlock BRUTALFLY_COCOON_SPAWNER = BLOCKS.register("brutalfly_cocoon_spawner", + () -> new com.craisinlord.antarchy.content.block.BrutalflyCocoonSpawnerBlock(BlockBehaviour.Properties.of().noCollission().instabreak().noLootTable())); public static final DeferredBlock HUSHWEED = BLOCKS.register("hushweed", () -> new HushweedBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.AZALEA).noCollission().noOcclusion())); public static final DeferredHolder DREAD = MOB_EFFECTS.register("dread", DreadMobEffect::new); @@ -1717,11 +1719,11 @@ public final class AntarchyFabricContent { public static final DeferredItem TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg", () -> new DeferredSpawnEggItem(TERMITE, 0xD4B96A, 0xFF6B1A, new Item.Properties())); public static final DeferredItem MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg", - () -> new DeferredSpawnEggItem(MOLEWORM, 0x7A6150, 0xD2B8A3, new Item.Properties())); + () -> new DeferredSpawnEggItem(MOLEWORM, 0xB8B8B8, 0x8A623A, new Item.Properties())); public static final DeferredItem MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg", () -> new DeferredSpawnEggItem(MANTIS, 0xF8F8F2, 0x63B44A, new Item.Properties())); public static final DeferredItem MOLEVORE_SPAWN_EGG = ITEMS.register("molevore_spawn_egg", - () -> new DeferredSpawnEggItem(MOLEVORE, 0x3E2E24, 0xB67B4F, new Item.Properties().rarity(Rarity.UNCOMMON))); + () -> new DeferredSpawnEggItem(MOLEVORE, 0x4A4A4A, 0x6B4A2B, new Item.Properties().rarity(Rarity.UNCOMMON))); public static final DeferredItem TRIFFID_SPAWN_EGG = ITEMS.register("triffid_spawn_egg", () -> new DeferredSpawnEggItem(TRIFFID, 0x4C8F3A, 0xFF2FB3, new Item.Properties().rarity(Rarity.UNCOMMON))); public static final DeferredItem APPLE_COW_SPAWN_EGG = ITEMS.register("apple_cow_spawn_egg", @@ -2578,6 +2580,7 @@ public final class AntarchyFabricContent { () -> WASP_NEST.get(), () -> HUSHWEED.get(), () -> OURANWOOD_SQUIRREL_NEST.get(), + () -> BRUTALFLY_COCOON_SPAWNER.get(), () -> ANT_NEST_BLOCK_ENTITY.get(), () -> DREAM_CAMPFIRE_BLOCK_ENTITY.get(), () -> WASP_NEST_BLOCK_ENTITY.get(), diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/OuranwoodWoodTypes.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/OuranwoodWoodTypes.java new file mode 100644 index 00000000..86217123 --- /dev/null +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/OuranwoodWoodTypes.java @@ -0,0 +1,17 @@ +package com.craisinlord.antarchy.fabric; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.fabric.mixin.WoodTypeInvoker; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; + +public final class OuranwoodWoodTypes { + public static final WoodType OURANWOOD = register("ouranwood"); + + private OuranwoodWoodTypes() { + } + + private static WoodType register(String name) { + return WoodTypeInvoker.antarchy$register(new WoodType(Antarchy.MODID + ":" + name, BlockSetType.JUNGLE)); + } +} diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/WoodTypeInvoker.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/WoodTypeInvoker.java new file mode 100644 index 00000000..9b7ff6c3 --- /dev/null +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/WoodTypeInvoker.java @@ -0,0 +1,13 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import net.minecraft.world.level.block.state.properties.WoodType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(WoodType.class) +public interface WoodTypeInvoker { + @Invoker("register") + static WoodType antarchy$register(WoodType woodType) { + throw new AssertionError(); + } +} diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CameraShakeMixin.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CameraShakeMixin.java index d5d3ec70..212cc276 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CameraShakeMixin.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CameraShakeMixin.java @@ -1,61 +1,45 @@ package com.craisinlord.antarchy.fabric.mixin.client; -import com.craisinlord.antarchy.content.entity.ToreterrorEntity; -import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; +import com.craisinlord.antarchy.content.client.CameraShakeClientState; import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; +import com.craisinlord.antarchy.content.item.BigBerthaItem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Final; 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.CallbackInfo; +import net.minecraft.client.renderer.GameRenderer; @Mixin(GameRenderer.class) public abstract class CameraShakeMixin { - private static final double MAX_SHAKE_RANGE = 48.0D; private static final int TORETERROR_SHAKE_TICKS = 25; - private static final double NIGHTMARE_SHAKE_RANGE = 32.0D; @Shadow @Final private Minecraft minecraft; @Inject(method = "bobView", at = @At("TAIL")) private void applyCameraShake(PoseStack poseStack, float partialTick, CallbackInfo ci) { - if (minecraft.level == null || minecraft.player == null) return; - - Vec3 cameraPos = minecraft.gameRenderer.getMainCamera().getPosition(); - float shakeStrength = 0.0F; - - for (ToreterrorEntity toreterror : minecraft.level.getEntitiesOfClass( - ToreterrorEntity.class, - minecraft.player.getBoundingBox().inflate(MAX_SHAKE_RANGE), - t -> t.isAlive() && t.isJumpShaking() - )) { - double distance = Math.sqrt(cameraPos.distanceToSqr(toreterror.position().add(0, toreterror.getBbHeight() * 0.5, 0))); - if (distance > MAX_SHAKE_RANGE) continue; - shakeStrength += (float) ((1.0D - distance / MAX_SHAKE_RANGE) * 1.0F); + if (minecraft.level == null || minecraft.player == null) { + CameraShakeClientState.clear(); + return; } - for (NightmareEntity nightmare : minecraft.level.getEntitiesOfClass( - NightmareEntity.class, - minecraft.player.getBoundingBox().inflate(NIGHTMARE_SHAKE_RANGE), - entity -> entity.isAlive() && entity.isRoaring() - )) { - double distance = Math.sqrt(cameraPos.distanceToSqr(nightmare.position().add(0.0D, nightmare.getBbHeight() * 0.5D, 0.0D))); - if (distance > NIGHTMARE_SHAKE_RANGE) continue; - shakeStrength += (float) ((1.0D - distance / NIGHTMARE_SHAKE_RANGE) * 1.35D); - } + float shakeStrength = CameraShakeClientState.getStrength(minecraft.gameRenderer.getMainCamera().getPosition()); int beetleShakeTicks = HerculesBeetleImpactShakeClientState.getTicks(); if (beetleShakeTicks > 0) { shakeStrength += (float) beetleShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F; } + int bigBerthaShakeTicks = BigBerthaItem.clientShakeTicks; + if (bigBerthaShakeTicks > 0) { + shakeStrength += (float) bigBerthaShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F; + } + if (shakeStrength <= 0.0F) return; float time = (float) (minecraft.player.tickCount + partialTick); diff --git a/fabric/src/main/resources/antarchy-fabric.mixins.json b/fabric/src/main/resources/antarchy-fabric.mixins.json index 24133392..c4066f37 100644 --- a/fabric/src/main/resources/antarchy-fabric.mixins.json +++ b/fabric/src/main/resources/antarchy-fabric.mixins.json @@ -15,11 +15,11 @@ "BloodglassRespawnMixin", "DreamCampfireBlockEntityMixin", "JumpyBootsFallDamageMixin", + "WoodTypeInvoker", "infinity.RandomSpringMixin", "infinity.PortalCreatorMixin" ], "client": [ - "client.NightmareCameraShakeMixin", "client.CameraShakeMixin", "client.DuctTapeInputMixin", "client.AntiwaterFogMixin", 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 4bfac523..2f27acd1 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java @@ -258,6 +258,7 @@ public class AntarchyNeoforge { () -> AntarchyNeoforgeBlocks.WASP_NEST.get(), () -> AntarchyNeoforgeBlocks.HUSHWEED.get(), () -> AntarchyNeoforgeBlocks.OURANWOOD_SQUIRREL_NEST.get(), + () -> AntarchyNeoforgeBlocks.BRUTALFLY_COCOON_SPAWNER.get(), () -> AntarchyNeoforgeBlocks.ANT_NEST_BLOCK_ENTITY.get(), () -> AntarchyNeoforgeBlocks.DREAM_CAMPFIRE_BLOCK_ENTITY.get(), () -> AntarchyNeoforgeBlocks.WASP_NEST_BLOCK_ENTITY.get(), diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java index 8306063a..5fe047eb 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java @@ -336,14 +336,14 @@ public final class AntarchyToolsConfig { "Base attack damage. Also the minimum damage at full health.", "Formula: damage = baseDamage * (1 + missingHealthFraction * scalingFactor)" ) - .defineInRange("baseDamage", 30.0D, 0.0D, 1024.0D); + .defineInRange("baseDamage", 15.0D, 0.0D, 1024.0D); NIGHTMARE_SWORD_ATTACK_SPEED = b.comment("Attack speed of the Nightmare Sword.").defineInRange("attackSpeed", -2.4D, -10.0D, 10.0D); NIGHTMARE_SWORD_SCALING_FACTOR = b .comment( "How much damage scales with missing health.", "At 1.0 and 0 HP remaining: damage doubles. At full health: always baseDamage." ) - .defineInRange("scalingFactor", 1.0D, 0.0D, 100.0D); + .defineInRange("scalingFactor", 1.5D, 0.0D, 100.0D); b.pop(); b.push("fallenKingCrown"); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/CameraShakeHandler.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/CameraShakeHandler.java index 75eb6c87..12daca96 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/CameraShakeHandler.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/CameraShakeHandler.java @@ -1,12 +1,11 @@ package com.craisinlord.antarchy.neoforge.client; import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.CameraShakeClientState; import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; -import com.craisinlord.antarchy.content.entity.ToreterrorEntity; -import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; +import com.craisinlord.antarchy.content.item.BigBerthaItem; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -14,9 +13,7 @@ import net.neoforged.neoforge.client.event.ViewportEvent; @EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) public final class CameraShakeHandler { - private static final double MAX_SHAKE_RANGE = 48.0D; private static final int TORETERROR_SHAKE_TICKS = 25; - private static final double NIGHTMARE_SHAKE_RANGE = 32.0D; private CameraShakeHandler() { } @@ -24,36 +21,23 @@ public final class CameraShakeHandler { @SubscribeEvent public static void onComputeCameraAngles(ViewportEvent.ComputeCameraAngles event) { Minecraft mc = Minecraft.getInstance(); - if (mc.level == null || mc.player == null) return; - - Vec3 cameraPos = event.getCamera().getPosition(); - float shakeStrength = 0.0F; - - for (ToreterrorEntity toreterror : mc.level.getEntitiesOfClass( - ToreterrorEntity.class, - mc.player.getBoundingBox().inflate(MAX_SHAKE_RANGE), - t -> t.isAlive() && t.isJumpShaking() - )) { - double distance = Math.sqrt(cameraPos.distanceToSqr(toreterror.position().add(0, toreterror.getBbHeight() * 0.5, 0))); - if (distance > MAX_SHAKE_RANGE) continue; - shakeStrength += (float) ((1.0D - distance / MAX_SHAKE_RANGE) * 1.0D); + if (mc.level == null || mc.player == null) { + CameraShakeClientState.clear(); + return; } - for (NightmareEntity nightmare : mc.level.getEntitiesOfClass( - NightmareEntity.class, - mc.player.getBoundingBox().inflate(NIGHTMARE_SHAKE_RANGE), - entity -> entity.isAlive() && entity.isRoaring() - )) { - double distance = Math.sqrt(cameraPos.distanceToSqr(nightmare.position().add(0.0D, nightmare.getBbHeight() * 0.5D, 0.0D))); - if (distance > NIGHTMARE_SHAKE_RANGE) continue; - shakeStrength += (float) ((1.0D - distance / NIGHTMARE_SHAKE_RANGE) * 1.35D); - } + float shakeStrength = CameraShakeClientState.getStrength(event.getCamera().getPosition()); int beetleShakeTicks = HerculesBeetleImpactShakeClientState.getTicks(); if (beetleShakeTicks > 0) { shakeStrength += (float) beetleShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F; } + int bigBerthaShakeTicks = BigBerthaItem.clientShakeTicks; + if (bigBerthaShakeTicks > 0) { + shakeStrength += (float) bigBerthaShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F; + } + if (shakeStrength <= 0.0F) return; float time = (float) (mc.player.tickCount + event.getPartialTick()); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/NightmareCameraShakeHandler.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/NightmareCameraShakeHandler.java deleted file mode 100644 index beae8706..00000000 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/NightmareCameraShakeHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.craisinlord.antarchy.neoforge.client; - -import com.craisinlord.antarchy.Antarchy; -import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; -import net.minecraft.client.Minecraft; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.ViewportEvent; - -@EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) -public final class NightmareCameraShakeHandler { - private static final double MAX_SHAKE_RANGE = 32.0D; - - private NightmareCameraShakeHandler() { - } - - @SubscribeEvent - public static void onComputeCameraAngles(ViewportEvent.ComputeCameraAngles event) { - Minecraft minecraft = Minecraft.getInstance(); - if (minecraft.level == null || minecraft.player == null) { - return; - } - - Vec3 cameraPos = event.getCamera().getPosition(); - float shakeStrength = 0.0F; - - for (NightmareEntity nightmare : minecraft.level.getEntitiesOfClass( - NightmareEntity.class, - minecraft.player.getBoundingBox().inflate(MAX_SHAKE_RANGE), - nightmare -> nightmare.isAlive() && nightmare.isRoaring() - )) { - double distance = Math.sqrt(cameraPos.distanceToSqr(nightmare.position().add(0.0D, nightmare.getBbHeight() * 0.5D, 0.0D))); - if (distance > MAX_SHAKE_RANGE) { - continue; - } - - shakeStrength += (float) ((1.0D - distance / MAX_SHAKE_RANGE) * 1.35D); - } - - if (shakeStrength <= 0.0F) { - return; - } - - float time = (float) (minecraft.player.tickCount + event.getPartialTick()); - event.setYaw(event.getYaw() + Mth.sin(time * 1.85F) * shakeStrength * 1.8F); - event.setPitch(event.getPitch() + Mth.cos(time * 2.15F) * shakeStrength * 1.45F); - event.setRoll(event.getRoll() + Mth.sin(time * 2.65F) * shakeStrength * 1.05F); - } -} diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java index 56b0feb1..dc087556 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java @@ -229,6 +229,8 @@ public final class AntarchyNeoforgeBlocks { () -> new WaspNestBlock(AntarchyNeoforgeItems::waspNestBlockEntityType, BlockBehaviour.Properties.ofFullCopy(Blocks.BEE_NEST))); public static final DeferredBlock OURANWOOD_SQUIRREL_NEST = BLOCKS.register("ouranwood_squirrel_nest", () -> new com.craisinlord.antarchy.content.block.OuranwoodSquirrelNestBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COARSE_DIRT).noLootTable())); + public static final DeferredBlock BRUTALFLY_COCOON_SPAWNER = BLOCKS.register("brutalfly_cocoon_spawner", + () -> new com.craisinlord.antarchy.content.block.BrutalflyCocoonSpawnerBlock(BlockBehaviour.Properties.of().noCollission().instabreak().noLootTable())); public static final DeferredBlock HUSHWEED = BLOCKS.register("hushweed", () -> new HushweedBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.AZALEA).noCollission().noOcclusion())); public static final DeferredBlock BILE_BLOCK = BLOCKS.register("bile", 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 4b20c614..03125724 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 @@ -516,11 +516,11 @@ public final class AntarchyNeoforgeItems { public static final DeferredItem TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.TERMITE, 0xD4B96A, 0xFF6B1A, new Item.Properties())); public static final DeferredItem MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg", - () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEWORM, 0x7A6150, 0xD2B8A3, new Item.Properties())); + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEWORM, 0xB8B8B8, 0x8A623A, new Item.Properties())); public static final DeferredItem MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MANTIS, 0xF8F8F2, 0x63B44A, new Item.Properties())); public static final DeferredItem MOLEVORE_SPAWN_EGG = ITEMS.register("molevore_spawn_egg", - () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEVORE, 0x3E2E24, 0xB67B4F, new Item.Properties().rarity(Rarity.UNCOMMON))); + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEVORE, 0x4A4A4A, 0x6B4A2B, new Item.Properties().rarity(Rarity.UNCOMMON))); public static final DeferredItem TRIFFID_SPAWN_EGG = ITEMS.register("triffid_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.TRIFFID, 0x4C8F3A, 0xFF2FB3, new Item.Properties().rarity(Rarity.UNCOMMON))); public static final DeferredItem APPLE_COW_SPAWN_EGG = ITEMS.register("apple_cow_spawn_egg", 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 d6ade634..fbb6a581 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 @@ -1,6 +1,7 @@ package com.craisinlord.antarchy.neoforge.registry; import com.craisinlord.antarchy.content.entity.*; +import net.minecraft.world.entity.animal.AbstractFish; import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity; import com.craisinlord.antarchy.content.entity.cloud_shark.CloudSharkEntity; import com.craisinlord.antarchy.content.entity.flying_squirrel.FlyingSquirrelEntity; @@ -51,5 +52,6 @@ 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.CHEEP.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, AbstractFish::checkSurfaceWaterAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); } }