rolly polly mob, rolly caves biome, toreterror sounds, alpha mantis turning revert, scorpion and cloud shark updates

This commit is contained in:
craisinlord committed 2026-07-06 08:50:56 -05:00
1 parent 9d34c45285
commit 303a56f7fc
65 files changed
+10746 -2647

No files matched your search

@@ -106,6 +106,11 @@ public final class AntarchySettings {
private static double alphaMantisFlyingSpeed = 0.77D;
private static int alphaMantisSummonIntervalTicks = 300;
private static int alphaMantisMaxMinions = 4;
private static double rollyPollyHealth = 12.0D;
private static double rollyPollyMovementSpeed = 0.3D;
private static double rollyPollyRollSpeedMultiplier = 2.2D;
private static double rollyPollyTumbleDamage = 1.0D;
private static int rollyPollyTameChance = 3;
private static double krakenProjectileDamageTakenMultiplier = 0.5D;
private static boolean krakenSquidSpawnEnabled = true;
private static boolean krakenMassSpawnEnabled = true;
@@ -233,23 +238,23 @@ public final class AntarchySettings {
private static final int reverieAmbientTargetMaxAgeTicks = 40;
private static final int reverieAmbientPulseIntervalMinTicks = 12;
private static final int reverieAmbientPulseIntervalMaxTicks = 19;
private static double emperorScorpionHealth = 100.0D;
private static double emperorScorpionAttackDamage = 12.0D;
private static double emperorScorpionHealth = 400.0D;
private static double emperorScorpionAttackDamage = 28.0D;
private static double emperorScorpionMovementSpeed = 0.32D;
private static double emperorScorpionArmor = 6.0D;
private static double emperorScorpionKnockbackResistance = 0.6D;
private static double emperorScorpionFollowRange = 32.0D;
private static double emperorScorpionArmor = 25.0D;
private static double emperorScorpionKnockbackResistance = 0.8D;
private static double emperorScorpionFollowRange = 40.0D;
private static int emperorScorpionXpReward = 25;
private static int emperorScorpionClawAnimTicks = 12;
private static int emperorScorpionClawHitTick = 6;
private static int emperorScorpionClawCooldownTicks = 16;
private static int emperorScorpionStingAnimTicks = 18;
private static int emperorScorpionStingHitTick = 9;
private static int emperorScorpionStingCooldownTicks = 42;
private static int emperorScorpionPoisonTicks = 100;
private static int emperorScorpionWeaknessTicks = 80;
private static int emperorScorpionSummonIntervalTicks = 180;
private static int emperorScorpionMaxSummonedScorpions = 4;
private static int emperorScorpionClawAnimTicks = 23;
private static int emperorScorpionClawHitTick = 12;
private static int emperorScorpionClawCooldownTicks = 28;
private static int emperorScorpionStingAnimTicks = 25;
private static int emperorScorpionStingHitTick = 13;
private static int emperorScorpionStingCooldownTicks = 60;
private static int emperorScorpionPoisonTicks = 300;
private static int emperorScorpionWeaknessTicks = 120;
private static int emperorScorpionSummonIntervalTicks = 140;
private static int emperorScorpionMaxSummonedScorpions = 8;
private static double scorpionHealth = 30.0D;
private static double scorpionAttackDamage = 5.0D;
private static double scorpionMovementSpeed = 0.29D;
@@ -819,6 +824,26 @@ public final class AntarchySettings {
return alphaMantisMaxMinions;
}
public static double rollyPollyHealth() {
return rollyPollyHealth;
}
public static double rollyPollyMovementSpeed() {
return rollyPollyMovementSpeed;
}
public static double rollyPollyRollSpeedMultiplier() {
return rollyPollyRollSpeedMultiplier;
}
public static double rollyPollyTumbleDamage() {
return rollyPollyTumbleDamage;
}
public static int rollyPollyTameChance() {
return rollyPollyTameChance;
}
public static double waspHealth() {
return waspHealth;
}
@@ -1247,6 +1272,26 @@ public final class AntarchySettings {
alphaMantisMaxMinions = value;
}
public static void setRollyPollyHealth(double value) {
rollyPollyHealth = value;
}
public static void setRollyPollyMovementSpeed(double value) {
rollyPollyMovementSpeed = value;
}
public static void setRollyPollyRollSpeedMultiplier(double value) {
rollyPollyRollSpeedMultiplier = value;
}
public static void setRollyPollyTumbleDamage(double value) {
rollyPollyTumbleDamage = value;
}
public static void setRollyPollyTameChance(int value) {
rollyPollyTameChance = value;
}
public static void setKrakenProjectileDamageTakenMultiplier(double value) {
krakenProjectileDamageTakenMultiplier = value;
}
@@ -90,6 +90,7 @@ public final class AntarchyTags {
public static final TagKey<Item> BUTTERFLY_BREEDING_FOODS = TagKey.create(Registries.ITEM, id("butterfly_breeding_foods"));
public static final TagKey<Item> REVERIE_DUPLICATION_ITEMS = TagKey.create(Registries.ITEM, id("reverie_duplication_items"));
public static final TagKey<Item> HERCULES_BEETLE_FOOD = TagKey.create(Registries.ITEM, id("hercules_beetle_food"));
public static final TagKey<Item> ROLLY_POLLY_FOOD = TagKey.create(Registries.ITEM, id("rolly_polly_food"));
private Items() {
}
@@ -6,6 +6,11 @@ import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.GeoModel;
public class CloudSharkModel extends GeoModel<CloudSharkEntity> {
public static final ResourceLocation BASE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/cloud_shark/cloud_shark.png");
public static final ResourceLocation EMISSIVE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/cloud_shark/cloud_shark_emissive.png");
@Override
public ResourceLocation getModelResource(CloudSharkEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/cloud_shark.geo.json");
@@ -13,7 +18,7 @@ public class CloudSharkModel extends GeoModel<CloudSharkEntity> {
@Override
public ResourceLocation getTextureResource(CloudSharkEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/cloud_shark.png");
return BASE_TEXTURE;
}
@Override
@@ -7,6 +7,9 @@ import software.bernie.geckolib.model.GeoModel;
public class EmperorScorpionModel extends GeoModel<EmperorScorpionEntity> {
public static final ResourceLocation EMISSIVE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/emperor_scorpion/emperor_scorpion_emissive.png");
@Override
public ResourceLocation getModelResource(EmperorScorpionEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/emperor_scorpion.geo.json");
@@ -14,7 +17,7 @@ public class EmperorScorpionModel extends GeoModel<EmperorScorpionEntity> {
@Override
public ResourceLocation getTextureResource(EmperorScorpionEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/emperor_scorpion.png");
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/emperor_scorpion/emperor_scorpion.png");
}
@Override
@@ -0,0 +1,28 @@
package com.craisinlord.antarchy.content.client.model;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.entity.RollyPollyEntity;
import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.GeoModel;
public class RollyPollyModel extends GeoModel<RollyPollyEntity> {
private static final ResourceLocation TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/rolly_polly/rolly_polly.png");
private static final ResourceLocation TEXTURE_SADDLED =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/rolly_polly/rolly_polly_saddled.png");
@Override
public ResourceLocation getModelResource(RollyPollyEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/rolly_polly.geo.json");
}
@Override
public ResourceLocation getTextureResource(RollyPollyEntity animatable) {
return animatable.hasSaddle() ? TEXTURE_SADDLED : TEXTURE;
}
@Override
public ResourceLocation getAnimationResource(RollyPollyEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "animations/rolly_polly.animation.json");
}
}
@@ -2,8 +2,17 @@ package com.craisinlord.antarchy.content.client.renderer;
import com.craisinlord.antarchy.content.client.model.CloudSharkModel;
import com.craisinlord.antarchy.content.entity.cloud_shark.CloudSharkEntity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.cache.object.BakedGeoModel;
import software.bernie.geckolib.renderer.GeoEntityRenderer;
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
public class CloudSharkRenderer extends GeoEntityRenderer<CloudSharkEntity> {
private static final float SHADOW_RADIUS = 0.6F;
@@ -11,5 +20,37 @@ public class CloudSharkRenderer extends GeoEntityRenderer<CloudSharkEntity> {
public CloudSharkRenderer(EntityRendererProvider.Context context) {
super(context, new CloudSharkModel());
this.shadowRadius = SHADOW_RADIUS;
this.addRenderLayer(new CloudSharkEmissiveLayer(this));
}
@Override
public RenderType getRenderType(CloudSharkEntity animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) {
return RenderType.entityCutoutNoCull(texture);
}
private static final class CloudSharkEmissiveLayer extends GeoRenderLayer<CloudSharkEntity> {
private CloudSharkEmissiveLayer(GeoEntityRenderer<CloudSharkEntity> renderer) {
super(renderer);
}
@Override
public void render(PoseStack poseStack, CloudSharkEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
int packedLight, int packedOverlay) {
RenderType emissiveType = RenderType.eyes(CloudSharkModel.EMISSIVE_TEXTURE);
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
this.getRenderer().reRender(
bakedModel,
poseStack,
bufferSource,
animatable,
emissiveType,
emissiveBuffer,
partialTick,
0xF000F0,
OverlayTexture.NO_OVERLAY,
0xFFFFFFFF
);
}
}
}
@@ -2,14 +2,59 @@ package com.craisinlord.antarchy.content.client.renderer;
import com.craisinlord.antarchy.content.client.model.EmperorScorpionModel;
import com.craisinlord.antarchy.content.entity.EmperorScorpionEntity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.cache.object.BakedGeoModel;
import software.bernie.geckolib.renderer.GeoEntityRenderer;
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
public class EmperorScorpionRenderer extends GeoEntityRenderer<EmperorScorpionEntity> {
public EmperorScorpionRenderer(EntityRendererProvider.Context context) {
super(context, new EmperorScorpionModel());
this.shadowRadius = 3.0F;
this.withScale(1.5F);
this.addRenderLayer(new EmperorScorpionEmissiveLayer(this));
}
@Override
public RenderType getRenderType(EmperorScorpionEntity animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) {
return RenderType.entityCutoutNoCull(texture);
}
@Override
protected float getDeathMaxRotation(EmperorScorpionEntity animatable) {
return 0.0F;
}
private static final class EmperorScorpionEmissiveLayer extends GeoRenderLayer<EmperorScorpionEntity> {
private EmperorScorpionEmissiveLayer(GeoEntityRenderer<EmperorScorpionEntity> renderer) {
super(renderer);
}
@Override
public void render(PoseStack poseStack, EmperorScorpionEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
int packedLight, int packedOverlay) {
RenderType emissiveType = RenderType.eyes(EmperorScorpionModel.EMISSIVE_TEXTURE);
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
this.getRenderer().reRender(
bakedModel,
poseStack,
bufferSource,
animatable,
emissiveType,
emissiveBuffer,
partialTick,
0xF000F0,
OverlayTexture.NO_OVERLAY,
0xFFFFFFFF
);
}
}
}
@@ -0,0 +1,13 @@
package com.craisinlord.antarchy.content.client.renderer;
import com.craisinlord.antarchy.content.client.model.RollyPollyModel;
import com.craisinlord.antarchy.content.entity.RollyPollyEntity;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import software.bernie.geckolib.renderer.GeoEntityRenderer;
public class RollyPollyRenderer extends GeoEntityRenderer<RollyPollyEntity> {
public RollyPollyRenderer(EntityRendererProvider.Context context) {
super(context, new RollyPollyModel());
this.shadowRadius = 0.5F;
}
}
@@ -48,40 +48,50 @@ import software.bernie.geckolib.animation.RawAnimation;
import software.bernie.geckolib.util.GeckoLibUtil;
public class EmperorScorpionEntity extends Monster implements GeoEntity {
private static final byte CLAW_ATTACK_ANIM_EVENT = 4;
private static final byte SNAP_ATTACK_ANIM_EVENT = 4;
private static final byte STING_ATTACK_ANIM_EVENT = 5;
private static final byte AGRO_ANIM_EVENT = 6;
private static final int CLAW_ATTACK_ANIM_TICKS = 12;
private static final int CLAW_ATTACK_HIT_TICK = 6;
private static final int CLAW_ATTACK_COOLDOWN_TICKS = 16;
private static final int STING_ATTACK_ANIM_TICKS = 18;
private static final int STING_ATTACK_HIT_TICK = 9;
private static final int STING_ATTACK_COOLDOWN_TICKS = 42;
private static final int POISON_DURATION_TICKS = 100;
private static final int WEAKNESS_DURATION_TICKS = 80;
private static final int SUMMON_INTERVAL_TICKS = 180;
private static final int MAX_SUMMONED_SCORPIONS = 4;
private static final int SNAP_ATTACK_ANIM_TICKS = 23;
private static final int SNAP_ATTACK_HIT_TICK = 12;
private static final int SNAP_ATTACK_COOLDOWN_TICKS = 28;
private static final int STING_ATTACK_ANIM_TICKS = 25;
private static final int STING_ATTACK_HIT_TICK = 13;
private static final int STING_ATTACK_COOLDOWN_TICKS = 60;
private static final int AGRO_ANIM_TICKS = 30;
private static final int DEATH_ANIM_TICKS = 40;
private static final float STING_DAMAGE = 18.0F;
private static final double STING_AOE_RADIUS = 5.0D;
private static final int POISON_DURATION_TICKS = 300;
private static final int WEAKNESS_DURATION_TICKS = 120;
private static final int SUMMON_INTERVAL_TICKS = 140;
private static final int MAX_SUMMONED_SCORPIONS = 8;
private static final String EMPEROR_SUMMON_TAG = "antarchy_emperor_summoned";
private static final ResourceKey<Level> THORAXIS_KEY =
ResourceKey.create(Registries.DIMENSION,
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "thoraxis"));
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
private static final RawAnimation ATTACK_ANIM = RawAnimation.begin().thenPlay("attack");
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
private static final RawAnimation SNAP_ANIM = RawAnimation.begin().thenPlay("snap");
private static final RawAnimation STING_ANIM = RawAnimation.begin().thenPlay("sting");
private static final RawAnimation AGRO_ANIM = RawAnimation.begin().thenPlay("agro");
private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlay("death");
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
private final ServerBossEvent bossEvent =
new ServerBossEvent(this.getDisplayName(), BossEvent.BossBarColor.RED, BossEvent.BossBarOverlay.PROGRESS);
new ServerBossEvent(this.getDisplayName(), BossEvent.BossBarColor.PURPLE, BossEvent.BossBarOverlay.PROGRESS);
private int attackAnimTicks = 0;
private int attackHitTick = 0;
private int attackCooldownTicks = 0;
private int stingCooldownTicks = 0;
private int agroAnimTicks = 0;
private int summonCooldown = 0;
private boolean attackDamageApplied = false;
private boolean stingAttackActive = false;
private boolean hasAgroed = false;
@Nullable private LivingEntity attackTarget;
public EmperorScorpionEntity(EntityType<? extends EmperorScorpionEntity> entityType, Level level) {
@@ -92,12 +102,13 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
public static AttributeSupplier.Builder createAttributes() {
return Monster.createMonsterAttributes()
.add(Attributes.MAX_HEALTH, 200.0D)
.add(Attributes.MAX_HEALTH, 400.0D)
.add(Attributes.MOVEMENT_SPEED, 0.32D)
.add(Attributes.ATTACK_DAMAGE, 18.0D)
.add(Attributes.ARMOR, 6.0D)
.add(Attributes.KNOCKBACK_RESISTANCE, 0.6D)
.add(Attributes.FOLLOW_RANGE, 32.0D);
.add(Attributes.ATTACK_DAMAGE, 28.0D)
.add(Attributes.ARMOR, 25.0D)
.add(Attributes.ARMOR_TOUGHNESS, 10.0D)
.add(Attributes.KNOCKBACK_RESISTANCE, 0.8D)
.add(Attributes.FOLLOW_RANGE, 40.0D);
}
public static boolean canSpawn(EntityType<EmperorScorpionEntity> entityType, ServerLevelAccessor level,
@@ -154,10 +165,27 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
this.resetAttackState();
}
}
if (this.agroAnimTicks > 0) {
this.agroAnimTicks--;
}
if (this.summonCooldown > 0) {
this.summonCooldown--;
}
if (!this.level().isClientSide) {
if (this.getTarget() != null) {
if (!this.hasAgroed) {
this.hasAgroed = true;
this.agroAnimTicks = AGRO_ANIM_TICKS;
this.getNavigation().stop();
this.level().broadcastEntityEvent(this, AGRO_ANIM_EVENT);
this.playSound(AntarchySoundEvents.EMPEROR_SCORPION_ROAR.get(), 2.0F, 0.7F);
}
} else {
this.hasAgroed = false;
}
}
if (this.getTarget() != null
&& this.summonCooldown <= 0
&& !this.isAttackLocked()
@@ -175,7 +203,7 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
return;
}
int toSpawn = 1 + this.random.nextInt(2);
int toSpawn = 2 + this.random.nextInt(2);
EntityType<ScorpionEntity> scorpionType = AntarchyObjects.SCORPION.get();
for (int i = 0; i < toSpawn; i++) {
double offsetX = (this.random.nextDouble() - 0.5D) * 6.0D;
@@ -198,10 +226,10 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
@Override
public boolean doHurtTarget(Entity target) {
return this.performStingAttack(target);
return this.performSnapAttack(target);
}
private boolean performClawAttack(Entity target) {
private boolean performSnapAttack(Entity target) {
boolean hurt = super.doHurtTarget(target);
if (hurt) {
this.playSound(AntarchySoundEvents.EMPEROR_SCORPION_ATTACK.get(), 0.9F, 0.95F + this.random.nextFloat() * 0.08F);
@@ -210,32 +238,39 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
}
private boolean performStingAttack(Entity target) {
boolean hurt;
if (this.level() instanceof ServerLevel serverLevel) {
hurt = target.hurt(AntarchyDamageSources.emperorScorpionSting(serverLevel, this),
(float) this.getAttributeValue(Attributes.ATTACK_DAMAGE));
} else {
hurt = super.doHurtTarget(target);
if (!(this.level() instanceof ServerLevel serverLevel)) {
return false;
}
if (hurt && target instanceof LivingEntity living) {
int poisonDuration = this.level().getDifficulty() == Difficulty.HARD
? POISON_DURATION_TICKS * 2 : POISON_DURATION_TICKS;
living.addEffect(new MobEffectInstance(MobEffects.POISON, poisonDuration, 0));
living.addEffect(new MobEffectInstance(MobEffects.WEAKNESS, WEAKNESS_DURATION_TICKS, 0));
boolean hurtAny = false;
for (LivingEntity living : serverLevel.getEntitiesOfClass(LivingEntity.class,
this.getBoundingBox().inflate(STING_AOE_RADIUS),
entity -> entity != this
&& entity.isAlive()
&& !(entity instanceof EmperorScorpionEntity)
&& !(entity instanceof ScorpionEntity))) {
if (living.hurt(AntarchyDamageSources.emperorScorpionSting(serverLevel, this), STING_DAMAGE)) {
hurtAny = true;
int poisonDuration = this.level().getDifficulty() == Difficulty.HARD
? POISON_DURATION_TICKS * 2 : POISON_DURATION_TICKS;
living.addEffect(new MobEffectInstance(MobEffects.POISON, poisonDuration, 1));
living.addEffect(new MobEffectInstance(MobEffects.WEAKNESS, WEAKNESS_DURATION_TICKS, 0));
}
}
if (hurtAny) {
this.playSound(AntarchySoundEvents.EMPEROR_SCORPION_ATTACK.get(), 1.0F, 0.9F + this.random.nextFloat() * 0.08F);
}
return hurt;
return hurtAny;
}
private void beginClawAttack(LivingEntity target) {
private void beginSnapAttack(LivingEntity target) {
this.attackTarget = target;
this.attackAnimTicks = CLAW_ATTACK_ANIM_TICKS;
this.attackHitTick = CLAW_ATTACK_HIT_TICK;
this.attackCooldownTicks = CLAW_ATTACK_COOLDOWN_TICKS;
this.attackAnimTicks = SNAP_ATTACK_ANIM_TICKS;
this.attackHitTick = SNAP_ATTACK_HIT_TICK;
this.attackCooldownTicks = SNAP_ATTACK_COOLDOWN_TICKS;
this.attackDamageApplied = false;
this.stingAttackActive = false;
this.getNavigation().stop();
this.level().broadcastEntityEvent(this, CLAW_ATTACK_ANIM_EVENT);
this.level().broadcastEntityEvent(this, SNAP_ATTACK_ANIM_EVENT);
this.commitLunge(target, 0.42D, 0.10D);
}
@@ -259,14 +294,13 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
}
this.getLookControl().setLookAt(this.attackTarget, 30.0F, 30.0F);
if (!this.attackDamageApplied
&& this.attackAnimTicks == this.attackHitTick
&& this.distanceToSqr(this.attackTarget) <= this.getAttackReachSqr(this.attackTarget)) {
this.attackDamageApplied = true;
if (!this.attackDamageApplied && this.attackAnimTicks == this.attackHitTick) {
if (this.stingAttackActive) {
this.attackDamageApplied = true;
this.performStingAttack(this.attackTarget);
} else {
this.performClawAttack(this.attackTarget);
} else if (this.distanceToSqr(this.attackTarget) <= this.getAttackReachSqr(this.attackTarget)) {
this.attackDamageApplied = true;
this.performSnapAttack(this.attackTarget);
}
}
@@ -306,13 +340,13 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
}
private boolean isAttackLocked() {
return this.attackAnimTicks > 0;
return this.attackAnimTicks > 0 || this.agroAnimTicks > 0;
}
@Override
public void handleEntityEvent(byte id) {
if (id == CLAW_ATTACK_ANIM_EVENT) {
this.attackAnimTicks = CLAW_ATTACK_ANIM_TICKS;
if (id == SNAP_ATTACK_ANIM_EVENT) {
this.attackAnimTicks = SNAP_ATTACK_ANIM_TICKS;
this.attackDamageApplied = false;
this.stingAttackActive = false;
return;
@@ -323,6 +357,10 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
this.stingAttackActive = true;
return;
}
if (id == AGRO_ANIM_EVENT) {
this.agroAnimTicks = AGRO_ANIM_TICKS;
return;
}
super.handleEntityEvent(id);
}
@@ -332,8 +370,14 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
}
private PlayState mainController(AnimationState<EmperorScorpionEntity> state) {
if (this.isDeadOrDying()) {
return state.setAndContinue(DEATH_ANIM);
}
if (this.attackAnimTicks > 0) {
return state.setAndContinue(ATTACK_ANIM);
return state.setAndContinue(this.stingAttackActive ? STING_ANIM : SNAP_ANIM);
}
if (this.agroAnimTicks > 0) {
return state.setAndContinue(AGRO_ANIM);
}
if (state.isMoving()) {
return state.setAndContinue(WALK_ANIM);
@@ -341,6 +385,15 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
return state.setAndContinue(IDLE_ANIM);
}
@Override
protected void tickDeath() {
this.deathTime++;
if (this.deathTime >= DEATH_ANIM_TICKS && !this.level().isClientSide && !this.isRemoved()) {
this.level().broadcastEntityEvent(this, (byte) 60);
this.remove(RemovalReason.KILLED);
}
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.geoCache;
@@ -421,7 +474,7 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
if (EmperorScorpionEntity.this.shouldUseSting(enemy)) {
EmperorScorpionEntity.this.beginStingAttack(enemy);
} else {
EmperorScorpionEntity.this.beginClawAttack(enemy);
EmperorScorpionEntity.this.beginSnapAttack(enemy);
}
return;
}
@@ -71,7 +71,6 @@ public class MantisEntity extends Monster implements GeoEntity {
public MantisEntity(EntityType<? extends MantisEntity> entityType, Level level) {
super(entityType, level);
this.lookControl = new SteadyLookControl(this);
this.setNoGravity(false);
this.setPathfindingMalus(PathType.WATER, -1.0F);
this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F);
@@ -208,14 +207,6 @@ public class MantisEntity extends Monster implements GeoEntity {
LivingEntity target = this.getTarget();
if (target != null && target.isAlive()) {
this.getLookControl().setLookAt(target, 30.0F, 30.0F);
// If the target is horizontally inside our (wide) footprint, walking toward
// it only makes us pivot in place — hold position, attack reach covers it
double dx = target.getX() - this.getX();
double dz = target.getZ() - this.getZ();
double halfWidth = this.getBbWidth() * 0.5D;
if (!this.isFlyingNow() && dx * dx + dz * dz < halfWidth * halfWidth) {
this.getNavigation().stop();
}
} else if (this.flyBurstTicks <= 0 && this.flyCooldownTicks <= 0 && this.onGround() && this.random.nextInt(180) == 0) {
this.startFlightBurst();
}
@@ -330,31 +321,6 @@ public class MantisEntity extends Monster implements GeoEntity {
return this.flyBurstTicks > 0;
}
/**
* The mantis hitbox is several blocks wide, so a melee-range target is often
* horizontally inside the footprint. The yaw from body center to such a target
* flips wildly as the target moves past the center, which made the mantis spin
* instead of facing the player — hold the current heading in that case.
*/
private static class SteadyLookControl extends net.minecraft.world.entity.ai.control.LookControl {
SteadyLookControl(Mob mob) {
super(mob);
}
@Override
public void tick() {
if (this.lookAtCooldown > 0) {
double dx = this.wantedX - this.mob.getX();
double dz = this.wantedZ - this.mob.getZ();
double halfWidth = this.mob.getBbWidth() * 0.5D;
if (dx * dx + dz * dz < halfWidth * halfWidth) {
return;
}
}
super.tick();
}
}
private void tickDebugLog() {
if (++this.debugLogTicks < 100) {
return;
@@ -0,0 +1,444 @@
package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchyTags;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.TamableAnimal;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.goal.FloatGoal;
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
import net.minecraft.world.entity.ai.goal.PanicGoal;
import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
import net.minecraft.world.entity.ai.goal.TemptGoal;
import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.Level;
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.AnimatableManager;
import software.bernie.geckolib.animation.AnimationController;
import software.bernie.geckolib.animation.AnimationState;
import software.bernie.geckolib.animation.PlayState;
import software.bernie.geckolib.animation.RawAnimation;
import software.bernie.geckolib.util.GeckoLibUtil;
public class RollyPollyEntity extends TamableAnimal 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 ROLL_UP_ANIM = RawAnimation.begin().thenPlay("wheel_mode");
private static final RawAnimation ROLLING_ANIM = RawAnimation.begin().thenLoop("roll");
private static final RawAnimation UNROLL_ANIM = RawAnimation.begin().thenPlay("normal_mode");
private static final int ANIM_IDLE = 0;
private static final int ANIM_WALK = 1;
private static final int ANIM_ROLL_UP = 2;
private static final int ANIM_ROLLING = 3;
private static final int ANIM_UNROLL = 4;
// wheel_mode is 0.75s, normal_mode is ~0.42s
private static final int ROLL_UP_TICKS = 15;
private static final int UNROLL_TICKS = 9;
private static final int DEFENSIVE_CURL_TICKS = 100;
private static final int TUMBLE_DAMAGE_INTERVAL_TICKS = 30;
private static final EntityDataAccessor<Integer> ANIMATION_STATE =
SynchedEntityData.defineId(RollyPollyEntity.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Boolean> SADDLED =
SynchedEntityData.defineId(RollyPollyEntity.class, EntityDataSerializers.BOOLEAN);
private static final EntityDataAccessor<Boolean> ROLLED =
SynchedEntityData.defineId(RollyPollyEntity.class, EntityDataSerializers.BOOLEAN);
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
private int rollTransitionTicks;
private boolean unrolling;
private int defensiveCurlTicks;
private int tumbleTicks;
public RollyPollyEntity(EntityType<? extends RollyPollyEntity> entityType, Level level) {
super(entityType, level);
}
public static AttributeSupplier.Builder createAttributes() {
return Mob.createMobAttributes()
.add(Attributes.MAX_HEALTH, AntarchySettings.rollyPollyHealth())
.add(Attributes.MOVEMENT_SPEED, AntarchySettings.rollyPollyMovementSpeed())
.add(Attributes.FOLLOW_RANGE, 16.0D);
}
@Override
protected void defineSynchedData(SynchedEntityData.Builder builder) {
super.defineSynchedData(builder);
builder.define(ANIMATION_STATE, ANIM_IDLE);
builder.define(SADDLED, false);
builder.define(ROLLED, false);
}
@Override
protected void registerGoals() {
this.goalSelector.addGoal(0, new FloatGoal(this));
this.goalSelector.addGoal(1, new PanicGoal(this, 1.4D) {
@Override
public boolean canUse() {
// Curled-up or tamed rolly pollies stand their ground
return !RollyPollyEntity.this.isRolled() && !RollyPollyEntity.this.isTame() && super.canUse();
}
});
this.goalSelector.addGoal(2, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyTags.Items.ROLLY_POLLY_FOOD), false) {
@Override
public boolean canUse() {
return !RollyPollyEntity.this.isRolled() && super.canUse();
}
});
this.goalSelector.addGoal(3, new WaterAvoidingRandomStrollGoal(this, 1.0D) {
@Override
public boolean canUse() {
return !RollyPollyEntity.this.isRolled() && !RollyPollyEntity.this.isVehicle() && super.canUse();
}
});
this.goalSelector.addGoal(4, new LookAtPlayerGoal(this, Player.class, 8.0F));
this.goalSelector.addGoal(5, new RandomLookAroundGoal(this));
}
@Override
public boolean isFood(ItemStack stack) {
return stack.is(AntarchyTags.Items.ROLLY_POLLY_FOOD);
}
@Override
public InteractionResult mobInteract(Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
if (this.isFood(stack)) {
if (!this.level().isClientSide) {
if (!player.getAbilities().instabuild) {
stack.shrink(1);
}
if (!this.isTame()) {
if (this.random.nextInt(AntarchySettings.rollyPollyTameChance()) == 0) {
this.setTame(true, true);
this.setOwnerUUID(player.getUUID());
this.stopDefensiveCurl();
this.setTarget(null);
this.level().broadcastEntityEvent(this, (byte) 7);
} else {
this.level().broadcastEntityEvent(this, (byte) 6);
}
} else if (this.getHealth() < this.getMaxHealth()) {
this.heal(4.0F);
this.level().broadcastEntityEvent(this, (byte) 7);
}
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
if (this.isTame()) {
if (!this.hasSaddle() && stack.is(Items.SADDLE) && this.isOwnedBy(player)) {
if (!this.level().isClientSide) {
this.setSaddled(true);
if (!player.getAbilities().instabuild) {
stack.shrink(1);
}
this.playSound(SoundEvents.HORSE_SADDLE, 1.0F, 1.2F);
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
if (this.hasSaddle() && stack.isEmpty() && player.isShiftKeyDown() && this.isOwnedBy(player) && !player.isPassengerOfSameVehicle(this)) {
if (!this.level().isClientSide) {
this.setSaddled(false);
this.spawnAtLocation(new ItemStack(Items.SADDLE));
this.playSound(SoundEvents.HORSE_SADDLE, 1.0F, 0.9F);
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
if (this.hasSaddle() && stack.isEmpty() && !player.isPassengerOfSameVehicle(this)) {
if (!this.level().isClientSide) {
player.startRiding(this);
}
return InteractionResult.sidedSuccess(this.level().isClientSide);
}
}
return super.mobInteract(player, hand);
}
@Override
@Nullable
public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) {
return null;
}
public boolean hasSaddle() {
return this.entityData.get(SADDLED);
}
public void setSaddled(boolean saddled) {
this.entityData.set(SADDLED, saddled);
}
public boolean isRolled() {
return this.entityData.get(ROLLED);
}
private void setRolled(boolean rolled) {
this.entityData.set(ROLLED, rolled);
}
/** Toggles wheel mode; called from the ridden-roll keybind payload. */
public void handleRollToggle(ServerPlayer player) {
if (!this.isTame() || !this.hasSaddle() || this.getControllingPassenger() != player) {
return;
}
if (this.rollTransitionTicks > 0) {
return;
}
if (this.isRolled()) {
this.startUnroll();
} else {
this.startRollUp();
}
}
private void startRollUp() {
this.setRolled(true);
this.unrolling = false;
this.rollTransitionTicks = ROLL_UP_TICKS;
this.setAnimationState(ANIM_ROLL_UP);
this.playSound(SoundEvents.ARMOR_EQUIP_TURTLE.value(), 0.8F, 1.4F);
}
private void startUnroll() {
this.unrolling = true;
this.rollTransitionTicks = UNROLL_TICKS;
this.setAnimationState(ANIM_UNROLL);
this.playSound(SoundEvents.ARMOR_EQUIP_TURTLE.value(), 0.8F, 1.1F);
}
private void stopDefensiveCurl() {
this.defensiveCurlTicks = 0;
if (this.isRolled() && !this.isVehicle()) {
this.startUnroll();
}
}
@Override
public boolean hurt(DamageSource source, float amount) {
if (this.isRolled()) {
amount *= 0.25F;
}
boolean hurt = super.hurt(source, amount);
// Wild rolly pollies curl up defensively when attacked
if (hurt && !this.level().isClientSide && !this.isTame() && this.isAlive()
&& !this.isRolled() && this.rollTransitionTicks <= 0) {
this.defensiveCurlTicks = DEFENSIVE_CURL_TICKS;
this.startRollUp();
}
return hurt;
}
@Override
public void tick() {
super.tick();
if (this.level().isClientSide) {
return;
}
if (this.rollTransitionTicks > 0) {
this.rollTransitionTicks--;
if (this.rollTransitionTicks <= 0) {
if (this.unrolling) {
this.setRolled(false);
this.unrolling = false;
this.setAnimationState(ANIM_IDLE);
} else {
this.setAnimationState(ANIM_ROLLING);
}
}
}
if (this.defensiveCurlTicks > 0) {
this.defensiveCurlTicks--;
this.getNavigation().stop();
if (this.defensiveCurlTicks <= 0 && this.isRolled() && !this.isVehicle()) {
this.startUnroll();
}
}
this.tickTumbleDamage();
this.updateAnimationState();
}
private void tickTumbleDamage() {
if (!this.isRolled() || this.rollTransitionTicks > 0
|| !(this.getControllingPassenger() instanceof Player rider)) {
this.tumbleTicks = 0;
return;
}
boolean moving = this.getDeltaMovement().horizontalDistanceSqr() > 0.003D;
boolean helmeted = !rider.getItemBySlot(EquipmentSlot.HEAD).isEmpty();
if (!moving || helmeted) {
return;
}
if (++this.tumbleTicks >= TUMBLE_DAMAGE_INTERVAL_TICKS) {
this.tumbleTicks = 0;
rider.hurt(this.damageSources().generic(), (float) AntarchySettings.rollyPollyTumbleDamage());
}
}
private void updateAnimationState() {
// Roll states are driven by the transition/tick logic above
int state = this.getAnimationState();
if (state == ANIM_ROLL_UP || state == ANIM_ROLLING || state == ANIM_UNROLL) {
return;
}
boolean moving = this.getDeltaMovement().horizontalDistanceSqr() > 1.0E-4D;
this.setAnimationState(moving ? ANIM_WALK : ANIM_IDLE);
}
private int getAnimationState() {
return this.entityData.get(ANIMATION_STATE);
}
private void setAnimationState(int state) {
this.entityData.set(ANIMATION_STATE, state);
}
@Override
@Nullable
public LivingEntity getControllingPassenger() {
if (!this.isTame() || !this.hasSaddle()) {
return null;
}
Entity passenger = this.getFirstPassenger();
return passenger instanceof LivingEntity living ? living : null;
}
@Override
public boolean canAddPassenger(Entity passenger) {
return this.getPassengers().isEmpty();
}
@Override
protected void positionRider(Entity passenger, MoveFunction moveFunction) {
if (this.hasPassenger(passenger)) {
// When rolled the rider tucks into the center of the ball; otherwise sits on the shell
double yOffset = this.isRolled() ? -0.25D : 0.45D;
moveFunction.accept(passenger, this.getX(), this.getY() + yOffset, this.getZ());
}
}
@Override
public void travel(Vec3 travelVector) {
if (!(this.getControllingPassenger() instanceof Player rider) || !this.isVehicle()) {
if (this.defensiveCurlTicks > 0) {
super.travel(Vec3.ZERO);
return;
}
super.travel(travelVector);
return;
}
if (this.rollTransitionTicks > 0) {
// Hold still while rolling up / unrolling
super.travel(Vec3.ZERO);
return;
}
this.setYRot(rider.getYHeadRot());
this.yBodyRot = this.getYRot();
this.yHeadRot = this.getYRot();
float forward = rider.zza;
float strafe = rider.xxa * 0.5F;
if (forward < 0.0F) {
forward *= 0.4F;
}
if (this.isRolled()) {
// Rolling is fast but drifty
strafe *= 0.35F;
}
double speed = this.getAttributeValue(Attributes.MOVEMENT_SPEED)
* (this.isRolled() ? AntarchySettings.rollyPollyRollSpeedMultiplier() : 1.0D);
this.setSpeed((float) speed);
Vec3 input = new Vec3(strafe, 0.0D, forward);
Vec3 motion = new Vec3(0.0D, this.getDeltaMovement().y, 0.0D);
this.moveRelative(this.getSpeed(), input);
this.setDeltaMovement(motion.add(this.getDeltaMovement().x, 0.0D, this.getDeltaMovement().z));
this.move(MoverType.SELF, this.getDeltaMovement());
}
@Override
public boolean causeFallDamage(float fallDistance, float multiplier, DamageSource damageSource) {
if (this.isRolled()) {
return false;
}
return super.causeFallDamage(fallDistance, multiplier, damageSource);
}
@Override
protected void dropEquipment() {
super.dropEquipment();
if (this.hasSaddle()) {
this.spawnAtLocation(new ItemStack(Items.SADDLE));
this.setSaddled(false);
}
}
@Override
public void addAdditionalSaveData(CompoundTag tag) {
super.addAdditionalSaveData(tag);
tag.putBoolean("Saddled", this.hasSaddle());
}
@Override
public void readAdditionalSaveData(CompoundTag tag) {
super.readAdditionalSaveData(tag);
this.setSaddled(tag.getBoolean("Saddled"));
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
controllers.add(new AnimationController<>(this, "main_controller", 2, this::mainAnimController));
}
private PlayState mainAnimController(AnimationState<RollyPollyEntity> state) {
return switch (this.getAnimationState()) {
case ANIM_WALK -> state.setAndContinue(WALK_ANIM);
case ANIM_ROLL_UP -> state.setAndContinue(ROLL_UP_ANIM);
case ANIM_ROLLING -> state.setAndContinue(ROLLING_ANIM);
case ANIM_UNROLL -> state.setAndContinue(UNROLL_ANIM);
default -> state.setAndContinue(IDLE_ANIM);
};
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.geoCache;
}
}
@@ -0,0 +1,20 @@
package com.craisinlord.antarchy.content.network;
import com.craisinlord.antarchy.Antarchy;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
/** C2S: the rider pressed the roll keybind — toggle the rolly polly's wheel mode. */
public record RollyPollyRollPayload() implements CustomPacketPayload {
public static final Type<RollyPollyRollPayload> TYPE =
new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "rolly_polly_roll"));
public static final StreamCodec<ByteBuf, RollyPollyRollPayload> STREAM_CODEC =
StreamCodec.unit(new RollyPollyRollPayload());
@Override
public Type<RollyPollyRollPayload> type() {
return TYPE;
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -7,8 +7,8 @@
"texture_width": 128,
"texture_height": 128,
"visible_bounds_width": 6,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
"visible_bounds_height": 5,
"visible_bounds_offset": [0, 1.5, 0]
},
"bones": [
{
@@ -22,7 +22,6 @@
"cubes": [
{"origin": [-6.5, 3, -22], "size": [13, 13, 25], "inflate": 0.01, "uv": [0, 0]},
{"origin": [-1, 16, -12], "size": [2, 5, 9], "inflate": 0.01, "uv": [0, 0]},
{"origin": [-1, 24, -9], "size": [2, 3, 16], "inflate": 0.1, "uv": [0, 99]},
{"origin": [-1, 21, -9], "size": [2, 7, 6], "inflate": 0.01, "uv": [51, 0]}
]
},
@@ -57,36 +56,68 @@
{"origin": [-4.5, 10, -49], "size": [9, 6, 8], "uv": [63, 85]}
]
},
{
"name": "right_wing",
"parent": "head",
"pivot": [-8, 16, -27.5],
"cubes": [
{"origin": [-22, 16, -33], "size": [14, 0, 11], "uv": [40, 105]}
]
},
{
"name": "right_wing2",
"parent": "right_wing",
"pivot": [-22, 16, -27.5],
"cubes": [
{"origin": [-36, 16, -33], "size": [14, 0, 11], "uv": [89, 51]}
]
},
{
"name": "left_wing",
"parent": "head",
"pivot": [8, 16, -27.5],
"cubes": [
{"origin": [8, 16, -33], "size": [14, 0, 11], "uv": [40, 105], "mirror": true}
{"origin": [8, 16, -33], "size": [16, 0, 15], "uv": [48, 99], "mirror": true}
]
},
{
"name": "left_wing2",
"parent": "left_wing",
"pivot": [22, 16, -27.5],
"pivot": [24, 16, -27.5],
"cubes": [
{"origin": [22, 16, -33], "size": [14, 0, 11], "uv": [89, 51], "mirror": true}
{"origin": [24, 16, -35], "size": [16, 0, 17], "uv": [-17, 105], "mirror": true}
]
},
{
"name": "left_wing_back",
"parent": "head",
"pivot": [8, 16, -2.5],
"cubes": [
{"origin": [8, 16, -8], "size": [16, 0, 15], "uv": [48, 99], "mirror": true}
]
},
{
"name": "left_wing_back2",
"parent": "left_wing_back",
"pivot": [24, 16, -2.5],
"cubes": [
{"origin": [24, 16, -10], "size": [16, 0, 17], "uv": [-17, 105], "mirror": true}
]
},
{
"name": "right_wing_back",
"parent": "head",
"pivot": [-8, 16, -2.5],
"cubes": [
{"origin": [-24, 16, -8], "size": [16, 0, 15], "uv": [48, 99]}
]
},
{
"name": "right_wing_back2",
"parent": "right_wing_back",
"pivot": [-24, 16, -2.5],
"cubes": [
{"origin": [-40, 16, -10], "size": [16, 0, 17], "uv": [-17, 105]}
]
},
{
"name": "right_wing",
"parent": "head",
"pivot": [-8, 16, -27.5],
"cubes": [
{"origin": [-24, 16, -33], "size": [16, 0, 15], "uv": [48, 99]}
]
},
{
"name": "right_wing2",
"parent": "right_wing",
"pivot": [-24, 16, -27.5],
"cubes": [
{"origin": [-40, 16, -35], "size": [16, 0, 17], "uv": [-17, 105]}
]
},
{
@@ -94,7 +125,10 @@
"parent": "head",
"pivot": [0, 17.5, -37],
"cubes": [
{"origin": [-4, 17, -41], "size": [8, 1, 8], "uv": [96, 108]}
{"origin": [-4, 17, -41], "size": [1, 2, 8], "uv": [32, 105]},
{"origin": [-3, 17, -41], "size": [6, 2, 1], "uv": [42, 105]},
{"origin": [-3, 17, -34], "size": [6, 2, 1], "uv": [42, 115]},
{"origin": [3, 17, -41], "size": [1, 2, 8], "uv": [32, 115]}
]
},
{
@@ -130,38 +164,6 @@
{"origin": [4.5, 4, -17], "size": [12, 3, 10], "inflate": 0.01, "uv": [0, 65], "mirror": true},
{"origin": [16.5, 4, -14], "size": [7, 3, 7], "inflate": 0.01, "uv": [90, 73], "mirror": true}
]
},
{
"name": "right_wing3",
"parent": "torso",
"pivot": [-9, 16, 1.5],
"cubes": [
{"origin": [-23, 16, -4], "size": [14, 0, 11], "uv": [40, 105]}
]
},
{
"name": "right_wing4",
"parent": "right_wing3",
"pivot": [-23, 16, 1.5],
"cubes": [
{"origin": [-37, 16, -4], "size": [14, 0, 11], "uv": [89, 51]}
]
},
{
"name": "left_wing3",
"parent": "torso",
"pivot": [9, 16, 1.5],
"cubes": [
{"origin": [9, 16, -4], "size": [14, 0, 11], "uv": [40, 105], "mirror": true}
]
},
{
"name": "left_wing4",
"parent": "left_wing3",
"pivot": [23, 16, 1.5],
"cubes": [
{"origin": [23, 16, -4], "size": [14, 0, 11], "uv": [89, 51], "mirror": true}
]
}
]
}
@@ -5,163 +5,283 @@
"description": {
"identifier": "geometry.unknown",
"texture_width": 128,
"texture_height": 128,
"visible_bounds_width": 12,
"texture_height": 256,
"visible_bounds_width": 15,
"visible_bounds_height": 4.5,
"visible_bounds_offset": [0, 1.75, 0]
},
"bones": [
{
"name": "scorpion_emperor",
"pivot": [0, 6.85714, 5.25]
"name": "Emperor_scorpion",
"pivot": [0, 8, 3]
},
{
"name": "l_leg3",
"parent": "scorpion_emperor",
"pivot": [10, 6.5, 14.5],
"rotation": [0, 0, 15],
"name": "body",
"parent": "Emperor_scorpion",
"pivot": [0, 13.77778, 4.77778]
},
{
"name": "right_leg3",
"parent": "body",
"pivot": [-16, 14.5, 1.5],
"cubes": [
{"origin": [9.5, 5, 12], "size": [21, 3, 5], "uv": [0, 113], "mirror": true}
{"origin": [-48, 13, -2], "size": [32, 3, 7], "uv": [44, 214], "mirror": true}
]
},
{
"name": "r_leg3",
"parent": "scorpion_emperor",
"pivot": [-10, 6.5, 14.5],
"rotation": [0, 0, -15],
"name": "right_leg4",
"parent": "right_leg3",
"pivot": [-48, 16, 1.5],
"cubes": [
{"origin": [-30.5, 5, 12], "size": [21, 3, 5], "uv": [0, 113]}
{"origin": [-80, 13, -2], "size": [32, 3, 7], "inflate": 0.1, "uv": [44, 224], "mirror": true},
{"origin": [-97, 12, -3], "size": [17, 5, 9], "uv": [67, 143], "mirror": true}
]
},
{
"name": "l_leg2",
"parent": "scorpion_emperor",
"pivot": [10, 6.5, 4.5],
"rotation": [0, 0, 15],
"name": "right_leg",
"parent": "body",
"pivot": [-16, 14.5, -5.5],
"cubes": [
{"origin": [9.5, 5, 2], "size": [21, 3, 5], "uv": [0, 113], "mirror": true}
{"origin": [-48, 13, -9], "size": [32, 3, 7], "uv": [44, 214], "mirror": true}
]
},
{
"name": "r_leg2",
"parent": "scorpion_emperor",
"pivot": [-10, 6.5, 4.5],
"rotation": [0, 0, -15],
"name": "right_leg2",
"parent": "right_leg",
"pivot": [-48, 16, -5.5],
"cubes": [
{"origin": [-30.5, 5, 2], "size": [21, 3, 5], "uv": [0, 113]}
{"origin": [-80, 13, -9], "size": [32, 3, 7], "inflate": 0.1, "uv": [44, 224], "mirror": true},
{"origin": [-97, 12, -10], "size": [17, 5, 9], "uv": [67, 143], "mirror": true}
]
},
{
"name": "l_leg",
"parent": "scorpion_emperor",
"pivot": [10, 6.5, -4.5],
"rotation": [0, 0, 15],
"name": "left_leg",
"parent": "body",
"pivot": [16, 14.5, -5.5],
"cubes": [
{"origin": [9.5, 5, -7], "size": [21, 3, 5], "uv": [0, 113], "mirror": true}
{"origin": [16, 13, -9], "size": [32, 3, 7], "uv": [44, 214]}
]
},
{
"name": "r_leg",
"parent": "scorpion_emperor",
"pivot": [-10, 6.5, -4.5],
"rotation": [0, 0, -15],
"name": "left_leg2",
"parent": "left_leg",
"pivot": [48, 16, -5.5],
"cubes": [
{"origin": [-30.5, 5, -7], "size": [21, 3, 5], "uv": [0, 113]}
{"origin": [48, 13, -9], "size": [32, 3, 7], "inflate": 0.1, "uv": [44, 224]},
{"origin": [80, 12, -10], "size": [17, 5, 9], "uv": [67, 143]}
]
},
{
"name": "left_leg3",
"parent": "body",
"pivot": [16, 14.5, 1.5],
"cubes": [
{"origin": [16, 13, -2], "size": [32, 3, 7], "uv": [44, 214]}
]
},
{
"name": "left_leg4",
"parent": "left_leg3",
"pivot": [48, 16, 1.5],
"cubes": [
{"origin": [48, 13, -2], "size": [32, 3, 7], "inflate": 0.1, "uv": [44, 224]},
{"origin": [80, 12, -3], "size": [17, 5, 9], "uv": [67, 143]}
]
},
{
"name": "left_leg_back",
"parent": "body",
"pivot": [16, 14.5, 8.5],
"cubes": [
{"origin": [16, 13, 5], "size": [32, 3, 7], "uv": [44, 214]}
]
},
{
"name": "left_leg_back2",
"parent": "left_leg_back",
"pivot": [48, 16, 8.5],
"cubes": [
{"origin": [48, 13, 5], "size": [32, 3, 7], "inflate": 0.1, "uv": [44, 224]},
{"origin": [80, 12, 4], "size": [17, 5, 9], "uv": [67, 143]}
]
},
{
"name": "right_leg_back",
"parent": "body",
"pivot": [-16, 14.5, 8.5],
"cubes": [
{"origin": [-48, 13, 5], "size": [32, 3, 7], "uv": [44, 214], "mirror": true}
]
},
{
"name": "right_leg_back2",
"parent": "right_leg_back",
"pivot": [-48, 16, 8.5],
"cubes": [
{"origin": [-80, 13, 5], "size": [32, 3, 7], "inflate": 0.1, "uv": [44, 224], "mirror": true},
{"origin": [-97, 12, 4], "size": [17, 5, 9], "uv": [67, 143], "mirror": true}
]
},
{
"name": "left_leg_back3",
"parent": "body",
"pivot": [16, 14.5, 15.5],
"cubes": [
{"origin": [16, 13, 12], "size": [32, 3, 7], "uv": [44, 214]}
]
},
{
"name": "left_leg_back4",
"parent": "left_leg_back3",
"pivot": [48, 16, 15.5],
"cubes": [
{"origin": [48, 13, 12], "size": [32, 3, 7], "inflate": 0.1, "uv": [44, 224]},
{"origin": [80, 12, 11], "size": [17, 5, 9], "uv": [67, 143]}
]
},
{
"name": "right_leg_back3",
"parent": "body",
"pivot": [-16, 14.5, 15.5],
"cubes": [
{"origin": [-48, 13, 12], "size": [32, 3, 7], "uv": [44, 214], "mirror": true}
]
},
{
"name": "right_leg_back4",
"parent": "right_leg_back3",
"pivot": [-48, 16, 15.5],
"cubes": [
{"origin": [-80, 13, 12], "size": [32, 3, 7], "inflate": 0.1, "uv": [44, 224], "mirror": true},
{"origin": [-97, 12, 11], "size": [17, 5, 9], "uv": [67, 143], "mirror": true}
]
},
{
"name": "torso",
"parent": "scorpion_emperor",
"pivot": [0, 9, 7.75],
"parent": "body",
"pivot": [0, 8, 3],
"cubes": [
{"origin": [-10.5, 5, -10], "size": [21, 8, 27], "uv": [0, 0]},
{"origin": [-8, 5, 17], "size": [16, 8, 11], "uv": [73, 109]},
{"origin": [-9.5, 12.5, 13], "size": [4, 5, 0], "uv": [0, 21]},
{"origin": [-4.5, 12.5, 13], "size": [4, 5, 0], "uv": [0, 21]},
{"origin": [0.5, 12.5, 13], "size": [4, 5, 0], "uv": [0, 21], "mirror": true},
{"origin": [5.5, 12.5, 13], "size": [4, 5, 0], "uv": [0, 21], "mirror": true},
{"origin": [5.5, 12.5, 3], "size": [4, 5, 0], "uv": [0, 21], "mirror": true},
{"origin": [0.5, 12.5, 3], "size": [4, 5, 0], "uv": [0, 21], "mirror": true},
{"origin": [-4.5, 12.5, 3], "size": [4, 5, 0], "uv": [0, 21]},
{"origin": [-9.5, 12.5, 3], "size": [4, 5, 0], "uv": [0, 21]},
{"origin": [-9.5, 12.5, -4], "size": [4, 5, 0], "uv": [0, 21]},
{"origin": [5.5, 12.5, -4], "size": [4, 5, 0], "uv": [0, 21], "mirror": true},
{"origin": [6.5, 12.5, 8], "size": [4, 5, 0], "uv": [0, 21], "mirror": true},
{"origin": [1.5, 12.5, 8], "size": [4, 5, 0], "uv": [0, 21], "mirror": true},
{"origin": [-4.5, 12.5, 8], "size": [4, 5, 0], "uv": [0, 21]},
{"origin": [-10.5, 12.5, 8], "size": [4, 5, 0], "uv": [0, 21]}
{"origin": [-16, 8, -13], "size": [32, 11, 32], "uv": [0, 100]}
]
},
{
"name": "tail_base",
"parent": "torso",
"pivot": [0, 14.5, 18.25],
"cubes": [
{"origin": [-12, 8, 19], "size": [24, 11, 19], "uv": [0, 143]}
]
},
{
"name": "tail",
"parent": "torso",
"pivot": [0, 7.00833, 27.99167],
"parent": "tail_base",
"pivot": [0, 15.5, 38],
"cubes": [
{"origin": [-4, 7, 28], "size": [8, 6, 13], "inflate": 0.1, "uv": [0, 92]}
{"origin": [-6.5, 12, 38], "size": [13, 7, 25], "uv": [0, 173]}
]
},
{
"name": "tail2",
"parent": "tail",
"pivot": [0, 7, 41],
"pivot": [0, 15.5, 63],
"cubes": [
{"origin": [-4, 7, 41], "size": [8, 6, 13], "uv": [42, 92]}
]
},
{
"name": "tail3",
"parent": "tail2",
"pivot": [0, 7, 54],
"cubes": [
{"origin": [-6.5, 7, 54], "size": [13, 11, 11], "uv": [62, 62]},
{"origin": [-2.5, 18, 56], "size": [5, 17, 7], "uv": [84, 84]},
{"origin": [0, 35, 56], "size": [0, 17, 7], "uv": [52, 104]},
{"origin": [0, 4, 70], "size": [0, 17, 7], "pivot": [0, 12.5, 73.5], "rotation": [-90, 0, 0], "uv": [52, 104]},
{"origin": [0, 24, 49], "size": [0, 17, 7], "pivot": [0, 32.5, 52.5], "rotation": [45, 0, 0], "uv": [52, 104]}
{"origin": [-5.5, 12, 97], "size": [11, 22, 11], "uv": [0, 205]},
{"origin": [0, 34, 100], "size": [0, 15, 8], "uv": [51, 165]},
{"origin": [-4.5, 12, 63], "size": [9, 7, 34], "uv": [42, 173]}
]
},
{
"name": "head",
"parent": "torso",
"pivot": [0, 9, -8],
"pivot": [0, 13.5, -13],
"cubes": [
{"origin": [-13.5, 4, -25], "size": [27, 10, 17], "uv": [0, 35]},
{"origin": [-5, 1, -27], "size": [2, 8, 3], "uv": [0, 62]},
{"origin": [3, 1, -27], "size": [2, 8, 3], "uv": [0, 62], "mirror": true}
{"origin": [-14, 8, -35], "size": [28, 11, 22], "uv": [0, 0]}
]
},
{
"name": "r_claw",
"name": "right_mandibule",
"parent": "head",
"pivot": [-12.5, 8, -16],
"pivot": [-9.13234, 15.5, -35.71164],
"cubes": [
{"origin": [-18.5, 3, -28], "size": [6, 10, 17], "uv": [69, 0]}
{"origin": [-8, 5, -37], "size": [7, 13, 8], "pivot": [0, 13.5, -46], "rotation": [0, -22.5, 0], "uv": [54, 79]}
]
},
{
"name": "r_claw2",
"parent": "r_claw",
"pivot": [-15.25, 8, -11],
"cubes": [
{"origin": [-26.5, 3, -31], "size": [11, 10, 20], "inflate": 0.1, "uv": [0, 62]},
{"origin": [-35.5, 8, -31], "size": [9, 0, 19], "uv": [25, 63]}
]
},
{
"name": "l_claw",
"name": "left_mandibule",
"parent": "head",
"pivot": [12.5, 8, -16],
"pivot": [9.13234, 15.5, -35.71164],
"cubes": [
{"origin": [12.5, 3, -28], "size": [6, 10, 17], "uv": [69, 0], "mirror": true}
{"origin": [1, 5, -37], "size": [7, 13, 8], "pivot": [0, 13.5, -46], "rotation": [0, 22.5, 0], "uv": [0, 81]}
]
},
{
"name": "l_claw2",
"parent": "l_claw",
"pivot": [15.25, 8, -11],
"name": "right_arm",
"parent": "head",
"pivot": [-10, 13, -21],
"cubes": [
{"origin": [26.5, 8, -31], "size": [9, 0, 19], "uv": [25, 63], "mirror": true},
{"origin": [15.5, 3, -31], "size": [11, 10, 20], "inflate": 0.1, "uv": [0, 62], "mirror": true}
{"origin": [-28, 11, -25], "size": [18, 4, 7], "uv": [64, 44]}
]
},
{
"name": "right_arm2",
"parent": "right_arm",
"pivot": [-28, 13, -18],
"cubes": [
{"origin": [-46, 11, -25], "size": [18, 4, 7], "uv": [64, 33]}
]
},
{
"name": "right_claw",
"parent": "right_arm2",
"pivot": [-44, 13, -21],
"cubes": [
{"origin": [-57, 9, -27], "size": [13, 8, 11], "uv": [54, 60]},
{"origin": [-67, 10, -29], "size": [12, 6, 15], "uv": [0, 60]},
{"origin": [-91, 10, -22], "size": [24, 6, 8], "uv": [0, 33]},
{"origin": [-91, 10, -29], "size": [8, 6, 7], "uv": [84, 79]}
]
},
{
"name": "right_claw_open",
"parent": "right_claw",
"pivot": [-58.5, 13, -22.5],
"cubes": [
{"origin": [-83, 10, -30], "size": [25, 6, 7], "inflate": -0.1, "uv": [0, 47]}
]
},
{
"name": "left_arm",
"parent": "head",
"pivot": [10, 13, -21],
"cubes": [
{"origin": [10, 11, -25], "size": [18, 4, 7], "uv": [64, 44], "mirror": true}
]
},
{
"name": "left_arm2",
"parent": "left_arm",
"pivot": [28, 13, -18],
"cubes": [
{"origin": [28, 11, -25], "size": [18, 4, 7], "uv": [64, 33], "mirror": true}
]
},
{
"name": "left_claw",
"parent": "left_arm2",
"pivot": [44, 13, -21],
"cubes": [
{"origin": [44, 9, -27], "size": [13, 8, 11], "uv": [54, 60], "mirror": true},
{"origin": [55, 10, -29], "size": [12, 6, 15], "uv": [0, 60], "mirror": true},
{"origin": [67, 10, -22], "size": [24, 6, 8], "uv": [0, 33], "mirror": true},
{"origin": [83, 10, -29], "size": [8, 6, 7], "uv": [84, 79], "mirror": true}
]
},
{
"name": "left_claw_open",
"parent": "left_claw",
"pivot": [58.5, 13, -22.5],
"cubes": [
{"origin": [58, 10, -30], "size": [25, 6, 7], "inflate": -0.1, "uv": [0, 47], "mirror": true}
]
}
]
@@ -38,7 +38,7 @@
"parent": "squirrel",
"pivot": [0, 4, 2],
"cubes": [
{"origin": [0, 8.5, -6], "size": [0, 3, 11], "uv": [42, 50]}
{"origin": [0, 8.5, -6], "size": [0, 3, 11], "uv": [23, 30]}
]
},
{
@@ -46,7 +46,8 @@
"parent": "body",
"pivot": [0, 6, -0.5],
"cubes": [
{"origin": [-3, 3.5, -6], "size": [6, 5, 11], "uv": [0, 0]}
{"origin": [-3, 3.5, -6], "size": [6, 5, 11], "uv": [0, 0]},
{"origin": [-3, 5.5, -6], "size": [6, 3, 11], "inflate": 0.2, "uv": [0, 41]}
]
},
{
@@ -54,7 +55,8 @@
"parent": "body",
"pivot": [0, 7.33333, -5.91667],
"cubes": [
{"origin": [-2, 5.5, -11], "size": [4, 4, 5], "uv": [17, 17]}
{"origin": [-2, 4.5, -11], "size": [4, 5, 5], "uv": [17, 17]},
{"origin": [-1, 3.75, -11.075], "size": [2, 2, 0], "uv": [25, 1]}
]
},
{
@@ -62,7 +64,7 @@
"parent": "head",
"pivot": [2.5, 6, -8.5],
"cubes": [
{"origin": [2, 5.5, -10], "size": [1, 1, 3], "uv": [19, 19], "mirror": true}
{"origin": [2, 4.5, -9], "size": [1, 2, 2], "uv": [30, 18], "mirror": true}
]
},
{
@@ -70,7 +72,7 @@
"parent": "head",
"pivot": [-2.5, 6, -8.5],
"cubes": [
{"origin": [-3, 5.5, -10], "size": [1, 1, 3], "uv": [19, 19]}
{"origin": [-3, 4.5, -9], "size": [1, 2, 2], "uv": [16, 18]}
]
},
{
@@ -78,7 +80,7 @@
"parent": "head",
"pivot": [1, 9.5, -6.5],
"cubes": [
{"origin": [1, 9.5, -7], "size": [2, 2, 1], "uv": [35, 12]}
{"origin": [1, 9.5, -7], "size": [2, 2, 0], "uv": [36, 13]}
]
},
{
@@ -86,7 +88,7 @@
"parent": "head",
"pivot": [-1, 9.5, -6.5],
"cubes": [
{"origin": [-3, 9.5, -7], "size": [2, 2, 1], "uv": [35, 12], "mirror": true}
{"origin": [-3, 9.5, -7], "size": [2, 2, 0], "uv": [36, 13], "mirror": true}
]
},
{
@@ -94,9 +96,9 @@
"parent": "body",
"pivot": [0, 6, 5],
"cubes": [
{"origin": [-1.5, 5, 5], "size": [3, 11, 3], "uv": [17, 27]},
{"origin": [-1.5, 5, 5], "size": [3, 11, 3], "uv": [14, 27]},
{"origin": [-1.5, 9, 8], "size": [3, 7, 5], "uv": [0, 17]},
{"origin": [0, 9, 13], "size": [0, 7, 2], "uv": [60, 18]}
{"origin": [0, 9, 13], "size": [0, 7, 2], "uv": [0, 0]}
]
},
{
@@ -112,7 +114,7 @@
"parent": "left_arm",
"pivot": [3, 5, -1],
"cubes": [
{"origin": [3, 0, -3.5], "size": [0, 5, 5], "uv": [30, 27]}
{"origin": [3, 0, -3.5], "size": [0, 5, 5], "inflate": 0.01, "uv": [26, 22]}
]
},
{
@@ -128,7 +130,7 @@
"parent": "right_arm",
"pivot": [-3, 5, -1],
"cubes": [
{"origin": [-3, 0, -3.5], "size": [0, 5, 5], "uv": [30, 27], "mirror": true}
{"origin": [-3, 0, -3.5], "size": [0, 5, 5], "inflate": 0.01, "uv": [26, 22], "mirror": true}
]
}
]
@@ -18,7 +18,12 @@
{
"name": "body",
"parent": "root",
"pivot": [0, 65, 0],
"pivot": [0, 69, 0]
},
{
"name": "torso",
"parent": "body",
"pivot": [0, 61, 0],
"cubes": [
{"origin": [-10, 65, -18], "size": [20, 32, 36], "uv": [0, 164]},
{"origin": [-12, 97, -46], "size": [24, 12, 80], "uv": [0, 0]},
@@ -36,7 +41,7 @@
},
{
"name": "right_eye",
"parent": "body",
"parent": "torso",
"pivot": [-18.32132, 90.25, -12.53553],
"cubes": [
{"origin": [-22.7, 83.25, -17], "size": [5, 14, 14], "pivot": [-16.2, 90.25, -9], "rotation": [0, -45, 0], "uv": [0, 0]}
@@ -44,7 +49,7 @@
},
{
"name": "left_eye",
"parent": "body",
"parent": "torso",
"pivot": [18.32132, 90.25, -12.53553],
"cubes": [
{"origin": [17.7, 83.25, -17], "size": [5, 14, 14], "pivot": [16.2, 90.25, -9], "rotation": [0, 45, 0], "uv": [0, 0], "mirror": true}
@@ -52,7 +57,7 @@
},
{
"name": "rightGrip",
"parent": "body",
"parent": "torso",
"pivot": [-18, 78, -16],
"cubes": [
{"origin": [-22, 76, -28], "size": [8, 4, 12], "uv": [268, 268]}
@@ -60,7 +65,7 @@
},
{
"name": "leftGrip",
"parent": "body",
"parent": "torso",
"pivot": [18, 78, -16],
"cubes": [
{"origin": [14, 76, -28], "size": [8, 4, 12], "uv": [268, 268], "mirror": true}
@@ -68,7 +73,7 @@
},
{
"name": "rightAntenna",
"parent": "body",
"parent": "torso",
"pivot": [-10, 95, 14],
"cubes": [
{"origin": [-42, 93, 14], "size": [32, 4, 4], "uv": [208, 77]}
@@ -76,7 +81,7 @@
},
{
"name": "leftAntenna",
"parent": "body",
"parent": "torso",
"pivot": [10, 95, 14],
"cubes": [
{"origin": [10, 93, 14], "size": [32, 4, 4], "uv": [208, 77], "mirror": true}
@@ -84,7 +89,7 @@
},
{
"name": "rightArm",
"parent": "body",
"parent": "torso",
"pivot": [-12, 93, -17],
"cubes": [
{"origin": [-14, 91, -35], "size": [4, 4, 20], "uv": [64, 232]}
@@ -109,7 +114,7 @@
},
{
"name": "leftArm",
"parent": "body",
"parent": "torso",
"pivot": [12, 93, -17],
"cubes": [
{"origin": [10, 91, -35], "size": [4, 4, 20], "uv": [64, 232], "mirror": true}
@@ -134,7 +139,7 @@
},
{
"name": "backRightThigh",
"parent": "root",
"parent": "body",
"pivot": [-12, 65, 14],
"cubes": [
{"origin": [-28, 57, 10], "size": [16, 8, 8], "uv": [116, 268]}
@@ -170,7 +175,7 @@
},
{
"name": "backLeftThigh",
"parent": "root",
"parent": "body",
"pivot": [12, 65, 14],
"cubes": [
{"origin": [12, 57, 10], "size": [16, 8, 8], "uv": [116, 268], "mirror": true}
@@ -206,7 +211,7 @@
},
{
"name": "frontLeftThigh",
"parent": "root",
"parent": "body",
"pivot": [12, 65, -14],
"cubes": [
{"origin": [12, 57, -18], "size": [16, 8, 8], "uv": [116, 268], "mirror": true}
@@ -242,7 +247,7 @@
},
{
"name": "frontRightThigh",
"parent": "root",
"parent": "body",
"pivot": [-12, 65, -14],
"cubes": [
{"origin": [-28, 57, -18], "size": [16, 8, 8], "uv": [116, 268]}
@@ -782,7 +782,11 @@
"item.antarchy.hercules_beetle_spawn_egg": "Hercules Beetle Spawn Egg",
"key.antarchy.dorrie_charge_jump": "Dorrie: Charge Jump",
"key.antarchy.hercules_beetle_charge": "Hercules Beetle: Charge",
"entity.antarchy.rolly_polly": "Rolly Polly",
"item.antarchy.rolly_polly_spawn_egg": "Rolly Polly Spawn Egg",
"key.antarchy.rolly_polly_roll": "Rolly Polly: Roll",
"entity.antarchy.reverie": "Reverie",
"biome.antarchy.rolly_caves": "Rolly Caves",
"biome.antarchy.thoraxis": "Thoraxis",
"biome.antarchy.nightmare_wastes": "Nightmare Wastes",
"biome.antarchy.umbral_hills": "Umbral Hills",
@@ -0,0 +1,3 @@
{
"parent": "minecraft:item/template_spawn_egg"
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 B

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

After

Width:  |  Height:  |  Size: 383 B

@@ -9,7 +9,7 @@
{
"parameters": {
"temperature": [-1.0, 1.0],
"humidity": [-1.0, 1.0],
"humidity": [-1.0, 0.5],
"continentalness": [-1.0, 1.0],
"erosion": [-1.0, 1.0],
"weirdness": [-1.0, 1.0],
@@ -18,6 +18,18 @@
},
"biome": "antarchy:cavaryn"
},
{
"parameters": {
"temperature": [-1.0, 1.0],
"humidity": [0.5, 1.0],
"continentalness": [-1.0, 1.0],
"erosion": [-1.0, 1.0],
"weirdness": [-1.0, 1.0],
"depth": [-2.0, -0.1],
"offset": 0.0
},
"biome": "antarchy:rolly_caves"
},
{
"parameters": {
"temperature": [-1.0, 1.0],
@@ -0,0 +1,7 @@
{
"replace": false,
"values": [
"minecraft:glow_berries",
"minecraft:sweet_berries"
]
}
@@ -1,6 +1,7 @@
{
"values": [
"antarchy:cavaryn",
"antarchy:brooding_tunnels"
"antarchy:brooding_tunnels",
"antarchy:rolly_caves"
]
}
@@ -0,0 +1,70 @@
{
"has_precipitation": false,
"temperature": 0.7,
"downfall": 0.6,
"effects": {
"fog_color": 4867366,
"water_color": 6591296,
"water_fog_color": 2440734,
"sky_color": 1710351,
"grass_color": 10275406,
"foliage_color": 10275406,
"mood_sound": {
"sound": "minecraft:ambient.cave",
"tick_delay": 60000,
"block_search_extent": 8,
"offset": 2.0
},
"particle": {
"probability": 0.004,
"options": {
"type": "minecraft:spore_blossom_air"
}
}
},
"spawn_costs": {},
"carvers": {
"air": [],
"liquid": []
},
"features": [
[],
[
"antarchy:rolly_caves_bile_pool"
],
[],
[],
[],
[],
[],
[],
[],
[
"minecraft:lush_caves_vegetation",
"minecraft:lush_caves_ceiling_vegetation",
"minecraft:cave_vines",
"minecraft:classic_vines_cave_feature",
"antarchy:rolly_caves_amber_moss_patch",
"antarchy:cavaryn_wall_amber_moss"
],
[]
],
"creature_spawn_probability": 0.08,
"spawners": {
"monster": [],
"creature": [
{
"type": "antarchy:rolly_polly",
"weight": 20,
"minCount": 1,
"maxCount": 2
}
],
"ambient": [],
"axolotls": [],
"underground_water_creature": [],
"water_creature": [],
"water_ambient": [],
"misc": []
}
}
@@ -0,0 +1,65 @@
{
"type": "minecraft:vegetation_patch",
"config": {
"surface": "floor",
"depth": 1,
"vertical_range": 5,
"extra_bottom_block_chance": 0.0,
"extra_edge_column_chance": 0.3,
"vegetation_chance": 0.7,
"xz_radius": {
"type": "minecraft:uniform",
"min_inclusive": 4,
"max_inclusive": 7
},
"replaceable": "#minecraft:moss_replaceable",
"ground_state": {
"type": "minecraft:weighted_state_provider",
"entries": [
{
"weight": 3,
"data": {
"Name": "antarchy:amber_moss_block"
}
},
{
"weight": 2,
"data": {
"Name": "minecraft:moss_block"
}
}
]
},
"vegetation_feature": {
"feature": {
"type": "minecraft:simple_block",
"config": {
"to_place": {
"type": "minecraft:weighted_state_provider",
"entries": [
{
"weight": 4,
"data": {
"Name": "antarchy:amber_moss_carpet"
}
},
{
"weight": 3,
"data": {
"Name": "minecraft:moss_carpet"
}
},
{
"weight": 2,
"data": {
"Name": "minecraft:short_grass"
}
}
]
}
}
},
"placement": []
}
}
}
@@ -0,0 +1,20 @@
{
"type": "minecraft:lake",
"config": {
"fluid": {
"type": "minecraft:simple_state_provider",
"state": {
"Name": "antarchy:bile",
"Properties": {
"level": "0"
}
}
},
"barrier": {
"type": "minecraft:simple_state_provider",
"state": {
"Name": "minecraft:moss_block"
}
}
}
}
@@ -0,0 +1,27 @@
{
"feature": "antarchy:rolly_caves_amber_moss_patch",
"placement": [
{
"type": "minecraft:count",
"count": 40
},
{
"type": "minecraft:in_square"
},
{
"type": "minecraft:height_range",
"height": {
"type": "minecraft:uniform",
"min_inclusive": {
"absolute": 2
},
"max_inclusive": {
"absolute": 200
}
}
},
{
"type": "minecraft:biome"
}
]
}
@@ -0,0 +1,27 @@
{
"feature": "antarchy:rolly_caves_bile_pool",
"placement": [
{
"type": "minecraft:rarity_filter",
"chance": 5
},
{
"type": "minecraft:in_square"
},
{
"type": "minecraft:height_range",
"height": {
"type": "minecraft:uniform",
"min_inclusive": {
"absolute": 8
},
"max_inclusive": {
"absolute": 160
}
}
},
{
"type": "minecraft:biome"
}
]
}
+12
View File
@@ -133,6 +133,18 @@ processResources {
exclude "antarchy-common.mixins.json"
}
// Fabric needs a refmap on the common mixin config, NeoForge only boots without one.
// Generate a fabric-only copy with the refmap injected so the shared file stays refmap-free.
def commonMixinConfig = project(':common').file('src/main/resources/antarchy-common.mixins.json')
inputs.file commonMixinConfig
doLast {
def json = new groovy.json.JsonSlurper().parse(commonMixinConfig)
json.put('refmap', 'antarchy.refmap.json')
new File(destinationDir, 'antarchy-common-fabric.mixins.json').text =
groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(json))
}
filesMatching("fabric.mod.json") {
expand(
version: project.version,
@@ -67,6 +67,7 @@ import com.craisinlord.antarchy.content.entity.OuranwoodBoatEntity;
import com.craisinlord.antarchy.content.entity.OuranwoodChestBoatEntity;
import com.craisinlord.antarchy.content.entity.AlphaMantisEntity;
import com.craisinlord.antarchy.content.entity.MantisEntity;
import com.craisinlord.antarchy.content.entity.RollyPollyEntity;
import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity;
import com.craisinlord.antarchy.content.entity.EmperorScorpionEntity;
import com.craisinlord.antarchy.content.entity.ScorpionEntity;
@@ -831,6 +832,11 @@ public final class AntarchyFabricContent {
.sized(4.0F, 3.25F)
.clientTrackingRange(10)
.build("alpha_mantis"));
public static final DeferredHolder<EntityType<?>, EntityType<RollyPollyEntity>> ROLLY_POLLY = ENTITY_TYPES.register("rolly_polly",
() -> EntityType.Builder.of(RollyPollyEntity::new, MobCategory.CREATURE)
.sized(0.95F, 0.85F)
.clientTrackingRange(10)
.build("rolly_polly"));
public static final DeferredHolder<EntityType<?>, EntityType<OuranwoodBoatEntity>> OURANWOOD_BOAT_ENTITY = ENTITY_TYPES.register("ouranwood_boat",
() -> EntityType.Builder.<OuranwoodBoatEntity>of(OuranwoodBoatEntity::new, MobCategory.MISC)
.sized(1.375F, 0.5625F)
@@ -1681,8 +1687,8 @@ public final class AntarchyFabricContent {
.build("basilisk"));
public static final DeferredHolder<EntityType<?>, EntityType<EmperorScorpionEntity>> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion",
() -> EntityType.Builder.of(EmperorScorpionEntity::new, MobCategory.MONSTER)
.sized(4.05F, 1.35F)
.clientTrackingRange(10)
.sized(6.0F, 3.0F)
.clientTrackingRange(12)
.build("emperor_scorpion"));
public static final DeferredHolder<EntityType<?>, EntityType<LucidEyeProjectileEntity>> LUCID_PEARL_PROJECTILE = ENTITY_TYPES.register("lucid_pearl_projectile",
() -> EntityType.Builder.<LucidEyeProjectileEntity>of(LucidEyeProjectileEntity::new, MobCategory.MISC)
@@ -1736,6 +1742,8 @@ public final class AntarchyFabricContent {
() -> new DeferredSpawnEggItem(MANTIS, 0xF8F8F2, 0x63B44A, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> ALPHA_MANTIS_SPAWN_EGG = ITEMS.register("alpha_mantis_spawn_egg",
() -> new DeferredSpawnEggItem(ALPHA_MANTIS, 0x8FDD6C, 0x2F5D22, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> ROLLY_POLLY_SPAWN_EGG = ITEMS.register("rolly_polly_spawn_egg",
() -> new DeferredSpawnEggItem(ROLLY_POLLY, 0x7284A3, 0xBCC8DB, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> MOLEVORE_SPAWN_EGG = ITEMS.register("molevore_spawn_egg",
() -> new DeferredSpawnEggItem(MOLEVORE, 0x4A4A4A, 0x6B4A2B, new Item.Properties().rarity(Rarity.UNCOMMON)));
public static final DeferredItem<DeferredSpawnEggItem> TRIFFID_SPAWN_EGG = ITEMS.register("triffid_spawn_egg",
@@ -1777,7 +1785,7 @@ public final class AntarchyFabricContent {
public static final DeferredItem<DeferredSpawnEggItem> BASILISK_SPAWN_EGG = ITEMS.register("basilisk_spawn_egg",
() -> new DeferredSpawnEggItem(BASILISK, 0x4A7C40, 0xD4A040, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> EMPEROR_SCORPION_SPAWN_EGG = ITEMS.register("emperor_scorpion_spawn_egg",
() -> new DeferredSpawnEggItem(EMPEROR_SCORPION, 0x1A1A0A, 0x8B2200, new Item.Properties()));
() -> new DeferredSpawnEggItem(EMPEROR_SCORPION, 0x3A3242, 0xD8CDB4, new Item.Properties()));
public static final DeferredItem<LucidEyeItem> LUCID_EYE = ITEMS.register("lucid_eye",
() -> new LucidEyeItem(new Item.Properties().stacksTo(16).rarity(Rarity.UNCOMMON)));
public static final DeferredItem<LucidPearlItem> LUCID_PEARL = ITEMS.register("lucid_pearl",
@@ -1928,6 +1936,7 @@ public final class AntarchyFabricContent {
FabricDefaultAttributeRegistry.register(SPIT_BUG.get(), SpitBugEntity.createAttributes().build());
FabricDefaultAttributeRegistry.register(MANTIS.get(), MantisEntity.createAttributes().build());
FabricDefaultAttributeRegistry.register(ALPHA_MANTIS.get(), AlphaMantisEntity.createAttributes().build());
FabricDefaultAttributeRegistry.register(ROLLY_POLLY.get(), RollyPollyEntity.createAttributes().build());
FabricDefaultAttributeRegistry.register(TRIFFID.get(), TriffidEntity.createAttributes().build());
FabricDefaultAttributeRegistry.register(LUCID.get(), LucidEntity.createAttributes().build());
FabricDefaultAttributeRegistry.register(SCORPION.get(), ScorpionEntity.createAttributes().build());
@@ -2087,7 +2096,7 @@ public final class AntarchyFabricContent {
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", "termite_spawn_egg",
"moleworm_spawn_egg", "mantis_spawn_egg", "alpha_mantis_spawn_egg", "molevore_spawn_egg", "triffid_spawn_egg",
"moleworm_spawn_egg", "mantis_spawn_egg", "alpha_mantis_spawn_egg", "rolly_polly_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", "spit_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg", "kraken_spawn_egg", "missile_squid_spawn_egg", "octopus_bomb_spawn_egg",
@@ -79,6 +79,7 @@ public final class AntarchyFabricClientBootstrap {
EntityRendererRegistry.register(AntarchyFabricContent.MOLEWORM.get(), MolewormRenderer::new);
EntityRendererRegistry.register(AntarchyFabricContent.MANTIS.get(), MantisRenderer::new);
EntityRendererRegistry.register(AntarchyFabricContent.ALPHA_MANTIS.get(), AlphaMantisRenderer::new);
EntityRendererRegistry.register(AntarchyFabricContent.ROLLY_POLLY.get(), RollyPollyRenderer::new);
EntityRendererRegistry.register(AntarchyFabricContent.MOLEVORE.get(), MolevoreRenderer::new);
EntityRendererRegistry.register(AntarchyFabricContent.TRIFFID.get(), TriffidRenderer::new);
EntityRendererRegistry.register(AntarchyFabricContent.OURANWOOD_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/boat/ouranwood.png"), false));
@@ -333,6 +334,7 @@ public final class AntarchyFabricClientBootstrap {
ScorpionWhipTetherRenderHandler.tick();
DorrieJumpClientHandler.tick();
HerculesBeetleClientHandler.tick();
RollyPollyClientHandler.tick();
});
BigBerthaClientHandler.register();
@@ -31,12 +31,20 @@ public final class AntarchyKeyBindings {
CATEGORY
);
public static final KeyMapping ROLLY_POLLY_ROLL = new KeyMapping(
"key.antarchy.rolly_polly_roll",
InputConstants.Type.KEYSYM,
GLFW.GLFW_KEY_R,
CATEGORY
);
private AntarchyKeyBindings() {}
public static void register() {
KeyBindingHelper.registerKeyBinding(BRUTALFLY_FLAP);
KeyBindingHelper.registerKeyBinding(DORRIE_CHARGE_JUMP);
KeyBindingHelper.registerKeyBinding(HERCULES_BEETLE_CHARGE);
KeyBindingHelper.registerKeyBinding(ROLLY_POLLY_ROLL);
}
public static boolean isBrutalflyFlapPressed() {
@@ -0,0 +1,29 @@
package com.craisinlord.antarchy.fabric.client;
import com.craisinlord.antarchy.content.entity.RollyPollyEntity;
import com.craisinlord.antarchy.content.network.RollyPollyRollPayload;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
public final class RollyPollyClientHandler {
private static boolean wasPressingRoll;
private RollyPollyClientHandler() {
}
public static void tick() {
Minecraft mc = Minecraft.getInstance();
LocalPlayer player = mc.player;
if (player == null || mc.screen != null || !(player.getVehicle() instanceof RollyPollyEntity)) {
wasPressingRoll = false;
return;
}
boolean pressingRoll = AntarchyKeyBindings.ROLLY_POLLY_ROLL.isDown();
if (pressingRoll && !wasPressingRoll) {
ClientPlayNetworking.send(new RollyPollyRollPayload());
}
wasPressingRoll = pressingRoll;
}
}
@@ -63,6 +63,7 @@ public final class AntarchyFabricNetworking {
PayloadTypeRegistry.playC2S().register(HerculesBeetleJumpInputPayload.TYPE, HerculesBeetleJumpInputPayload.STREAM_CODEC);
PayloadTypeRegistry.playC2S().register(HerculesBeetleMountedAttackPayload.TYPE, HerculesBeetleMountedAttackPayload.STREAM_CODEC);
PayloadTypeRegistry.playC2S().register(HerculesBeetleMountedChargePayload.TYPE, HerculesBeetleMountedChargePayload.STREAM_CODEC);
PayloadTypeRegistry.playC2S().register(com.craisinlord.antarchy.content.network.RollyPollyRollPayload.TYPE, com.craisinlord.antarchy.content.network.RollyPollyRollPayload.STREAM_CODEC);
PayloadTypeRegistry.playC2S().register(MultipartAttackPayload.TYPE, MultipartAttackPayload.STREAM_CODEC);
PayloadTypeRegistry.playC2S().register(MultipartInteractPayload.TYPE, MultipartInteractPayload.STREAM_CODEC);
}
@@ -90,6 +91,8 @@ public final class AntarchyFabricNetworking {
context.server().execute(() -> handleHerculesBeetleMountedAttack(context.player(), payload)));
ServerPlayNetworking.registerGlobalReceiver(HerculesBeetleMountedChargePayload.TYPE, (payload, context) ->
context.server().execute(() -> handleHerculesBeetleMountedCharge(context.player(), payload)));
ServerPlayNetworking.registerGlobalReceiver(com.craisinlord.antarchy.content.network.RollyPollyRollPayload.TYPE, (payload, context) ->
context.server().execute(() -> handleRollyPollyRoll(context.player())));
ServerPlayNetworking.registerGlobalReceiver(MultipartAttackPayload.TYPE, (payload, context) ->
context.server().execute(() -> handleMultipartAttack(context.player(), payload)));
ServerPlayNetworking.registerGlobalReceiver(MultipartInteractPayload.TYPE, (payload, context) ->
@@ -370,6 +373,12 @@ public final class AntarchyFabricNetworking {
}
}
private static void handleRollyPollyRoll(ServerPlayer player) {
if (player.getVehicle() instanceof com.craisinlord.antarchy.content.entity.RollyPollyEntity rollyPolly) {
rollyPolly.handleRollToggle(player);
}
}
public static void triggerHerculesBeetleImpactShake(int durationTicks) {
HerculesBeetleImpactShakeClientState.trigger(durationTicks);
}
+1 -1
View File
@@ -24,7 +24,7 @@
]
},
"mixins": [
"antarchy-common.mixins.json",
"antarchy-common-fabric.mixins.json",
"antarchy-fabric.mixins.json"
],
"depends": {
+3 -1
View File
@@ -84,4 +84,6 @@ regions_unexplored_curseforge_file_id=7826194
#
#infinite_dimensions_curseforge_id=981829
#infinite_dimensions_curseforge_file_id=7739053
#infinite_dimensions_curseforge_file_id=7739053
# Gradle 8.8 cannot run on newer JDKs (e.g. 25); pin the build JVM to 21
org.gradle.java.home=C:/Program Files/Java/jdk-21.0.10
@@ -116,6 +116,12 @@ public final class AntarchyConfigModuleNeoforge {
AntarchySettings.setAlphaMantisSummonIntervalTicks(AntarchyMobsConfig.alphaMantisSummonIntervalTicks());
AntarchySettings.setAlphaMantisMaxMinions(AntarchyMobsConfig.alphaMantisMaxMinions());
AntarchySettings.setRollyPollyHealth(AntarchyMobsConfig.rollyPollyHealth());
AntarchySettings.setRollyPollyMovementSpeed(AntarchyMobsConfig.rollyPollyMovementSpeed());
AntarchySettings.setRollyPollyRollSpeedMultiplier(AntarchyMobsConfig.rollyPollyRollSpeedMultiplier());
AntarchySettings.setRollyPollyTumbleDamage(AntarchyMobsConfig.rollyPollyTumbleDamage());
AntarchySettings.setRollyPollyTameChance(AntarchyMobsConfig.rollyPollyTameChance());
AntarchySettings.setTriffidHealth(AntarchyMobsConfig.triffidHealth());
AntarchySettings.setTriffidAttackDamage(AntarchyMobsConfig.triffidAttackDamage());
AntarchySettings.setTriffidGrabDamage(AntarchyMobsConfig.triffidGrabDamage());
@@ -100,6 +100,15 @@ public final class AntarchyMobsConfig {
private static final ModConfigSpec.IntValue ALPHA_MANTIS_MAX_MINIONS;
// Rolly Polly
private static final ModConfigSpec.DoubleValue ROLLY_POLLY_HEALTH;
private static final ModConfigSpec.DoubleValue ROLLY_POLLY_MOVEMENT_SPEED;
private static final ModConfigSpec.DoubleValue ROLLY_POLLY_ROLL_SPEED_MULTIPLIER;
private static final ModConfigSpec.DoubleValue ROLLY_POLLY_TUMBLE_DAMAGE;
private static final ModConfigSpec.IntValue ROLLY_POLLY_TAME_CHANCE;
// Triffid
private static final ModConfigSpec.DoubleValue TRIFFID_HEALTH;
@@ -390,6 +399,17 @@ public final class AntarchyMobsConfig {
b.pop();
// Rolly Polly
b.push("rollyPolly");
ROLLY_POLLY_HEALTH = b.comment("Base max health.") .defineInRange("health", 12.0D, 1.0D, 32768.0D);
ROLLY_POLLY_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.3D, 0.0D, 10.0D);
ROLLY_POLLY_ROLL_SPEED_MULTIPLIER = b.comment("Speed multiplier while rolled up and ridden.") .defineInRange("rollSpeedMultiplier", 2.2D, 0.1D, 20.0D);
ROLLY_POLLY_TUMBLE_DAMAGE = b.comment("Damage dealt to a helmetless rider while rolling. 0 disables.") .defineInRange("tumbleDamage", 1.0D, 0.0D, 1024.0D);
ROLLY_POLLY_TAME_CHANCE = b.comment("Taming succeeds with a 1-in-N chance per food item.") .defineInRange("tameChance", 3, 1, 100);
b.pop();
// Triffid
b.push("triffid");
@@ -617,6 +637,11 @@ public final class AntarchyMobsConfig {
static double alphaMantisFlyingSpeed() { return ALPHA_MANTIS_FLYING_SPEED.get(); }
static int alphaMantisSummonIntervalTicks() { return ALPHA_MANTIS_SUMMON_INTERVAL_TICKS.get(); }
static int alphaMantisMaxMinions() { return ALPHA_MANTIS_MAX_MINIONS.get(); }
static double rollyPollyHealth() { return ROLLY_POLLY_HEALTH.get(); }
static double rollyPollyMovementSpeed() { return ROLLY_POLLY_MOVEMENT_SPEED.get(); }
static double rollyPollyRollSpeedMultiplier() { return ROLLY_POLLY_ROLL_SPEED_MULTIPLIER.get(); }
static double rollyPollyTumbleDamage() { return ROLLY_POLLY_TUMBLE_DAMAGE.get(); }
static int rollyPollyTameChance() { return ROLLY_POLLY_TAME_CHANCE.get(); }
static double triffidHealth() { return TRIFFID_HEALTH.get(); }
static double triffidAttackDamage() { return TRIFFID_ATTACK_DAMAGE.get(); }
@@ -37,6 +37,14 @@ public final class AntarchyKeyBindings {
CATEGORY
);
public static final KeyMapping ROLLY_POLLY_ROLL = new KeyMapping(
"key.antarchy.rolly_polly_roll",
KeyConflictContext.IN_GAME,
InputConstants.Type.KEYSYM,
InputConstants.KEY_R,
CATEGORY
);
private AntarchyKeyBindings() {}
@SubscribeEvent
@@ -44,5 +52,6 @@ public final class AntarchyKeyBindings {
event.register(BRUTALFLY_FLAP);
event.register(DORRIE_CHARGE_JUMP);
event.register(HERCULES_BEETLE_CHARGE);
event.register(ROLLY_POLLY_ROLL);
}
}
@@ -95,6 +95,7 @@ public final class AntarchyNeoForgeClient {
event.registerEntityRenderer(AntarchyNeoforgeEntites.MOLEWORM.get(), context -> withParalyzedGeoLayer(new MolewormRenderer(context)));
event.registerEntityRenderer(AntarchyNeoforgeEntites.MANTIS.get(), context -> withParalyzedGeoLayer(new MantisRenderer(context)));
event.registerEntityRenderer(AntarchyNeoforgeEntites.ALPHA_MANTIS.get(), context -> withParalyzedGeoLayer(new AlphaMantisRenderer(context)));
event.registerEntityRenderer(AntarchyNeoforgeEntites.ROLLY_POLLY.get(), context -> withParalyzedGeoLayer(new RollyPollyRenderer(context)));
event.registerEntityRenderer(AntarchyNeoforgeEntites.MOLEVORE.get(), context -> withParalyzedGeoLayer(new MolevoreRenderer(context)));
event.registerEntityRenderer(AntarchyNeoforgeEntites.TRIFFID.get(), context -> withParalyzedGeoLayer(new TriffidRenderer(context)));
event.registerEntityRenderer(AntarchyNeoforgeEntites.OURANWOOD_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, OURANWOOD_BOAT_TEXTURE, false));
@@ -0,0 +1,36 @@
package com.craisinlord.antarchy.neoforge.client;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.entity.RollyPollyEntity;
import com.craisinlord.antarchy.content.network.RollyPollyRollPayload;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.network.PacketDistributor;
@EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT)
public final class RollyPollyClientHandler {
private static boolean wasPressingRoll;
private RollyPollyClientHandler() {
}
@SubscribeEvent
public static void onClientTick(ClientTickEvent.Post event) {
Minecraft mc = Minecraft.getInstance();
LocalPlayer player = mc.player;
if (player == null || mc.screen != null || !(player.getVehicle() instanceof RollyPollyEntity)) {
wasPressingRoll = false;
return;
}
boolean pressingRoll = AntarchyKeyBindings.ROLLY_POLLY_ROLL.isDown();
if (pressingRoll && !wasPressingRoll) {
PacketDistributor.sendToServer(new RollyPollyRollPayload());
}
wasPressingRoll = pressingRoll;
}
}
@@ -0,0 +1,31 @@
package com.craisinlord.antarchy.neoforge.network;
import com.craisinlord.antarchy.content.entity.RollyPollyEntity;
import com.craisinlord.antarchy.content.network.RollyPollyRollPayload;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
public final class RollyPollyNetworking {
private RollyPollyNetworking() {
}
public static void register(PayloadRegistrar registrar) {
registrar.playToServer(
RollyPollyRollPayload.TYPE,
RollyPollyRollPayload.STREAM_CODEC,
RollyPollyNetworking::handleRollToggle
);
}
private static void handleRollToggle(RollyPollyRollPayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
if (!(context.player() instanceof ServerPlayer player)) {
return;
}
if (player.getVehicle() instanceof RollyPollyEntity rollyPolly) {
rollyPolly.handleRollToggle(player);
}
});
}
}
@@ -61,6 +61,7 @@ public class AntarchyNeoforgeCreativeModeTabs {
event.accept(AntarchyNeoforgeItems.MOLEWORM_SPAWN_EGG.get());
event.accept(AntarchyNeoforgeItems.MANTIS_SPAWN_EGG.get());
event.accept(AntarchyNeoforgeItems.ALPHA_MANTIS_SPAWN_EGG.get());
event.accept(AntarchyNeoforgeItems.ROLLY_POLLY_SPAWN_EGG.get());
event.accept(AntarchyNeoforgeItems.MOLEVORE_SPAWN_EGG.get());
event.accept(AntarchyNeoforgeItems.TRIFFID_SPAWN_EGG.get());
event.accept(AntarchyNeoforgeItems.APPLE_COW_SPAWN_EGG.get());
@@ -18,6 +18,7 @@ import com.craisinlord.antarchy.content.entity.HushProjectileEntity;
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
import com.craisinlord.antarchy.content.entity.JumpyBugEntity;
import com.craisinlord.antarchy.content.entity.AlphaMantisEntity;
import com.craisinlord.antarchy.content.entity.RollyPollyEntity;
import com.craisinlord.antarchy.content.entity.MantisEntity;
import com.craisinlord.antarchy.content.entity.MissileSquidEntity;
import com.craisinlord.antarchy.content.entity.OctopusBombEntity;
@@ -99,6 +100,11 @@ public final class AntarchyNeoforgeEntites {
.sized(4.0F, 3.25F)
.clientTrackingRange(10)
.build("alpha_mantis"));
public static final DeferredHolder<EntityType<?>, EntityType<RollyPollyEntity>> ROLLY_POLLY = ENTITY_TYPES.register("rolly_polly",
() -> EntityType.Builder.of(RollyPollyEntity::new, MobCategory.CREATURE)
.sized(0.95F, 0.85F)
.clientTrackingRange(10)
.build("rolly_polly"));
public static final DeferredHolder<EntityType<?>, EntityType<OuranwoodBoatEntity>> OURANWOOD_BOAT_ENTITY = ENTITY_TYPES.register("ouranwood_boat",
() -> EntityType.Builder.<OuranwoodBoatEntity>of(OuranwoodBoatEntity::new, MobCategory.MISC)
.sized(1.375F, 0.5625F)
@@ -266,8 +272,8 @@ public final class AntarchyNeoforgeEntites {
.build("basilisk"));
public static final DeferredHolder<EntityType<?>, EntityType<EmperorScorpionEntity>> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion",
() -> EntityType.Builder.of(EmperorScorpionEntity::new, MobCategory.MONSTER)
.sized(4.05F, 1.35F)
.clientTrackingRange(10)
.sized(6.0F, 3.0F)
.clientTrackingRange(12)
.build("emperor_scorpion"));
public static final DeferredHolder<EntityType<?>, EntityType<LucidEyeProjectileEntity>> LUCID_PEARL_PROJECTILE = ENTITY_TYPES.register("lucid_pearl_projectile",
() -> EntityType.Builder.<LucidEyeProjectileEntity>of(LucidEyeProjectileEntity::new, MobCategory.MISC)
@@ -54,6 +54,7 @@ public class AntarchyNeoforgeEntityAttributes {
event.put(AntarchyNeoforgeEntites.SPIT_BUG.get(), SpitBugEntity.createAttributes().build());
event.put(AntarchyNeoforgeEntites.MANTIS.get(), MantisEntity.createAttributes().build());
event.put(AntarchyNeoforgeEntites.ALPHA_MANTIS.get(), AlphaMantisEntity.createAttributes().build());
event.put(AntarchyNeoforgeEntites.ROLLY_POLLY.get(), RollyPollyEntity.createAttributes().build());
event.put(AntarchyNeoforgeEntites.TRIFFID.get(), TriffidEntity.createAttributes().build());
event.put(AntarchyNeoforgeEntites.LUCID.get(), LucidEntity.createAttributes().build());
event.put(AntarchyNeoforgeEntites.SCORPION.get(), ScorpionEntity.createAttributes().build());
@@ -515,6 +515,8 @@ public final class AntarchyNeoforgeItems {
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MANTIS, 0xF8F8F2, 0x63B44A, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> ALPHA_MANTIS_SPAWN_EGG = ITEMS.register("alpha_mantis_spawn_egg",
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.ALPHA_MANTIS, 0x8FDD6C, 0x2F5D22, new Item.Properties().rarity(Rarity.UNCOMMON)));
public static final DeferredItem<DeferredSpawnEggItem> ROLLY_POLLY_SPAWN_EGG = ITEMS.register("rolly_polly_spawn_egg",
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.ROLLY_POLLY, 0x7284A3, 0xBCC8DB, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> MOLEVORE_SPAWN_EGG = ITEMS.register("molevore_spawn_egg",
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.MOLEVORE, 0x4A4A4A, 0x6B4A2B, new Item.Properties().rarity(Rarity.UNCOMMON)));
public static final DeferredItem<DeferredSpawnEggItem> TRIFFID_SPAWN_EGG = ITEMS.register("triffid_spawn_egg",
@@ -556,7 +558,7 @@ public final class AntarchyNeoforgeItems {
public static final DeferredItem<DeferredSpawnEggItem> BASILISK_SPAWN_EGG = ITEMS.register("basilisk_spawn_egg",
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.BASILISK, 0x4A7C40, 0xD4A040, new Item.Properties()));
public static final DeferredItem<DeferredSpawnEggItem> EMPEROR_SCORPION_SPAWN_EGG = ITEMS.register("emperor_scorpion_spawn_egg",
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.EMPEROR_SCORPION, 0x1A1A0A, 0x8B2200, new Item.Properties()));
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.EMPEROR_SCORPION, 0x3A3242, 0xD8CDB4, new Item.Properties()));
public static final DeferredItem<LucidEyeItem> LUCID_EYE = ITEMS.register("lucid_eye",
() -> new LucidEyeItem(new Item.Properties().stacksTo(16).rarity(Rarity.UNCOMMON)));
public static final DeferredItem<LucidPearlItem> LUCID_PEARL = ITEMS.register("lucid_pearl",
@@ -24,6 +24,7 @@ public class AntarchyNeoforgePayloadHandlers {
JumpyBootsNetworking.register(registrar);
DorrieJumpNetworking.register(registrar);
HerculesBeetleNetworking.register(registrar);
com.craisinlord.antarchy.neoforge.network.RollyPollyNetworking.register(registrar);
registrar.playToClient(
com.craisinlord.antarchy.content.network.BloodglassStatePayload.TYPE,
com.craisinlord.antarchy.content.network.BloodglassStatePayload.STREAM_CODEC,