From b00ee762ab2ff86ecd9ac15afe2e77564ddc0e64 Mon Sep 17 00:00:00 2001 From: craisinlord Date: Thu, 25 Jun 2026 23:41:43 -0500 Subject: [PATCH] new stink bug, termites, started to fix new kraken --- .../antarchy/config/AntarchySettings.java | 14 + .../antarchy/content/AntarchyObjects.java | 7 + .../content/client/model/KrakenModel.java | 4 +- .../client/model/OctopusBombModel.java | 22 + .../content/client/model/TermiteModel.java | 27 + .../client/renderer/KrakenRenderer.java | 4 +- .../client/renderer/OctopusBombRenderer.java | 13 + .../client/renderer/StinkBugRenderer.java | 22 +- .../client/renderer/TermiteRenderer.java | 35 + .../content/entity/OctopusBombEntity.java | 684 ++++++ .../content/entity/StinkBugEntity.java | 28 +- .../content/entity/ToreterrorEntity.java | 286 ++- .../content/entity/kraken/KrakenEntity.java | 318 ++- .../worldgen/elythia/ElythiaBiomeSource.java | 51 +- .../mixins/SquidzookaEnchantMixin.java | 72 + .../resources/antarchy-common.mixins.json | 1 + .../antarchy/animations/kraken.animation.json | 5 + .../animations/octopus_bomb.animation.json | 4 +- .../animations/stink_bug.animation.json | 926 ++++++--- .../animations/termite.animation.json | 1836 +++++++++++++++++ .../animations/toreterror.animation.json | 1156 ++++++----- .../antarchy/blockstates/termite_nest.json | 4 +- .../assets/antarchy/geo/stink_bug.geo.json | 117 +- .../assets/antarchy/geo/termite.geo.json | 197 ++ .../assets/antarchy/geo/toreterror.geo.json | 6 +- .../resources/assets/antarchy/lang/en_us.json | 2 + .../antarchy/models/block/termite_nest.json | 12 +- .../models/item/octopus_bomb_spawn_egg.json | 3 + .../antarchy/textures/entity/kraken.png | Bin 0 -> 44419 bytes .../antarchy/textures/entity/moleworm.png | Bin 1468 -> 1123 bytes .../antarchy/textures/entity/stink_bug.png | Bin 674 -> 883 bytes .../antarchy/textures/entity/termite.png | Bin 0 -> 1713 bytes .../antarchy/textures/entity/toreterror.png | Bin 10190 -> 13769 bytes .../data/antarchy/dimension/elythia.json | 1 + .../data/minecraft/tags/block/climbable.json | 7 + .../tags/item/enchantable/crossbow.json | 3 +- .../fabric/AntarchyFabricContent.java | 34 +- .../antarchy/fabric/AntarchyFabricEvents.java | 1 + .../client/AntarchyFabricClientBootstrap.java | 2 + .../antarchy/neoforge/AntarchyNeoforge.java | 1 + .../client/AntarchyNeoForgeClient.java | 2 + .../registry/AntarchyNeoForgeEvents.java | 1 + .../registry/AntarchyNeoforgeBlocks.java | 5 +- .../AntarchyNeoforgeCreativeModeTabs.java | 5 +- .../registry/AntarchyNeoforgeEntites.java | 11 +- .../AntarchyNeoforgeEntityAttributes.java | 2 + .../registry/AntarchyNeoforgeItems.java | 5 + .../AntarchyNeoforgeSpawnPlacements.java | 2 + 48 files changed, 4786 insertions(+), 1152 deletions(-) create mode 100644 common/src/main/java/com/craisinlord/antarchy/content/client/model/OctopusBombModel.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/content/client/model/TermiteModel.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/content/client/renderer/OctopusBombRenderer.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/content/client/renderer/TermiteRenderer.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java create mode 100644 common/src/main/java/com/craisinlord/antarchy/mixins/SquidzookaEnchantMixin.java create mode 100644 common/src/main/resources/assets/antarchy/animations/termite.animation.json create mode 100644 common/src/main/resources/assets/antarchy/geo/termite.geo.json create mode 100644 common/src/main/resources/assets/antarchy/models/item/octopus_bomb_spawn_egg.json create mode 100644 common/src/main/resources/assets/antarchy/textures/entity/kraken.png create mode 100644 common/src/main/resources/assets/antarchy/textures/entity/termite.png create mode 100644 common/src/main/resources/data/minecraft/tags/block/climbable.json 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 8bb2de50..63a49f5f 100644 --- a/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java +++ b/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java @@ -90,6 +90,8 @@ public final class AntarchySettings { private static ResourceKey rainbowAntNonInfinityFallbackDimension = dimensionKey("antarchy:elythia"); private static double krakenHealth = 1500.0D; private static double krakenAttackDamage = 45.0D; + private static double octopusBombHealth = 250.0D; + private static double octopusBombAttackDamage = 16.0D; private static double brutalflyHealth = 400.0D; private static double brutalflySwipeDamage = 15.0D; private static double brutalflySpitDamage = 5.0D; @@ -733,6 +735,18 @@ public final class AntarchySettings { return krakenAttackDamage; } + public static double octopusBombHealth() { + return octopusBombHealth; + } + + public static void setOctopusBombHealth(double value) { octopusBombHealth = value; } + + public static double octopusBombAttackDamage() { + return octopusBombAttackDamage; + } + + public static void setOctopusBombAttackDamage(double value) { octopusBombAttackDamage = value; } + public static double brutalflyHealth() { return brutalflyHealth; } 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 a5d0d49f..a9050d9d 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java @@ -18,6 +18,7 @@ import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyOrbEntity; import com.craisinlord.antarchy.content.block.entity.HushweedBlockEntity; import com.craisinlord.antarchy.content.entity.flying_squirrel.FlyingSquirrelEntity; import com.craisinlord.antarchy.content.entity.MissileSquidEntity; +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; import com.craisinlord.antarchy.content.entity.MolewormEntity; import com.craisinlord.antarchy.content.entity.MantisEntity; @@ -53,6 +54,8 @@ public final class AntarchyObjects { @SuppressWarnings("unchecked") public static Supplier> MISSILE_SQUID = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") + public static Supplier> OCTOPUS_BOMB = (Supplier>) UNBOUND; + @SuppressWarnings("unchecked") public static Supplier> MOLEWORM = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") public static Supplier> MANTIS = (Supplier>) UNBOUND; @@ -404,6 +407,10 @@ public final class AntarchyObjects { return state.is(DUPLICATOR_LOG.get()) || state.is(DUPLICATOR_SAPLING.get()); } + public static void setOctopusBomb(Supplier> supplier) { + OCTOPUS_BOMB = supplier; + } + public static BlockBehaviour.Properties shellstoneProperties() { return BlockBehaviour.Properties.ofFullCopy(Blocks.STONE).requiresCorrectToolForDrops(); } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/model/KrakenModel.java b/common/src/main/java/com/craisinlord/antarchy/content/client/model/KrakenModel.java index abed8910..c47a4fb4 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/client/model/KrakenModel.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/model/KrakenModel.java @@ -12,9 +12,7 @@ public class KrakenModel extends GeoModel { @Override public ResourceLocation getTextureResource(KrakenEntity animatable) { - return animatable.isPhaseTwo() - ? ResourceLocation.fromNamespaceAndPath("antarchy", "textures/entity/kraken_purple.png") - : ResourceLocation.fromNamespaceAndPath("antarchy", "textures/entity/kraken.png"); + return ResourceLocation.fromNamespaceAndPath("antarchy", "textures/entity/kraken.png"); } @Override diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/model/OctopusBombModel.java b/common/src/main/java/com/craisinlord/antarchy/content/client/model/OctopusBombModel.java new file mode 100644 index 00000000..8936dc67 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/model/OctopusBombModel.java @@ -0,0 +1,22 @@ +package com.craisinlord.antarchy.content.client.model; + +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class OctopusBombModel extends GeoModel { + @Override + public ResourceLocation getModelResource(OctopusBombEntity animatable) { + return ResourceLocation.fromNamespaceAndPath("antarchy", "geo/octopus_bomb.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(OctopusBombEntity animatable) { + return ResourceLocation.fromNamespaceAndPath("antarchy", "textures/entity/octopus_bomb.png"); + } + + @Override + public ResourceLocation getAnimationResource(OctopusBombEntity animatable) { + return ResourceLocation.fromNamespaceAndPath("antarchy", "animations/octopus_bomb.animation.json"); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/model/TermiteModel.java b/common/src/main/java/com/craisinlord/antarchy/content/client/model/TermiteModel.java new file mode 100644 index 00000000..b760aaf2 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/model/TermiteModel.java @@ -0,0 +1,27 @@ +package com.craisinlord.antarchy.content.client.model; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.ant.TermiteEntity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class TermiteModel extends GeoModel { + private static final ResourceLocation MODEL = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/termite.geo.json"); + private static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/termite.png"); + private static final ResourceLocation ANIMATIONS = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "animations/termite.animation.json"); + + @Override + public ResourceLocation getModelResource(TermiteEntity animatable) { + return MODEL; + } + + @Override + public ResourceLocation getTextureResource(TermiteEntity animatable) { + return TEXTURE; + } + + @Override + public ResourceLocation getAnimationResource(TermiteEntity animatable) { + return ANIMATIONS; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/KrakenRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/KrakenRenderer.java index 153fd33f..83b72cc1 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/KrakenRenderer.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/KrakenRenderer.java @@ -8,7 +8,7 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer; public class KrakenRenderer extends GeoEntityRenderer { public KrakenRenderer(EntityRendererProvider.Context context) { super(context, new KrakenModel()); - this.shadowRadius = 3.6F; - this.withScale(3.0F); + this.shadowRadius = 2.0F; + this.withScale(1.5F); } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/OctopusBombRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/OctopusBombRenderer.java new file mode 100644 index 00000000..5c557b9a --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/OctopusBombRenderer.java @@ -0,0 +1,13 @@ +package com.craisinlord.antarchy.content.client.renderer; + +import com.craisinlord.antarchy.content.client.model.OctopusBombModel; +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import software.bernie.geckolib.renderer.GeoEntityRenderer; + +public class OctopusBombRenderer extends GeoEntityRenderer { + public OctopusBombRenderer(EntityRendererProvider.Context context) { + super(context, new OctopusBombModel()); + this.shadowRadius = 1.2F; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/StinkBugRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/StinkBugRenderer.java index e7c6cc97..48cb9ada 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/StinkBugRenderer.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/StinkBugRenderer.java @@ -2,34 +2,16 @@ package com.craisinlord.antarchy.content.client.renderer; import com.craisinlord.antarchy.content.client.model.StinkBugModel; import com.craisinlord.antarchy.content.entity.StinkBugEntity; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; -import org.jetbrains.annotations.Nullable; -import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.renderer.GeoEntityRenderer; public class StinkBugRenderer extends GeoEntityRenderer { - private static final float ADULT_SCALE = 0.75F; - private static final float BABY_SCALE = 0.50F; - private static final float ADULT_SHADOW_RADIUS = 0.6F; + private static final float ADULT_SCALE = 0.95F; + private static final float ADULT_SHADOW_RADIUS = 0.2F; public StinkBugRenderer(EntityRendererProvider.Context context) { super(context, new StinkBugModel()); this.shadowRadius = ADULT_SHADOW_RADIUS; this.withScale(ADULT_SCALE); } - - @Override - public void preRender(PoseStack poseStack, StinkBugEntity animatable, BakedGeoModel model, @Nullable MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { - super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); - - if (animatable.isBaby()) { - poseStack.scale(BABY_SCALE, BABY_SCALE, BABY_SCALE); - this.shadowRadius = ADULT_SHADOW_RADIUS * BABY_SCALE; - } else { - this.shadowRadius = ADULT_SHADOW_RADIUS; - } - } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/TermiteRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/TermiteRenderer.java new file mode 100644 index 00000000..9ccbad9b --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/TermiteRenderer.java @@ -0,0 +1,35 @@ +package com.craisinlord.antarchy.content.client.renderer; + +import com.craisinlord.antarchy.content.client.model.TermiteModel; +import com.craisinlord.antarchy.content.entity.ant.TermiteEntity; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoEntityRenderer; + +public class TermiteRenderer extends GeoEntityRenderer { + private static final float ADULT_SHADOW_RADIUS = 0.3F; + private static final float ADULT_SCALE = 0.85F; + private static final float BABY_SCALE = 0.5F; + + public TermiteRenderer(EntityRendererProvider.Context context) { + super(context, new TermiteModel()); + this.shadowRadius = ADULT_SHADOW_RADIUS; + } + + @Override + public void preRender(PoseStack poseStack, TermiteEntity animatable, BakedGeoModel model, @Nullable MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { + super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); + + if (animatable.isBaby()) { + poseStack.scale(ADULT_SCALE * BABY_SCALE, ADULT_SCALE * BABY_SCALE, ADULT_SCALE * BABY_SCALE); + this.shadowRadius = ADULT_SHADOW_RADIUS * BABY_SCALE; + } else { + poseStack.scale(ADULT_SCALE, ADULT_SCALE, ADULT_SCALE); + this.shadowRadius = ADULT_SHADOW_RADIUS; + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java new file mode 100644 index 00000000..b06d9949 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/OctopusBombEntity.java @@ -0,0 +1,684 @@ +package com.craisinlord.antarchy.content.entity; + +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.damage.AntarchyDamageSources; +import net.minecraft.core.BlockPos; +import net.minecraft.tags.FluidTags; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; +import net.minecraft.world.entity.ai.control.SmoothSwimmingMoveControl; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.keyframe.event.builtin.AutoPlayingSoundKeyframeHandler; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.List; +import java.util.Objects; + +public class OctopusBombEntity extends Monster implements GeoEntity { + private static final EntityDataAccessor ATTACK_STATE = SynchedEntityData.defineId(OctopusBombEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor ROARING = SynchedEntityData.defineId(OctopusBombEntity.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor ANIMATION_STATE = SynchedEntityData.defineId(OctopusBombEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor CAN_FLY = SynchedEntityData.defineId(OctopusBombEntity.class, EntityDataSerializers.BOOLEAN); + + private static final String ATTACK_COOLDOWN_KEY = "AttackCooldown"; + private static final String ACTION_TICKS_KEY = "ActionTicks"; + private static final String LAST_ATTACK_STATE_KEY = "LastAttackState"; + private static final String AGGRO_TRIGGERED_KEY = "AggroTriggered"; + private static final String GRAB_TARGET_KEY = "GrabTarget"; + private static final String CAN_FLY_KEY = "CanFly"; + private static final String SPAWNED_BY_KRAKEN_KEY = "SpawnedByKraken"; + + private static final int ATTACK_NONE = 0; + private static final int ATTACK_GRAB = 1; + private static final int ATTACK_SWIPE = 2; + private static final int ANIM_IDLE = 0; + private static final int ANIM_SWIM = 2; + private static final int ANIM_SWIPE = 3; + private static final int ANIM_GRAB = 4; + private static final int ANIM_DEATH = 5; + private static final int DEATH_ANIM_TICKS = 60; + private static final int INK_SPRAY_RANGE = 6; + private static final int INK_SPRAY_COOLDOWN = 80; + + private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle"); + private static final RawAnimation SWIM_ANIM = RawAnimation.begin().thenLoop("swim"); + private static final RawAnimation SWIPE_ANIM = RawAnimation.begin().thenPlay("Swipe"); + private static final RawAnimation GRAB_ANIM = RawAnimation.begin().thenPlay("Grab"); + private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlay("Death"); + + private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + private float wanderDx, wanderDy, wanderDz; + private int wanderRetargetTicks; + private int attackCooldown; + private int actionTicks; + private int lastAttackState; + private boolean aggroTriggered; + private int grabbedTargetId = -1; + private int strafeRetargetTicks; + private int inkSprayCooldown; + private float orbitDirection = 1.0F; + private boolean spawnedByKraken; + + public OctopusBombEntity(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 80, 8, 0.06F, 0.12F, true); + this.xpReward = 15; + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 250.0D) + .add(Attributes.ATTACK_DAMAGE, 16.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D) + .add(Attributes.FLYING_SPEED, 0.28D) + .add(Attributes.FOLLOW_RANGE, 32.0D) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.4D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { + return level.getFluidState(pos).is(FluidTags.WATER) && level.getFluidState(pos.above()).is(FluidTags.WATER); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(ATTACK_STATE, ATTACK_NONE); + builder.define(ROARING, false); + builder.define(ANIMATION_STATE, ANIM_IDLE); + builder.define(CAN_FLY, false); + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor key) { + super.onSyncedDataUpdated(key); + if (CAN_FLY.equals(key)) { + this.moveControl = this.canFly() + ? new FlyingMoveControl(this, 20, true) + : new SmoothSwimmingMoveControl(this, 80, 8, 0.06F, 0.12F, true); + this.navigation = this.canFly() + ? new FlyingPathNavigation(this, this.level()) + : new WaterBoundPathNavigation(this, this.level()); + } + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 20.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + + HurtByTargetGoal hurtByTargetGoal = new HurtByTargetGoal(this); + hurtByTargetGoal.setAlertOthers(MissileSquidEntity.class); + this.targetSelector.addGoal(1, hurtByTargetGoal); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController) + .setSoundKeyframeHandler(new AutoPlayingSoundKeyframeHandler<>())); + } + + private PlayState mainAnimController(AnimationState state) { + return switch (this.getAnimationState()) { + case ANIM_GRAB -> state.setAndContinue(GRAB_ANIM); + case ANIM_SWIPE -> state.setAndContinue(SWIPE_ANIM); + case ANIM_SWIM -> state.setAndContinue(SWIM_ANIM); + case ANIM_DEATH -> state.setAndContinue(DEATH_ANIM); + default -> state.setAndContinue(IDLE_ANIM); + }; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.geoCache; + } + + @Override + protected PathNavigation createNavigation(Level level) { + return new WaterBoundPathNavigation(this, level); + } + + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData spawnData) { + Objects.requireNonNull(this.getAttribute(Attributes.MAX_HEALTH)).setBaseValue(com.craisinlord.antarchy.config.AntarchySettings.octopusBombHealth()); + this.setHealth((float) com.craisinlord.antarchy.config.AntarchySettings.octopusBombHealth()); + Objects.requireNonNull(this.getAttribute(Attributes.ATTACK_DAMAGE)).setBaseValue(com.craisinlord.antarchy.config.AntarchySettings.octopusBombAttackDamage()); + return super.finalizeSpawn(level, difficulty, spawnReason, spawnData); + } + + @Override + public void baseTick() { + int airSupply = this.getAirSupply(); + super.baseTick(); + if (!this.canFly()) { + this.handleAirSupply(airSupply); + } else { + this.setAirSupply(this.getMaxAirSupply()); + } + } + + @Override + public void tick() { + super.tick(); + this.setNoGravity(this.isInWater() || this.canFly()); + + if (this.level().isClientSide) { + this.updateSwimRotation(); + return; + } + + if (this.attackCooldown > 0) { + this.attackCooldown--; + } + if (this.inkSprayCooldown > 0) { + this.inkSprayCooldown--; + } + + LivingEntity target = this.getTarget(); + + this.tickDefensiveInkSpray(); + + if (target == null || !target.isAlive()) { + this.resetCombatState(); + if (this.isInWater()) { + this.tickWanderMovement(); + } + this.updateSwimRotation(); + this.updateAnimationState(); + return; + } + + this.getLookControl().setLookAt(target, 25.0F, 20.0F); + + if (!this.aggroTriggered) { + this.startAggroRoar(); + } + + if (this.isRoaring()) { + this.tickRoarState(target); + this.updateSwimRotation(); + this.updateAnimationState(); + return; + } + + if (this.getAttackState() != ATTACK_NONE) { + this.tickCurrentAttack(target); + this.updateSwimRotation(); + this.updateAnimationState(); + return; + } + + this.tickPursuitMovement(target); + + if (this.attackCooldown <= 0) { + int nextAttack = this.chooseNextAttack(target); + if (nextAttack != ATTACK_NONE) { + this.startAttack(nextAttack); + } + } + + this.updateSwimRotation(); + this.updateAnimationState(); + } + + @Override + public void travel(Vec3 travelVector) { + if (this.isEffectiveAi() && (this.isInWater() || this.canFly())) { + this.moveRelative(this.getSpeed(), travelVector); + this.move(MoverType.SELF, this.getDeltaMovement()); + this.setDeltaMovement(this.getDeltaMovement().scale(this.isInWater() ? 0.92D : 0.91D)); + return; + } + + super.travel(travelVector); + } + + @Override + protected boolean shouldDespawnInPeaceful() { + return false; + } + + @Override + public boolean removeWhenFarAway(double distanceToClosestPlayer) { + return false; + } + + @Override + @Nullable + protected SoundEvent getAmbientSound() { + return null; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return AntarchySoundEvents.KRAKEN_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return AntarchySoundEvents.KRAKEN_DEATH.get(); + } + + @Override + protected float getSoundVolume() { + return 1.2F; + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putInt(ATTACK_COOLDOWN_KEY, this.attackCooldown); + tag.putInt(ACTION_TICKS_KEY, this.actionTicks); + tag.putInt(LAST_ATTACK_STATE_KEY, this.lastAttackState); + tag.putBoolean(AGGRO_TRIGGERED_KEY, this.aggroTriggered); + tag.putBoolean(CAN_FLY_KEY, this.canFly()); + tag.putBoolean(SPAWNED_BY_KRAKEN_KEY, this.spawnedByKraken); + if (this.grabbedTargetId >= 0) { + tag.putInt(GRAB_TARGET_KEY, this.grabbedTargetId); + } + tag.putBoolean("Roaring", this.isRoaring()); + tag.putInt("AttackState", this.getAttackState()); + tag.putInt("AnimationState", this.getAnimationState()); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + this.attackCooldown = tag.getInt(ATTACK_COOLDOWN_KEY); + this.actionTicks = tag.getInt(ACTION_TICKS_KEY); + this.lastAttackState = tag.contains(LAST_ATTACK_STATE_KEY) ? tag.getInt(LAST_ATTACK_STATE_KEY) : ATTACK_NONE; + this.aggroTriggered = tag.getBoolean(AGGRO_TRIGGERED_KEY); + this.setCanFly(tag.getBoolean(CAN_FLY_KEY)); + this.spawnedByKraken = tag.getBoolean(SPAWNED_BY_KRAKEN_KEY); + this.grabbedTargetId = tag.contains(GRAB_TARGET_KEY) ? tag.getInt(GRAB_TARGET_KEY) : -1; + this.entityData.set(ROARING, tag.getBoolean("Roaring")); + this.entityData.set(ATTACK_STATE, tag.getInt("AttackState")); + this.entityData.set(ANIMATION_STATE, tag.contains("AnimationState") ? tag.getInt("AnimationState") : ANIM_IDLE); + this.updateAnimationState(); + } + + public boolean isRoaring() { + return this.entityData.get(ROARING); + } + + public boolean canFly() { + return this.entityData.get(CAN_FLY); + } + + public int getAttackState() { + return this.entityData.get(ATTACK_STATE); + } + + public int getAnimationState() { + return this.entityData.get(ANIMATION_STATE); + } + + private void setRoaring(boolean roaring) { + this.entityData.set(ROARING, roaring); + } + + public void setCanFly(boolean canFly) { + this.entityData.set(CAN_FLY, canFly); + } + + public void launchAsProjectile(net.minecraft.world.entity.Entity owner, net.minecraft.world.phys.Vec3 velocity) { + this.spawnedByKraken = true; + this.setCanFly(true); + this.setDeltaMovement(velocity); + } + + private void setAttackState(int attackState) { + this.entityData.set(ATTACK_STATE, attackState); + } + + private void setAnimationState(int animationState) { + this.entityData.set(ANIMATION_STATE, animationState); + } + + private void startAggroRoar() { + this.aggroTriggered = true; + this.actionTicks = 30; + this.setRoaring(true); + this.playSound(AntarchySoundEvents.KRAKEN_ROAR.get(), 1.4F, 1.07F); + this.getNavigation().stop(); + this.setDeltaMovement(this.getDeltaMovement().scale(0.2D)); + this.updateAnimationState(); + } + + private void tickRoarState(LivingEntity target) { + this.getNavigation().stop(); + this.getMoveControl().setWantedPosition(this.getX(), this.getY(), this.getZ(), 0.0D); + this.setDeltaMovement(this.getDeltaMovement().scale(0.6D)); + this.getLookControl().setLookAt(target, 25.0F, 20.0F); + + if (--this.actionTicks <= 0) { + this.actionTicks = 0; + this.setRoaring(false); + this.attackCooldown = 18; + } + } + + private void tickCurrentAttack(LivingEntity target) { + this.getNavigation().stop(); + this.getLookControl().setLookAt(target, 30.0F, 25.0F); + this.setDeltaMovement(this.getDeltaMovement().scale(0.8D)); + + switch (this.getAttackState()) { + case ATTACK_GRAB -> this.tickGrabAttack(target); + case ATTACK_SWIPE -> this.tickSwipeAttack(); + default -> this.finishAttack(); + } + } + + private void startAttack(int attackState) { + this.setAttackState(attackState); + this.grabbedTargetId = -1; + + if (attackState == ATTACK_GRAB) { + this.actionTicks = 55; + this.playSound(AntarchySoundEvents.KRAKEN_ATTACK.get(), 1.2F, 1.07F); + } else if (attackState == ATTACK_SWIPE) { + this.actionTicks = 40; + this.playSound(AntarchySoundEvents.KRAKEN_SPIN.get(), 1.1F, 1.13F); + } + } + + private void tickGrabAttack(LivingEntity target) { + if (this.actionTicks == 48 && this.distanceToSqr(target) <= 42.25D) { + this.grabbedTargetId = target.getId(); + } + + LivingEntity grabbedTarget = this.getGrabbedTarget(); + if (grabbedTarget != null && grabbedTarget.isAlive()) { + this.holdGrabbedTarget(grabbedTarget); + if (this.actionTicks <= 45 && this.actionTicks > 10 && this.actionTicks % 10 == 0) { + if (this.level() instanceof ServerLevel serverLevel) { + grabbedTarget.hurt(AntarchyDamageSources.krakenMauling(serverLevel, this), 4.0F); + } + } + } + + if (--this.actionTicks <= 0) { + if (grabbedTarget != null && grabbedTarget.isAlive()) { + this.pullDown(grabbedTarget, 2.5D); + } + this.grabbedTargetId = -1; + this.finishAttack(); + } + } + + private void tickSwipeAttack() { + if (this.actionTicks == 10) { + this.performSwipe(); + } + + if (--this.actionTicks <= 0) { + this.finishAttack(); + } + } + + private void finishAttack() { + int finished = this.getAttackState(); + this.setAttackState(ATTACK_NONE); + this.actionTicks = 0; + this.attackCooldown = 18; + this.grabbedTargetId = -1; + this.lastAttackState = finished; + this.updateAnimationState(); + } + + private void tickPursuitMovement(LivingEntity target) { + if (this.strafeRetargetTicks-- <= 0) { + this.strafeRetargetTicks = 10 + this.random.nextInt(12); + if (this.random.nextFloat() < 0.4F) { + this.orbitDirection *= -1.0F; + } + } + + Vec3 attackPoint = this.createCombatTarget(target); + this.getMoveControl().setWantedPosition(attackPoint.x, attackPoint.y, attackPoint.z, 1.1D); + } + + private void resetCombatState() { + this.setAttackState(ATTACK_NONE); + this.setRoaring(false); + this.setTarget(null); + this.actionTicks = 0; + this.grabbedTargetId = -1; + this.aggroTriggered = false; + this.updateAnimationState(); + } + + private void handleAirSupply(int previousAirSupply) { + if (this.isInWaterOrBubble()) { + this.setAirSupply(this.getMaxAirSupply()); + return; + } + + this.setAirSupply(previousAirSupply - 1); + if (this.getAirSupply() <= -20) { + this.setAirSupply(0); + this.hurt(this.damageSources().drown(), 2.0F); + } + } + + private void tickDefensiveInkSpray() { + if (this.inkSprayCooldown > 0 || !(this.level() instanceof ServerLevel serverLevel)) { + return; + } + + Player nearbyPlayer = this.level().getNearestPlayer(this, INK_SPRAY_RANGE); + if (nearbyPlayer == null || nearbyPlayer.isCreative() || nearbyPlayer.isSpectator()) { + return; + } + + this.inkSprayCooldown = INK_SPRAY_COOLDOWN; + this.playSound(AntarchySoundEvents.KRAKEN_HURT.get(), 1.0F, 1.49F); + + double centerY = this.getY() + this.getBbHeight() * 0.5D; + serverLevel.sendParticles(ParticleTypes.SQUID_INK, this.getX(), centerY, this.getZ(), 55, 1.2D, 0.8D, 1.2D, 0.02D); + serverLevel.sendParticles(ParticleTypes.SQUID_INK, this.getX(), centerY, this.getZ(), 35, 2.0D, 1.1D, 2.0D, 0.01D); + } + + private int chooseNextAttack(LivingEntity target) { + double distSqr = this.distanceToSqr(target); + boolean canGrab = distSqr <= 42.25D; + boolean canSwipe = distSqr <= 81.0D && this.isTargetInFront(target, -0.15D); + + if (!canGrab && !canSwipe) { + return ATTACK_NONE; + } + + int grabWeight = canGrab ? (this.lastAttackState == ATTACK_GRAB ? 1 : 4) : 0; + int swipeWeight = canSwipe ? (this.lastAttackState == ATTACK_SWIPE ? 1 : 5) : 0; + int total = grabWeight + swipeWeight; + if (total == 0) return ATTACK_NONE; + + int roll = this.random.nextInt(total); + if (roll < grabWeight) return ATTACK_GRAB; + return ATTACK_SWIPE; + } + + private void performSwipe() { + AABB hitBox = this.getBoundingBox().inflate(7.0D, 3.0D, 7.0D); + List players = this.level().getEntitiesOfClass(Player.class, hitBox, player -> player.isAlive() && this.isTargetInFront(player, -0.15D)); + float damage = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); + for (Player player : players) { + if (this.level() instanceof ServerLevel serverLevel) { + player.hurt(AntarchyDamageSources.krakenMauling(serverLevel, this), damage); + Vec3 direction = player.position().subtract(this.position()); + Vec3 horizontal = new Vec3(direction.x, 0.0D, direction.z).normalize().scale(1.75D); + player.push(horizontal.x, 0.3D, horizontal.z); + player.hurtMarked = true; + } + } + } + + private void holdGrabbedTarget(LivingEntity target) { + Vec3 anchor = this.position().add(0.0D, -this.getBbHeight() * 0.4D, 0.0D); + target.setDeltaMovement(anchor.subtract(target.position()).scale(0.35D)); + target.resetFallDistance(); + if (target instanceof ServerPlayer serverPlayer) { + serverPlayer.connection.teleport(anchor.x, anchor.y, anchor.z, target.getYRot(), target.getXRot()); + } else { + target.moveTo(anchor.x, anchor.y, anchor.z, target.getYRot(), target.getXRot()); + } + target.hurtMarked = true; + } + + private void pullDown(LivingEntity target, double downwardStrength) { + target.push(0.0D, -downwardStrength, 0.0D); + target.hurtMarked = true; + } + + @Nullable + private LivingEntity getGrabbedTarget() { + if (this.grabbedTargetId < 0) { + return null; + } + net.minecraft.world.entity.Entity entity = this.level().getEntity(this.grabbedTargetId); + return entity instanceof LivingEntity livingEntity ? livingEntity : null; + } + + private boolean isTargetInFront(LivingEntity target, double minimumDot) { + Vec3 forward = this.getViewVector(1.0F); + Vec3 toTarget = target.position().subtract(this.position()).normalize(); + return forward.dot(toTarget) >= minimumDot; + } + + private Vec3 createCombatTarget(LivingEntity target) { + double radius = 9.0D; + double angle = this.tickCount * 0.16D * this.orbitDirection + this.getId() * 0.11D; + double x = target.getX() + Math.cos(angle) * radius; + double z = target.getZ() + Math.sin(angle) * radius; + double y = Mth.clamp( + target.getY() + 1.0D + Math.sin((this.tickCount + this.getId()) * 0.18D), + target.getY() - 3.0D, + target.getY() + 4.0D + ); + return new Vec3(x, y, z); + } + + private void updateSwimRotation() { + Vec3 velocity = this.getDeltaMovement(); + if (velocity.horizontalDistanceSqr() > 1.0E-4D) { + float targetYaw = (float) (Mth.atan2(velocity.z, velocity.x) * (180.0D / Math.PI)) - 90.0F; + this.setYRot(Mth.approachDegrees(this.getYRot(), targetYaw, 6.0F)); + this.yBodyRot = this.getYRot(); + this.yHeadRot = this.getYRot(); + } + + if (velocity.lengthSqr() > 1.0E-4D) { + float targetPitch = (float) (-(Mth.atan2(velocity.y, velocity.horizontalDistance()) * (180.0D / Math.PI))); + this.setXRot(Mth.approachDegrees(this.getXRot(), targetPitch, 4.0F)); + } + } + + @Override + public void die(DamageSource damageSource) { + if (!this.level().isClientSide) { + this.setAnimationState(ANIM_DEATH); + this.actionTicks = 0; + this.attackCooldown = 0; + this.setAttackState(ATTACK_NONE); + this.setRoaring(false); + this.setDeltaMovement(Vec3.ZERO); + this.getNavigation().stop(); + } + super.die(damageSource); + } + + @Override + protected void tickDeath() { + this.deathTime++; + + if (this.deathTime == 1) { + this.setAnimationState(ANIM_DEATH); + } + + if (this.deathTime >= DEATH_ANIM_TICKS) { + this.remove(RemovalReason.KILLED); + this.dropExperience(this); + } + } + + private void updateAnimationState() { + if (this.isDeadOrDying()) { + this.setAnimationState(ANIM_DEATH); + return; + } + + if (this.isRoaring()) { + this.setAnimationState(ANIM_IDLE); + return; + } + + switch (this.getAttackState()) { + case ATTACK_GRAB -> { + this.setAnimationState(ANIM_GRAB); + return; + } + case ATTACK_SWIPE -> { + this.setAnimationState(ANIM_SWIPE); + return; + } + default -> { + } + } + + if (!this.isInWater()) { + this.setAnimationState(ANIM_SWIM); + return; + } + + Vec3 velocity = this.getDeltaMovement(); + double horizontalSpeedSqr = velocity.horizontalDistanceSqr(); + double verticalSpeedSqr = velocity.y * velocity.y; + if (horizontalSpeedSqr > 0.03D && horizontalSpeedSqr > verticalSpeedSqr * 2.5D) { + this.setAnimationState(ANIM_SWIM); + return; + } + + this.setAnimationState(ANIM_IDLE); + } + + private void tickWanderMovement() { + if (--this.wanderRetargetTicks <= 0) { + this.wanderRetargetTicks = 40 + this.random.nextInt(40); + float angle = this.random.nextFloat() * (float) (Math.PI * 2); + this.wanderDx = Mth.cos(angle) * 0.1f; + this.wanderDy = -0.05f + this.random.nextFloat() * 0.1f; + this.wanderDz = Mth.sin(angle) * 0.1f; + } + this.setDeltaMovement(this.getDeltaMovement().add(this.wanderDx, this.wanderDy, this.wanderDz)); + } +} 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 791186f4..5c46a8ca 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 @@ -7,8 +7,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.tags.EntityTypeTags; import net.minecraft.world.entity.AgeableMob; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -37,9 +35,12 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class StinkBugEntity extends Animal implements GeoEntity { 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 STINK_BURST_PARTICLES = 32; private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + private int fartAnimationTicks; public StinkBugEntity(EntityType entityType, Level level) { super(entityType, level); @@ -73,18 +74,8 @@ public class StinkBugEntity extends Animal implements GeoEntity { public void tick() { super.tick(); - if (this.level().isClientSide || this.tickCount % 10 != 0) { - return; - } - - for (var target : this.level().getEntitiesOfClass( - net.minecraft.world.entity.LivingEntity.class, - this.getBoundingBox().inflate(StinkyBehavior.STINK_BUG_AURA_RADIUS), - entity -> entity != this - && entity.isAlive() - && !entity.getType().is(EntityTypeTags.SENSITIVE_TO_BANE_OF_ARTHROPODS) - )) { - target.addEffect(new MobEffectInstance(AntarchyObjects.STINKY_EFFECT.get(), StinkyBehavior.STINKY_EFFECT_DURATION_TICKS, 0, false, true, true)); + if (this.fartAnimationTicks > 0) { + this.fartAnimationTicks--; } } @@ -92,6 +83,7 @@ public class StinkBugEntity extends Animal implements GeoEntity { public boolean hurt(DamageSource source, float amount) { boolean hurt = super.hurt(source, amount); if (hurt) { + this.triggerFartAnimation(); StinkyBehavior.emitBurst(this, STINK_BURST_PARTICLES); } return hurt; @@ -119,7 +111,15 @@ 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; + } } 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 fd5aedc9..541afda0 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 @@ -63,9 +63,11 @@ public class ToreterrorEntity extends Monster implements GeoEntity { private static final int ANIM_WALK = 1; private static final int ANIM_SHOOT = 2; private static final int ANIM_JUMP_ATTACK = 3; - private static final int ANIM_SPIN = 4; - private static final int ANIM_DEATH = 5; - private static final int ANIM_RAPID_SHOOT = 6; + private static final int ANIM_SPIN_START = 4; + private static final int ANIM_SPIN_LOOP = 5; + private static final int ANIM_SPIN_END = 6; + private static final int ANIM_DEATH = 7; + private static final int ANIM_RAPID_SHOOT = 8; private static final int ATTACK_RAPID_FIRE = 0; private static final int ATTACK_HUGE_BOMB = 1; @@ -81,15 +83,21 @@ public class ToreterrorEntity extends Monster implements GeoEntity { private static final int JUMP_TOTAL_TICKS = 40; private static final int JUMP_LAUNCH_TICK = 10; private static final int JUMP_SHAKE_TICKS = 25; - private static final int SPIN_TOTAL_TICKS = 40; - private static final int SPIN_START_TICK = 3; - private static final int SPIN_END_TICK = 22; + private static final int SPIN_START_TOTAL_TICKS = 5; + private static final int SPIN_LOOP_MIN_TICKS = 200; + private static final int SPIN_LOOP_MAX_TICKS = 300; + private static final int SPIN_END_TOTAL_TICKS = 10; private static final int SPIN_HIT_INTERVAL = 5; + private static final int SPIN_STUCK_FAIL_LIMIT = 10; private static final double CLOSE_RANGE_SQR = 64.0D; private static final double JUMP_RANGE_SQR = 400.0D; private static final double RANGED_MAX_RANGE_SQR = 625.0D; + private static final double SPIN_TRIGGER_RANGE_SQR = 225.0D; + private static final double SPIN_LEASH_RANGE_SQR = 225.0D; private static final double SPIN_RADIUS = 4.5D; + private static final double SPIN_MOVE_SPEED = 1.7D; + private static final double SPIN_ANIMATION_SPEED = 0.7D; private static final double JUMP_SHOCKWAVE_RADIUS = 6.0D; private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("Idle"); @@ -97,7 +105,9 @@ public class ToreterrorEntity extends Monster implements GeoEntity { private static final RawAnimation SHOOT_ANIM = RawAnimation.begin().thenPlay("shoot").thenLoop("Idle"); private static final RawAnimation RAPID_SHOOT_ANIM = RawAnimation.begin().thenLoop("shoot"); private static final RawAnimation JUMP_ANIM = RawAnimation.begin().thenPlay("jump_attack").thenLoop("Idle"); - private static final RawAnimation SPIN_ANIM = RawAnimation.begin().thenPlay("spin_attack").thenLoop("Idle"); + private static final RawAnimation SPIN_START_ANIM = RawAnimation.begin().thenPlay("spin_attack_start"); + private static final RawAnimation SPIN_LOOP_ANIM = RawAnimation.begin().thenLoop("spin_attack"); + private static final RawAnimation SPIN_END_ANIM = RawAnimation.begin().thenPlay("spin_attack_end"); private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlayAndHold("death"); private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); @@ -105,7 +115,10 @@ public class ToreterrorEntity extends Monster implements GeoEntity { private int shootAnimTicks; private int jumpAnimTicks; - private int spinAnimTicks; + private int spinStartTicks; + private int spinLoopTicks; + private int spinEndTicks; + private int spinLoopTotalTicks; private int shootCooldown; private int jumpCooldown; private int spinCooldown; @@ -116,6 +129,9 @@ public class ToreterrorEntity extends Monster implements GeoEntity { private boolean shootBomberFired; private boolean shootBomberFiredSecond; private int rapidFireNextTick; + private Vec3 spinDirection = Vec3.ZERO; + private int spinStrafeSign = 1; + private int spinStuckTicks; private final Map spinHitCooldowns = new HashMap<>(); public ToreterrorEntity(EntityType entityType, Level level) { @@ -166,12 +182,18 @@ public class ToreterrorEntity extends Monster implements GeoEntity { private PlayState mainAnimController(AnimationState state) { int animState = this.getAnimationState(); + state.getController().setAnimationSpeed(1.0D); return switch (animState) { case ANIM_WALK -> state.setAndContinue(WALK_ANIM); case ANIM_SHOOT -> state.setAndContinue(SHOOT_ANIM); case ANIM_RAPID_SHOOT -> state.setAndContinue(RAPID_SHOOT_ANIM); case ANIM_JUMP_ATTACK -> state.setAndContinue(JUMP_ANIM); - case ANIM_SPIN -> state.setAndContinue(SPIN_ANIM); + case ANIM_SPIN_START -> state.setAndContinue(SPIN_START_ANIM); + case ANIM_SPIN_LOOP -> { + state.getController().setAnimationSpeed(SPIN_ANIMATION_SPEED); + yield state.setAndContinue(SPIN_LOOP_ANIM); + } + case ANIM_SPIN_END -> state.setAndContinue(SPIN_END_ANIM); case ANIM_DEATH -> state.setAndContinue(DEATH_ANIM); default -> state.setAndContinue(IDLE_ANIM); }; @@ -209,8 +231,8 @@ public class ToreterrorEntity extends Monster implements GeoEntity { this.tickShootAnimation(); } else if (this.jumpAnimTicks > 0) { this.tickJumpAnimation(); - } else if (this.spinAnimTicks > 0) { - this.tickSpinAnimation(); + } else if (this.isSpinSequenceActive()) { + this.tickSpinSequence(); } else { this.updateIdleAnimation(); } @@ -242,7 +264,6 @@ public class ToreterrorEntity extends Monster implements GeoEntity { private void enterPhase2() { this.entityData.set(PHASE_2, true); - this.bossEvent.setColor(BossEvent.BossBarColor.RED); } public boolean isPhase2() { @@ -303,7 +324,7 @@ public class ToreterrorEntity extends Monster implements GeoEntity { this.setAnimationState(ANIM_DEATH); this.shootAnimTicks = 0; this.jumpAnimTicks = 0; - this.spinAnimTicks = 0; + this.stopSpinSequence(); this.setDeltaMovement(Vec3.ZERO); this.getNavigation().stop(); } @@ -339,7 +360,11 @@ public class ToreterrorEntity extends Monster implements GeoEntity { } private boolean isInAttackAnimation() { - return this.shootAnimTicks > 0 || this.jumpAnimTicks > 0 || this.spinAnimTicks > 0; + return this.shootAnimTicks > 0 || this.jumpAnimTicks > 0 || this.isSpinSequenceActive(); + } + + private boolean isSpinSequenceActive() { + return this.spinStartTicks > 0 || this.spinLoopTicks > 0 || this.spinEndTicks > 0; } private void tickShootAnimation() { @@ -405,21 +430,220 @@ public class ToreterrorEntity extends Monster implements GeoEntity { } } - private void tickSpinAnimation() { - this.setAnimationState(ANIM_SPIN); - int elapsed = SPIN_TOTAL_TICKS - this.spinAnimTicks; + private void tickSpinSequence() { this.getNavigation().stop(); - this.setDeltaMovement(this.getDeltaMovement().multiply(0.7D, 1.0D, 0.7D)); - if (elapsed >= SPIN_START_TICK && elapsed <= SPIN_END_TICK && elapsed % SPIN_HIT_INTERVAL == 0) { + if (this.spinStartTicks > 0) { + this.tickSpinStart(); + return; + } + if (this.spinLoopTicks > 0) { + this.tickSpinLoop(); + return; + } + this.tickSpinEnd(); + } + + private void tickSpinStart() { + this.setAnimationState(ANIM_SPIN_START); + this.setDeltaMovement(this.getDeltaMovement().scale(0.75D)); + LivingEntity target = this.getTarget(); + if (target != null) { + Vec3 towardTarget = horizontalDirectionTo(target.position()); + if (towardTarget.lengthSqr() > 1.0E-4D) { + this.spinDirection = towardTarget; + this.lookInDirection(towardTarget); + } + } + this.spinStartTicks--; + } + + private void tickSpinLoop() { + this.setAnimationState(ANIM_SPIN_LOOP); + LivingEntity target = this.getTarget(); + if (target == null || !target.isAlive()) { + this.beginSpinEnd(); + return; + } + + this.updateSpinDirection(target); + if (!this.moveDuringSpin()) { + this.spinStuckTicks++; + if (this.spinStuckTicks >= SPIN_STUCK_FAIL_LIMIT) { + this.beginSpinEnd(); + return; + } + } else { + this.spinStuckTicks = 0; + } + + int elapsed = this.spinLoopTotalTicks - this.spinLoopTicks; + if (elapsed % SPIN_HIT_INTERVAL == 0) { this.applySpinDamage(); } - this.spinAnimTicks--; - if (this.spinAnimTicks <= 0) { - this.spinCooldown = 160 + this.random.nextInt(80); + + this.lookInDirection(this.spinDirection); + this.spinLoopTicks--; + if (this.spinLoopTicks <= 0) { + this.beginSpinEnd(); + } + } + + private void tickSpinEnd() { + this.setAnimationState(ANIM_SPIN_END); + this.setDeltaMovement(this.getDeltaMovement().multiply(0.7D, 1.0D, 0.7D)); + this.spinEndTicks--; + if (this.spinEndTicks <= 0) { + this.stopSpinSequence(); + this.spinCooldown = 260 + this.random.nextInt(80); this.spinHitCooldowns.clear(); } } + private void updateSpinDirection(LivingEntity target) { + Vec3 towardTarget = horizontalDirectionTo(target.position()); + if (towardTarget.lengthSqr() <= 1.0E-4D) { + return; + } + if (this.distanceToSqr(target) > SPIN_LEASH_RANGE_SQR) { + this.spinDirection = towardTarget; + return; + } + Vec3 forward = this.spinDirection.lengthSqr() > 1.0E-4D ? this.spinDirection.normalize() : towardTarget; + Vec3 strafe = new Vec3(-towardTarget.z, 0.0D, towardTarget.x).scale(this.spinStrafeSign); + Vec3 combined = forward.scale(1.2D).add(towardTarget.scale(0.15D)).add(strafe.scale(1.35D)); + this.spinDirection = combined.lengthSqr() > 1.0E-4D ? combined.normalize() : towardTarget; + } + + private boolean moveDuringSpin() { + Vec3 direction = this.spinDirection.lengthSqr() > 1.0E-4D ? this.spinDirection.normalize() : Vec3.ZERO; + if (direction == Vec3.ZERO) { + return false; + } + + if (this.trySpinMoves(direction, false)) { + return true; + } + + this.spinStrafeSign *= -1; + Vec3 bounced = rotateHorizontal(direction, this.spinStrafeSign * 35.0D); + if (this.trySpinMoves(bounced, true)) { + return true; + } + + Vec3 reversed = direction.scale(-1.0D); + if (this.trySpinMoves(reversed, true)) { + return true; + } + + Vec3 reversedBounce = rotateHorizontal(reversed, this.spinStrafeSign * 25.0D); + return this.trySpinMoves(reversedBounce, true); + } + + private boolean trySpinMoves(Vec3 baseDirection, boolean bounced) { + Vec3[] attempts = new Vec3[]{ + baseDirection, + rotateHorizontal(baseDirection, 28.0D * this.spinStrafeSign), + rotateHorizontal(baseDirection, -28.0D * this.spinStrafeSign), + rotateHorizontal(baseDirection, 52.0D * this.spinStrafeSign), + rotateHorizontal(baseDirection, -52.0D * this.spinStrafeSign) + }; + for (Vec3 attempt : attempts) { + if (this.trySpinMove(attempt, 0.0D, 0.0D) || this.trySpinMove(attempt, 1.0D, 0.42D) || this.trySpinMove(attempt, -1.0D, -0.28D)) { + this.spinDirection = attempt.normalize(); + if (bounced) { + this.spinStrafeSign *= -1; + } + return true; + } + } + return false; + } + + private boolean trySpinMove(Vec3 direction, double yOffset, double verticalVelocity) { + Vec3 horizontalMove = new Vec3(direction.x * SPIN_MOVE_SPEED, 0.0D, direction.z * SPIN_MOVE_SPEED); + AABB movedBox = this.getBoundingBox().move(horizontalMove.x, yOffset, horizontalMove.z); + if (!this.level().noCollision(this, movedBox)) { + return false; + } + if (!this.hasSpinSupport(movedBox)) { + return false; + } + + this.setDeltaMovement(horizontalMove.x, verticalVelocity, horizontalMove.z); + this.hasImpulse = true; + return true; + } + + private boolean hasSpinSupport(AABB box) { + double probeY = box.minY - 0.2D; + double[][] probes = new double[][]{ + {box.getCenter().x, box.getCenter().z}, + {box.minX + 0.25D, box.minZ + 0.25D}, + {box.minX + 0.25D, box.maxZ - 0.25D}, + {box.maxX - 0.25D, box.minZ + 0.25D}, + {box.maxX - 0.25D, box.maxZ - 0.25D} + }; + + for (double[] probe : probes) { + BlockPos supportPos = BlockPos.containing(probe[0], probeY, probe[1]); + if (this.level().loadedAndEntityCanStandOnFace(supportPos, this, Direction.UP)) { + return true; + } + BlockPos lowerSupportPos = supportPos.below(); + if (this.level().loadedAndEntityCanStandOnFace(lowerSupportPos, this, Direction.UP)) { + return true; + } + } + return false; + } + + private Vec3 horizontalDirectionTo(Vec3 targetPos) { + Vec3 diff = targetPos.subtract(this.position()); + Vec3 horizontal = new Vec3(diff.x, 0.0D, diff.z); + return horizontal.lengthSqr() > 1.0E-4D ? horizontal.normalize() : Vec3.ZERO; + } + + private void lookInDirection(Vec3 direction) { + if (direction.lengthSqr() <= 1.0E-4D) { + return; + } + float yaw = (float) (net.minecraft.util.Mth.atan2(direction.z, direction.x) * (180.0D / Math.PI)) - 90.0F; + this.setYRot(yaw); + this.yBodyRot = yaw; + this.yHeadRot = yaw; + this.setYHeadRot(yaw); + } + + private static Vec3 rotateHorizontal(Vec3 direction, double degrees) { + if (direction.lengthSqr() <= 1.0E-4D) { + return Vec3.ZERO; + } + double radians = Math.toRadians(degrees); + double cos = Math.cos(radians); + double sin = Math.sin(radians); + double x = direction.x * cos - direction.z * sin; + double z = direction.x * sin + direction.z * cos; + return new Vec3(x, 0.0D, z).normalize(); + } + + private void beginSpinEnd() { + this.spinStartTicks = 0; + this.spinLoopTicks = 0; + if (this.spinEndTicks <= 0) { + this.spinEndTicks = SPIN_END_TOTAL_TICKS; + } + } + + private void stopSpinSequence() { + this.spinStartTicks = 0; + this.spinLoopTicks = 0; + this.spinEndTicks = 0; + this.spinLoopTotalTicks = 0; + this.spinDirection = Vec3.ZERO; + this.spinStrafeSign = 1; + this.spinStuckTicks = 0; + } + private Vec3 calcLaunchVelocity(Vec3 from, Vec3 to, double minSpeed) { Vec3 diff = to.subtract(from); double dh = Math.sqrt(diff.x * diff.x + diff.z * diff.z); @@ -618,22 +842,32 @@ public class ToreterrorEntity extends Monster implements GeoEntity { LivingEntity target = ToreterrorEntity.this.getTarget(); if (target == null || ToreterrorEntity.this.isInAttackAnimation()) return false; if (ToreterrorEntity.this.spinCooldown > 0) return false; - return ToreterrorEntity.this.distanceToSqr(target) <= CLOSE_RANGE_SQR && ToreterrorEntity.this.onGround(); + return ToreterrorEntity.this.distanceToSqr(target) <= SPIN_TRIGGER_RANGE_SQR && ToreterrorEntity.this.onGround(); } @Override public void start() { - ToreterrorEntity.this.spinAnimTicks = SPIN_TOTAL_TICKS; + LivingEntity target = ToreterrorEntity.this.getTarget(); + ToreterrorEntity.this.spinStartTicks = SPIN_START_TOTAL_TICKS; + ToreterrorEntity.this.spinLoopTotalTicks = SPIN_LOOP_MIN_TICKS + ToreterrorEntity.this.random.nextInt(SPIN_LOOP_MAX_TICKS - SPIN_LOOP_MIN_TICKS + 1); + ToreterrorEntity.this.spinLoopTicks = ToreterrorEntity.this.spinLoopTotalTicks; + ToreterrorEntity.this.spinEndTicks = 0; + ToreterrorEntity.this.spinStuckTicks = 0; + ToreterrorEntity.this.spinStrafeSign = ToreterrorEntity.this.random.nextBoolean() ? 1 : -1; + ToreterrorEntity.this.spinHitCooldowns.clear(); + ToreterrorEntity.this.spinDirection = target == null + ? Vec3.ZERO + : ToreterrorEntity.this.horizontalDirectionTo(target.position()); } @Override public boolean canContinueToUse() { - return ToreterrorEntity.this.spinAnimTicks > 0; + return ToreterrorEntity.this.isSpinSequenceActive(); } @Override public void stop() { - ToreterrorEntity.this.spinAnimTicks = 0; + ToreterrorEntity.this.stopSpinSequence(); } } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java index 90491c58..229c946b 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java @@ -5,8 +5,9 @@ import com.craisinlord.antarchy.content.AntarchyObjects; import com.craisinlord.antarchy.content.AntarchySoundEvents; import com.craisinlord.antarchy.content.damage.AntarchyDamageSources; import com.craisinlord.antarchy.content.entity.MissileSquidEntity; - +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; import com.craisinlord.antarchy.content.damage.AntarchyDamageTypes; + import java.util.List; import java.util.Objects; import net.minecraft.core.BlockPos; @@ -68,24 +69,28 @@ public class KrakenEntity extends Monster implements GeoEntity { private static final String ATTACK_COOLDOWN_KEY = "AttackCooldown"; private static final String ACTION_TICKS_KEY = "ActionTicks"; private static final String PHASE_TRANSITION_TICKS_KEY = "PhaseTransitionTicks"; - private static final String NEXT_ATTACK_INDEX_KEY = "NextAttackIndex"; - private static final String SLAM_COOLDOWN_KEY = "SlamCooldown"; private static final String PHASE_SUMMON_COOLDOWN_KEY = "PhaseSummonCooldown"; private static final String LAST_ATTACK_STATE_KEY = "LastAttackState"; private static final String AGGRO_TRIGGERED_KEY = "AggroTriggered"; private static final String GRAB_TARGET_KEY = "GrabTarget"; + private static final double BOSS_BAR_RANGE = 40.0D; + private static final int ATTACK_NONE = 0; private static final int ATTACK_GRAB = 1; - private static final int ATTACK_SWIPE = 2; - private static final int ATTACK_SLAM = 3; - private static final int ANIM_IDLE = 0; - private static final int ANIM_IDLE_TWO = 1; - private static final int ANIM_SWIM = 2; - private static final int ANIM_SWIPE = 3; - private static final int ANIM_GRAB = 4; + private static final int ATTACK_SWING_LEFT = 2; + private static final int ATTACK_SWING_RIGHT = 3; + + // Synced animation state values + private static final int ANIM_NONE = 0; + private static final int ANIM_CRY = 1; + private static final int ANIM_GRAB = 2; + private static final int ANIM_SWING_LEFT = 3; + private static final int ANIM_SWING_RIGHT = 4; private static final int ANIM_DEATH = 5; + private static final int DEATH_ANIM_TICKS = 60; + private static final ResourceLocation PHASE_TWO_SPEED_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "kraken_phase_two_speed"); private static final ResourceLocation PHASE_TWO_FLYING_SPEED_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "kraken_phase_two_flying_speed"); private static final ResourceLocation PHASE_TWO_DAMAGE_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "kraken_phase_two_damage"); @@ -96,21 +101,21 @@ public class KrakenEntity extends Monster implements GeoEntity { private static final AttributeModifier PHASE_TWO_DAMAGE = new AttributeModifier(PHASE_TWO_DAMAGE_ID, PHASE_TWO_DAMAGE_BONUS, AttributeModifier.Operation.ADD_VALUE); private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle"); - private static final RawAnimation SWIM_ANIM = RawAnimation.begin().thenLoop("swim"); - private static final RawAnimation SWIPE_ANIM = RawAnimation.begin().thenPlay("Swipe"); - private static final RawAnimation GRAB_ANIM = RawAnimation.begin().thenPlay("Grab"); - private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlay("Death"); + private static final RawAnimation CRY_ANIM = RawAnimation.begin().thenPlay("cry"); + private static final RawAnimation GRAB_ANIM = RawAnimation.begin().thenPlay("grab"); + private static final RawAnimation SWING_LEFT_ANIM = RawAnimation.begin().thenPlay("swing_left"); + private static final RawAnimation SWING_RIGHT_ANIM = RawAnimation.begin().thenPlay("swing_right"); + private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlay("death"); private final ServerBossEvent bossEvent = new ServerBossEvent(Component.literal("The Kraken"), BossEvent.BossBarColor.BLUE, BossEvent.BossBarOverlay.PROGRESS); private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + @Nullable private Vec3 patrolTarget; private int patrolRetargetTicks; private int attackCooldown; private int actionTicks; private int phaseTransitionTicks; - private int nextAttackIndex; - private int slamCooldown; private int phaseSummonCooldown; private int lastAttackState; private boolean aggroTriggered; @@ -121,6 +126,7 @@ public class KrakenEntity extends Monster implements GeoEntity { private int strafeRetargetTicks; private float orbitDirection = 1.0F; private boolean stormActive; + public KrakenEntity(EntityType entityType, Level level) { super(entityType, level); this.moveControl = new FlyingMoveControl(this, 20, true); @@ -149,7 +155,7 @@ public class KrakenEntity extends Monster implements GeoEntity { builder.define(ATTACK_STATE, ATTACK_NONE); builder.define(ROARING, false); builder.define(PHASE_TWO, false); - builder.define(ANIMATION_STATE, ANIM_IDLE); + builder.define(ANIMATION_STATE, ANIM_NONE); } @Override @@ -165,17 +171,26 @@ public class KrakenEntity extends Monster implements GeoEntity { @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { - controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController) + // idle_controller always loops idle; action_controller layers on top when active + controllers.add(new AnimationController<>(this, "idle_controller", 0, state -> { + if (this.getAnimationState() == ANIM_DEATH) { + return PlayState.STOP; + } + state.setAndContinue(IDLE_ANIM); + return PlayState.CONTINUE; + }).setSoundKeyframeHandler(new AutoPlayingSoundKeyframeHandler<>())); + controllers.add(new AnimationController<>(this, "action_controller", 0, this::actionAnimController) .setSoundKeyframeHandler(new AutoPlayingSoundKeyframeHandler<>())); } - private PlayState mainAnimController(AnimationState state) { + private PlayState actionAnimController(AnimationState state) { return switch (this.getAnimationState()) { + case ANIM_CRY -> state.setAndContinue(CRY_ANIM); case ANIM_GRAB -> state.setAndContinue(GRAB_ANIM); - case ANIM_SWIPE -> state.setAndContinue(SWIPE_ANIM); - case ANIM_SWIM -> state.setAndContinue(SWIM_ANIM); + case ANIM_SWING_LEFT -> state.setAndContinue(SWING_LEFT_ANIM); + case ANIM_SWING_RIGHT -> state.setAndContinue(SWING_RIGHT_ANIM); case ANIM_DEATH -> state.setAndContinue(DEATH_ANIM); - default -> state.setAndContinue(IDLE_ANIM); + default -> PlayState.STOP; }; } @@ -221,9 +236,6 @@ public class KrakenEntity extends Monster implements GeoEntity { if (this.attackCooldown > 0) { this.attackCooldown--; } - if (this.slamCooldown > 0) { - this.slamCooldown--; - } if (this.phaseSummonCooldown > 0) { this.phaseSummonCooldown--; } @@ -307,7 +319,8 @@ public class KrakenEntity extends Monster implements GeoEntity { if (source.is(DamageTypeTags.IS_FIRE) || source.is(DamageTypes.LIGHTNING_BOLT) || source.is(AntarchyDamageTypes.KRAKEN_LIGHTNING) - || source.getEntity() instanceof MissileSquidEntity) { + || source.getEntity() instanceof MissileSquidEntity + || source.getEntity() instanceof OctopusBombEntity) { return false; } @@ -351,8 +364,6 @@ public class KrakenEntity extends Monster implements GeoEntity { tag.putInt(ATTACK_COOLDOWN_KEY, this.attackCooldown); tag.putInt(ACTION_TICKS_KEY, this.actionTicks); tag.putInt(PHASE_TRANSITION_TICKS_KEY, this.phaseTransitionTicks); - tag.putInt(NEXT_ATTACK_INDEX_KEY, this.nextAttackIndex); - tag.putInt(SLAM_COOLDOWN_KEY, this.slamCooldown); tag.putInt(PHASE_SUMMON_COOLDOWN_KEY, this.phaseSummonCooldown); tag.putInt(LAST_ATTACK_STATE_KEY, this.lastAttackState); tag.putBoolean(AGGRO_TRIGGERED_KEY, this.aggroTriggered); @@ -374,8 +385,6 @@ public class KrakenEntity extends Monster implements GeoEntity { this.attackCooldown = tag.getInt(ATTACK_COOLDOWN_KEY); this.actionTicks = tag.getInt(ACTION_TICKS_KEY); this.phaseTransitionTicks = tag.getInt(PHASE_TRANSITION_TICKS_KEY); - this.nextAttackIndex = tag.getInt(NEXT_ATTACK_INDEX_KEY); - this.slamCooldown = tag.getInt(SLAM_COOLDOWN_KEY); this.phaseSummonCooldown = tag.getInt(PHASE_SUMMON_COOLDOWN_KEY); this.lastAttackState = tag.contains(LAST_ATTACK_STATE_KEY) ? tag.getInt(LAST_ATTACK_STATE_KEY) : ATTACK_NONE; this.aggroTriggered = tag.getBoolean(AGGRO_TRIGGERED_KEY); @@ -384,7 +393,7 @@ public class KrakenEntity extends Monster implements GeoEntity { this.entityData.set(ROARING, tag.getBoolean("Roaring")); this.entityData.set(ATTACK_STATE, tag.getInt("AttackState")); this.entityData.set(PHASE_TWO, tag.getBoolean("PhaseTwo")); - this.entityData.set(ANIMATION_STATE, tag.contains("AnimationState") ? tag.getInt("AnimationState") : ANIM_IDLE); + this.entityData.set(ANIMATION_STATE, tag.contains("AnimationState") ? tag.getInt("AnimationState") : ANIM_NONE); this.lightningStrikeCooldown = tag.getInt("LightningStrikeCooldown"); this.lightningAmbientCooldown = tag.getInt("LightningAmbientCooldown"); this.stormActive = false; @@ -475,7 +484,7 @@ public class KrakenEntity extends Monster implements GeoEntity { this.getLookControl().setLookAt(target, 25.0F, 20.0F); if (!this.spawnedPhaseMinions && this.phaseTransitionTicks <= 40) { - this.spawnPhaseMinions(1 + this.random.nextInt(2), true, target); + this.spawnMinions(1 + this.random.nextInt(2), target); this.spawnedPhaseMinions = true; } @@ -499,8 +508,8 @@ public class KrakenEntity extends Monster implements GeoEntity { switch (this.getAttackState()) { case ATTACK_GRAB -> this.tickGrabAttack(target); - case ATTACK_SWIPE -> this.tickSwipeAttack(); - case ATTACK_SLAM -> this.tickSlamAttack(); + case ATTACK_SWING_LEFT -> this.tickSwingAttack(false); + case ATTACK_SWING_RIGHT -> this.tickSwingAttack(true); default -> this.finishAttack(); } } @@ -512,12 +521,9 @@ public class KrakenEntity extends Monster implements GeoEntity { if (attackState == ATTACK_GRAB) { this.actionTicks = 55; this.playSound(AntarchySoundEvents.KRAKEN_ATTACK.get(), 1.45F, 0.9F); - } else if (attackState == ATTACK_SWIPE) { + } else if (attackState == ATTACK_SWING_LEFT || attackState == ATTACK_SWING_RIGHT) { this.actionTicks = 40; this.playSound(AntarchySoundEvents.KRAKEN_SPIN.get(), 1.3F, 0.95F); - } else if (attackState == ATTACK_SLAM) { - this.actionTicks = 34; - this.playSound(AntarchySoundEvents.KRAKEN_ATTACK.get(), 1.5F, 0.82F); } } @@ -545,19 +551,10 @@ public class KrakenEntity extends Monster implements GeoEntity { } } - private void tickSwipeAttack() { + // swingRight=true means ATTACK_SWING_RIGHT, which knocks players to the Kraken's LEFT + private void tickSwingAttack(boolean swingRight) { if (this.actionTicks == 10) { - this.performSwipe(); - } - - if (--this.actionTicks <= 0) { - this.finishAttack(); - } - } - - private void tickSlamAttack() { - if (this.actionTicks == 8) { - this.performTentacleSlam(); + this.performSwing(swingRight); } if (--this.actionTicks <= 0) { @@ -566,15 +563,12 @@ public class KrakenEntity extends Monster implements GeoEntity { } private void finishAttack() { - int finishedAttack = this.getAttackState(); + int finished = this.getAttackState(); this.setAttackState(ATTACK_NONE); this.actionTicks = 0; this.attackCooldown = this.isPhaseTwo() ? 12 : 18; this.grabbedTargetId = -1; - this.lastAttackState = finishedAttack; - if (finishedAttack == ATTACK_SLAM) { - this.slamCooldown = this.isPhaseTwo() ? 110 : 150; - } + this.lastAttackState = finished; this.updateAnimationState(); } @@ -614,96 +608,57 @@ public class KrakenEntity extends Monster implements GeoEntity { } private int chooseNextAttack(LivingEntity target) { - int[] attackRotation = new int[] {ATTACK_GRAB, ATTACK_SWIPE, ATTACK_SLAM}; - int[] weightedAttacks = new int[attackRotation.length]; - int[] weights = new int[attackRotation.length]; - int eligibleCount = 0; - int totalWeight = 0; + double distSqr = this.distanceToSqr(target); + boolean canGrab = distSqr <= 64.0D; + boolean canSwing = distSqr <= 81.0D; - for (int attack : attackRotation) { - if (!this.canUseAttack(attack, target)) { - continue; - } - - int weight = this.getAttackWeight(attack); - if (attack == this.lastAttackState) { - weight = Math.max(1, weight / 3); - } - if (weight <= 0) { - continue; - } - - weightedAttacks[eligibleCount] = attack; - weights[eligibleCount] = weight; - totalWeight += weight; - eligibleCount++; - } - - if (eligibleCount == 0) { + if (!canGrab && !canSwing) { return ATTACK_NONE; } - int roll = this.random.nextInt(totalWeight); - for (int i = 0; i < eligibleCount; i++) { - roll -= weights[i]; - if (roll < 0) { - return weightedAttacks[i]; - } + int grabWeight = canGrab ? (this.lastAttackState == ATTACK_GRAB ? 1 : 4) : 0; + int swingWeight = canSwing ? (this.isSwingAttack(this.lastAttackState) ? 1 : 5) : 0; + int total = grabWeight + swingWeight; + if (total == 0) { + return ATTACK_NONE; } - return weightedAttacks[eligibleCount - 1]; - } - - private int getAttackWeight(int attackState) { - return switch (attackState) { - case ATTACK_GRAB -> 4; - case ATTACK_SWIPE -> 5; - case ATTACK_SLAM -> this.isPhaseTwo() ? 1 : 0; - default -> 0; - }; - } - - private void tickPhaseTwoPressure(LivingEntity target) { - if (!this.isPhaseTwo() || this.phaseSummonCooldown > 0) { - return; + int roll = this.random.nextInt(total); + if (roll < grabWeight) { + return ATTACK_GRAB; } - if (this.countNearbyMissileSquids() >= 12) { - this.phaseSummonCooldown = 40; - return; - } - this.spawnPhaseMinions(1 + this.random.nextInt(2), true, target); - this.phaseSummonCooldown = 90 + this.random.nextInt(50); + return this.resolveSwingDirection(target); } - private int countNearbyMissileSquids() { - return this.level().getEntitiesOfClass( - MissileSquidEntity.class, - this.getBoundingBox().inflate(28.0D), - squid -> squid.isAlive() - ).size(); + private boolean isSwingAttack(int attackState) { + return attackState == ATTACK_SWING_LEFT || attackState == ATTACK_SWING_RIGHT; } - private boolean canUseAttack(int attackState, LivingEntity target) { - double distanceToTarget = this.distanceToSqr(target); - return switch (attackState) { - case ATTACK_GRAB -> distanceToTarget <= 64.0D; - case ATTACK_SWIPE -> distanceToTarget <= 81.0D && this.isTargetInFront(target, 0.1D); - case ATTACK_SLAM -> this.slamCooldown <= 0 && distanceToTarget <= 144.0D; - default -> false; - }; - } - - private boolean isTargetInFront(LivingEntity target, double minimumDot) { + // Determines left vs right based on which side the target is on relative to the Kraken. + // Kraken's right vector is forward x world-up. If target is on the Kraken's right side, + // use swing_right (which knocks them left). If on the left, use swing_left (knocks them right). + private int resolveSwingDirection(LivingEntity target) { Vec3 forward = this.getViewVector(1.0F); - Vec3 toTarget = target.position().subtract(this.position()).normalize(); - return forward.dot(toTarget) >= minimumDot; + Vec3 right = forward.cross(new Vec3(0, 1, 0)).normalize(); + Vec3 toTarget = target.position().subtract(this.position()); + return right.dot(toTarget) > 0 ? ATTACK_SWING_RIGHT : ATTACK_SWING_LEFT; } - private void performSwipe() { + private void performSwing(boolean swingRight) { AABB hitBox = this.getBoundingBox().inflate(7.0D, 3.0D, 7.0D); - List players = this.level().getEntitiesOfClass(Player.class, hitBox, player -> player.isAlive() && this.isTargetInFront(player, -0.15D)); + List players = this.level().getEntitiesOfClass(Player.class, hitBox, LivingEntity::isAlive); + float damage = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); + + Vec3 forward = this.getViewVector(1.0F); + // swingRight knocks to Kraken's left (-right), swingLeft knocks to Kraken's right (+right) + Vec3 right = forward.cross(new Vec3(0, 1, 0)).normalize(); + Vec3 knockDir = swingRight ? right.scale(-1) : right; + for (Player player : players) { - this.hurtAndKnockback(player, (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE), 1.75D, 0.45D); + if (!(this.level() instanceof ServerLevel serverLevel)) continue; + if (!player.hurt(AntarchyDamageSources.krakenMauling(serverLevel, this), damage)) continue; + player.push(knockDir.x * 1.75D, 0.4D, knockDir.z * 1.75D); + player.hurtMarked = true; } if (this.level() instanceof ServerLevel serverLevel) { @@ -711,19 +666,6 @@ public class KrakenEntity extends Monster implements GeoEntity { } } - private void performTentacleSlam() { - AABB hitBox = this.getBoundingBox().inflate(8.5D, 2.5D, 8.5D); - List players = this.level().getEntitiesOfClass(Player.class, hitBox, LivingEntity::isAlive); - float damage = (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE) * 0.75F; - for (Player player : players) { - this.hurtAndKnockback(player, damage, 1.35D, 0.62D); - } - - if (this.level() instanceof ServerLevel serverLevel) { - serverLevel.sendParticles(ParticleTypes.SPLASH, this.getX(), this.getY() + 0.5D, this.getZ(), 36, 1.8D, 0.5D, 1.8D, 0.12D); - } - } - private void holdGrabbedTarget(LivingEntity target) { Vec3 anchor = this.position() .add(this.getViewVector(1.0F).normalize().scale(this.getBbWidth() * 0.65D)) @@ -738,14 +680,6 @@ public class KrakenEntity extends Monster implements GeoEntity { target.hurtMarked = true; } - private void hurtAndKnockback(LivingEntity target, float damage, double horizontalStrength, double verticalStrength) { - if (!(this.level() instanceof ServerLevel serverLevel) || !target.hurt(AntarchyDamageSources.krakenMauling(serverLevel, this), damage)) { - return; - } - - this.knockAway(target, horizontalStrength, verticalStrength); - } - private void knockAway(LivingEntity target, double horizontalStrength, double verticalStrength) { Vec3 direction = target.position().subtract(this.position()); Vec3 horizontal = new Vec3(direction.x, 0.0D, direction.z); @@ -771,7 +705,25 @@ public class KrakenEntity extends Monster implements GeoEntity { return entity instanceof LivingEntity livingEntity ? livingEntity : null; } - private void spawnPhaseMinions(int desiredCount, boolean launched, @Nullable LivingEntity currentTarget) { + private void tickPhaseTwoPressure(LivingEntity target) { + if (!this.isPhaseTwo() || this.phaseSummonCooldown > 0) { + return; + } + if (this.countNearbyMinions() >= 12) { + this.phaseSummonCooldown = 40; + return; + } + this.spawnMinions(1 + this.random.nextInt(2), target); + this.phaseSummonCooldown = 90 + this.random.nextInt(50); + } + + private int countNearbyMinions() { + net.minecraft.world.phys.AABB range = this.getBoundingBox().inflate(28.0D); + return this.level().getEntitiesOfClass(OctopusBombEntity.class, range, OctopusBombEntity::isAlive).size() + + this.level().getEntitiesOfClass(MissileSquidEntity.class, range, MissileSquidEntity::isAlive).size(); + } + + private void spawnMinions(int desiredCount, @Nullable LivingEntity currentTarget) { if (!(this.level() instanceof ServerLevel serverLevel)) { return; } @@ -779,22 +731,23 @@ public class KrakenEntity extends Monster implements GeoEntity { int spawned = 0; for (int attempt = 0; attempt < desiredCount * 4 && spawned < desiredCount; attempt++) { - Vec3 spawnPos = this.findPhaseMinionSpawnPos(currentTarget); - MissileSquidEntity missileSquid = AntarchyObjects.MISSILE_SQUID.get().create(serverLevel); - if (missileSquid == null) { - continue; - } + Vec3 spawnPos = this.findBombSpawnPos(currentTarget); + boolean spawnBomb = this.random.nextBoolean(); - missileSquid.setCanFly(true); - missileSquid.setSpawnedByKraken(true); - missileSquid.moveTo(spawnPos.x, spawnPos.y, spawnPos.z, this.getYRot(), 0.0F); - serverLevel.addFreshEntity(missileSquid); - if (launched) { - missileSquid.launchAsProjectile(this, this.createPhaseMinionLaunchVelocity(spawnPos, currentTarget)); - } else if (currentTarget != null) { - missileSquid.setTarget(currentTarget); + if (spawnBomb) { + OctopusBombEntity bomb = AntarchyObjects.OCTOPUS_BOMB.get().create(serverLevel); + if (bomb == null) continue; + bomb.moveTo(spawnPos.x, spawnPos.y, spawnPos.z, this.getYRot(), 0.0F); + serverLevel.addFreshEntity(bomb); + bomb.launchAsProjectile(this, this.createBombLaunchVelocity(spawnPos, currentTarget)); + serverLevel.sendParticles(ParticleTypes.BUBBLE, bomb.getX(), bomb.getY() + 0.4D, bomb.getZ(), 14, 0.3D, 0.25D, 0.3D, 0.03D); + } else { + MissileSquidEntity squid = AntarchyObjects.MISSILE_SQUID.get().create(serverLevel); + if (squid == null) continue; + squid.moveTo(spawnPos.x, spawnPos.y, spawnPos.z, this.getYRot(), 0.0F); + serverLevel.addFreshEntity(squid); + serverLevel.sendParticles(ParticleTypes.BUBBLE, squid.getX(), squid.getY() + 0.4D, squid.getZ(), 14, 0.3D, 0.25D, 0.3D, 0.03D); } - serverLevel.sendParticles(ParticleTypes.BUBBLE, missileSquid.getX(), missileSquid.getY() + 0.4D, missileSquid.getZ(), 14, 0.3D, 0.25D, 0.3D, 0.03D); spawned++; } @@ -803,7 +756,7 @@ public class KrakenEntity extends Monster implements GeoEntity { } } - private Vec3 findPhaseMinionSpawnPos(@Nullable LivingEntity currentTarget) { + private Vec3 findBombSpawnPos(@Nullable LivingEntity currentTarget) { Vec3 anchor = currentTarget != null ? currentTarget.position() : this.position(); for (int attempt = 0; attempt < 18; attempt++) { double angle = this.random.nextDouble() * Mth.TWO_PI; @@ -822,7 +775,7 @@ public class KrakenEntity extends Monster implements GeoEntity { return this.position().add(0.0D, this.getBbHeight() * 0.6D, 0.0D); } - private Vec3 createPhaseMinionLaunchVelocity(Vec3 spawnPos, @Nullable LivingEntity currentTarget) { + private Vec3 createBombLaunchVelocity(Vec3 spawnPos, @Nullable LivingEntity currentTarget) { Vec3 aimPoint = currentTarget != null ? currentTarget.getEyePosition() : this.position().add(this.getViewVector(1.0F).scale(10.0D)); @@ -1043,14 +996,14 @@ public class KrakenEntity extends Monster implements GeoEntity { private void updateSwimRotation() { Vec3 velocity = this.getDeltaMovement(); if (velocity.horizontalDistanceSqr() > 1.0E-4D) { - float targetYaw = (float)(Mth.atan2(velocity.z, velocity.x) * (180.0D / Math.PI)) - 90.0F; + float targetYaw = (float) (Mth.atan2(velocity.z, velocity.x) * (180.0D / Math.PI)) - 90.0F; this.setYRot(Mth.approachDegrees(this.getYRot(), targetYaw, 6.0F)); this.yBodyRot = this.getYRot(); this.yHeadRot = this.getYRot(); } if (velocity.lengthSqr() > 1.0E-4D) { - float targetPitch = (float)(-(Mth.atan2(velocity.y, velocity.horizontalDistance()) * (180.0D / Math.PI))); + float targetPitch = (float) (-(Mth.atan2(velocity.y, velocity.horizontalDistance()) * (180.0D / Math.PI))); this.setXRot(Mth.approachDegrees(this.getXRot(), targetPitch, 4.0F)); } } @@ -1090,8 +1043,13 @@ public class KrakenEntity extends Monster implements GeoEntity { return; } - if (this.phaseTransitionTicks > 0 || this.isRoaring()) { - this.setAnimationState(ANIM_IDLE); + if (this.isRoaring()) { + this.setAnimationState(ANIM_CRY); + return; + } + + if (this.phaseTransitionTicks > 0) { + this.setAnimationState(ANIM_NONE); return; } @@ -1100,22 +1058,18 @@ public class KrakenEntity extends Monster implements GeoEntity { this.setAnimationState(ANIM_GRAB); return; } - case ATTACK_SWIPE, ATTACK_SLAM -> { - this.setAnimationState(ANIM_SWIPE); + case ATTACK_SWING_LEFT -> { + this.setAnimationState(ANIM_SWING_LEFT); + return; + } + case ATTACK_SWING_RIGHT -> { + this.setAnimationState(ANIM_SWING_RIGHT); return; } default -> { } } - Vec3 velocity = this.getDeltaMovement(); - double horizontalSpeedSqr = velocity.horizontalDistanceSqr(); - double verticalSpeedSqr = velocity.y * velocity.y; - if (horizontalSpeedSqr > 0.03D && horizontalSpeedSqr > verticalSpeedSqr * 2.5D) { - this.setAnimationState(ANIM_SWIM); - return; - } - - this.setAnimationState(this.isPhaseTwo() ? ANIM_IDLE_TWO : ANIM_IDLE); + this.setAnimationState(ANIM_NONE); } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java index 99958d6a..d9155e5a 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java @@ -20,28 +20,41 @@ public class ElythiaBiomeSource extends BiomeSource { Registries.BIOME, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "moleworm_caves") ); + private static final ResourceKey ELYTHIA_OCEAN = ResourceKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "elythia_ocean") + ); + private static final ResourceKey ELYTHIA_BEACH = ResourceKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "elythia_beach") + ); private static final int[] SURFACE_FALLBACK_BLOCK_YS = new int[]{192, 160, 128, 96, 64, 32, 0}; public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( MultiNoiseBiomeSource.DIRECT_CODEC.forGetter(ElythiaBiomeSource::parameters), Codec.INT.optionalFieldOf("moleworm_caves_max_y", 72).forGetter(ElythiaBiomeSource::molewormCavesMaxY), - Codec.INT.optionalFieldOf("surface_biome_sample_y", 160).forGetter(ElythiaBiomeSource::surfaceBiomeSampleY) + Codec.INT.optionalFieldOf("surface_biome_sample_y", 160).forGetter(ElythiaBiomeSource::surfaceBiomeSampleY), + Codec.INT.optionalFieldOf("ocean_max_y", 85).forGetter(ElythiaBiomeSource::oceanMaxY) ).apply(instance, ElythiaBiomeSource::new)); private final Climate.ParameterList> parameters; private final MultiNoiseBiomeSource delegate; private final int molewormCavesMaxY; private final int surfaceBiomeSampleY; + private final int oceanMaxY; private final int molewormCavesMaxQuartY; private final int surfaceBiomeSampleQuartY; + private final int oceanMaxQuartY; - public ElythiaBiomeSource(Climate.ParameterList> parameters, int molewormCavesMaxY, int surfaceBiomeSampleY) { + public ElythiaBiomeSource(Climate.ParameterList> parameters, int molewormCavesMaxY, int surfaceBiomeSampleY, int oceanMaxY) { this.parameters = parameters; this.delegate = MultiNoiseBiomeSource.createFromList(parameters); this.molewormCavesMaxY = molewormCavesMaxY; this.surfaceBiomeSampleY = surfaceBiomeSampleY; + this.oceanMaxY = oceanMaxY; this.molewormCavesMaxQuartY = QuartPos.fromBlock(molewormCavesMaxY); this.surfaceBiomeSampleQuartY = QuartPos.fromBlock(surfaceBiomeSampleY); + this.oceanMaxQuartY = QuartPos.fromBlock(oceanMaxY); } private Climate.ParameterList> parameters() { @@ -56,6 +69,10 @@ public class ElythiaBiomeSource extends BiomeSource { return this.surfaceBiomeSampleY; } + private int oceanMaxY() { + return this.oceanMaxY; + } + @Override protected MapCodec codec() { return CODEC; @@ -69,18 +86,31 @@ public class ElythiaBiomeSource extends BiomeSource { @Override public Holder getNoiseBiome(int x, int y, int z, Climate.Sampler sampler) { Holder biome = this.delegate.getNoiseBiome(x, y, z, sampler); - if (!biome.is(MOLEWORM_CAVES) || y <= this.molewormCavesMaxQuartY) { - return biome; + + // Cap moleworm caves below their max Y + if (biome.is(MOLEWORM_CAVES) && y > this.molewormCavesMaxQuartY) { + return resolveSurfaceFallback(x, y, z, sampler, MOLEWORM_CAVES); } + // Cap ocean/beach biomes above sea level — if terrain noise puts these biomes + // too high, replace with whatever surface biome would naturally be there + if ((biome.is(ELYTHIA_OCEAN) || biome.is(ELYTHIA_BEACH)) && y > this.oceanMaxQuartY) { + return resolveSurfaceFallback(x, y, z, sampler, ELYTHIA_OCEAN, ELYTHIA_BEACH); + } + + return biome; + } + + @SafeVarargs + private Holder resolveSurfaceFallback(int x, int y, int z, Climate.Sampler sampler, ResourceKey... excluded) { Holder fallback = this.delegate.getNoiseBiome(x, this.surfaceBiomeSampleQuartY, z, sampler); - if (!fallback.is(MOLEWORM_CAVES)) { + if (!isExcluded(fallback, excluded)) { return fallback; } for (int sampleBlockY : SURFACE_FALLBACK_BLOCK_YS) { Holder candidate = this.delegate.getNoiseBiome(x, QuartPos.fromBlock(sampleBlockY), z, sampler); - if (!candidate.is(MOLEWORM_CAVES)) { + if (!isExcluded(candidate, excluded)) { return candidate; } } @@ -88,9 +118,18 @@ public class ElythiaBiomeSource extends BiomeSource { return fallback; } + @SafeVarargs + private static boolean isExcluded(Holder biome, ResourceKey... excluded) { + for (ResourceKey key : excluded) { + if (biome.is(key)) return true; + } + return false; + } + @Override public void addDebugInfo(java.util.List debug, net.minecraft.core.BlockPos pos, Climate.Sampler sampler) { this.delegate.addDebugInfo(debug, pos, sampler); debug.add("Elythia mole cave cap: y<=" + this.molewormCavesMaxY); + debug.add("Elythia ocean cap: y<=" + this.oceanMaxY); } } diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/SquidzookaEnchantMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/SquidzookaEnchantMixin.java new file mode 100644 index 00000000..cecbfe67 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/SquidzookaEnchantMixin.java @@ -0,0 +1,72 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.item.SquidzookaItem; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Enchantment.class) +public abstract class SquidzookaEnchantMixin { + private static final Registry ENCHANTMENT_REGISTRY = resolveEnchantmentRegistry(); + + @Inject(method = "canEnchant", at = @At("HEAD"), cancellable = true) + private void antarchy$limitSquidzookaCrossbowEnchants(ItemStack stack, CallbackInfoReturnable cir) { + this.antarchy$applySquidzookaEnchantRules(stack, cir); + } + + @Inject(method = "isPrimaryItem", at = @At("HEAD"), cancellable = true) + private void antarchy$limitSquidzookaPrimaryItem(ItemStack stack, CallbackInfoReturnable cir) { + this.antarchy$applySquidzookaEnchantRules(stack, cir); + } + + @Inject(method = "isSupportedItem", at = @At("HEAD"), cancellable = true) + private void antarchy$limitSquidzookaSupportedItem(ItemStack stack, CallbackInfoReturnable cir) { + this.antarchy$applySquidzookaEnchantRules(stack, cir); + } + + private void antarchy$applySquidzookaEnchantRules(ItemStack stack, CallbackInfoReturnable cir) { + if (!(stack.getItem() instanceof SquidzookaItem)) { + return; + } + + if (ENCHANTMENT_REGISTRY == null) { + return; + } + + Enchantment enchantment = (Enchantment) (Object) this; + ResourceLocation enchantmentId = ENCHANTMENT_REGISTRY.getKey(enchantment); + if (enchantmentId == null) { + return; + } + + if (enchantmentId.equals(Enchantments.MULTISHOT.location())) { + cir.setReturnValue(true); + return; + } + + if (enchantmentId.equals(Enchantments.QUICK_CHARGE.location()) + || enchantmentId.equals(Enchantments.PIERCING.location())) { + cir.setReturnValue(false); + } + } + + @SuppressWarnings("unchecked") + private static Registry resolveEnchantmentRegistry() { + try { + return (Registry) BuiltInRegistries.class.getField("ENCHANTMENT").get(null); + } catch (ReflectiveOperationException primary) { + try { + return (Registry) BuiltInRegistries.class.getField("ENCHANTMENTS").get(null); + } catch (ReflectiveOperationException ignored) { + return null; + } + } + } +} diff --git a/common/src/main/resources/antarchy-common.mixins.json b/common/src/main/resources/antarchy-common.mixins.json index d2dbc9ae..f597f485 100644 --- a/common/src/main/resources/antarchy-common.mixins.json +++ b/common/src/main/resources/antarchy-common.mixins.json @@ -12,6 +12,7 @@ "FireVisualEntityMixin", "GlowVinesUnderLeavesMixin", "ServerPlayerGameModeMixin", + "SquidzookaEnchantMixin", "StinkyLivingEntityMixin", "TorchflowerBlockStateMixin", "gravity.AbstractArrowGravityMixin", diff --git a/common/src/main/resources/assets/antarchy/animations/kraken.animation.json b/common/src/main/resources/assets/antarchy/animations/kraken.animation.json index 0a7dc29c..4401a478 100644 --- a/common/src/main/resources/assets/antarchy/animations/kraken.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/kraken.animation.json @@ -4,6 +4,11 @@ "idle": { "loop": true, "animation_length": 4, + "sound_effects": { + "0.0": { + "effect": "antarchy:kraken_flying_loop|0.45|1.0" + } + }, "bones": { "l_shoulder": { "rotation": { diff --git a/common/src/main/resources/assets/antarchy/animations/octopus_bomb.animation.json b/common/src/main/resources/assets/antarchy/animations/octopus_bomb.animation.json index 01241865..fe841375 100644 --- a/common/src/main/resources/assets/antarchy/animations/octopus_bomb.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/octopus_bomb.animation.json @@ -203,7 +203,7 @@ "animation_length": 2.5, "sound_effects": { "0.0": { - "effect": "antarchy:kraken_flying_loop|0.45|1.0" + "effect": "antarchy:kraken_flying_loop|0.45|1.19" } }, "bones": { @@ -10276,7 +10276,7 @@ "animation_length": 1, "sound_effects": { "0.0": { - "effect": "antarchy:kraken_flying_sideways_loop|0.45|1.0" + "effect": "antarchy:kraken_flying_sideways_loop|0.45|1.19" } }, "bones": { 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 064d2985..f75c3604 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 @@ -3,137 +3,188 @@ "animations": { "idle": { "loop": true, - "animation_length": 2.5, + "animation_length": 2, "bones": { - "body": { + "root": { "position": { "0.0": { "post": { "vector": [0, 0.5, 0] }, "lerp_mode": "catmullrom" - }, - "2.5": { + } + } + }, + "body": { + "rotation": { + "0.0": { "post": { - "vector": [0, 0.5, 0] + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -0.5, 0] }, "lerp_mode": "catmullrom" } } }, - "antenna": { + "r_antenna": { "rotation": { "0.0": { "post": { - "vector": [40, 0, 0] + "vector": [0, 0, -7.5] }, "lerp_mode": "catmullrom" }, - "1.25": { + "1.0": { "post": { - "vector": [50, 0, 0] + "vector": [0.66778, -2.51027, -22.28928] }, "lerp_mode": "catmullrom" }, - "2.5": { + "2.0": { "post": { - "vector": [40, 0, 0] + "vector": [0, 0, -7.5] }, "lerp_mode": "catmullrom" } } }, - "frontLeftLeg": { + "r_antenna2": { "rotation": { "0.0": { "post": { - "vector": [0, 0, -10] + "vector": [0, 0, -135] }, "lerp_mode": "catmullrom" }, - "2.5": { + "1.2083": { "post": { - "vector": [0, 0, -10] + "vector": [1.12732, 1.85014, -147.29336] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, -135] }, "lerp_mode": "catmullrom" } } }, - "middleLeftLeg": { + "l_antenna": { "rotation": { "0.0": { "post": { - "vector": [0, 0, -10] + "vector": [0, 0, 7.5] }, "lerp_mode": "catmullrom" }, - "2.5": { + "1.0": { "post": { - "vector": [0, 0, -10] + "vector": [0.66778, 2.51027, 22.28928] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 7.5] }, "lerp_mode": "catmullrom" } } }, - "backLeftLeg": { + "l_antenna2": { "rotation": { "0.0": { "post": { - "vector": [0, 0, -10] + "vector": [0, 0, 135] }, "lerp_mode": "catmullrom" }, - "2.5": { + "1.2083": { "post": { - "vector": [0, 0, -10] + "vector": [1.12732, -1.85014, 147.29336] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 135] }, "lerp_mode": "catmullrom" } } }, - "frontRightLeg": { + "right_leg": { + "rotation": { + "vector": [0, 0, -22.5] + } + }, + "right_leg_back": { "rotation": { "0.0": { "post": { - "vector": [0, 0, 10] - }, - "lerp_mode": "catmullrom" - }, - "2.5": { - "post": { - "vector": [0, 0, 10] + "vector": [-9.00717, 20.70481, -24.14867] }, "lerp_mode": "catmullrom" } } }, - "middleRightLeg": { + "right_leg_front": { "rotation": { - "0.0": { - "post": { - "vector": [0, 0, 10] - }, - "lerp_mode": "catmullrom" - }, - "2.5": { - "post": { - "vector": [0, 0, 10] - }, - "lerp_mode": "catmullrom" - } + "vector": [9.00717, -20.70481, -24.14867] } }, - "backRightLeg": { + "left_leg_front": { + "rotation": { + "vector": [9.00717, 20.70481, 24.14867] + } + }, + "left_leg": { + "rotation": { + "vector": [0, 0, 22.5] + } + }, + "left_leg_back": { + "rotation": { + "vector": [-9.00717, -20.70481, 24.14867] + } + }, + "head": { "rotation": { "0.0": { "post": { - "vector": [0, 0, 10] + "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" }, - "2.5": { + "1.0": { "post": { - "vector": [0, 0, 10] + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" } @@ -143,29 +194,9 @@ }, "walk": { "loop": true, - "animation_length": 1, + "animation_length": 0.5, "bones": { - "body": { - "rotation": { - "0.0": { - "post": { - "vector": [0, -5, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [0, 5, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [0, -5, 0] - }, - "lerp_mode": "catmullrom" - } - }, + "root": { "position": { "0.0": { "post": { @@ -175,69 +206,17 @@ } } }, - "antenna": { + "body": { "rotation": { "0.0": { "post": { - "vector": [40, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { - "post": { - "vector": [50, 0, 0] + "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [40, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [50, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [40, 0, 0] - }, - "lerp_mode": "catmullrom" - } - } - }, - "frontLeftLeg": { - "rotation": { - "0.0": { - "post": { - "vector": [9.9108, -44.4038, -14.137] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { - "post": { - "vector": [0, 0, -10] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [-9.9108, 44.4038, -14.137] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [0, 0, 18.36] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [9.9108, -44.4038, -14.137] + "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" } @@ -245,65 +224,341 @@ "position": { "0.0": { "post": { - "vector": [0.75, 0, 0] + "vector": [0, -0.5, 0] }, "lerp_mode": "catmullrom" }, "0.25": { "post": { - "vector": [0, 0, 0] + "vector": [0, -1, 0] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [0.75, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [0.75, 0, 0] + "vector": [0, -0.5, 0] }, "lerp_mode": "catmullrom" } } }, - "middleLeftLeg": { + "r_antenna": { "rotation": { "0.0": { "post": { - "vector": [0, 0, -10] + "vector": [0, 0, -7.5] }, "lerp_mode": "catmullrom" }, "0.25": { "post": { - "vector": [-9.9108, 44.4038, -14.137] + "vector": [0, 0, -25] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [0, 0, 18.36] + "vector": [0, 0, -7.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_antenna2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -135] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.2917": { "post": { - "vector": [9.9108, -44.4038, -14.137] + "vector": [0, 0, -120] }, "lerp_mode": "catmullrom" }, - "1.0": { + "0.5": { "post": { - "vector": [0, 0, -10] + "vector": [0, 0, -135] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_antenna": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 7.5] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 25] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 7.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_antenna2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 135] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0, 120] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 135] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-20.94102, 40.78947, -30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [20.94102, -40.78947, -30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-20.94102, 40.78947, -30.36119] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg_back": { + "rotation": { + "0.0": { + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-20.94102, 40.78947, -30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg_front": { + "rotation": { + "0.0": { + "post": { + "vector": [20.94102, -40.78947, -30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-20.94102, 40.78947, -30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [20.94102, -40.78947, -30.36119] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg_front": { + "rotation": { + "0.0": { + "post": { + "vector": [-20.94102, -40.78947, 30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [20.94102, 40.78947, 30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-20.94102, -40.78947, 30.36119] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-20.94102, -40.78947, 30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg_back": { + "rotation": { + "0.0": { + "post": { + "vector": [-20.94102, -40.78947, 30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [20.94102, 40.78947, 30.36119] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-20.94102, -40.78947, 30.36119] + }, + "lerp_mode": "catmullrom" + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "fart": { + "loop": true, + "animation_length": 1.5, + "bones": { + "root": { + "position": { + "0.0": { + "post": { + "vector": [0, 0.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [0, 2.5, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 0.49, -1.99] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0.5, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "body": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-152.84, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" } @@ -311,297 +566,380 @@ "position": { "0.0": { "post": { - "vector": [0, 0, 0] + "vector": [0, -0.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, -0.25, 0] }, "lerp_mode": "catmullrom" }, "0.25": { "post": { - "vector": [0.75, 0, 0] + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0.25, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0.25, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0.25, -0.25, 0] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [0, 0, 0] + "vector": [0, 1.75, -1] }, "lerp_mode": "catmullrom" }, - "0.75": { + "1.2083": { "post": { - "vector": [0.75, 0, 0] + "vector": [-0.01, -0.97, 0] }, "lerp_mode": "catmullrom" }, - "1.0": { + "1.5": { "post": { - "vector": [0, 0, 0] + "vector": [0, -0.5, 0] }, "lerp_mode": "catmullrom" } } }, - "backLeftLeg": { + "r_antenna": { "rotation": { "0.0": { "post": { - "vector": [-9.9108, 44.4038, -14.137] + "vector": [0, 0, -7.5] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 0, -42.5] }, "lerp_mode": "catmullrom" }, "0.25": { "post": { - "vector": [0, 0, 18.36] + "vector": [0, 0, -42.5] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [9.9108, -44.4038, -14.137] + "vector": [0, 0, -42.5] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.5417": { "post": { "vector": [0, 0, -10] }, "lerp_mode": "catmullrom" }, - "1.0": { + "1.5": { "post": { - "vector": [-9.9108, 44.4038, -14.137] - }, - "lerp_mode": "catmullrom" - } - }, - "position": { - "0.0": { - "post": { - "vector": [0.75, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [0.75, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [0.75, 0, 0] + "vector": [0, 0, -7.5] }, "lerp_mode": "catmullrom" } } }, - "frontRightLeg": { + "r_antenna2": { "rotation": { "0.0": { "post": { - "vector": [-9.9108, -44.4038, 14.137] + "vector": [0, 0, -135] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 0, -135] }, "lerp_mode": "catmullrom" }, "0.25": { "post": { - "vector": [0, 0, -18.36] + "vector": [0, 0, -135] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [9.9108, 44.4038, 14.137] + "vector": [0, 0, -135] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.5417": { "post": { "vector": [0, 0, 10] }, "lerp_mode": "catmullrom" }, - "1.0": { + "1.5": { "post": { - "vector": [-9.9108, -44.4038, 14.137] - }, - "lerp_mode": "catmullrom" - } - }, - "position": { - "0.0": { - "post": { - "vector": [-0.75, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [-0.75, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [-0.75, 0, 0] + "vector": [0, 0, -135] }, "lerp_mode": "catmullrom" } } }, - "middleRightLeg": { + "l_antenna": { "rotation": { "0.0": { "post": { - "vector": [0, 0, -18.36] + "vector": [0, 0, 7.5] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 0, 42.5] }, "lerp_mode": "catmullrom" }, "0.25": { "post": { - "vector": [9.9108, 44.4038, 14.137] + "vector": [0, 0, 42.5] }, "lerp_mode": "catmullrom" }, "0.5": { + "post": { + "vector": [0, 0, 42.5] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { "post": { "vector": [0, 0, 10] }, "lerp_mode": "catmullrom" }, - "0.75": { + "1.5": { "post": { - "vector": [-9.9108, -44.4038, 14.137] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [0, 0, -18.36] - }, - "lerp_mode": "catmullrom" - } - }, - "position": { - "0.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { - "post": { - "vector": [-0.75, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [-0.75, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [0, 0, 0] + "vector": [0, 0, 7.5] }, "lerp_mode": "catmullrom" } } }, - "backRightLeg": { + "l_antenna2": { "rotation": { "0.0": { "post": { - "vector": [9.9108, 44.4038, 14.137] + "vector": [0, 0, 135] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 0, 135] }, "lerp_mode": "catmullrom" }, "0.25": { "post": { - "vector": [0, 0, 10] + "vector": [0, 0, 135] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [-9.9108, -44.4038, 14.137] + "vector": [0, 0, 135] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.5417": { "post": { - "vector": [0, 0, -18.36] + "vector": [0, 0, -10] }, "lerp_mode": "catmullrom" }, - "1.0": { + "1.5": { "post": { - "vector": [9.9108, 44.4038, 14.137] + "vector": [0, 0, 135] }, "lerp_mode": "catmullrom" } + } + }, + "right_leg": { + "rotation": { + "vector": [0, 0, -22.5] + } + }, + "right_leg_back": { + "rotation": { + "0.0": { + "post": { + "vector": [-9.00717, 20.70481, -24.14867] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg_front": { + "rotation": { + "0.0": { + "vector": [9.00717, -20.70481, -24.14867] + }, + "0.25": { + "vector": [9.00717, -20.70481, -24.14867] + }, + "1.25": { + "vector": [9.00717, -20.70481, -24.14867] + } }, "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 1, 0] + }, + "1.25": { + "vector": [0, 0, 0] + } + } + }, + "left_leg_front": { + "rotation": { + "0.0": { + "vector": [9.00717, 20.70481, 24.14867] + }, + "0.25": { + "vector": [9.00717, 20.70481, 24.14867] + }, + "1.25": { + "vector": [9.00717, 20.70481, 24.14867] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 1, 0] + }, + "1.25": { + "vector": [0, 0, 0] + } + } + }, + "left_leg": { + "rotation": { + "vector": [0, 0, 22.5] + } + }, + "left_leg_back": { + "rotation": { + "vector": [-9.00717, -20.70481, 24.14867] + } + }, + "right_eye": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.1667": { + "vector": [1, 0.3, 1] + }, + "0.25": { + "vector": [1, 0.3, 1] + }, + "1.5": { + "vector": [1, 1, 1] + } + } + }, + "left_eye": { + "scale": { + "0.1667": { + "vector": [1, 0.3, 1] + }, + "0.25": { + "vector": [1, 0.3, 1] + } + } + }, + "head": { + "rotation": { "0.0": { "post": { - "vector": [-0.75, 0, 0] + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [17.5, 0, 0] }, "lerp_mode": "catmullrom" }, "0.25": { "post": { - "vector": [0, 0, 0] + "vector": [17.5, 0, 0] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [-0.75, 0, 0] + "vector": [132.55, 0, 0] }, "lerp_mode": "catmullrom" }, - "0.75": { + "0.5417": { + "post": { + "vector": [-30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [11.12, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { "post": { "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [-0.75, 0, 0] - }, - "lerp_mode": "catmullrom" } } } diff --git a/common/src/main/resources/assets/antarchy/animations/termite.animation.json b/common/src/main/resources/assets/antarchy/animations/termite.animation.json new file mode 100644 index 00000000..77ba7fc5 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/animations/termite.animation.json @@ -0,0 +1,1836 @@ +{ + "format_version": "1.8.0", + "animations": { + "idle": { + "loop": true, + "animation_length": 4, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "abdomen": { + "rotation": { + "0.0": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 37.5] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 37.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg3": { + "rotation": { + "0.0": { + "post": { + "vector": [-15.84766, -19.58991, 40.25298] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-15.84766, -19.58991, 40.25298] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg4": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg5": { + "rotation": { + "0.0": { + "post": { + "vector": [14.15251, 17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [14.15251, 17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg6": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -37.5] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, -37.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg3": { + "rotation": { + "0.0": { + "post": { + "vector": [-15.84766, 19.58991, -40.25298] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-15.84766, 19.58991, -40.25298] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg4": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg5": { + "rotation": { + "0.0": { + "post": { + "vector": [14.15251, -17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [14.15251, -17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg6": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_mandibule": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0.17875, 0.10358, 1.61888] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_mandibule": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0.17875, -0.10358, -1.61888] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_antenna": { + "rotation": { + "vector": [0, -22.5, 0] + } + }, + "r_antenna": { + "rotation": { + "vector": [0, 22.5, 0] + } + } + } + }, + "dance": { + "loop": true, + "animation_length": 1.5, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-13.85813, -24.26239, 5.93679] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-13.85813, -24.26239, 5.93679] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-24.00312, 18.43745, -15.27944] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [-24.00312, 18.43745, -15.27944] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "thorax": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, -10, 0] + }, + "0.5": { + "vector": [0, -10, 0] + }, + "0.75": { + "vector": [0, 0, 0] + }, + "1.5": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "abdomen": { + "rotation": { + "0.0": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [9.72631, 0.45349, -2.99327] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [9.72631, 0.45349, -2.99327] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [12.5, -12.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [12.5, -12.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 37.5] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 37.5] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 37.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg3": { + "rotation": { + "0.0": { + "post": { + "vector": [-15.84766, -19.58991, 40.25298] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-15.84766, -19.58991, 40.25298] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [-15.84766, -19.58991, 40.25298] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg4": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg5": { + "rotation": { + "0.0": { + "post": { + "vector": [14.15251, 17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [14.15251, 17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [14.15251, 17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg6": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -37.5] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -37.5] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, -37.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg3": { + "rotation": { + "0.0": { + "post": { + "vector": [-15.84766, 19.58991, -40.25298] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-15.84766, 19.58991, -40.25298] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [-15.84766, 19.58991, -40.25298] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg4": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg5": { + "rotation": { + "0.0": { + "post": { + "vector": [14.15251, -17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [14.15251, -17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [14.15251, -17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg6": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Termite": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, -7.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -7.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 12.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 12.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_mandibule": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-0.61003, 22.29711, -3.09472] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_mandibule": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-0.47532, -19.82169, 2.71994] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_antenna": { + "rotation": { + "vector": [0, -22.5, 0] + } + }, + "r_antenna": { + "rotation": { + "vector": [0, 22.5, 0] + } + } + } + }, + "walk": { + "loop": true, + "animation_length": 0.5, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "thorax": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + } + } + }, + "abdomen": { + "rotation": { + "0.0": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [31.33144, 34.12398, 47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [31.33144, 34.12398, 47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-14.15251, -17.67415, 62.21128] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [5.74672, 4.98753, 33.20458] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [31.33144, 34.12398, 47.33883] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg3": { + "rotation": { + "0.0": { + "post": { + "vector": [-33.59794, -35.79744, 48.63781] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [12.49325, 15.74419, 39.23412] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-33.59794, -35.79744, 48.63781] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg4": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg5": { + "rotation": { + "0.0": { + "post": { + "vector": [-30.04912, -35.07869, 44.72041] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [29.82269, 35.55522, 45.05671] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-30.04912, -35.07869, 44.72041] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg6": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-14.15251, 17.67415, -62.21128] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [5.74672, -4.98753, -33.20458] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [31.33144, -34.12398, -47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [31.33144, -34.12398, -47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-14.15251, 17.67415, -62.21128] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg3": { + "rotation": { + "0.0": { + "post": { + "vector": [12.49325, -15.74419, -39.23412] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-33.59794, 35.79744, -48.63781] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [12.49325, -15.74419, -39.23412] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg4": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg5": { + "rotation": { + "0.0": { + "post": { + "vector": [29.82269, -35.55522, -45.05671] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-30.04912, 35.07869, -44.72041] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [29.82269, -35.55522, -45.05671] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg6": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Termite": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_mandibule": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_mandibule": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_antenna": { + "rotation": { + "vector": [0, -22.5, 0] + } + }, + "r_antenna": { + "rotation": { + "vector": [0, 22.5, 0] + } + } + } + }, + "attack": { + "loop": true, + "animation_length": 1, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [-20, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-20, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "thorax": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "abdomen": { + "rotation": { + "0.0": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [19.92514, 0.26438, -1.96682] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [19.92514, 0.26438, -1.96682] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 37.5] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-14.15251, -17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-14.15251, -17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 37.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg3": { + "rotation": { + "0.0": { + "post": { + "vector": [-15.84766, -19.58991, 40.25298] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-33.59794, -35.79744, 48.63781] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-33.59794, -35.79744, 48.63781] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-15.84766, -19.58991, 40.25298] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg4": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg5": { + "rotation": { + "0.0": { + "post": { + "vector": [14.15251, 17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [31.33144, 34.12398, 47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [31.33144, 34.12398, 47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [31.33144, 34.12398, 47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [31.33144, 34.12398, 47.33883] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [14.15251, 17.67415, 39.71128] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_leg6": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, -115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -37.5] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-14.15251, 17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-14.15251, 17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, -37.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg3": { + "rotation": { + "0.0": { + "post": { + "vector": [-15.84766, 19.58991, -40.25298] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-33.59794, 35.79744, -48.63781] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-33.59794, 35.79744, -48.63781] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-15.84766, 19.58991, -40.25298] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg4": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg5": { + "rotation": { + "0.0": { + "post": { + "vector": [14.15251, -17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [31.33144, -34.12398, -47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [31.33144, -34.12398, -47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [31.33144, -34.12398, -47.33883] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [31.33144, -34.12398, -47.33883] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [14.15251, -17.67415, -39.71128] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_leg6": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 115] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Termite": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -3] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -3] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_mandibule": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [-0.27472, 52.98677, 1.40178] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-0.27472, 52.98677, 1.40178] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-2.2516, -39.58992, 6.25038] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-2.2516, -39.58992, 6.25038] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-0.17995, -12.39135, 1.6575] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_mandibule": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [-0.27472, -52.98677, -1.40178] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-0.27472, -52.98677, -1.40178] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-2.2516, 39.58992, -6.25038] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-2.2516, 39.58992, -6.25038] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-0.06397, 7.43547, -0.98448] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_antenna": { + "rotation": { + "vector": [0, -22.5, 0] + } + }, + "r_antenna": { + "rotation": { + "vector": [0, 22.5, 0] + } + } + } + } + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/animations/toreterror.animation.json b/common/src/main/resources/assets/antarchy/animations/toreterror.animation.json index 0f9ee2ff..d0a2525b 100644 --- a/common/src/main/resources/assets/antarchy/animations/toreterror.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/toreterror.animation.json @@ -2134,297 +2134,52 @@ } }, "spin_attack": { - "animation_length": 2, + "loop": true, + "animation_length": 0.2917, "bones": { - "Jaw": { - "rotation": { - "0.0": { - "post": { - "vector": [7.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [7.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [7.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [7.5, 0, 0] - }, - "lerp_mode": "catmullrom" - } - } - }, - "Head": { - "rotation": { - "0.0": { - "post": { - "vector": [-50, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [-50, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [-50, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.375": { - "post": { - "vector": [12.40552, -0.42671, -3.86532] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [-50, 0, 0] - }, - "lerp_mode": "catmullrom" - } - } - }, - "Torso": { - "rotation": { - "0.0": { - "post": { - "vector": [12.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [12.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [12.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [12.5, 0, 0] - }, - "lerp_mode": "catmullrom" - } - } - }, "R_arm": { "rotation": { "0.0": { - "post": { - "vector": [3.42896, -5.43394, -46.98263] - }, - "lerp_mode": "catmullrom" - }, - "0.1667": { "post": { "vector": [-40.03828, -6.42252, -14.31771] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [-40.03828, -6.42252, -14.31771] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [-40.03828, -6.42252, -14.31771] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [3.42896, -5.43394, -46.98263] - }, - "lerp_mode": "catmullrom" } }, "position": { "0.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.1667": { "post": { "vector": [0, -8.42649, 7.07066] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [0, -8.42649, 7.07066] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [0, -8.42649, 7.07066] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" } } }, "R_arm2": { "rotation": { "0.0": { - "post": { - "vector": [-12.73916, -59.16159, 14.75144] - }, - "lerp_mode": "catmullrom" - }, - "0.1667": { "post": { "vector": [-7.46814, -29.5764, 7.46814] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [-7.46814, -29.5764, 7.46814] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [-7.46814, -29.5764, 7.46814] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [-12.73916, -59.16159, 14.75144] - }, - "lerp_mode": "catmullrom" } } }, "Shell": { "rotation": { "0.0": { - "post": { - "vector": [-5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.0833": { - "post": { - "vector": [20, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.125": { - "post": { - "vector": [30, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { "post": { "vector": [12.5, 0, 0] }, "lerp_mode": "catmullrom" - }, - "0.2917": { - "post": { - "vector": [17.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [17.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0833": { - "post": { - "vector": [39.04, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [17.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.375": { - "post": { - "vector": [29.9, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [-27.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.625": { - "post": { - "vector": [-7.5, 0, 0] - }, - "lerp_mode": "catmullrom" } }, "position": { "0.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { "post": { "vector": [0, -0.64279, -0.76604] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [0, -0.64279, -0.76604] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [0, -0.64279, -0.76604] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" } } }, @@ -2436,383 +2191,81 @@ }, "lerp_mode": "catmullrom" }, - "0.1667": { - "post": { - "vector": [37.5, 1.20877, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.2917": { - "post": { - "vector": [37.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.4167": { + "0.125": { "post": { "vector": [39.4, -452.04, 0] }, "lerp_mode": "catmullrom" }, - "0.5": { + "0.2083": { "post": { "vector": [12.5, -720, 0] }, "lerp_mode": "catmullrom" }, - "0.5833": { + "0.2917": { "post": { "vector": [38.06, -725.19, 0] }, "lerp_mode": "catmullrom" - }, - "0.7083": { - "post": { - "vector": [12.5, -682.5, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [12.5, -682.5, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.9583": { - "post": { - "vector": [37.5, -345, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0417": { - "post": { - "vector": [38.33, -95, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0833": { - "post": { - "vector": [12.5, -7.5, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [12.5, -7.5, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [37.5, 0, 0] - }, - "lerp_mode": "catmullrom" } }, "position": { "0.0": { - "post": { - "vector": [0, -1.25, 15] - }, - "lerp_mode": "catmullrom" - }, - "0.1667": { "post": { "vector": [0, -29.25, 15] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [0, -29.25, 15] - }, - "lerp_mode": "catmullrom" - }, - "1.0833": { - "post": { - "vector": [0, -29.25, -48] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [0, -29.25, -48] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [0, -1.25, -28] - }, - "lerp_mode": "catmullrom" } } }, "L_arm": { "rotation": { "0.0": { - "post": { - "vector": [3.42896, 5.43394, 46.98263] - }, - "lerp_mode": "catmullrom" - }, - "0.1667": { "post": { "vector": [-40.03828, 6.42252, 14.31771] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [-40.03828, 6.42252, 14.31771] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [-40.03828, 6.42252, 14.31771] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [3.42896, 5.43394, 46.98263] - }, - "lerp_mode": "catmullrom" } } }, "L_arm2": { "rotation": { "0.0": { - "post": { - "vector": [-12.73916, 59.16159, -14.75144] - }, - "lerp_mode": "catmullrom" - }, - "0.1667": { "post": { "vector": [-6.91252, -20.07846, -1.38281] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [-6.91252, -20.07846, -1.38281] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [-6.91252, -20.07846, -1.38281] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [-12.73916, 59.16159, -14.75144] - }, - "lerp_mode": "catmullrom" } } }, "R-Leg": { - "rotation": { - "0.0": { - "post": { - "vector": [-37.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [-37.5, 0, 0] - }, - "lerp_mode": "catmullrom" - } - }, - "position": { - "0.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.0833": { - "post": { - "vector": [1, 7.14018, 5.47885] - }, - "lerp_mode": "catmullrom" - }, - "1.3333": { - "post": { - "vector": [6.05456, 12.07085, 4.02709] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - } - }, "scale": { "0.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.2083": { "post": { "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" } } }, "L-Leg": { - "rotation": { - "0.0": { - "post": { - "vector": [-37.5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [-37.5, 0, 0] - }, - "lerp_mode": "catmullrom" - } - }, - "position": { - "0.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.0833": { - "post": { - "vector": [-1, 7.14018, 5.47885] - }, - "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [-1, 7.14018, 5.47885] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [-1, 7.14018, 5.47885] - }, - "lerp_mode": "catmullrom" - }, - "1.3333": { - "post": { - "vector": [-0.7, 11.60171, 6.24351] - }, - "lerp_mode": "catmullrom" - }, - "1.4583": { - "post": { - "vector": [-0.04547, -4.23409, 3.9696] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - } - }, "scale": { "0.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.2083": { "post": { "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" } } }, "Torso_2": { "scale": { "0.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.2083": { "post": { "vector": [0, 0, 0] }, "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" } } } @@ -3303,6 +2756,605 @@ } } } + }, + "spin_attack_start": { + "animation_length": 0.25, + "bones": { + "Jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Head": { + "rotation": { + "0.0": { + "post": { + "vector": [-50, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Torso": { + "rotation": { + "0.0": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "R_arm": { + "rotation": { + "0.0": { + "post": { + "vector": [3.42896, -5.43394, -46.98263] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [-40.03828, -6.42252, -14.31771] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, -8.42649, 7.07066] + }, + "lerp_mode": "catmullrom" + } + } + }, + "R_arm2": { + "rotation": { + "0.0": { + "post": { + "vector": [-12.73916, -59.16159, 14.75144] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [-7.46814, -29.5764, 7.46814] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Shell": { + "rotation": { + "0.0": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [20, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Toreterror": { + "rotation": { + "0.0": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [37.5, 1.20877, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -1.25, 15] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, -29.25, 15] + }, + "lerp_mode": "catmullrom" + } + } + }, + "L_arm": { + "rotation": { + "0.0": { + "post": { + "vector": [3.42896, 5.43394, 46.98263] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [-40.03828, 6.42252, 14.31771] + }, + "lerp_mode": "catmullrom" + } + } + }, + "L_arm2": { + "rotation": { + "0.0": { + "post": { + "vector": [-12.73916, 59.16159, -14.75144] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [-6.91252, -20.07846, -1.38281] + }, + "lerp_mode": "catmullrom" + } + } + }, + "R-Leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [1, 7.14018, 5.47885] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "L-Leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [-1, 7.14018, 5.47885] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Torso_2": { + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "spin_attack_end": { + "animation_length": 0.4583, + "bones": { + "Jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [20, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Head": { + "rotation": { + "0.0": { + "post": { + "vector": [-50, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [12.40552, -0.42671, -3.86532] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-50, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-30, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Torso": { + "rotation": { + "0.0": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "R_arm": { + "rotation": { + "0.0": { + "post": { + "vector": [-40.03828, -6.42252, -14.31771] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [3.42896, -5.43394, -46.98263] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -8.42649, 7.07066] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "R_arm2": { + "rotation": { + "0.0": { + "post": { + "vector": [-7.46814, -29.5764, 7.46814] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-12.73916, -59.16159, 14.75144] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Shell": { + "rotation": { + "0.0": { + "post": { + "vector": [17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [29.9, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -0.64279, -0.76604] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Toreterror": { + "rotation": { + "0.0": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -29.25, 15] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, -1.25, 15] + }, + "lerp_mode": "catmullrom" + } + } + }, + "L_arm": { + "rotation": { + "0.0": { + "post": { + "vector": [-40.03828, 6.42252, 14.31771] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [3.42896, 5.43394, 46.98263] + }, + "lerp_mode": "catmullrom" + } + } + }, + "L_arm2": { + "rotation": { + "0.0": { + "post": { + "vector": [-6.91252, -20.07846, -1.38281] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-12.73916, 59.16159, -14.75144] + }, + "lerp_mode": "catmullrom" + } + } + }, + "R-Leg": { + "rotation": { + "0.25": { + "pre": { + "vector": [-37.5, 0, 0] + }, + "post": { + "vector": [-37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0833": { + "pre": { + "vector": [6.05456, 12.07085, 4.02709] + }, + "post": { + "vector": [6.05456, 12.07085, 4.02709] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "L-Leg": { + "rotation": { + "0.25": { + "pre": { + "vector": [-37.5, 0, 0] + }, + "post": { + "vector": [-37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [-1, 7.14018, 5.47885] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [-0.7, 11.60171, 6.24351] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [-0.04547, -4.23409, 3.9696] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "Torso_2": { + "scale": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + } + } } } } \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/blockstates/termite_nest.json b/common/src/main/resources/assets/antarchy/blockstates/termite_nest.json index 70dd28f2..016df757 100644 --- a/common/src/main/resources/assets/antarchy/blockstates/termite_nest.json +++ b/common/src/main/resources/assets/antarchy/blockstates/termite_nest.json @@ -1,8 +1,8 @@ { "variants": { "facing=north": {"model": "antarchy:block/termite_nest"}, - "facing=east": {"model": "antarchy:block/termite_nest", "y": 90}, + "facing=east": {"model": "antarchy:block/termite_nest", "y": 90}, "facing=south": {"model": "antarchy:block/termite_nest", "y": 180}, - "facing=west": {"model": "antarchy:block/termite_nest", "y": 270} + "facing=west": {"model": "antarchy:block/termite_nest", "y": 270} } } diff --git a/common/src/main/resources/assets/antarchy/geo/stink_bug.geo.json b/common/src/main/resources/assets/antarchy/geo/stink_bug.geo.json index d8bf299a..07b58cbc 100644 --- a/common/src/main/resources/assets/antarchy/geo/stink_bug.geo.json +++ b/common/src/main/resources/assets/antarchy/geo/stink_bug.geo.json @@ -3,80 +3,129 @@ "minecraft:geometry": [ { "description": { - "identifier": "geometry.stinkbug", - "texture_width": 32, + "identifier": "geometry.Stinkbug", + "texture_width": 64, "texture_height": 32, "visible_bounds_width": 2, - "visible_bounds_height": 1.5, - "visible_bounds_offset": [0, 0.25, 0] + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] }, "bones": [ { "name": "root", - "pivot": [0, 0, 0] + "pivot": [0, 1.14286, -0.57143] + }, + { + "name": "right_leg", + "parent": "root", + "pivot": [-3, 1, 0.5], + "cubes": [ + {"origin": [-7, 1, 0], "size": [4, 0, 1], "uv": [3, 10]} + ] + }, + { + "name": "left_leg", + "parent": "root", + "pivot": [3, 1, 0.5], + "cubes": [ + {"origin": [3, 1, 0], "size": [4, 0, 1], "uv": [3, 10], "mirror": true} + ] + }, + { + "name": "right_leg_front", + "parent": "root", + "pivot": [-3, 1, -1.5], + "cubes": [ + {"origin": [-7, 1, -2], "size": [4, 0, 1], "uv": [3, 10]} + ] + }, + { + "name": "left_leg_front", + "parent": "root", + "pivot": [3, 1, -1.5], + "cubes": [ + {"origin": [3, 1, -2], "size": [4, 0, 1], "uv": [3, 10], "mirror": true} + ] + }, + { + "name": "right_leg_back", + "parent": "root", + "pivot": [-3, 1, 2.5], + "cubes": [ + {"origin": [-7, 1, 2], "size": [4, 0, 1], "uv": [3, 10]} + ] + }, + { + "name": "left_leg_back", + "parent": "root", + "pivot": [3, 1, 2.5], + "cubes": [ + {"origin": [3, 1, 2], "size": [4, 0, 1], "uv": [3, 10], "mirror": true} + ] }, { "name": "body", "parent": "root", - "pivot": [0, 2, 0], + "pivot": [0, 1, 1], "cubes": [ - {"origin": [-3, 0, -5], "size": [6, 4, 10], "uv": [0, 0]} + {"origin": [-3, 1, -2], "size": [6, 4, 6], "uv": [0, 0]}, + {"origin": [-3, 1, -2], "size": [6, 4, 6], "inflate": 0.2, "uv": [0, 11]} ] }, { - "name": "antenna", + "name": "head", "parent": "body", - "pivot": [0, 4, -4], + "pivot": [0, 2.25, -2], "cubes": [ - {"origin": [-2, 4, -5], "size": [4, 2, 1], "uv": [0, 14]} + {"origin": [-3, 1.25, -6], "size": [6, 2, 4], "uv": [18, 0]} ] }, { - "name": "frontLeftLeg", - "parent": "body", - "pivot": [-3, 0, -4], + "name": "right_eye", + "parent": "head", + "pivot": [-3, 2.75, -5.5], "cubes": [ - {"origin": [-6, 0, -5], "size": [3, 0, 2], "uv": [10, 14]} + {"origin": [-3, 2.25, -6], "size": [0, 1, 1], "inflate": 0.02, "uv": [12, 9]} ] }, { - "name": "frontRightLeg", - "parent": "body", - "pivot": [3, 0, -4], + "name": "left_eye", + "parent": "head", + "pivot": [3, 2.75, -5.5], "cubes": [ - {"origin": [3, 0, -5], "size": [3, 0, 2], "uv": [10, 14], "mirror": true} + {"origin": [3, 2.25, -6], "size": [0, 1, 1], "inflate": 0.02, "uv": [12, 9], "mirror": true} ] }, { - "name": "middleLeftLeg", - "parent": "body", - "pivot": [-3, 0, 0], + "name": "r_antenna", + "parent": "head", + "pivot": [-2, 2.75, -5], "cubes": [ - {"origin": [-6, 0, -1], "size": [3, 0, 2], "uv": [10, 14]} + {"origin": [-2, 2.75, -6], "size": [0, 4, 2], "uv": [18, -2]} ] }, { - "name": "middleRightLeg", - "parent": "body", - "pivot": [3, 0, 0], + "name": "r_antenna2", + "parent": "r_antenna", + "pivot": [-2, 6.75, -5], "cubes": [ - {"origin": [3, 0, -1], "size": [3, 0, 2], "uv": [10, 14], "mirror": true} + {"origin": [-2, 6.75, -6], "size": [0, 4, 2], "uv": [0, 8]} ] }, { - "name": "backLeftLeg", - "parent": "body", - "pivot": [-3, 0, 4], + "name": "l_antenna", + "parent": "head", + "pivot": [2, 2.75, -5], "cubes": [ - {"origin": [-6, 0, 3], "size": [3, 0, 2], "uv": [10, 14]} + {"origin": [2, 2.75, -6], "size": [0, 4, 2], "uv": [18, -2], "mirror": true} ] }, { - "name": "backRightLeg", - "parent": "body", - "pivot": [3, 0, 4], + "name": "l_antenna2", + "parent": "l_antenna", + "pivot": [2, 6.75, -5], "cubes": [ - {"origin": [3, 0, 3], "size": [3, 0, 2], "uv": [10, 14], "mirror": true} + {"origin": [2, 6.75, -6], "size": [0, 4, 2], "uv": [0, 8], "mirror": true} ] } ] diff --git a/common/src/main/resources/assets/antarchy/geo/termite.geo.json b/common/src/main/resources/assets/antarchy/geo/termite.geo.json new file mode 100644 index 00000000..d6262550 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/geo/termite.geo.json @@ -0,0 +1,197 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.Termite", + "texture_width": 64, + "texture_height": 64, + "visible_bounds_width": 2, + "visible_bounds_height": 1.5, + "visible_bounds_offset": [0, 0.25, 0] + }, + "bones": [ + { + "name": "Termite", + "pivot": [0, 1.21429, -1.91667] + }, + { + "name": "r_leg", + "parent": "Termite", + "pivot": [-1.5, 1, -3.5], + "cubes": [ + {"origin": [-7.5, 1, -3.5], "size": [6, 0, 1], "uv": [-1, 12]} + ] + }, + { + "name": "r_leg2", + "parent": "r_leg", + "pivot": [-7.5, 1, -3.5], + "cubes": [ + {"origin": [-12.5, 1, -3.5], "size": [5, 0, 1], "uv": [-1, 28]} + ] + }, + { + "name": "l_leg", + "parent": "Termite", + "pivot": [1.5, 1, -3.5], + "cubes": [ + {"origin": [1.5, 1, -3.5], "size": [6, 0, 1], "uv": [-1, 14]} + ] + }, + { + "name": "l_leg2", + "parent": "l_leg", + "pivot": [7.5, 1, -3.5], + "cubes": [ + {"origin": [7.5, 1, -3.5], "size": [5, 0, 1], "uv": [-1, 30]} + ] + }, + { + "name": "r_leg5", + "parent": "Termite", + "pivot": [-1.5, 1, -2.5], + "cubes": [ + {"origin": [-7.5, 1, -2.5], "size": [6, 0, 1], "uv": [-1, 16]} + ] + }, + { + "name": "r_leg6", + "parent": "r_leg5", + "pivot": [-7.5, 1, -2.5], + "cubes": [ + {"origin": [-12.5, 1, -2.5], "size": [5, 0, 1], "uv": [-1, 24]} + ] + }, + { + "name": "l_leg5", + "parent": "Termite", + "pivot": [1.5, 1, -2.5], + "cubes": [ + {"origin": [1.5, 1, -2.5], "size": [6, 0, 1], "uv": [-1, 18]} + ] + }, + { + "name": "l_leg6", + "parent": "l_leg5", + "pivot": [7.5, 1, -2.5], + "cubes": [ + {"origin": [7.5, 1, -2.5], "size": [5, 0, 1], "uv": [-1, 34]} + ] + }, + { + "name": "r_leg3", + "parent": "Termite", + "pivot": [-1.5, 1, -4.5], + "cubes": [ + {"origin": [-7.5, 1, -4.5], "size": [6, 0, 1], "uv": [-1, 20]} + ] + }, + { + "name": "r_leg4", + "parent": "r_leg3", + "pivot": [-7.5, 1, -4.5], + "cubes": [ + {"origin": [-12.5, 1, -4.5], "size": [5, 0, 1], "uv": [-1, 32]} + ] + }, + { + "name": "l_leg3", + "parent": "Termite", + "pivot": [1.5, 1, -4.5], + "cubes": [ + {"origin": [1.5, 1, -4.5], "size": [6, 0, 1], "uv": [-1, 22]} + ] + }, + { + "name": "l_leg4", + "parent": "l_leg3", + "pivot": [7.5, 1, -4.5], + "cubes": [ + {"origin": [7.5, 1, -4.5], "size": [5, 0, 1], "uv": [-1, 26]} + ] + }, + { + "name": "thorax", + "parent": "Termite", + "pivot": [0, 2.5, -4.41667], + "cubes": [ + {"origin": [-2, 1, -4.5], "size": [4, 3, 4], "uv": [11, 20]} + ] + }, + { + "name": "head", + "parent": "thorax", + "pivot": [-0.27778, 1.83333, -4.27778], + "cubes": [ + {"origin": [-1.5, 1.25, -4.5], "size": [3, 2, 1], "uv": [12, 13]}, + {"origin": [-3, 1, -12.25], "size": [6, 3, 8], "inflate": 0.01, "uv": [20, 4]} + ] + }, + { + "name": "r_mandibule", + "parent": "head", + "pivot": [-1.33333, 1.5, -11.99167], + "cubes": [ + {"origin": [-3.5, 1, -18], "size": [2, 1, 6], "uv": [5, 31]}, + {"origin": [-1.5, 1.5, -14.1], "size": [1, 0, 1], "uv": [1, 1]}, + {"origin": [-1.5, 1.5, -17.1], "size": [1, 0, 1], "uv": [-1, 0]}, + {"origin": [-2.5, 1.5, -19], "size": [1, 0, 1], "uv": [1, 0]} + ] + }, + { + "name": "l_mandibule", + "parent": "head", + "pivot": [1.33333, 1.5, -11.99167], + "cubes": [ + {"origin": [1.5, 1, -18], "size": [2, 1, 6], "uv": [15, 28], "mirror": true}, + {"origin": [0.5, 1.5, -14.1], "size": [1, 0, 1], "uv": [1, 1], "mirror": true}, + {"origin": [0.5, 1.5, -17.1], "size": [1, 0, 1], "uv": [-1, 0], "mirror": true}, + {"origin": [1.5, 1.5, -19], "size": [1, 0, 1], "uv": [1, 0], "mirror": true} + ] + }, + { + "name": "l_eye", + "parent": "head", + "pivot": [3, 2.75, -8.25], + "cubes": [ + {"origin": [3, 1.75, -9.25], "size": [0, 2, 2], "inflate": 0.05, "uv": [15, 15]} + ] + }, + { + "name": "r_eye", + "parent": "head", + "pivot": [-3, 2.75, -8.25], + "cubes": [ + {"origin": [-3, 1.75, -9.25], "size": [0, 2, 2], "inflate": 0.05, "uv": [15, 15], "mirror": true} + ] + }, + { + "name": "l_antenna", + "parent": "head", + "pivot": [3, 3, -9.25], + "cubes": [ + {"origin": [3, 3, -17.25], "size": [1, 0, 8], "inflate": 0.01, "uv": [12, 0]} + ] + }, + { + "name": "r_antenna", + "parent": "head", + "pivot": [-3, 3, -9.25], + "cubes": [ + {"origin": [-4, 3, -17.25], "size": [1, 0, 8], "inflate": 0.01, "uv": [12, 0], "mirror": true} + ] + }, + { + "name": "abdomen", + "parent": "thorax", + "pivot": [0, 2.5, -2.125], + "cubes": [ + {"origin": [-2.5, 1, -1.25], "size": [5, 4, 8], "inflate": 0.05, "uv": [1, 0]}, + {"origin": [-1.5, 1.25, -2.25], "size": [3, 2, 1], "uv": [11, 28]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/geo/toreterror.geo.json b/common/src/main/resources/assets/antarchy/geo/toreterror.geo.json index dedf02c6..7d17099c 100644 --- a/common/src/main/resources/assets/antarchy/geo/toreterror.geo.json +++ b/common/src/main/resources/assets/antarchy/geo/toreterror.geo.json @@ -6,9 +6,9 @@ "identifier": "geometry.unknown", "texture_width": 256, "texture_height": 256, - "visible_bounds_width": 6, - "visible_bounds_height": 5.5, - "visible_bounds_offset": [0, 2.25, 0] + "visible_bounds_width": 8, + "visible_bounds_height": 6.5, + "visible_bounds_offset": [0, 2.75, 0] }, "bones": [ { diff --git a/common/src/main/resources/assets/antarchy/lang/en_us.json b/common/src/main/resources/assets/antarchy/lang/en_us.json index 79d939de..1c26892e 100644 --- a/common/src/main/resources/assets/antarchy/lang/en_us.json +++ b/common/src/main/resources/assets/antarchy/lang/en_us.json @@ -150,6 +150,7 @@ "entity.antarchy.cloud_shark": "Cloud Shark", "entity.antarchy.kraken": "The Kraken", "entity.antarchy.missile_squid": "Missile Squid", + "entity.antarchy.octopus_bomb": "Octopus Bomb", "entity.antarchy.nightmare": "Nightmare", "entity.antarchy.bed_bug": "Bed Bug", "entity.antarchy.stink_bug": "Stink Bug", @@ -372,6 +373,7 @@ "item.antarchy.cloud_shark_spawn_egg": "Cloud Shark Spawn Egg", "item.antarchy.kraken_spawn_egg": "Uh, no. Don't.", "item.antarchy.missile_squid_spawn_egg": "Missile Squid Spawn Egg", + "item.antarchy.octopus_bomb_spawn_egg": "Octopus Bomb Spawn Egg", "item.antarchy.nightmare_spawn_egg": "Nightmare Spawn Egg", "item.antarchy.toreterror_spawn_egg": "Toreterror Spawn Egg", "item.antarchy.creeping_horror_spawn_egg": "Creeping Horror Spawn Egg", diff --git a/common/src/main/resources/assets/antarchy/models/block/termite_nest.json b/common/src/main/resources/assets/antarchy/models/block/termite_nest.json index 9b9976b0..1bc0e245 100644 --- a/common/src/main/resources/assets/antarchy/models/block/termite_nest.json +++ b/common/src/main/resources/assets/antarchy/models/block/termite_nest.json @@ -1,8 +1,12 @@ { - "parent": "minecraft:block/orientable", + "parent": "minecraft:block/cube", "textures": { - "front": "antarchy:block/termite_nest_front", - "side": "antarchy:block/termite_nest_side", - "top": "antarchy:block/termite_nest_top" + "particle": "antarchy:block/brown_ant_nest/brown_ant_nest", + "down": "minecraft:block/coarse_dirt", + "up": "antarchy:block/brown_ant_nest/brown_ant_nest_top", + "north": "antarchy:block/brown_ant_nest/brown_ant_nest", + "south": "antarchy:block/brown_ant_nest/brown_ant_nest", + "west": "antarchy:block/brown_ant_nest/brown_ant_nest", + "east": "antarchy:block/brown_ant_nest/brown_ant_nest" } } diff --git a/common/src/main/resources/assets/antarchy/models/item/octopus_bomb_spawn_egg.json b/common/src/main/resources/assets/antarchy/models/item/octopus_bomb_spawn_egg.json new file mode 100644 index 00000000..ddd15597 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/octopus_bomb_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} diff --git a/common/src/main/resources/assets/antarchy/textures/entity/kraken.png b/common/src/main/resources/assets/antarchy/textures/entity/kraken.png new file mode 100644 index 0000000000000000000000000000000000000000..b39b621ce5a4161efe0cd8e43f301e173269b006 GIT binary patch literal 44419 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 FV1l?n!{Gn` diff --git a/common/src/main/resources/assets/antarchy/textures/entity/stink_bug.png b/common/src/main/resources/assets/antarchy/textures/entity/stink_bug.png index 62d2da0fd086e1bccf1f1f089dfb6f3aec3338b2..09c3cec91297929c612fbcdd11b0b20004ad3f0e 100644 GIT binary patch literal 883 zcmV-(1C0EMP)HQHvI#w`ajyVbJea*1pNo?Y}2-dE+P=3MI>cK z(iox5Oj+1-CY$JWKWDmeXY|=XIPc9c;`g0%zW1JY@AusE?)Vb(cV+H;G(R&P%}!24 zvty^!hr^%BW}|xCni-3huU?4k>lm+}>&EzidBEm1+r}1vjf{+DWol|dN|m3I3HqQE znT+FicS*+Jd$^}#_5rtWrbk13n}e@pcee;I!C%h!&Hne}7A%Ej`4)yX!*DeO!593PP3?2v-i z#=p1QCHK94vEMb~nX7r`^lxtb61YNPTWx4M3|P(cXQv|$|7kF2$%-C~{~4+{tb+T)x%)h6~W@LgV(ouK3}4wpN6$N9gv1oILbZz>)pQr00960Ao{O?00006NkltRVmZ literal 674 zcmV;T0$u%yP)n5R3WaVIe}Eu#(MbJRxDevPzfeKwuPO-UHwX>5sNhE-8$r;$Ac!b} z*o3GV<9XiX4(X84+ppb(yff#%=X1`SdnZ`xFRP8M-W*$FZ31Mt2-YC36XT{A-~o4T z_RU5If@J6PuQkl-mnJ|KnRW?jW^Uzyw?D2~OeEPk*PQAfQoXzPa?9$=)_d^VIvWGY zaH;-_?2-#;@2@Dv?KfBL$%pHb#nAD9Uy=*p$qD!L#wUAw=QEH(&mx|;9nEvkOPbDS^GMwc@?Fu+h zaETS97vPE7uWCw063Nab=2>W#UO)`t1E)cYYwi>>Js;E&xI_etCzqdM-TMula=k~F zb=S!k^(g_pxX#^Wv!zv2ERR{lCl2ej&7kuGeedA~gA255`+ZaImce3>MuTq}Hr_Q4j-wpB&FBF-ICR*shL66) zf>Uf>kz;HBpY3jZv1jYwt+o5t$Q|VDN*3*xPI?j?g(<)FdSI>RzvLhu8`r_1!&iWx zLb2RNyps6E*9W9@N@4-xBGL_hAc{H%-)Ou3+e^Psc;d0e6Q zIk>jsUq9Y!L7rR)KMwpLDf!Ri3X|d2ti3m!bg3XuE(8TD`Oo7@CTF&s4B?rDJAR<5 zfT{yk2dWNK9jH2R?j1Pl^YkA80RR8~j-$H(000I_L_t&o01bInP_vI1i2wiq07*qo IM6N<$f^pG5!TZ$3)gRr(M z|Nd!I=EmX@JJT&wgTq4m!q7zlr@#42`g$&?&X{Q3@{}|~k3i8j++L|!uiM!o6^#u- zo9u(#?YCUTfYSQX&~MreFwg-E_fBfoVZixg=Y%%d2P+vcGdknWze?|VHj?q zfR4>T8(4eQ1lQRR=m2iMzh1LW_P6i5Lum862gU$&Vhh56y1TB_l!;+RiP$*zCuFuo zkL-L0I)Fcp^l8?~KA=50J}qGM?3hY)LM&}8M)+bPwxE3!%f^<)<;`Xr=1@#m=PZ6L zMzF>LcOGoktn=F^`?RV4ptZ9}kbr4s24@kzU~|1+$AwJWCb99;iTxfII}CJez7t)i z4m|*_>)_;D4<}4=-T(fTy?Wi}3gE6sn}dkQ;#wT(<8T?Jq{Q$Op%&ZtGB6atD>Va*KedPf*%*N79+E84aNCg{1fkU?fhhAP%ER{=$mWh7KH${Yv zn;jqRNPb0^o+)guq$w-^B0SAey@!q-NL~RBXw`=meyg$ZAbs5IxCIW{|MTCh0HZe9 zN5=;6vAG$`9M;a3jF4@zPWAz80N1);$A=4E`x|iu`k~*%13Y!|zy;3D&U-Gf0etWU zjCJRs{Z!ZDT=b)3%QViF{#pabI1GRZT>D|gN=IuC&(3=3V1BtGuc`qsfuaU0GTA_N zSv2uTTYFBu2(kTX4It}e9~Qs{U=Bg$iIcwsbq$rD)&R0j_OG=Dj89K^AXGaG7>w2c zG7n$@Y)DrF+<6(34z6!lb*%wp9>4iKd$ptz|_ClWt$wbY%cp2gU@yAlZ13K6|V+ z={F_}c4dHN-k7l7!0MwFI)zDXg!D@pV3~&nz%SOe+W+VIPL45JsC@2Fg z^Tq_fVAxdDp*B^XH@!&yhl#-*4_mk*xUey<-$v=m0Lwfq0O^8pGx}NozaH=Lknf)v z@lt_)-uJn{#+Y>L+^9bN!$>BJRVE7?{_a80&Q+v504QxVHCiLxO@^J?Zmj9_lm`Gk zji#w+jg5Yn*67$6n{L6d^`$(3umzdTcnSxQ&C|_=xeE-)g)C(=#sUMfdAhkUcYy)9 zkflsw%+$BQfJ{#;-~0;<$hVAUx}O3AGCi?;^Di(U-!hu%ehLi8^u+SbzrcWe%V?(i zDKH?@6U#UM0t0eAqw9_TG5`Po|NlDJ3UmMf00v1!K~w_(sj|SmKJgFW00000NkvXX Hu0mjf-4j7m literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/antarchy/textures/entity/toreterror.png b/common/src/main/resources/assets/antarchy/textures/entity/toreterror.png index b0eeb33f006cf8be12845bc5e96930253580e9c2..179df7c9af824d2809d3be5f65dfa3d24e132ed5 100644 GIT binary patch literal 13769 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 T)z>=m6M(L!!M(D(HgEn1iz-M| literal 10190 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 buildAntType(BrownAntEntity::new, MobCategory.CREATURE, "brown_ant")); public static final DeferredHolder, EntityType> RAINBOW_ANT = ENTITY_TYPES.register("rainbow_ant", () -> buildAntType(RainbowAntEntity::new, MobCategory.CREATURE, "rainbow_ant")); + public static final DeferredHolder, EntityType> TERMITE = ENTITY_TYPES.register("termite", + () -> buildAntType(TermiteEntity::new, MobCategory.CREATURE, "termite")); public static final DeferredHolder, EntityType> MOLEWORM = ENTITY_TYPES.register("moleworm", () -> EntityType.Builder.of(MolewormEntity::new, MobCategory.MONSTER) .sized(0.4F, 0.3F) @@ -826,6 +830,8 @@ public final class AntarchyFabricContent { () -> new AntNestBlock(BROWN_ANT, AntarchyFabricContent::antNestBlockEntityType, BlockBehaviour.Properties.ofFullCopy(Blocks.DIRT).noLootTable())); public static final DeferredBlock RAINBOW_ANT_NEST = BLOCKS.register("rainbow_ant_nest", () -> new AntNestBlock(RAINBOW_ANT, AntarchyFabricContent::antNestBlockEntityType, BlockBehaviour.Properties.ofFullCopy(Blocks.DIRT).noLootTable())); + public static final DeferredBlock TERMITE_NEST = BLOCKS.register("termite_nest", + () -> new AntNestBlock(TERMITE, AntarchyFabricContent::antNestBlockEntityType, BlockBehaviour.Properties.ofFullCopy(Blocks.DIRT).noLootTable())); public static final DeferredBlock URANIUM_ORE = BLOCKS.register("uranium_ore", () -> createOre(Blocks.EMERALD_ORE, 4, 8)); public static final DeferredBlock DEEPSLATE_URANIUM_ORE = BLOCKS.register("deepslate_uranium_ore", @@ -934,7 +940,8 @@ public final class AntarchyFabricContent { AntNestBlockEntity::new, RED_ANT_NEST.get(), BROWN_ANT_NEST.get(), - RAINBOW_ANT_NEST.get() + RAINBOW_ANT_NEST.get(), + TERMITE_NEST.get() ).build(null)); public static final DeferredHolder, BlockEntityType> DREAM_CAMPFIRE_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("dream_campfire", () -> BlockEntityType.Builder.of( @@ -1070,6 +1077,7 @@ public final class AntarchyFabricContent { public static final DeferredItem RED_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(RED_ANT_NEST); public static final DeferredItem BROWN_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(BROWN_ANT_NEST); public static final DeferredItem RAINBOW_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(RAINBOW_ANT_NEST); + public static final DeferredItem TERMITE_NEST_ITEM = ITEMS.registerSimpleBlockItem(TERMITE_NEST); public static final DeferredItem URANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(URANIUM_ORE); public static final DeferredItem DEEPSLATE_URANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(DEEPSLATE_URANIUM_ORE); public static final DeferredItem TITANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(TITANIUM_ORE); @@ -1527,7 +1535,7 @@ public final class AntarchyFabricContent { .build("cloud_shark")); public static final DeferredHolder, EntityType> KRAKEN = ENTITY_TYPES.register("kraken", () -> EntityType.Builder.of(KrakenEntity::new, MobCategory.MONSTER) - .sized(5.2F, 9.8F) + .sized(11.4F, 39.0F) .clientTrackingRange(12) .build("kraken")); public static final DeferredHolder, EntityType> MISSILE_SQUID = ENTITY_TYPES.register("missile_squid", @@ -1535,6 +1543,11 @@ public final class AntarchyFabricContent { .sized(1.62F, 3.18F) .clientTrackingRange(10) .build("missile_squid")); + public static final DeferredHolder, EntityType> OCTOPUS_BOMB = ENTITY_TYPES.register("octopus_bomb", + () -> EntityType.Builder.of(OctopusBombEntity::new, MobCategory.MONSTER) + .sized(2.4F, 2.9F) + .clientTrackingRange(10) + .build("octopus_bomb")); public static final DeferredHolder, EntityType> NIGHTMARE = ENTITY_TYPES.register("nightmare", () -> EntityType.Builder.of(NightmareEntity::new, MobCategory.MONSTER) .sized(3.2F, 3.8F) @@ -1610,6 +1623,8 @@ public final class AntarchyFabricContent { () -> new DeferredSpawnEggItem(BROWN_ANT, 0x6A4320, 0x26160A, new Item.Properties())); public static final DeferredItem RAINBOW_ANT_SPAWN_EGG = ITEMS.register("rainbow_ant_spawn_egg", () -> new DeferredSpawnEggItem(RAINBOW_ANT, 0x56D4F0, 0xF66DBB, new Item.Properties())); + public static final DeferredItem TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg", + () -> new DeferredSpawnEggItem(TERMITE, 0xE8DFC0, 0x5C3C1A, new Item.Properties())); public static final DeferredItem MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg", () -> new DeferredSpawnEggItem(MOLEWORM, 0x7A6150, 0xD2B8A3, new Item.Properties())); public static final DeferredItem MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg", @@ -1640,6 +1655,8 @@ public final class AntarchyFabricContent { () -> new DeferredSpawnEggItem(KRAKEN, 0x163C53, 0x4F8E99, new Item.Properties().rarity(Rarity.EPIC))); public static final DeferredItem MISSILE_SQUID_SPAWN_EGG = ITEMS.register("missile_squid_spawn_egg", () -> new DeferredSpawnEggItem(MISSILE_SQUID, 0xD88FA7, 0x8D5269, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final DeferredItem OCTOPUS_BOMB_SPAWN_EGG = ITEMS.register("octopus_bomb_spawn_egg", + () -> new DeferredSpawnEggItem(OCTOPUS_BOMB, 0xC882C8, 0x5C1A7A, new Item.Properties().rarity(Rarity.UNCOMMON))); public static final DeferredItem NIGHTMARE_SPAWN_EGG = ITEMS.register("nightmare_spawn_egg", () -> new DeferredSpawnEggItem(NIGHTMARE, 0x22121C, 0xB51B2D, new Item.Properties().rarity(Rarity.RARE))); public static final DeferredItem BED_BUG_SPAWN_EGG = ITEMS.register("bed_bug_spawn_egg", @@ -1769,6 +1786,7 @@ public final class AntarchyFabricContent { FabricDefaultAttributeRegistry.register(CLOUD_SHARK.get(), CloudSharkEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(KRAKEN.get(), KrakenEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(MISSILE_SQUID.get(), MissileSquidEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(OCTOPUS_BOMB.get(), OctopusBombEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(NIGHTMARE.get(), NightmareEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(BED_BUG.get(), BedBugEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(STINK_BUG.get(), StinkBugEntity.createAttributes().build()); @@ -1802,6 +1820,11 @@ public final class AntarchyFabricContent { ).build()); FabricDefaultAttributeRegistry.register(MOLEWORM.get(), MolewormEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(MOLEVORE.get(), MolevoreEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(TERMITE.get(), buildAntAttributes( + AntarchySettings.termiteHealth(), + AntarchySettings.termiteMovementSpeed(), + AntarchySettings.termiteAttackDamage() + ).build()); } private static void registerSpawnPlacements() { @@ -1819,6 +1842,7 @@ public final class AntarchyFabricContent { SpawnPlacements.register(JUMPY_BUG.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, JumpyBugEntity::canSpawn); SpawnPlacements.register(KRAKEN.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, KrakenEntity::canSpawn); SpawnPlacements.register(MISSILE_SQUID.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MissileSquidEntity::canSpawn); + SpawnPlacements.register(OCTOPUS_BOMB.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, OctopusBombEntity::canSpawn); SpawnPlacements.register(NIGHTMARE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, NightmareEntity::canSpawn); SpawnPlacements.register(MOLEWORM.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MolewormEntity::canSpawn); SpawnPlacements.register(MANTIS.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MantisEntity::canSpawn); @@ -1830,6 +1854,7 @@ public final class AntarchyFabricContent { SpawnPlacements.register(BASILISK.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BasiliskEntity::canSpawn); SpawnPlacements.register(EMPEROR_SCORPION.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EmperorScorpionEntity::canSpawn); SpawnPlacements.register(TORETERROR.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ToreterrorEntity::canSpawn); + SpawnPlacements.register(TERMITE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); } private static void populateCreativeTab(CreativeModeTab.Output output) { @@ -1918,11 +1943,11 @@ public final class AntarchyFabricContent { case "dream_torch", "dream_lantern", "dream_campfire", "dream_fire", "dream_fire_ceiling" -> 10; case "easter_bunny_spawn_egg", "flying_squirrel_spawn_egg", "caterpillar_spawn_egg", "butterfly_spawn_egg", "reverie_spawn_egg", "brutalfly_spawn_egg", - "red_ant_spawn_egg", "brown_ant_spawn_egg", "rainbow_ant_spawn_egg", + "red_ant_spawn_egg", "brown_ant_spawn_egg", "rainbow_ant_spawn_egg", "termite_spawn_egg", "moleworm_spawn_egg", "mantis_spawn_egg", "molevore_spawn_egg", "triffid_spawn_egg", "apple_cow_spawn_egg", "golden_apple_cow_spawn_egg", "enchanted_golden_apple_cow_spawn_egg", "honeyed_apple_cow_spawn_egg", "dr_trayaurus_spawn_egg", "wasp_spawn_egg", - "bomber_spawn_egg", "jumpy_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg", "kraken_spawn_egg", "missile_squid_spawn_egg", + "bomber_spawn_egg", "jumpy_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg", "kraken_spawn_egg", "missile_squid_spawn_egg", "octopus_bomb_spawn_egg", "nightmare_spawn_egg", "bed_bug_spawn_egg", "lucid_spawn_egg", "scorpion_spawn_egg", "basilisk_spawn_egg", "emperor_scorpion_spawn_egg", "toreterror_spawn_egg", "creeping_horror_spawn_egg", "lurking_terror_spawn_egg" -> 90; @@ -2324,6 +2349,7 @@ public final class AntarchyFabricContent { DUCT_TAPE_USE ); + AntarchyObjects.setOctopusBomb(OCTOPUS_BOMB); AntarchyObjects.bind( EASTER_BUNNY, FLYING_SQUIRREL, diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java index c4cb5790..1584e2d5 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java @@ -53,6 +53,7 @@ public final class AntarchyFabricEvents { ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.UMBRAL_MOSS_CARPET.get().asItem(), 0.3f); ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.AMBER_MOSS_BLOCK.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.AMBER_MOSS_CARPET.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.CREEPVINE.get().asItem(), 0.3f); ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.HUSHWEED.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.CORNEA_EAR.get(), 0.65f); diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java index 921ba8e5..48130010 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java @@ -73,6 +73,7 @@ public final class AntarchyFabricClientBootstrap { EntityRendererRegistry.register(AntarchyFabricContent.RED_ANT.get(), AntRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.BROWN_ANT.get(), AntRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.RAINBOW_ANT.get(), AntRenderer::new); + EntityRendererRegistry.register(AntarchyFabricContent.TERMITE.get(), TermiteRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.MOLEWORM.get(), MolewormRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.MANTIS.get(), MantisRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.MOLEVORE.get(), MolevoreRenderer::new); @@ -87,6 +88,7 @@ public final class AntarchyFabricClientBootstrap { EntityRendererRegistry.register(AntarchyFabricContent.CLOUD_SHARK.get(), CloudSharkRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.KRAKEN.get(), KrakenRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.MISSILE_SQUID.get(), MissileSquidRenderer::new); + EntityRendererRegistry.register(AntarchyFabricContent.OCTOPUS_BOMB.get(), OctopusBombRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.NIGHTMARE.get(), NightmareRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.LUCID.get(), LucidRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.BED_BUG.get(), BedBugRenderer::new); 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 7ce91fed..92e197d5 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java @@ -252,6 +252,7 @@ public class AntarchyNeoforge { () -> AntarchyNeoforgeMisc.BLOODGLASS_MAX_HEARTS, () -> AntarchyNeoforgeMisc.BLOODGLASS_WARD ); + AntarchyObjects.setOctopusBomb(AntarchyNeoforgeEntites.OCTOPUS_BOMB); } private static boolean isModLoaded(String modId) { diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java index e71ecf5d..3ea56095 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java @@ -87,6 +87,7 @@ public final class AntarchyNeoForgeClient { event.registerEntityRenderer(AntarchyNeoforgeEntites.RED_ANT.get(), context -> withParalyzedGeoLayer(new AntRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.BROWN_ANT.get(), context -> withParalyzedGeoLayer(new AntRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.RAINBOW_ANT.get(), context -> withParalyzedGeoLayer(new AntRenderer(context))); + event.registerEntityRenderer(AntarchyNeoforgeEntites.TERMITE.get(), context -> withParalyzedGeoLayer(new TermiteRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.MOLEWORM.get(), context -> withParalyzedGeoLayer(new MolewormRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.MANTIS.get(), context -> withParalyzedGeoLayer(new MantisRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.MOLEVORE.get(), context -> withParalyzedGeoLayer(new MolevoreRenderer(context))); @@ -101,6 +102,7 @@ public final class AntarchyNeoForgeClient { event.registerEntityRenderer(AntarchyNeoforgeEntites.CLOUD_SHARK.get(), context -> withParalyzedGeoLayer(new CloudSharkRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.KRAKEN.get(), context -> withParalyzedGeoLayer(new KrakenRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.MISSILE_SQUID.get(), context -> withParalyzedGeoLayer(new MissileSquidRenderer(context))); + event.registerEntityRenderer(AntarchyNeoforgeEntites.OCTOPUS_BOMB.get(), context -> withParalyzedGeoLayer(new OctopusBombRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.NIGHTMARE.get(), context -> withParalyzedGeoLayer(new NightmareRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.LUCID.get(), context -> withParalyzedGeoLayer(new LucidRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.BED_BUG.get(), context -> withParalyzedGeoLayer(new BedBugRenderer(context))); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java index d11f817b..99f897ef 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java @@ -1126,6 +1126,7 @@ public final class AntarchyNeoForgeEvents { ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.UMBRAL_MOSS_CARPET.get().asItem(), 0.3f); ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.AMBER_MOSS_BLOCK.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.AMBER_MOSS_CARPET.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.CREEPVINE.get().asItem(), 0.3f); ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.HUSHWEED.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeItems.CORNEA_EAR.get(), 0.65f); }); 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 fc3d1ee7..6f0bef7a 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 @@ -240,6 +240,8 @@ public final class AntarchyNeoforgeBlocks { () -> new AntNestBlock(AntarchyNeoforgeEntites.BROWN_ANT, AntarchyNeoforgeItems::antNestBlockEntityType, BlockBehaviour.Properties.ofFullCopy(Blocks.DIRT).noLootTable())); public static final DeferredBlock RAINBOW_ANT_NEST = BLOCKS.register("rainbow_ant_nest", () -> new AntNestBlock(AntarchyNeoforgeEntites.RAINBOW_ANT, AntarchyNeoforgeItems::antNestBlockEntityType, BlockBehaviour.Properties.ofFullCopy(Blocks.DIRT).noLootTable())); + public static final DeferredBlock TERMITE_NEST = BLOCKS.register("termite_nest", + () -> new AntNestBlock(AntarchyNeoforgeEntites.TERMITE, AntarchyNeoforgeItems::antNestBlockEntityType, BlockBehaviour.Properties.ofFullCopy(Blocks.DIRT).noLootTable())); public static final DeferredBlock URANIUM_ORE = BLOCKS.register("uranium_ore", () -> createOre(Blocks.EMERALD_ORE, 4, 8)); public static final DeferredBlock DEEPSLATE_URANIUM_ORE = BLOCKS.register("deepslate_uranium_ore", @@ -350,7 +352,8 @@ public final class AntarchyNeoforgeBlocks { AntNestBlockEntity::new, RED_ANT_NEST.get(), BROWN_ANT_NEST.get(), - RAINBOW_ANT_NEST.get() + RAINBOW_ANT_NEST.get(), + TERMITE_NEST.get() ).build(null)); public static final DeferredHolder, BlockEntityType> DREAM_CAMPFIRE_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("dream_campfire", () -> BlockEntityType.Builder.of( diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java index cebd22a7..4fbb93c4 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java @@ -57,6 +57,7 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.RED_ANT_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.BROWN_ANT_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.RAINBOW_ANT_SPAWN_EGG.get()); + event.accept(AntarchyNeoforgeItems.TERMITE_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.MOLEWORM_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.MANTIS_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.MOLEVORE_SPAWN_EGG.get()); @@ -72,6 +73,7 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.CLOUD_SHARK_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.KRAKEN_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.MISSILE_SQUID_SPAWN_EGG.get()); + event.accept(AntarchyNeoforgeItems.OCTOPUS_BOMB_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.NIGHTMARE_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.BED_BUG_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.LUCID_SPAWN_EGG.get()); @@ -104,6 +106,7 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.RED_ANT_NEST_ITEM.get()); event.accept(AntarchyNeoforgeItems.BROWN_ANT_NEST_ITEM.get()); event.accept(AntarchyNeoforgeItems.RAINBOW_ANT_NEST_ITEM.get()); + event.accept(AntarchyNeoforgeItems.TERMITE_NEST_ITEM.get()); event.accept(AntarchyNeoforgeItems.URANIUM_ORE_ITEM.get()); event.accept(AntarchyNeoforgeItems.DEEPSLATE_URANIUM_ORE_ITEM.get()); event.accept(AntarchyNeoforgeItems.TITANIUM_ORE_ITEM.get()); @@ -385,7 +388,7 @@ public class AntarchyNeoforgeCreativeModeTabs { // 11 - Plants and flowers case "orange_milkweed", "pink_milkweed", "torchflower_bush", "hushweed", "amber_lichen", "creepvine", "triffid_goo_block", "wasp_nest", - "red_ant_nest", "brown_ant_nest", "rainbow_ant_nest" -> 11; + "red_ant_nest", "brown_ant_nest", "rainbow_ant_nest", "termite_nest" -> 11; // 12 - Dream lighting case "dream_torch", "dream_lantern", "dream_campfire" -> 12; diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java index 5e57e5cc..361b7693 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java @@ -18,6 +18,7 @@ import com.craisinlord.antarchy.content.entity.HushProjectileEntity; import com.craisinlord.antarchy.content.entity.JumpyBugEntity; import com.craisinlord.antarchy.content.entity.MantisEntity; import com.craisinlord.antarchy.content.entity.MissileSquidEntity; +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; import com.craisinlord.antarchy.content.entity.MolevoreEntity; import com.craisinlord.antarchy.content.entity.MolewormEntity; import com.craisinlord.antarchy.content.entity.OuranwoodBoatEntity; @@ -33,6 +34,7 @@ import com.craisinlord.antarchy.content.entity.ant.BaseAntEntity; import com.craisinlord.antarchy.content.entity.ant.BrownAntEntity; import com.craisinlord.antarchy.content.entity.ant.RainbowAntEntity; import com.craisinlord.antarchy.content.entity.ant.RedAntEntity; +import com.craisinlord.antarchy.content.entity.ant.TermiteEntity; import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity; import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyEntity; import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyOrbEntity; @@ -74,6 +76,8 @@ public final class AntarchyNeoforgeEntites { () -> buildAntType(BrownAntEntity::new, MobCategory.CREATURE, "brown_ant")); public static final DeferredHolder, EntityType> RAINBOW_ANT = ENTITY_TYPES.register("rainbow_ant", () -> buildAntType(RainbowAntEntity::new, MobCategory.CREATURE, "rainbow_ant")); + public static final DeferredHolder, EntityType> TERMITE = ENTITY_TYPES.register("termite", + () -> buildAntType(TermiteEntity::new, MobCategory.CREATURE, "termite")); public static final DeferredHolder, EntityType> MOLEWORM = ENTITY_TYPES.register("moleworm", () -> EntityType.Builder.of(MolewormEntity::new, MobCategory.MONSTER) .sized(0.4F, 0.3F) @@ -199,7 +203,7 @@ public final class AntarchyNeoforgeEntites { .build("cloud_shark")); public static final DeferredHolder, EntityType> KRAKEN = ENTITY_TYPES.register("kraken", () -> EntityType.Builder.of(KrakenEntity::new, MobCategory.MONSTER) - .sized(5.2F, 9.8F) + .sized(11.4F, 39.0F) .clientTrackingRange(12) .build("kraken")); public static final DeferredHolder, EntityType> MISSILE_SQUID = ENTITY_TYPES.register("missile_squid", @@ -207,6 +211,11 @@ public final class AntarchyNeoforgeEntites { .sized(1.62F, 3.18F) .clientTrackingRange(10) .build("missile_squid")); + public static final DeferredHolder, EntityType> OCTOPUS_BOMB = ENTITY_TYPES.register("octopus_bomb", + () -> EntityType.Builder.of(OctopusBombEntity::new, MobCategory.MONSTER) + .sized(2.4F, 2.9F) + .clientTrackingRange(10) + .build("octopus_bomb")); public static final DeferredHolder, EntityType> NIGHTMARE = ENTITY_TYPES.register("nightmare", () -> EntityType.Builder.of(NightmareEntity::new, MobCategory.MONSTER) .sized(3.2F, 3.8F) diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java index 6a91e498..3cf6bf1e 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java @@ -44,6 +44,7 @@ public class AntarchyNeoforgeEntityAttributes { event.put(AntarchyNeoforgeEntites.CLOUD_SHARK.get(), CloudSharkEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.KRAKEN.get(), KrakenEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.MISSILE_SQUID.get(), MissileSquidEntity.createAttributes().build()); + event.put(AntarchyNeoforgeEntites.OCTOPUS_BOMB.get(), OctopusBombEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.NIGHTMARE.get(), NightmareEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.BED_BUG.get(), BedBugEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.STINK_BUG.get(), StinkBugEntity.createAttributes().build()); @@ -67,6 +68,7 @@ public class AntarchyNeoforgeEntityAttributes { event.put(AntarchyNeoforgeEntites.RED_ANT.get(), redAntAttributes); event.put(AntarchyNeoforgeEntites.BROWN_ANT.get(), brownAntAttributes); event.put(AntarchyNeoforgeEntites.RAINBOW_ANT.get(), rainbowAntAttributes); + event.put(AntarchyNeoforgeEntites.TERMITE.get(), termiteAttributes); event.put(AntarchyNeoforgeEntites.MOLEWORM.get(), MolewormEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.MOLEVORE.get(), MolevoreEntity.createAttributes().build()); } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java index 5d3d620e..270900c0 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 @@ -173,6 +173,7 @@ public final class AntarchyNeoforgeItems { public static final DeferredItem RED_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.RED_ANT_NEST); public static final DeferredItem BROWN_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.BROWN_ANT_NEST); public static final DeferredItem RAINBOW_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.RAINBOW_ANT_NEST); + public static final DeferredItem TERMITE_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.TERMITE_NEST); public static final DeferredItem URANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.URANIUM_ORE); public static final DeferredItem DEEPSLATE_URANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.DEEPSLATE_URANIUM_ORE); public static final DeferredItem TITANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.TITANIUM_ORE); @@ -501,6 +502,8 @@ public final class AntarchyNeoforgeItems { () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.BROWN_ANT, 0x6A4320, 0x26160A, new Item.Properties())); public static final DeferredItem RAINBOW_ANT_SPAWN_EGG = ITEMS.register("rainbow_ant_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.RAINBOW_ANT, 0x56D4F0, 0xF66DBB, new Item.Properties())); + public static final DeferredItem TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.TERMITE, 0xE8DFC0, 0x5C3C1A, new Item.Properties())); public static final DeferredItem MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEWORM, 0x7A6150, 0xD2B8A3, new Item.Properties())); public static final DeferredItem MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg", @@ -531,6 +534,8 @@ public final class AntarchyNeoforgeItems { () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.KRAKEN, 0x163C53, 0x4F8E99, new Item.Properties().rarity(Rarity.EPIC))); public static final DeferredItem MISSILE_SQUID_SPAWN_EGG = ITEMS.register("missile_squid_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MISSILE_SQUID, 0xD88FA7, 0x8D5269, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final DeferredItem OCTOPUS_BOMB_SPAWN_EGG = ITEMS.register("octopus_bomb_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.OCTOPUS_BOMB, 0xC882C8, 0x5C1A7A, new Item.Properties().rarity(Rarity.UNCOMMON))); public static final DeferredItem NIGHTMARE_SPAWN_EGG = ITEMS.register("nightmare_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.NIGHTMARE, 0x22121C, 0xB51B2D, new Item.Properties().rarity(Rarity.RARE))); public static final DeferredItem BED_BUG_SPAWN_EGG = ITEMS.register("bed_bug_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 748f39bb..bc55ca8c 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 @@ -36,6 +36,7 @@ public class AntarchyNeoforgeSpawnPlacements { event.register(AntarchyNeoforgeEntites.JUMPY_BUG.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, JumpyBugEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.KRAKEN.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, KrakenEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.MISSILE_SQUID.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MissileSquidEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); + event.register(AntarchyNeoforgeEntites.OCTOPUS_BOMB.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, OctopusBombEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.NIGHTMARE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, NightmareEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.MOLEWORM.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MolewormEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.MANTIS.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MantisEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); @@ -46,5 +47,6 @@ public class AntarchyNeoforgeSpawnPlacements { event.register(AntarchyNeoforgeEntites.SCORPION.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ScorpionEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.BASILISK.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BasiliskEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.EMPEROR_SCORPION.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EmperorScorpionEntity::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); } }