Beta 7 Commit
This commit is contained in:
1 parent
f23cf63f4f
commit
e74ee5733a
321 files changed
+7376
-8143
No files matched your search
+6
-1
@@ -27,7 +27,12 @@ dependencies {
|
||||
// compileOnly(files("$rootDir/infinite_dimensions_jars/soul-fire-d-neoforge-1.21-6.1.0.jar"))
|
||||
// compileOnly(files("$rootDir/infinite_dimensions_jars/prometheus-neoforge-1.21-1.2.5.jar"))
|
||||
compileOnly(files("$rootDir/infinite_dimensions_jars/sable-neoforge-1.21.1-2.0.3.jar"))
|
||||
compileOnly(files("$rootDir/infinite_dimensions_jars/antarchy-1.0.0+1.21.1-neoforge.jar"))
|
||||
// compileOnly(files("$rootDir/infinite_dimensions_jars/antarchy-1.0.0+1.21.1-neoforge.jar"))
|
||||
// NeoForge jar (not fabric) — sizeable_foliage's fabric jar is intermediary-mapped
|
||||
// (Fabric remaps to intermediary for shipping, not official names), which common's
|
||||
// official-Mojang-mapped compile can't resolve directly. NeoForge jars use official
|
||||
// names throughout, so this is the one common can safely compile against.
|
||||
compileOnly(files("$rootDir/sizeable_foliage_jars/sizeable_foliage-neoforge-1.21.1-1.0.0.jar"))
|
||||
compileOnly("software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}")
|
||||
//
|
||||
// compileOnly group: 'org.ow2.asm', name: 'asm-tree', version: '9.4'
|
||||
|
||||
@@ -162,7 +162,7 @@ public final class AntarchySettings {
|
||||
private static int basiliskSpawnMaxLightLevel = 5;
|
||||
private static double basiliskHealth = 150.0D;
|
||||
private static double basiliskAttackDamage = 36.0D;
|
||||
private static double basiliskMovementSpeed = 0.225D;
|
||||
private static double basiliskMovementSpeed = 0.18D;
|
||||
private static double basiliskArmor = 6.0D;
|
||||
private static double basiliskKnockbackResistance = 0.5D;
|
||||
private static double basiliskFollowRange = 28.0D;
|
||||
@@ -239,10 +239,10 @@ 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 = 400.0D;
|
||||
private static double emperorScorpionHealth = 300.0D;
|
||||
private static double emperorScorpionAttackDamage = 28.0D;
|
||||
private static double emperorScorpionMovementSpeed = 0.384D;
|
||||
private static double emperorScorpionArmor = 25.0D;
|
||||
private static double emperorScorpionArmor = 22.0D;
|
||||
private static double emperorScorpionKnockbackResistance = 0.8D;
|
||||
private static double emperorScorpionFollowRange = 40.0D;
|
||||
private static int emperorScorpionXpReward = 25;
|
||||
@@ -490,6 +490,7 @@ public final class AntarchySettings {
|
||||
private static double herculesBeetleHealth = 500.0D;
|
||||
private static double herculesBeetleAttackDamage = 30.0D;
|
||||
private static double herculesBeetleChargeDamage = 40.0D;
|
||||
private static double glimmerHealth = 20.0D;
|
||||
|
||||
private AntarchySettings() {
|
||||
}
|
||||
@@ -2547,4 +2548,6 @@ public final class AntarchySettings {
|
||||
public static double herculesBeetleChargeDamage() { return herculesBeetleChargeDamage; }
|
||||
public static void setHerculesBeetleChargeDamage(double v) { herculesBeetleChargeDamage = v; }
|
||||
public static void setDorrieHealth(double v) { dorrieHealth = v; }
|
||||
public static double glimmerHealth() { return glimmerHealth; }
|
||||
public static void setGlimmerHealth(double v) { glimmerHealth = v; }
|
||||
}
|
||||
@@ -99,6 +99,10 @@ public final class AntarchyObjects {
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<EntityType<HerculesBeetleEntity>> HERCULES_BEETLE = (Supplier<EntityType<HerculesBeetleEntity>>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<EntityType<com.craisinlord.antarchy.content.entity.GlimmerEntity>> GLIMMER = (Supplier<EntityType<com.craisinlord.antarchy.content.entity.GlimmerEntity>>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<Holder<MobEffect>> GLIMMERS_GRACE = (Supplier<Holder<MobEffect>>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<net.minecraft.world.item.Item> CHEEP_ITEM = (Supplier<net.minecraft.world.item.Item>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<Block> DUPLICATOR_LOG = (Supplier<Block>) UNBOUND;
|
||||
@@ -211,8 +215,6 @@ public final class AntarchyObjects {
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<Block> PINK_MILKWEED = (Supplier<Block>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<Block> TORCHFLOWER_BUSH = (Supplier<Block>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<Block> BED_BUG_EGG = (Supplier<Block>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<Block> CREEPING_HORROR_EGGS = (Supplier<Block>) UNBOUND;
|
||||
@@ -319,7 +321,6 @@ public final class AntarchyObjects {
|
||||
Supplier<Block> mossyOuranwoodWood,
|
||||
Supplier<Block> orangeMilkweed,
|
||||
Supplier<Block> pinkMilkweed,
|
||||
Supplier<Block> torchflowerBush,
|
||||
Supplier<Block> bedBugEggs,
|
||||
Supplier<Block> creepingHorrorEggs,
|
||||
Supplier<Block> lurkingTerrorEggs,
|
||||
@@ -413,7 +414,6 @@ public final class AntarchyObjects {
|
||||
MOSSY_OURANWOOD_WOOD = mossyOuranwoodWood;
|
||||
ORANGE_MILKWEED = orangeMilkweed;
|
||||
PINK_MILKWEED = pinkMilkweed;
|
||||
TORCHFLOWER_BUSH = torchflowerBush;
|
||||
BED_BUG_EGG = bedBugEggs;
|
||||
CREEPING_HORROR_EGGS = creepingHorrorEggs;
|
||||
LURKING_TERROR_EGGS = lurkingTerrorEggs;
|
||||
@@ -444,6 +444,14 @@ public final class AntarchyObjects {
|
||||
HERCULES_BEETLE = supplier;
|
||||
}
|
||||
|
||||
public static void setGlimmer(Supplier<EntityType<com.craisinlord.antarchy.content.entity.GlimmerEntity>> supplier) {
|
||||
GLIMMER = supplier;
|
||||
}
|
||||
|
||||
public static void setGlimmersGrace(Supplier<Holder<MobEffect>> supplier) {
|
||||
GLIMMERS_GRACE = supplier;
|
||||
}
|
||||
|
||||
public static BlockBehaviour.Properties shellstoneProperties() {
|
||||
return BlockBehaviour.Properties.ofFullCopy(Blocks.STONE).requiresCorrectToolForDrops();
|
||||
}
|
||||
|
||||
@@ -94,6 +94,7 @@ public final class AntarchyTags {
|
||||
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"));
|
||||
public static final TagKey<Item> GLIMMER_FOOD = TagKey.create(Registries.ITEM, id("glimmer_food"));
|
||||
|
||||
private Items() {
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.craisinlord.antarchy.content;
|
||||
|
||||
import net.minecraft.core.particles.DustParticleOptions;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
public final class GlimmerParticles {
|
||||
private static final int AMBIENT_INTERVAL_TICKS = 6;
|
||||
private static final DustParticleOptions AMBIENT = new DustParticleOptions(new Vector3f(0.55F, 0.85F, 1.0F), 0.9F);
|
||||
private static final DustParticleOptions TRAIL = new DustParticleOptions(new Vector3f(0.6F, 0.9F, 1.0F), 1.1F);
|
||||
|
||||
private GlimmerParticles() {
|
||||
}
|
||||
|
||||
public static void tickAmbient(LivingEntity entity, boolean running) {
|
||||
if (!(entity.level() instanceof ServerLevel serverLevel)) {
|
||||
return;
|
||||
}
|
||||
if (!entity.isAlive() || entity.tickCount % AMBIENT_INTERVAL_TICKS != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int count = running ? 2 : 1;
|
||||
serverLevel.sendParticles(
|
||||
AMBIENT,
|
||||
entity.getRandomX(0.6D),
|
||||
entity.getY(0.3D) + entity.getBbHeight() * 0.6D,
|
||||
entity.getRandomZ(0.6D),
|
||||
count,
|
||||
0.15D,
|
||||
0.2D,
|
||||
0.15D,
|
||||
0.0D
|
||||
);
|
||||
|
||||
Vec3 motion = entity.getDeltaMovement();
|
||||
if (running && motion.horizontalDistanceSqr() > 1.0E-4D) {
|
||||
Vec3 direction = new Vec3(motion.x, 0.0D, motion.z).normalize();
|
||||
Vec3 behind = entity.position().subtract(direction.scale(0.4D)).add(0.0D, 0.15D, 0.0D);
|
||||
serverLevel.sendParticles(TRAIL, behind.x, behind.y, behind.z, 1, 0.05D, 0.05D, 0.05D, 0.0D);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelAccessor;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.BonemealableBlock;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition;
|
||||
@@ -31,7 +32,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
* part directly two above the origin of a stage-3 bush renders the top slice of
|
||||
* the oversized cross model
|
||||
*/
|
||||
public class BigBushPartBlock extends Block {
|
||||
public class BigBushPartBlock extends Block implements BonemealableBlock {
|
||||
public static final MapCodec<BigBushPartBlock> CODEC = Block.simpleCodec(BigBushPartBlock::new);
|
||||
|
||||
public static final BooleanProperty CAP = BooleanProperty.create("cap");
|
||||
@@ -123,6 +124,29 @@ public class BigBushPartBlock extends Block {
|
||||
}
|
||||
}
|
||||
|
||||
/** Bonemeal applied to any part of a growing bush grows the whole thing, same as clicking the origin. */
|
||||
@Override
|
||||
public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
|
||||
BlockPos origin = findOrigin(level, pos);
|
||||
return origin != null && level.getBlockState(origin).getBlock() instanceof BigBushBlock bigBush
|
||||
&& bigBush.isValidBonemealTarget(level, origin, level.getBlockState(origin));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) {
|
||||
BlockPos origin = findOrigin(level, pos);
|
||||
return origin != null && level.getBlockState(origin).getBlock() instanceof BigBushBlock bigBush
|
||||
&& bigBush.isBonemealSuccess(level, random, origin, level.getBlockState(origin));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
|
||||
BlockPos origin = findOrigin(level, pos);
|
||||
if (origin != null && level.getBlockState(origin).getBlock() instanceof BigBushBlock bigBush) {
|
||||
bigBush.performBonemeal(level, random, origin, level.getBlockState(origin));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ItemInteractionResult useItemOn(
|
||||
ItemStack stack,
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.client;
|
||||
|
||||
import com.craisinlord.antarchy.content.block.BigBushBlock;
|
||||
import com.craisinlord.antarchy.content.block.BigBushPartBlock;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public final class BigBushCameraHider {
|
||||
private static BlockPos hiddenOrigin;
|
||||
|
||||
private BigBushCameraHider() {
|
||||
}
|
||||
|
||||
public static void update(Minecraft mc) {
|
||||
BlockPos newOrigin = null;
|
||||
if (mc.level != null && mc.player != null) {
|
||||
Vec3 cameraPos = mc.gameRenderer.getMainCamera().getPosition();
|
||||
BlockPos pos = BlockPos.containing(cameraPos);
|
||||
BlockState state = mc.level.getBlockState(pos);
|
||||
if (state.getBlock() instanceof BigBushBlock && state.getValue(BigBushBlock.AGE) > 0) {
|
||||
newOrigin = pos;
|
||||
} else if (state.getBlock() instanceof BigBushPartBlock) {
|
||||
newOrigin = BigBushPartBlock.findOrigin(mc.level, pos);
|
||||
}
|
||||
}
|
||||
if (!Objects.equals(newOrigin, hiddenOrigin)) {
|
||||
BlockPos previous = hiddenOrigin;
|
||||
hiddenOrigin = newOrigin;
|
||||
markDirty(mc, previous);
|
||||
markDirty(mc, newOrigin);
|
||||
}
|
||||
}
|
||||
|
||||
private static void markDirty(Minecraft mc, BlockPos origin) {
|
||||
if (origin != null && mc.levelRenderer != null) {
|
||||
mc.levelRenderer.setBlocksDirty(
|
||||
origin.getX() - 2, origin.getY() - 1, origin.getZ() - 2,
|
||||
origin.getX() + 2, origin.getY() + 3, origin.getZ() + 2);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean shouldFade(BlockPos pos) {
|
||||
BlockPos origin = hiddenOrigin;
|
||||
if (origin == null) {
|
||||
return false;
|
||||
}
|
||||
return Math.abs(pos.getX() - origin.getX()) <= 1
|
||||
&& Math.abs(pos.getZ() - origin.getZ()) <= 1
|
||||
&& pos.getY() >= origin.getY()
|
||||
&& pos.getY() <= origin.getY() + 2;
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.client;
|
||||
|
||||
import com.craisinlord.antarchy.content.block.BigBushBlock;
|
||||
import com.craisinlord.antarchy.content.block.BigBushPartBlock;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
|
||||
public final class BigBushRenderHelper {
|
||||
private BigBushRenderHelper() {
|
||||
}
|
||||
|
||||
public static boolean isInsideBigBush(LivingEntity entity) {
|
||||
Level level = entity.level();
|
||||
return isBush(level, entity.blockPosition()) || isBush(level, BlockPos.containing(entity.getEyePosition()));
|
||||
}
|
||||
|
||||
private static boolean isBush(Level level, BlockPos pos) {
|
||||
BlockState state = level.getBlockState(pos);
|
||||
if (state.getBlock() instanceof BigBushPartBlock) {
|
||||
return true;
|
||||
}
|
||||
return state.getBlock() instanceof BigBushBlock && state.getValue(BigBushBlock.AGE) > 0;
|
||||
}
|
||||
}
|
||||
+5
-1
@@ -6,6 +6,10 @@ import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class EmperorScorpionModel extends GeoModel<EmperorScorpionEntity> {
|
||||
public static final ResourceLocation NORMAL_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/emperor_scorpion/emperor_scorpion.png");
|
||||
public static final ResourceLocation HARDEN_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/emperor_scorpion/emperor_scorpion_harden.png");
|
||||
|
||||
public static final ResourceLocation EMISSIVE_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/emperor_scorpion/emperor_scorpion_emissive.png");
|
||||
@@ -17,7 +21,7 @@ public class EmperorScorpionModel extends GeoModel<EmperorScorpionEntity> {
|
||||
|
||||
@Override
|
||||
public ResourceLocation getTextureResource(EmperorScorpionEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/emperor_scorpion/emperor_scorpion.png");
|
||||
return NORMAL_TEXTURE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.craisinlord.antarchy.content.client.model;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.entity.GlimmerEntity;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class GlimmerModel extends GeoModel<GlimmerEntity> {
|
||||
private static final ResourceLocation ADULT_GEO = rl("geo/glimmer.geo.json");
|
||||
private static final ResourceLocation BABY_GEO = rl("geo/glimmer_baby.geo.json");
|
||||
private static final ResourceLocation ADULT_ANIM = rl("animations/glimmer.animation.json");
|
||||
private static final ResourceLocation BABY_ANIM = rl("animations/glimmer_baby.animation.json");
|
||||
private static final ResourceLocation ADULT_DAY = rl("textures/entity/glimmer/glimmer_day.png");
|
||||
private static final ResourceLocation ADULT_NIGHT = rl("textures/entity/glimmer/glimmer.png");
|
||||
private static final ResourceLocation BABY_DAY = rl("textures/entity/glimmer/glimmer_baby_day.png");
|
||||
private static final ResourceLocation BABY_NIGHT = rl("textures/entity/glimmer/glimmer_baby.png");
|
||||
public static final ResourceLocation ADULT_EMISSIVE = rl("textures/entity/glimmer/glimmer_emissive.png");
|
||||
public static final ResourceLocation BABY_EMISSIVE = rl("textures/entity/glimmer/glimmer_baby_emissive.png");
|
||||
|
||||
private static ResourceLocation rl(String path) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(GlimmerEntity animatable) {
|
||||
return animatable.isBaby() ? BABY_GEO : ADULT_GEO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getAnimationResource(GlimmerEntity animatable) {
|
||||
return animatable.isBaby() ? BABY_ANIM : ADULT_ANIM;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getTextureResource(GlimmerEntity animatable) {
|
||||
return textureFor(animatable, animatable.getGlowBlend(0.0F) >= 0.5F);
|
||||
}
|
||||
|
||||
public static ResourceLocation textureFor(GlimmerEntity animatable, boolean glowing) {
|
||||
if (animatable.isBaby()) {
|
||||
return glowing ? BABY_NIGHT : BABY_DAY;
|
||||
}
|
||||
return glowing ? ADULT_NIGHT : ADULT_DAY;
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,9 @@ import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class NightmareModel extends GeoModel<NightmareEntity> {
|
||||
public static final ResourceLocation EMISSIVE_TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/nightmare_emissive.png");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(NightmareEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/nightmare.geo.json");
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.client.model;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.entity.SpitBugEntity;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class SpitBugModel extends GeoModel<SpitBugEntity> {
|
||||
@Override
|
||||
public ResourceLocation getModelResource(SpitBugEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/spit_bug.geo.json");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getTextureResource(SpitBugEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/spit_bug.png");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getAnimationResource(SpitBugEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "animations/spit_bug.animation.json");
|
||||
}
|
||||
}
|
||||
+83
@@ -4,6 +4,8 @@ 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 java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
@@ -15,13 +17,22 @@ import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
|
||||
|
||||
public class EmperorScorpionRenderer extends GeoEntityRenderer<EmperorScorpionEntity> {
|
||||
private static final int CROSSFADE_TICKS = 12;
|
||||
private final Map<Integer, HardenTransitionState> transitions = new HashMap<>();
|
||||
|
||||
public EmperorScorpionRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new EmperorScorpionModel());
|
||||
this.shadowRadius = 3.0F;
|
||||
this.addRenderLayer(new EmperorScorpionHardenLayer(this));
|
||||
this.addRenderLayer(new EmperorScorpionEmissiveLayer(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(EmperorScorpionEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) {
|
||||
this.updateTransition(entity);
|
||||
super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RenderType getRenderType(EmperorScorpionEntity animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) {
|
||||
return RenderType.entityCutoutNoCull(texture);
|
||||
@@ -57,4 +68,76 @@ public class EmperorScorpionRenderer extends GeoEntityRenderer<EmperorScorpionEn
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTransition(EmperorScorpionEntity entity) {
|
||||
int phase = entity.getHardenPhaseIndex();
|
||||
HardenTransitionState state = this.transitions.computeIfAbsent(entity.getId(), ignored ->
|
||||
new HardenTransitionState(phase, entity.tickCount));
|
||||
|
||||
if (state.currentPhase != phase) {
|
||||
state.currentPhase = phase;
|
||||
state.transitionStartTick = entity.tickCount;
|
||||
} else if (phase == 0
|
||||
&& entity.tickCount - state.transitionStartTick > CROSSFADE_TICKS) {
|
||||
this.transitions.remove(entity.getId());
|
||||
}
|
||||
}
|
||||
|
||||
private float getHardenAlpha(EmperorScorpionEntity entity, float partialTick) {
|
||||
HardenTransitionState state = this.transitions.get(entity.getId());
|
||||
if (state == null) {
|
||||
return 0.0F;
|
||||
}
|
||||
|
||||
float elapsed = (entity.tickCount - state.transitionStartTick) + partialTick;
|
||||
return switch (state.currentPhase) {
|
||||
case 2 -> Math.max(0.0F, Math.min(1.0F, elapsed / 11.0F));
|
||||
case 3 -> 1.0F;
|
||||
case 4 -> Math.max(0.0F, Math.min(1.0F, 1.0F - (elapsed / 20.0F)));
|
||||
default -> 0.0F;
|
||||
};
|
||||
}
|
||||
|
||||
private static final class HardenTransitionState {
|
||||
private int currentPhase;
|
||||
private int transitionStartTick;
|
||||
|
||||
private HardenTransitionState(int currentPhase, int transitionStartTick) {
|
||||
this.currentPhase = currentPhase;
|
||||
this.transitionStartTick = transitionStartTick;
|
||||
}
|
||||
}
|
||||
|
||||
private static final class EmperorScorpionHardenLayer extends GeoRenderLayer<EmperorScorpionEntity> {
|
||||
private EmperorScorpionHardenLayer(EmperorScorpionRenderer 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) {
|
||||
EmperorScorpionRenderer renderer = (EmperorScorpionRenderer) this.getRenderer();
|
||||
float alpha = renderer.getHardenAlpha(animatable, partialTick);
|
||||
if (alpha <= 0.0F) {
|
||||
return;
|
||||
}
|
||||
|
||||
RenderType hardenType = RenderType.entityTranslucent(EmperorScorpionModel.HARDEN_TEXTURE);
|
||||
VertexConsumer hardenBuffer = bufferSource.getBuffer(hardenType);
|
||||
int color = ((Math.max(0, Math.min(255, Math.round(alpha * 255.0F))) & 0xFF) << 24) | 0x00FFFFFF;
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
hardenType,
|
||||
hardenBuffer,
|
||||
partialTick,
|
||||
packedLight,
|
||||
packedOverlay,
|
||||
color
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.model.GlimmerModel;
|
||||
import com.craisinlord.antarchy.content.entity.GlimmerEntity;
|
||||
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 GlimmerRenderer extends GeoEntityRenderer<GlimmerEntity> {
|
||||
private static final float SHADOW_RADIUS = 0.5F;
|
||||
|
||||
public GlimmerRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new GlimmerModel());
|
||||
this.shadowRadius = SHADOW_RADIUS;
|
||||
this.addRenderLayer(new GlimmerCrossfadeLayer(this));
|
||||
this.addRenderLayer(new GlimmerEmissiveLayer(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public RenderType getRenderType(GlimmerEntity animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) {
|
||||
return RenderType.entityTranslucent(texture);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preRender(PoseStack poseStack, GlimmerEntity 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);
|
||||
this.shadowRadius = SHADOW_RADIUS;
|
||||
}
|
||||
|
||||
private static final class GlimmerCrossfadeLayer extends GeoRenderLayer<GlimmerEntity> {
|
||||
private GlimmerCrossfadeLayer(GeoEntityRenderer<GlimmerEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, GlimmerEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
float glowBlend = animatable.getGlowBlend(partialTick);
|
||||
if (glowBlend <= 0.0F || glowBlend >= 1.0F) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean baseGlowing = glowBlend >= 0.5F;
|
||||
float overlayAlpha = baseGlowing ? 1.0F - glowBlend : glowBlend;
|
||||
if (overlayAlpha <= 0.0F) {
|
||||
return;
|
||||
}
|
||||
|
||||
ResourceLocation overlayTexture = GlimmerModel.textureFor(animatable, !baseGlowing);
|
||||
RenderType overlayType = RenderType.entityTranslucent(overlayTexture);
|
||||
VertexConsumer overlayBuffer = bufferSource.getBuffer(overlayType);
|
||||
int color = ((Math.max(0, Math.min(255, Math.round(overlayAlpha * 255.0F))) & 0xFF) << 24) | 0x00FFFFFF;
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
overlayType,
|
||||
overlayBuffer,
|
||||
partialTick,
|
||||
packedLight,
|
||||
packedOverlay,
|
||||
color
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static final class GlimmerEmissiveLayer extends GeoRenderLayer<GlimmerEntity> {
|
||||
private GlimmerEmissiveLayer(GeoEntityRenderer<GlimmerEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, GlimmerEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
if (!animatable.isGlowingState()) {
|
||||
return;
|
||||
}
|
||||
|
||||
ResourceLocation texture = animatable.isBaby() ? GlimmerModel.BABY_EMISSIVE : GlimmerModel.ADULT_EMISSIVE;
|
||||
RenderType emissiveType = RenderType.eyes(texture);
|
||||
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
emissiveType,
|
||||
emissiveBuffer,
|
||||
partialTick,
|
||||
0xF000F0,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
0xFFFFFFFF
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+35
@@ -2,18 +2,53 @@ package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.model.NightmareModel;
|
||||
import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity;
|
||||
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 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 NightmareRenderer extends GeoEntityRenderer<NightmareEntity> {
|
||||
public NightmareRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new NightmareModel());
|
||||
this.shadowRadius = 1.8F;
|
||||
this.withScale(1.15F);
|
||||
this.addRenderLayer(new NightmareEmissiveLayer(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getDeathMaxRotation(NightmareEntity animatable) {
|
||||
return 0.0F;
|
||||
}
|
||||
|
||||
private static final class NightmareEmissiveLayer extends GeoRenderLayer<NightmareEntity> {
|
||||
private NightmareEmissiveLayer(GeoEntityRenderer<NightmareEntity> renderer) {
|
||||
super(renderer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(PoseStack poseStack, NightmareEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
|
||||
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
|
||||
int packedLight, int packedOverlay) {
|
||||
RenderType emissiveType = RenderType.eyes(NightmareModel.EMISSIVE_TEXTURE);
|
||||
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
|
||||
this.getRenderer().reRender(
|
||||
bakedModel,
|
||||
poseStack,
|
||||
bufferSource,
|
||||
animatable,
|
||||
emissiveType,
|
||||
emissiveBuffer,
|
||||
partialTick,
|
||||
0xF000F0,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
0xFFFFFFFF
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
-73
@@ -1,73 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.entity.SpitBugProjectileEntity;
|
||||
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.EntityRenderer;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import org.joml.Matrix4f;
|
||||
|
||||
public class SpitBugProjectileRenderer extends EntityRenderer<SpitBugProjectileEntity> {
|
||||
private static final ResourceLocation PROJECTILE_TEXTURE =
|
||||
ResourceLocation.withDefaultNamespace("textures/entity/enderdragon/dragon_fireball.png");
|
||||
|
||||
public SpitBugProjectileRenderer(EntityRendererProvider.Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getBlockLightLevel(SpitBugProjectileEntity entity, BlockPos pos) {
|
||||
return 15;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(SpitBugProjectileEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight) {
|
||||
poseStack.pushPose();
|
||||
poseStack.mulPose(this.entityRenderDispatcher.cameraOrientation());
|
||||
|
||||
float scale = entity.getRenderScale(partialTick);
|
||||
poseStack.scale(scale, scale, scale);
|
||||
|
||||
VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.entityTranslucent(PROJECTILE_TEXTURE));
|
||||
PoseStack.Pose pose = poseStack.last();
|
||||
Matrix4f matrix4f = pose.pose();
|
||||
float alpha = entity.isLingering() ? 0.78F : 0.95F;
|
||||
|
||||
addVertex(vertexConsumer, pose, matrix4f, -0.5F, -0.5F, 0.0F, 1.0F, alpha, packedLight);
|
||||
addVertex(vertexConsumer, pose, matrix4f, 0.5F, -0.5F, 1.0F, 1.0F, alpha, packedLight);
|
||||
addVertex(vertexConsumer, pose, matrix4f, 0.5F, 0.5F, 1.0F, 0.0F, alpha, packedLight);
|
||||
addVertex(vertexConsumer, pose, matrix4f, -0.5F, 0.5F, 0.0F, 0.0F, alpha, packedLight);
|
||||
|
||||
poseStack.popPose();
|
||||
super.render(entity, entityYaw, partialTick, poseStack, buffer, packedLight);
|
||||
}
|
||||
|
||||
private static void addVertex(
|
||||
VertexConsumer vertexConsumer,
|
||||
PoseStack.Pose pose,
|
||||
Matrix4f matrix4f,
|
||||
float x,
|
||||
float y,
|
||||
float u,
|
||||
float v,
|
||||
float alpha,
|
||||
int packedLight
|
||||
) {
|
||||
vertexConsumer.addVertex(matrix4f, x, y, 0.0F)
|
||||
.setColor(0.55F, 1.0F, 0.35F, alpha)
|
||||
.setUv(u, v)
|
||||
.setOverlay(OverlayTexture.NO_OVERLAY)
|
||||
.setLight(packedLight)
|
||||
.setNormal(pose, 0.0F, 0.0F, 1.0F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getTextureLocation(SpitBugProjectileEntity entity) {
|
||||
return PROJECTILE_TEXTURE;
|
||||
}
|
||||
}
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.model.SpitBugModel;
|
||||
import com.craisinlord.antarchy.content.entity.SpitBugEntity;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
|
||||
public class SpitBugRenderer extends GeoEntityRenderer<SpitBugEntity> {
|
||||
public SpitBugRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new SpitBugModel());
|
||||
this.shadowRadius = 1.6F;
|
||||
this.withScale(0.85F);
|
||||
}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
package com.craisinlord.antarchy.content.effect;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.GlimmerParticles;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.effect.MobEffect;
|
||||
import net.minecraft.world.effect.MobEffectCategory;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.ai.attributes.Attribute;
|
||||
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
|
||||
import net.minecraft.world.entity.ai.attributes.AttributeMap;
|
||||
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
|
||||
import net.minecraft.world.entity.ai.attributes.Attributes;
|
||||
|
||||
public final class GlimmersGraceMobEffect extends MobEffect {
|
||||
private static final ResourceLocation SPEED_MODIFIER_ID =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmers_grace_speed");
|
||||
private static final ResourceLocation JUMP_MODIFIER_ID =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmers_grace_jump");
|
||||
private static final ResourceLocation FALL_DAMAGE_MODIFIER_ID =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmers_grace_fall_damage");
|
||||
|
||||
public GlimmersGraceMobEffect() {
|
||||
super(MobEffectCategory.BENEFICIAL, 0x7FDBFF);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addAttributeModifiers(AttributeMap attributeMap, int amplifier) {
|
||||
addModifier(attributeMap, Attributes.MOVEMENT_SPEED, SPEED_MODIFIER_ID, 0.35D * (amplifier + 1));
|
||||
addModifier(attributeMap, Attributes.JUMP_STRENGTH, JUMP_MODIFIER_ID, 0.5D * (amplifier + 1));
|
||||
addModifier(attributeMap, Attributes.FALL_DAMAGE_MULTIPLIER, FALL_DAMAGE_MODIFIER_ID, -0.6D * (amplifier + 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeAttributeModifiers(AttributeMap attributeMap) {
|
||||
removeModifier(attributeMap, Attributes.MOVEMENT_SPEED, SPEED_MODIFIER_ID);
|
||||
removeModifier(attributeMap, Attributes.JUMP_STRENGTH, JUMP_MODIFIER_ID);
|
||||
removeModifier(attributeMap, Attributes.FALL_DAMAGE_MULTIPLIER, FALL_DAMAGE_MODIFIER_ID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldApplyEffectTickThisTick(int duration, int amplifier) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applyEffectTick(LivingEntity livingEntity, int amplifier) {
|
||||
GlimmerParticles.tickAmbient(livingEntity, livingEntity.getDeltaMovement().horizontalDistanceSqr() > 0.01D);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void addModifier(AttributeMap attributeMap, Holder<Attribute> attribute, ResourceLocation id, double amount) {
|
||||
AttributeInstance instance = attributeMap.getInstance(attribute);
|
||||
if (instance == null) {
|
||||
return;
|
||||
}
|
||||
instance.addTransientModifier(new AttributeModifier(id, amount, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL));
|
||||
}
|
||||
|
||||
private static void removeModifier(AttributeMap attributeMap, Holder<Attribute> attribute, ResourceLocation id) {
|
||||
AttributeInstance instance = attributeMap.getInstance(attribute);
|
||||
if (instance == null) {
|
||||
return;
|
||||
}
|
||||
instance.removeModifier(id);
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,7 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
SynchedEntityData.defineId(DorrieEntity.class, EntityDataSerializers.INT);
|
||||
|
||||
private static final int MAX_CHARGE_TICKS = 40;
|
||||
private static final float WATER_RIDE_SPEED = 1.84F;
|
||||
private static final float WATER_RIDE_SPEED = 0.78F;
|
||||
private static final float LAND_BEACH_SPEED = 0.10F;
|
||||
private static final int QUIRK_DURATION_TICKS = 65;
|
||||
private static final int MIN_QUIRK_COOLDOWN_TICKS = 140;
|
||||
@@ -277,13 +277,16 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
public void tick() {
|
||||
super.tick();
|
||||
this.updateNavigationMode();
|
||||
this.setNoGravity(this.isInWater() || this.isInLava());
|
||||
this.setNoGravity(false);
|
||||
|
||||
if (this.getControllingPassenger() instanceof Player player) {
|
||||
this.setYRot(player.getYRot());
|
||||
this.yRotO = this.getYRot();
|
||||
this.yBodyRot = this.getYRot();
|
||||
this.yHeadRot = this.getYRot();
|
||||
if (this.getQuirkTicks() > 0) {
|
||||
this.setQuirkTicks(0);
|
||||
}
|
||||
if (this.isInWater() || this.isInLava()) {
|
||||
if (player.zza > 0.05F) {
|
||||
this.swimForwardTicks = Math.min(this.swimForwardTicks + 1, 60);
|
||||
@@ -365,7 +368,14 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
if (this.isInWater() || this.isInLava()) {
|
||||
this.moveRelative(this.getSpeed(), new Vec3(riddenInput.x, 0.0D, riddenInput.z));
|
||||
Vec3 motion = this.getDeltaMovement();
|
||||
double vertical = this.isLeaping ? 0.0D : riddenInput.y * 0.09D;
|
||||
double vertical = 0.0D;
|
||||
if (!this.isLeaping) {
|
||||
if (this.isUnderWater()) {
|
||||
vertical = riddenInput.y * 0.025D;
|
||||
} else if (riddenInput.y < 0.0D) {
|
||||
vertical = riddenInput.y * 0.02D;
|
||||
}
|
||||
}
|
||||
this.setDeltaMovement(
|
||||
motion.x * 0.92D,
|
||||
motion.y * 0.90D + vertical,
|
||||
@@ -374,10 +384,6 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
this.move(net.minecraft.world.entity.MoverType.SELF, this.getDeltaMovement());
|
||||
return;
|
||||
}
|
||||
|
||||
this.moveRelative(this.getSpeed(), new Vec3(riddenInput.x, 0.0D, riddenInput.z));
|
||||
this.move(net.minecraft.world.entity.MoverType.SELF, this.getDeltaMovement());
|
||||
return;
|
||||
}
|
||||
|
||||
super.travel(travelVector);
|
||||
@@ -410,9 +416,9 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
if (this.hasPassenger(passenger)) {
|
||||
Vec3 forward = this.getLookAngle().multiply(1.0D, 0.0D, 1.0D);
|
||||
moveFunction.accept(passenger,
|
||||
this.getX() - forward.x * 0.25D,
|
||||
this.getX() - forward.x * 0.65D,
|
||||
this.getY() + 0.5D,
|
||||
this.getZ() - forward.z * 0.25D);
|
||||
this.getZ() - forward.z * 0.65D);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -478,18 +484,20 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
}
|
||||
|
||||
boolean moving = this.isMovingForAnimation(state);
|
||||
if (this.isInWater() || this.isInLava()) {
|
||||
return state.setAndContinue(moving ? SWIM_ANIM : IDLE_WATER_ANIM);
|
||||
}
|
||||
|
||||
if (this.onGround()) {
|
||||
if (moving) {
|
||||
state.getController().setAnimationSpeed(0.75D);
|
||||
return state.setAndContinue(WALK_ANIM);
|
||||
}
|
||||
|
||||
return state.setAndContinue(IDLE_GROUND_ANIM);
|
||||
}
|
||||
|
||||
if (this.isInWater() || this.isInLava()) {
|
||||
return state.setAndContinue(moving ? SWIM_ANIM : IDLE_WATER_ANIM);
|
||||
}
|
||||
return state.setAndContinue(moving ? SWIM_ANIM : IDLE_GROUND_ANIM);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AnimatableInstanceCache getAnimatableInstanceCache() {
|
||||
return this.geoCache;
|
||||
|
||||
+579
-193
@@ -1,42 +1,49 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.content.AntarchySoundEvents;
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.AntarchyObjects;
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import com.craisinlord.antarchy.content.AntarchySoundEvents;
|
||||
import com.craisinlord.antarchy.content.AntarchyObjects;
|
||||
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
|
||||
import com.craisinlord.antarchy.content.entity.ScorpionEntity;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.server.level.ServerBossEvent;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.Difficulty;
|
||||
import net.minecraft.world.BossEvent;
|
||||
import net.minecraft.world.Difficulty;
|
||||
import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.effect.MobEffects;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import net.minecraft.world.entity.MobSpawnType;
|
||||
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.MeleeAttackGoal;
|
||||
import net.minecraft.world.entity.ai.goal.Goal;
|
||||
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
|
||||
import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
|
||||
import net.minecraft.world.entity.ai.goal.RandomStrollGoal;
|
||||
import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal;
|
||||
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.DifficultyInstance;
|
||||
import net.minecraft.world.entity.monster.Monster;
|
||||
import net.minecraft.world.level.levelgen.Heightmap;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.ServerLevelAccessor;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.animatable.GeoEntity;
|
||||
import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
|
||||
@@ -47,26 +54,37 @@ import software.bernie.geckolib.animation.PlayState;
|
||||
import software.bernie.geckolib.animation.RawAnimation;
|
||||
import software.bernie.geckolib.util.GeckoLibUtil;
|
||||
|
||||
public class EmperorScorpionEntity extends Monster implements GeoEntity {
|
||||
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;
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class EmperorScorpionEntity extends Monster implements GeoEntity {
|
||||
private static final byte CLAW_ATTACK_EVENT = 4;
|
||||
private static final byte STING_ATTACK_EVENT = 5;
|
||||
private static final EntityDataAccessor<Integer> ANIMATION_STATE =
|
||||
SynchedEntityData.defineId(EmperorScorpionEntity.class, EntityDataSerializers.INT);
|
||||
private static final EntityDataAccessor<Integer> HARDEN_PHASE =
|
||||
SynchedEntityData.defineId(EmperorScorpionEntity.class, EntityDataSerializers.INT);
|
||||
|
||||
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 int ANIM_IDLE = 0;
|
||||
private static final int ANIM_WALK = 1;
|
||||
private static final int ANIM_CLAW_ATTACK = 2;
|
||||
private static final int ANIM_STING_ATTACK = 3;
|
||||
private static final int ANIM_DEATH = 4;
|
||||
private static final int ANIM_HARDEN_START = 5;
|
||||
private static final int ANIM_HARDEN_ACTIVE = 6;
|
||||
private static final int ANIM_HARDEN_END = 7;
|
||||
private static final double CLAW_LUNGE_SPEED = 0.12D;
|
||||
private static final double CLAW_LUNGE_LIFT = 0.02D;
|
||||
private static final double STING_LUNGE_SPEED = 0.08D;
|
||||
private static final double STING_LUNGE_LIFT = 0.01D;
|
||||
private static final double CLAW_RANGE = 5.25D;
|
||||
private static final double STING_RANGE = 5.75D;
|
||||
private static final int HARDEN_START_TICKS = 11;
|
||||
private static final int HARDEN_END_TICKS = 20;
|
||||
private static final int HARDEN_HEAL_INTERVAL_TICKS = 20;
|
||||
private static final float HARDEN_HEAL_AMOUNT = 2.0F;
|
||||
private static final int HARDEN_MIN_DURATION_TICKS = 100;
|
||||
private static final int HARDEN_MAX_DURATION_TICKS = 200;
|
||||
|
||||
private static final ResourceKey<Level> THORAXIS_KEY =
|
||||
ResourceKey.create(Registries.DIMENSION,
|
||||
@@ -74,26 +92,37 @@ public class EmperorScorpionEntity extends Monster 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 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 CLAW_ATTACK_ANIM = RawAnimation.begin().thenPlay("snap");
|
||||
private static final RawAnimation STING_ATTACK_ANIM = RawAnimation.begin().thenPlay("sting");
|
||||
private static final RawAnimation HARDEN_START_ANIM = RawAnimation.begin().thenPlay("harden");
|
||||
private static final RawAnimation HARDEN_ACTIVE_ANIM = RawAnimation.begin().thenLoop("harden_state");
|
||||
private static final RawAnimation HARDEN_END_ANIM = RawAnimation.begin().thenPlay("end_of_harden_state");
|
||||
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.PURPLE, BossEvent.BossBarOverlay.PROGRESS);
|
||||
|
||||
private int attackAnimTicks = 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;
|
||||
private int attackAnimTicks;
|
||||
private int clawCooldownTicks;
|
||||
private int stingCooldownTicks;
|
||||
private int hardenCooldownTicks = AntarchySettings.emperorScorpionSummonIntervalTicks();
|
||||
private int hardenCastTicks;
|
||||
private int hardenCastSpawnTicks;
|
||||
private int hardenStateTicks;
|
||||
private int hardenDurationTicks;
|
||||
private int hardenHealTicks;
|
||||
private int hardenSummonedScorpions;
|
||||
private float hardenLockedYaw;
|
||||
private float hardenLockedPitch;
|
||||
private boolean attackDamageApplied;
|
||||
private AttackType currentAttack = AttackType.NONE;
|
||||
private HardenPhase hardenPhase = HardenPhase.NONE;
|
||||
@Nullable private LivingEntity attackTarget;
|
||||
|
||||
public EmperorScorpionEntity(EntityType<? extends EmperorScorpionEntity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
this.xpReward = 25;
|
||||
this.xpReward = AntarchySettings.emperorScorpionXpReward();
|
||||
this.bossEvent.setDarkenScreen(false);
|
||||
}
|
||||
|
||||
@@ -108,11 +137,42 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
|
||||
.add(Attributes.FOLLOW_RANGE, AntarchySettings.emperorScorpionFollowRange());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
builder.define(ANIMATION_STATE, ANIM_IDLE);
|
||||
builder.define(HARDEN_PHASE, HardenPhase.NONE.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
this.goalSelector.addGoal(1, new EmperorScorpionCombatGoal());
|
||||
this.goalSelector.addGoal(5, new RandomStrollGoal(this, 0.8D));
|
||||
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 12.0F));
|
||||
this.goalSelector.addGoal(7, new RandomLookAroundGoal(this));
|
||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this));
|
||||
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean fireImmune() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hurt(DamageSource source, float amount) {
|
||||
if (this.isHardenedStateActive()) {
|
||||
return false;
|
||||
}
|
||||
return super.hurt(source, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInvulnerableTo(DamageSource source) {
|
||||
return this.isHardenedStateActive() || super.isInvulnerableTo(source);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void lavaHurt() {
|
||||
}
|
||||
@@ -131,47 +191,6 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
|
||||
&& Monster.checkMonsterSpawnRules(entityType, level, spawnReason, pos, random);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.2D, true));
|
||||
this.goalSelector.addGoal(5, new RandomStrollGoal(this, 0.8D) {
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
return !EmperorScorpionEntity.this.isInCombat() && super.canUse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
return !EmperorScorpionEntity.this.isInCombat() && super.canContinueToUse();
|
||||
}
|
||||
});
|
||||
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 12.0F) {
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
return !EmperorScorpionEntity.this.isInCombat() && super.canUse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
return !EmperorScorpionEntity.this.isInCombat() && super.canContinueToUse();
|
||||
}
|
||||
});
|
||||
this.goalSelector.addGoal(7, new RandomLookAroundGoal(this) {
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
return !EmperorScorpionEntity.this.isInCombat() && super.canUse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
return !EmperorScorpionEntity.this.isInCombat() && super.canContinueToUse();
|
||||
}
|
||||
});
|
||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this));
|
||||
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public float maxUpStep() {
|
||||
return 1.5F;
|
||||
@@ -179,157 +198,260 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
|
||||
|
||||
@Override
|
||||
public int getMaxHeadYRot() {
|
||||
return 35;
|
||||
return 40;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth());
|
||||
|
||||
if (this.clawCooldownTicks > 0) {
|
||||
this.clawCooldownTicks--;
|
||||
}
|
||||
if (this.stingCooldownTicks > 0) {
|
||||
this.stingCooldownTicks--;
|
||||
}
|
||||
if (this.hardenCooldownTicks > 0) {
|
||||
this.hardenCooldownTicks--;
|
||||
}
|
||||
if (this.attackAnimTicks > 0) {
|
||||
if (!this.level().isClientSide) {
|
||||
this.tickActiveAttack();
|
||||
}
|
||||
this.attackAnimTicks--;
|
||||
if (this.attackAnimTicks <= 0) {
|
||||
this.attackDamageApplied = false;
|
||||
this.stingAttackActive = false;
|
||||
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;
|
||||
}
|
||||
this.tickHardenState();
|
||||
}
|
||||
|
||||
if (this.getTarget() != null
|
||||
&& this.summonCooldown <= 0
|
||||
&& !this.isAttackLocked()
|
||||
&& this.getHealth() <= this.getMaxHealth() * 0.75F
|
||||
&& this.level() instanceof ServerLevel serverLevel) {
|
||||
this.trySummonScorpions(serverLevel);
|
||||
}
|
||||
}
|
||||
|
||||
private void trySummonScorpions(ServerLevel serverLevel) {
|
||||
long nearby = serverLevel.getEntitiesOfClass(ScorpionEntity.class, this.getBoundingBox().inflate(16.0D),
|
||||
scorpion -> scorpion.getTags().contains(EMPEROR_SUMMON_TAG)).size();
|
||||
this.summonCooldown = SUMMON_INTERVAL_TICKS;
|
||||
if (nearby >= MAX_SUMMONED_SCORPIONS) {
|
||||
return;
|
||||
}
|
||||
|
||||
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;
|
||||
double offsetZ = (this.random.nextDouble() - 0.5D) * 6.0D;
|
||||
BlockPos xzPos = BlockPos.containing(this.getX() + offsetX, 0, this.getZ() + offsetZ);
|
||||
BlockPos spawnPos = serverLevel.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, xzPos);
|
||||
@Nullable ScorpionEntity scorpion = scorpionType.create(serverLevel);
|
||||
if (scorpion == null) continue;
|
||||
scorpion.moveTo(spawnPos.getX() + 0.5D, spawnPos.getY(), spawnPos.getZ() + 0.5D,
|
||||
this.getYRot(), 0.0F);
|
||||
scorpion.addTag(EMPEROR_SUMMON_TAG);
|
||||
scorpion.setTarget(this.getTarget());
|
||||
scorpion.finalizeSpawn(serverLevel,
|
||||
serverLevel.getCurrentDifficultyAt(spawnPos),
|
||||
MobSpawnType.MOB_SUMMONED, null);
|
||||
serverLevel.addFreshEntity(scorpion);
|
||||
}
|
||||
this.playSound(AntarchySoundEvents.EMPEROR_SCORPION_ROAR.get(), 1.2F, 0.75F);
|
||||
this.updateAnimationState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doHurtTarget(Entity target) {
|
||||
boolean hurt = super.doHurtTarget(target);
|
||||
if (hurt) {
|
||||
boolean usedSting = false;
|
||||
if (target instanceof LivingEntity livingTarget && this.shouldUseSting(livingTarget)) {
|
||||
this.stingAttackActive = true;
|
||||
this.attackAnimTicks = STING_ATTACK_ANIM_TICKS;
|
||||
this.attackDamageApplied = false;
|
||||
this.level().broadcastEntityEvent(this, STING_ATTACK_ANIM_EVENT);
|
||||
usedSting = this.performStingAttack(livingTarget);
|
||||
if (usedSting) {
|
||||
this.stingCooldownTicks = STING_ATTACK_COOLDOWN_TICKS;
|
||||
if (!hurt) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
this.stingAttackActive = false;
|
||||
this.attackAnimTicks = SNAP_ATTACK_ANIM_TICKS;
|
||||
this.attackDamageApplied = false;
|
||||
this.level().broadcastEntityEvent(this, SNAP_ATTACK_ANIM_EVENT);
|
||||
}
|
||||
if (!usedSting) {
|
||||
this.playSound(AntarchySoundEvents.EMPEROR_SCORPION_ATTACK.get(), 0.9F, 0.95F + this.random.nextFloat() * 0.08F);
|
||||
}
|
||||
}
|
||||
return hurt;
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean performStingAttack(Entity target) {
|
||||
if (!(target instanceof LivingEntity living)) {
|
||||
private boolean doStingAttack(LivingEntity target) {
|
||||
boolean hurt;
|
||||
if (this.level() instanceof net.minecraft.server.level.ServerLevel serverLevel) {
|
||||
hurt = target.hurt(
|
||||
AntarchyDamageSources.emperorScorpionSting(serverLevel, this),
|
||||
(float) this.getAttributeValue(Attributes.ATTACK_DAMAGE)
|
||||
);
|
||||
} else {
|
||||
hurt = target.hurt(this.damageSources().mobAttack(this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE));
|
||||
}
|
||||
|
||||
if (!hurt) {
|
||||
return false;
|
||||
}
|
||||
if (!(this.level() instanceof ServerLevel serverLevel)) {
|
||||
return false;
|
||||
}
|
||||
boolean hurt = living.hurt(AntarchyDamageSources.emperorScorpionSting(serverLevel, this), STING_DAMAGE);
|
||||
if (hurt) {
|
||||
|
||||
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));
|
||||
this.playSound(AntarchySoundEvents.EMPEROR_SCORPION_ATTACK.get(), 1.0F, 0.9F + this.random.nextFloat() * 0.08F);
|
||||
}
|
||||
return hurt;
|
||||
? AntarchySettings.emperorScorpionPoisonTicks() * 2
|
||||
: AntarchySettings.emperorScorpionPoisonTicks();
|
||||
target.addEffect(new MobEffectInstance(MobEffects.POISON, poisonDuration, 1));
|
||||
target.addEffect(new MobEffectInstance(MobEffects.WEAKNESS, AntarchySettings.emperorScorpionWeaknessTicks(), 0));
|
||||
this.playSound(AntarchySoundEvents.EMPEROR_SCORPION_ATTACK.get(), 1.0F, 0.88F + this.random.nextFloat() * 0.08F);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean shouldUseSting(LivingEntity target) {
|
||||
return this.stingCooldownTicks <= 0
|
||||
&& target.isAlive()
|
||||
&& (this.getHealth() <= this.getMaxHealth() * 0.8F || this.random.nextFloat() < 0.35F);
|
||||
private void beginAttack(LivingEntity target, AttackType attackType) {
|
||||
if (this.isHardenSequenceActive()) {
|
||||
return;
|
||||
}
|
||||
this.attackTarget = target;
|
||||
this.currentAttack = attackType;
|
||||
this.attackAnimTicks = attackType.animTicks();
|
||||
this.attackDamageApplied = false;
|
||||
this.getNavigation().stop();
|
||||
if (attackType == AttackType.CLAW) {
|
||||
this.clawCooldownTicks = AntarchySettings.emperorScorpionClawCooldownTicks();
|
||||
this.level().broadcastEntityEvent(this, CLAW_ATTACK_EVENT);
|
||||
this.commitLunge(target, CLAW_LUNGE_SPEED, CLAW_LUNGE_LIFT);
|
||||
} else if (attackType == AttackType.STING) {
|
||||
this.stingCooldownTicks = AntarchySettings.emperorScorpionStingCooldownTicks();
|
||||
this.level().broadcastEntityEvent(this, STING_ATTACK_EVENT);
|
||||
this.commitLunge(target, STING_LUNGE_SPEED, STING_LUNGE_LIFT);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isAttackLocked() {
|
||||
return this.attackAnimTicks > 0 || this.agroAnimTicks > 0;
|
||||
private void tickActiveAttack() {
|
||||
if (this.attackTarget == null || !this.attackTarget.isAlive() || this.isHardenSequenceActive()) {
|
||||
this.resetAttackState();
|
||||
return;
|
||||
}
|
||||
|
||||
private boolean isInCombat() {
|
||||
return this.getTarget() != null || this.isAttackLocked();
|
||||
this.getLookControl().setLookAt(this.attackTarget, 30.0F, 30.0F);
|
||||
if (!this.attackDamageApplied
|
||||
&& this.attackAnimTicks == this.currentAttack.hitTick()
|
||||
&& this.canHitAttackTarget(this.attackTarget, this.currentAttack)) {
|
||||
this.attackDamageApplied = true;
|
||||
if (this.currentAttack == AttackType.STING) {
|
||||
this.doStingAttack(this.attackTarget);
|
||||
} else {
|
||||
this.doHurtTarget(this.attackTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean canHitAttackTarget(LivingEntity target, AttackType attackType) {
|
||||
double range = attackType == AttackType.STING ? STING_RANGE : CLAW_RANGE;
|
||||
return this.distanceToSqr(target) <= range * range && this.hasLineOfSight(target);
|
||||
}
|
||||
|
||||
private void resetAttackState() {
|
||||
this.attackAnimTicks = 0;
|
||||
this.attackDamageApplied = false;
|
||||
this.currentAttack = AttackType.NONE;
|
||||
this.attackTarget = null;
|
||||
}
|
||||
|
||||
private void tickHardenState() {
|
||||
if (this.getHardenPhase() == HardenPhase.NONE) {
|
||||
if (this.hardenCooldownTicks <= 0 && this.getTarget() != null && this.getTarget().isAlive()) {
|
||||
this.beginHardenCast();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
this.getNavigation().stop();
|
||||
this.setSpeed(0.0F);
|
||||
this.setZza(0.0F);
|
||||
|
||||
switch (this.getHardenPhase()) {
|
||||
case CASTING -> {
|
||||
if (this.hardenCastTicks % this.hardenCastSpawnTicks == 0
|
||||
&& this.hardenSummonedScorpions < AntarchySettings.emperorScorpionMaxSummonedScorpions()) {
|
||||
this.summonScorpionMinion();
|
||||
this.hardenSummonedScorpions++;
|
||||
if (this.hardenSummonedScorpions >= AntarchySettings.emperorScorpionMaxSummonedScorpions()) {
|
||||
this.beginHardening();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (--this.hardenCastTicks <= 0) {
|
||||
this.beginHardening();
|
||||
}
|
||||
}
|
||||
case START -> {
|
||||
this.lockHardenRotation();
|
||||
if (--this.hardenStateTicks <= 0) {
|
||||
this.beginHardened();
|
||||
}
|
||||
}
|
||||
case ACTIVE -> {
|
||||
this.lockHardenRotation();
|
||||
Vec3 motion = this.getDeltaMovement();
|
||||
this.setDeltaMovement(0.0D, motion.y, 0.0D);
|
||||
if (--this.hardenDurationTicks <= 0) {
|
||||
this.beginHardeningEnd();
|
||||
return;
|
||||
}
|
||||
if (--this.hardenHealTicks <= 0) {
|
||||
this.hardenHealTicks = HARDEN_HEAL_INTERVAL_TICKS;
|
||||
this.heal(HARDEN_HEAL_AMOUNT);
|
||||
}
|
||||
}
|
||||
case END -> {
|
||||
this.lockHardenRotation();
|
||||
Vec3 motion = this.getDeltaMovement();
|
||||
this.setDeltaMovement(0.0D, motion.y, 0.0D);
|
||||
if (--this.hardenStateTicks <= 0) {
|
||||
this.setHardenPhase(HardenPhase.NONE);
|
||||
this.hardenCooldownTicks = Math.max(1, AntarchySettings.emperorScorpionSummonIntervalTicks());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void beginHardenCast() {
|
||||
this.setHardenPhase(HardenPhase.CASTING);
|
||||
this.hardenCastTicks = Math.max(1, AntarchySettings.emperorScorpionSummonIntervalTicks());
|
||||
this.hardenCastSpawnTicks = Math.max(1, this.hardenCastTicks / Math.max(1, AntarchySettings.emperorScorpionMaxSummonedScorpions()));
|
||||
this.hardenStateTicks = 0;
|
||||
this.hardenDurationTicks = 0;
|
||||
this.hardenHealTicks = 0;
|
||||
this.hardenSummonedScorpions = 0;
|
||||
this.resetAttackState();
|
||||
this.getNavigation().stop();
|
||||
}
|
||||
|
||||
private void beginHardening() {
|
||||
this.setHardenPhase(HardenPhase.START);
|
||||
this.hardenStateTicks = HARDEN_START_TICKS;
|
||||
this.hardenLockedYaw = this.getYRot();
|
||||
this.hardenLockedPitch = this.getXRot();
|
||||
this.playSound(AntarchySoundEvents.EMPEROR_SCORPION_ROAR.get(), 1.0F, 0.95F + this.random.nextFloat() * 0.05F);
|
||||
this.setAggressive(false);
|
||||
}
|
||||
|
||||
private void beginHardened() {
|
||||
this.setHardenPhase(HardenPhase.ACTIVE);
|
||||
this.hardenDurationTicks = HARDEN_MIN_DURATION_TICKS + this.random.nextInt(HARDEN_MAX_DURATION_TICKS - HARDEN_MIN_DURATION_TICKS + 1);
|
||||
this.hardenHealTicks = HARDEN_HEAL_INTERVAL_TICKS;
|
||||
}
|
||||
|
||||
private void beginHardeningEnd() {
|
||||
this.setHardenPhase(HardenPhase.END);
|
||||
this.hardenStateTicks = HARDEN_END_TICKS;
|
||||
this.setAggressive(false);
|
||||
}
|
||||
|
||||
private void summonScorpionMinion() {
|
||||
if (!(this.level() instanceof ServerLevel serverLevel)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ScorpionEntity scorpion = AntarchyObjects.SCORPION.get().create(serverLevel);
|
||||
if (scorpion == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Vec3 ring = Vec3.directionFromRotation(0.0F, this.random.nextFloat() * 360.0F)
|
||||
.scale(2.75D + this.random.nextDouble() * 1.75D);
|
||||
BlockPos spawnPos = BlockPos.containing(this.getX() + ring.x, this.getY(), this.getZ() + ring.z);
|
||||
scorpion.moveTo(spawnPos.getX() + 0.5D, spawnPos.getY(), spawnPos.getZ() + 0.5D, this.random.nextFloat() * 360.0F, 0.0F);
|
||||
scorpion.finalizeSpawn(serverLevel, serverLevel.getCurrentDifficultyAt(spawnPos), MobSpawnType.MOB_SUMMONED, null);
|
||||
scorpion.setPersistenceRequired();
|
||||
if (this.getTarget() instanceof LivingEntity target) {
|
||||
scorpion.setTarget(target);
|
||||
}
|
||||
serverLevel.addFreshEntity(scorpion);
|
||||
}
|
||||
|
||||
private void commitLunge(LivingEntity target, double horizontalSpeed, double verticalSpeed) {
|
||||
Vec3 lunge = target.position().subtract(this.position());
|
||||
Vec3 horizontal = new Vec3(lunge.x, 0.0D, lunge.z);
|
||||
if (horizontal.lengthSqr() < 1.0E-4D) {
|
||||
return;
|
||||
}
|
||||
horizontal = horizontal.normalize().scale(horizontalSpeed);
|
||||
this.setDeltaMovement(this.getDeltaMovement().add(horizontal.x, verticalSpeed, horizontal.z));
|
||||
this.hasImpulse = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleEntityEvent(byte id) {
|
||||
if (id == SNAP_ATTACK_ANIM_EVENT) {
|
||||
this.attackAnimTicks = SNAP_ATTACK_ANIM_TICKS;
|
||||
if (id == CLAW_ATTACK_EVENT) {
|
||||
this.currentAttack = AttackType.CLAW;
|
||||
this.attackAnimTicks = AntarchySettings.emperorScorpionClawAnimTicks();
|
||||
this.attackDamageApplied = false;
|
||||
this.stingAttackActive = false;
|
||||
return;
|
||||
}
|
||||
if (id == STING_ATTACK_ANIM_EVENT) {
|
||||
this.attackAnimTicks = STING_ATTACK_ANIM_TICKS;
|
||||
if (id == STING_ATTACK_EVENT) {
|
||||
this.currentAttack = AttackType.STING;
|
||||
this.attackAnimTicks = AntarchySettings.emperorScorpionStingAnimTicks();
|
||||
this.attackDamageApplied = false;
|
||||
this.stingAttackActive = true;
|
||||
return;
|
||||
}
|
||||
if (id == AGRO_ANIM_EVENT) {
|
||||
this.agroAnimTicks = AGRO_ANIM_TICKS;
|
||||
return;
|
||||
}
|
||||
super.handleEntityEvent(id);
|
||||
@@ -341,19 +463,85 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
|
||||
}
|
||||
|
||||
private PlayState mainController(AnimationState<EmperorScorpionEntity> state) {
|
||||
return switch (this.getAnimationState()) {
|
||||
case ANIM_WALK -> state.setAndContinue(WALK_ANIM);
|
||||
case ANIM_CLAW_ATTACK -> state.setAndContinue(CLAW_ATTACK_ANIM);
|
||||
case ANIM_STING_ATTACK -> state.setAndContinue(STING_ATTACK_ANIM);
|
||||
case ANIM_HARDEN_START -> state.setAndContinue(HARDEN_START_ANIM);
|
||||
case ANIM_HARDEN_ACTIVE -> state.setAndContinue(HARDEN_ACTIVE_ANIM);
|
||||
case ANIM_HARDEN_END -> state.setAndContinue(HARDEN_END_ANIM);
|
||||
case ANIM_DEATH -> state.setAndContinue(DEATH_ANIM);
|
||||
default -> state.setAndContinue(IDLE_ANIM);
|
||||
};
|
||||
}
|
||||
|
||||
private int getAnimationState() {
|
||||
return this.entityData.get(ANIMATION_STATE);
|
||||
}
|
||||
|
||||
private HardenPhase getHardenPhase() {
|
||||
HardenPhase[] phases = HardenPhase.values();
|
||||
int phaseOrdinal = this.entityData.get(HARDEN_PHASE);
|
||||
return phaseOrdinal >= 0 && phaseOrdinal < phases.length ? phases[phaseOrdinal] : HardenPhase.NONE;
|
||||
}
|
||||
|
||||
public int getHardenPhaseIndex() {
|
||||
return this.entityData.get(HARDEN_PHASE);
|
||||
}
|
||||
|
||||
private void setAnimationState(int animationState) {
|
||||
this.entityData.set(ANIMATION_STATE, animationState);
|
||||
}
|
||||
|
||||
private void setHardenPhase(HardenPhase phase) {
|
||||
this.hardenPhase = phase;
|
||||
this.entityData.set(HARDEN_PHASE, phase.ordinal());
|
||||
}
|
||||
|
||||
private void lockHardenRotation() {
|
||||
if (!this.isHardenSequenceActive()) {
|
||||
return;
|
||||
}
|
||||
this.setYRot(this.hardenLockedYaw);
|
||||
this.setYHeadRot(this.hardenLockedYaw);
|
||||
this.yBodyRot = this.hardenLockedYaw;
|
||||
this.yBodyRotO = this.hardenLockedYaw;
|
||||
this.yHeadRotO = this.hardenLockedYaw;
|
||||
this.setXRot(this.hardenLockedPitch);
|
||||
this.xRotO = this.hardenLockedPitch;
|
||||
}
|
||||
|
||||
private void updateAnimationState() {
|
||||
if (this.isDeadOrDying()) {
|
||||
return state.setAndContinue(DEATH_ANIM);
|
||||
this.setAnimationState(ANIM_DEATH);
|
||||
return;
|
||||
}
|
||||
HardenPhase currentHardenPhase = this.getHardenPhase();
|
||||
if (currentHardenPhase == HardenPhase.START) {
|
||||
this.setAnimationState(ANIM_HARDEN_START);
|
||||
return;
|
||||
}
|
||||
if (currentHardenPhase == HardenPhase.ACTIVE) {
|
||||
this.setAnimationState(ANIM_HARDEN_ACTIVE);
|
||||
return;
|
||||
}
|
||||
if (currentHardenPhase == HardenPhase.END) {
|
||||
this.setAnimationState(ANIM_HARDEN_END);
|
||||
return;
|
||||
}
|
||||
if (this.attackAnimTicks > 0) {
|
||||
return state.setAndContinue(this.stingAttackActive ? STING_ANIM : SNAP_ANIM);
|
||||
this.setAnimationState(this.currentAttack == AttackType.STING ? ANIM_STING_ATTACK : ANIM_CLAW_ATTACK);
|
||||
return;
|
||||
}
|
||||
if (this.agroAnimTicks > 0) {
|
||||
return state.setAndContinue(AGRO_ANIM);
|
||||
if (currentHardenPhase == HardenPhase.CASTING) {
|
||||
this.setAnimationState(ANIM_IDLE);
|
||||
return;
|
||||
}
|
||||
if (state.isMoving()) {
|
||||
return state.setAndContinue(WALK_ANIM);
|
||||
if (this.getTarget() != null || this.getDeltaMovement().horizontalDistanceSqr() > 1.0E-4D) {
|
||||
this.setAnimationState(ANIM_WALK);
|
||||
return;
|
||||
}
|
||||
return state.setAndContinue(IDLE_ANIM);
|
||||
this.setAnimationState(ANIM_IDLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -390,6 +578,50 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
|
||||
return 0.8F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addAdditionalSaveData(CompoundTag tag) {
|
||||
super.addAdditionalSaveData(tag);
|
||||
tag.putInt("HardenPhase", this.hardenPhase.ordinal());
|
||||
tag.putInt("HardenCooldownTicks", this.hardenCooldownTicks);
|
||||
tag.putInt("HardenCastTicks", this.hardenCastTicks);
|
||||
tag.putInt("HardenCastSpawnTicks", this.hardenCastSpawnTicks);
|
||||
tag.putInt("HardenStateTicks", this.hardenStateTicks);
|
||||
tag.putInt("HardenDurationTicks", this.hardenDurationTicks);
|
||||
tag.putInt("HardenHealTicks", this.hardenHealTicks);
|
||||
tag.putInt("HardenSummonedScorpions", this.hardenSummonedScorpions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readAdditionalSaveData(CompoundTag tag) {
|
||||
super.readAdditionalSaveData(tag);
|
||||
if (tag.contains("HardenPhase")) {
|
||||
int phaseOrdinal = tag.getInt("HardenPhase");
|
||||
HardenPhase[] phases = HardenPhase.values();
|
||||
this.setHardenPhase(phaseOrdinal >= 0 && phaseOrdinal < phases.length ? phases[phaseOrdinal] : HardenPhase.NONE);
|
||||
}
|
||||
if (tag.contains("HardenCooldownTicks")) {
|
||||
this.hardenCooldownTicks = tag.getInt("HardenCooldownTicks");
|
||||
}
|
||||
if (tag.contains("HardenCastTicks")) {
|
||||
this.hardenCastTicks = tag.getInt("HardenCastTicks");
|
||||
}
|
||||
if (tag.contains("HardenCastSpawnTicks")) {
|
||||
this.hardenCastSpawnTicks = tag.getInt("HardenCastSpawnTicks");
|
||||
}
|
||||
if (tag.contains("HardenStateTicks")) {
|
||||
this.hardenStateTicks = tag.getInt("HardenStateTicks");
|
||||
}
|
||||
if (tag.contains("HardenDurationTicks")) {
|
||||
this.hardenDurationTicks = tag.getInt("HardenDurationTicks");
|
||||
}
|
||||
if (tag.contains("HardenHealTicks")) {
|
||||
this.hardenHealTicks = tag.getInt("HardenHealTicks");
|
||||
}
|
||||
if (tag.contains("HardenSummonedScorpions")) {
|
||||
this.hardenSummonedScorpions = tag.getInt("HardenSummonedScorpions");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCustomName(@Nullable net.minecraft.network.chat.Component name) {
|
||||
super.setCustomName(name);
|
||||
@@ -413,4 +645,158 @@ public class EmperorScorpionEntity extends Monster implements GeoEntity {
|
||||
super.remove(reason);
|
||||
this.bossEvent.removeAllPlayers();
|
||||
}
|
||||
|
||||
private boolean isAttackLocked() {
|
||||
return this.attackAnimTicks > 0;
|
||||
}
|
||||
|
||||
public boolean isHardenSequenceActive() {
|
||||
return this.getHardenPhase() != HardenPhase.NONE;
|
||||
}
|
||||
|
||||
public boolean isHardenedStateActive() {
|
||||
HardenPhase currentHardenPhase = this.getHardenPhase();
|
||||
return currentHardenPhase == HardenPhase.START
|
||||
|| currentHardenPhase == HardenPhase.ACTIVE
|
||||
|| currentHardenPhase == HardenPhase.END;
|
||||
}
|
||||
|
||||
public boolean isHardened() {
|
||||
return this.getHardenPhase() == HardenPhase.ACTIVE;
|
||||
}
|
||||
|
||||
public boolean shouldUseHardenTexture() {
|
||||
return this.getHardenPhase() == HardenPhase.START
|
||||
|| this.getHardenPhase() == HardenPhase.ACTIVE
|
||||
|| this.getHardenPhase() == HardenPhase.END;
|
||||
}
|
||||
|
||||
private final class EmperorScorpionCombatGoal extends Goal {
|
||||
private static final double CHASE_SPEED = 1.1D;
|
||||
|
||||
private EmperorScorpionCombatGoal() {
|
||||
this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
LivingEntity target = EmperorScorpionEntity.this.getTarget();
|
||||
return target != null && target.isAlive() && !EmperorScorpionEntity.this.isHardenSequenceActive();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
LivingEntity target = EmperorScorpionEntity.this.getTarget();
|
||||
return (target != null && target.isAlive()) || EmperorScorpionEntity.this.isAttackLocked();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
EmperorScorpionEntity.this.setAggressive(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
EmperorScorpionEntity.this.setAggressive(false);
|
||||
EmperorScorpionEntity.this.getNavigation().stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
LivingEntity target = EmperorScorpionEntity.this.getTarget();
|
||||
if (target == null) {
|
||||
EmperorScorpionEntity.this.getNavigation().stop();
|
||||
return;
|
||||
}
|
||||
|
||||
if (EmperorScorpionEntity.this.isHardenSequenceActive()) {
|
||||
this.stopMovement();
|
||||
return;
|
||||
}
|
||||
|
||||
EmperorScorpionEntity.this.getLookControl().setLookAt(target, 30.0F, 30.0F);
|
||||
|
||||
if (EmperorScorpionEntity.this.isAttackLocked()) {
|
||||
this.stopMovement();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!EmperorScorpionEntity.this.hasLineOfSight(target)) {
|
||||
EmperorScorpionEntity.this.getNavigation().moveTo(target, CHASE_SPEED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!EmperorScorpionEntity.this.isWithinMeleeAttackRange(target)) {
|
||||
EmperorScorpionEntity.this.getNavigation().moveTo(target, CHASE_SPEED);
|
||||
return;
|
||||
}
|
||||
|
||||
this.stopMovement();
|
||||
AttackType attackType = EmperorScorpionEntity.this.selectAttack(target);
|
||||
if (attackType == AttackType.NONE) {
|
||||
EmperorScorpionEntity.this.getNavigation().moveTo(target, CHASE_SPEED);
|
||||
return;
|
||||
}
|
||||
|
||||
EmperorScorpionEntity.this.beginAttack(target, attackType);
|
||||
}
|
||||
|
||||
private void stopMovement() {
|
||||
EmperorScorpionEntity.this.getNavigation().stop();
|
||||
EmperorScorpionEntity.this.setSpeed(0.0F);
|
||||
EmperorScorpionEntity.this.setZza(0.0F);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWithinMeleeAttackRange(LivingEntity target) {
|
||||
return this.distanceToSqr(target) <= STING_RANGE * STING_RANGE;
|
||||
}
|
||||
|
||||
private AttackType selectAttack(LivingEntity target) {
|
||||
boolean inClawRange = this.clawCooldownTicks <= 0 && this.distanceToSqr(target) <= CLAW_RANGE * CLAW_RANGE;
|
||||
boolean inStingRange = this.stingCooldownTicks <= 0 && this.distanceToSqr(target) <= STING_RANGE * STING_RANGE;
|
||||
boolean canClaw = inClawRange && this.hasLineOfSight(target);
|
||||
boolean canSting = inStingRange && this.hasLineOfSight(target);
|
||||
if (canSting && (!canClaw || this.random.nextFloat() < 0.3F)) {
|
||||
return AttackType.STING;
|
||||
}
|
||||
if (canClaw) {
|
||||
return AttackType.CLAW;
|
||||
}
|
||||
if (canSting) {
|
||||
return AttackType.STING;
|
||||
}
|
||||
return AttackType.NONE;
|
||||
}
|
||||
|
||||
private enum AttackType {
|
||||
NONE,
|
||||
CLAW,
|
||||
STING;
|
||||
|
||||
private int animTicks() {
|
||||
return switch (this) {
|
||||
case CLAW -> AntarchySettings.emperorScorpionClawAnimTicks();
|
||||
case STING -> AntarchySettings.emperorScorpionStingAnimTicks();
|
||||
default -> 0;
|
||||
};
|
||||
}
|
||||
|
||||
private int hitTick() {
|
||||
return switch (this) {
|
||||
case CLAW -> AntarchySettings.emperorScorpionClawHitTick();
|
||||
case STING -> AntarchySettings.emperorScorpionStingHitTick();
|
||||
default -> 0;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private enum HardenPhase {
|
||||
NONE,
|
||||
CASTING,
|
||||
START,
|
||||
ACTIVE,
|
||||
END
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,430 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import com.craisinlord.antarchy.content.AntarchyObjects;
|
||||
import com.craisinlord.antarchy.content.AntarchyTags;
|
||||
import com.craisinlord.antarchy.content.GlimmerParticles;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.ListTag;
|
||||
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.world.DifficultyInstance;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.entity.AgeableMob;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.MobSpawnType;
|
||||
import net.minecraft.world.entity.SpawnGroupData;
|
||||
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.FollowParentGoal;
|
||||
import net.minecraft.world.entity.ai.goal.Goal;
|
||||
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.ai.util.DefaultRandomPos;
|
||||
import net.minecraft.world.entity.animal.Animal;
|
||||
import net.minecraft.world.entity.monster.Monster;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.crafting.Ingredient;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.ServerLevelAccessor;
|
||||
import net.minecraft.world.level.pathfinder.Path;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
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 GlimmerEntity extends Animal implements GeoEntity {
|
||||
private static final EntityDataAccessor<Integer> GLOW_TICKS =
|
||||
SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.INT);
|
||||
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
|
||||
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
|
||||
private static final RawAnimation RUN_ANIM = RawAnimation.begin().thenLoop("run");
|
||||
private static final String QUIRK_CONTROLLER = "quirk_controller";
|
||||
private static final String QUIRK_TRIGGER = "quirk";
|
||||
|
||||
private static final int TRUST_REQUIRED_FEEDS = 3;
|
||||
private static final int GRACE_DURATION_TICKS = 2400;
|
||||
private static final int GRACE_COOLDOWN_TICKS = 6000;
|
||||
private static final int GLOW_LIGHT_THRESHOLD = 7;
|
||||
private static final int GLOW_CHECK_INTERVAL_TICKS = 20;
|
||||
private static final int GLOW_TRANSITION_TICKS = 10;
|
||||
private static final double WALK_SPEED_THRESHOLD_SQR = 0.0009D;
|
||||
private static final double RUN_SPEED_THRESHOLD_SQR = 0.0035D;
|
||||
|
||||
private static final int MIN_QUIRK_COOLDOWN = 20 * 8;
|
||||
private static final int MAX_QUIRK_COOLDOWN = 20 * 25;
|
||||
|
||||
private static final String TRUST_KEY = "GlimmerTrust";
|
||||
private static final String TRUST_PLAYER_KEY = "Player";
|
||||
private static final String TRUST_FEED_COUNT_KEY = "FeedCount";
|
||||
private static final String TRUST_TRUSTED_KEY = "Trusted";
|
||||
private static final String TRUST_COOLDOWN_KEY = "GraceCooldown";
|
||||
private static final String GLOWING_SAVE_KEY = "Glowing";
|
||||
|
||||
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
|
||||
private final Map<UUID, TrustEntry> trustByPlayer = new HashMap<>();
|
||||
|
||||
private boolean glowing;
|
||||
private int quirkCooldown = createQuirkCooldown();
|
||||
|
||||
public GlimmerEntity(EntityType<? extends GlimmerEntity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
}
|
||||
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return net.minecraft.world.entity.Mob.createMobAttributes()
|
||||
.add(Attributes.MAX_HEALTH, AntarchySettings.glimmerHealth())
|
||||
.add(Attributes.MOVEMENT_SPEED, 0.3D)
|
||||
.add(Attributes.FOLLOW_RANGE, 24.0D);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
builder.define(GLOW_TICKS, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
this.goalSelector.addGoal(1, new PanicGoal(this, 1.6D));
|
||||
this.goalSelector.addGoal(2, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyTags.Items.GLIMMER_FOOD), false));
|
||||
this.goalSelector.addGoal(3, new AvoidUntrustedPlayerGoal(10.0F, 1.15D));
|
||||
this.goalSelector.addGoal(4, new net.minecraft.world.entity.ai.goal.AvoidEntityGoal<>(this, Monster.class, 8.0F, 1.0D, 1.2D));
|
||||
this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.25D));
|
||||
this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D));
|
||||
this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F));
|
||||
this.goalSelector.addGoal(8, new RandomLookAroundGoal(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFood(ItemStack stack) {
|
||||
return stack.is(AntarchyTags.Items.GLIMMER_FOOD);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GlimmerEntity getBreedOffspring(ServerLevel level, AgeableMob otherParent) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult mobInteract(Player player, InteractionHand hand) {
|
||||
ItemStack stack = player.getItemInHand(hand);
|
||||
if (stack.is(AntarchyTags.Items.GLIMMER_FOOD)) {
|
||||
return this.feedGlimmerFood(player, stack, hand);
|
||||
}
|
||||
return super.mobInteract(player, hand);
|
||||
}
|
||||
|
||||
private InteractionResult feedGlimmerFood(Player player, ItemStack stack, InteractionHand hand) {
|
||||
if (this.level().isClientSide) {
|
||||
return InteractionResult.CONSUME;
|
||||
}
|
||||
|
||||
this.usePlayerItem(player, hand, stack);
|
||||
this.playSound(SoundEvents.GENERIC_EAT, 1.0F, 1.0F + (this.random.nextFloat() - 0.5F) * 0.2F);
|
||||
|
||||
if (!this.isBaby()) {
|
||||
TrustEntry entry = this.trustByPlayer.computeIfAbsent(player.getUUID(), id -> new TrustEntry());
|
||||
if (!entry.trusted) {
|
||||
entry.feedCount++;
|
||||
if (entry.feedCount >= TRUST_REQUIRED_FEEDS) {
|
||||
entry.trusted = true;
|
||||
}
|
||||
} else if (this.glowing && entry.graceCooldown <= 0) {
|
||||
player.addEffect(new MobEffectInstance(AntarchyObjects.GLIMMERS_GRACE.get(), GRACE_DURATION_TICKS, 0, false, true, true));
|
||||
entry.graceCooldown = GRACE_COOLDOWN_TICKS;
|
||||
}
|
||||
}
|
||||
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
public boolean isTrusted(UUID playerId) {
|
||||
TrustEntry entry = this.trustByPlayer.get(playerId);
|
||||
return entry != null && entry.trusted;
|
||||
}
|
||||
|
||||
private boolean hasAnyTrustProgress() {
|
||||
for (TrustEntry entry : this.trustByPlayer.values()) {
|
||||
if (entry.trusted || entry.feedCount > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPersistenceRequired() {
|
||||
return super.isPersistenceRequired() || (!this.isBaby() && this.hasAnyTrustProgress());
|
||||
}
|
||||
|
||||
public boolean isGlowingState() {
|
||||
return this.getGlowTicks() > 0;
|
||||
}
|
||||
|
||||
public float getGlowBlend(float partialTick) {
|
||||
return Mth.clamp((this.getGlowTicks() + partialTick) / (float) GLOW_TRANSITION_TICKS, 0.0F, 1.0F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
|
||||
if (this.quirkCooldown > 0) {
|
||||
this.quirkCooldown--;
|
||||
}
|
||||
|
||||
if (!this.level().isClientSide && this.tickCount % GLOW_CHECK_INTERVAL_TICKS == 0) {
|
||||
this.glowing = this.level().getMaxLocalRawBrightness(this.blockPosition()) <= GLOW_LIGHT_THRESHOLD;
|
||||
}
|
||||
|
||||
if (!this.level().isClientSide) {
|
||||
int glowTicks = this.getGlowTicks();
|
||||
if (this.glowing && glowTicks < GLOW_TRANSITION_TICKS) {
|
||||
this.setGlowTicks(glowTicks + 1);
|
||||
} else if (!this.glowing && glowTicks > 0) {
|
||||
this.setGlowTicks(glowTicks - 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.isGlowingState()) {
|
||||
GlimmerParticles.tickAmbient(this, this.getDeltaMovement().horizontalDistanceSqr() > RUN_SPEED_THRESHOLD_SQR);
|
||||
}
|
||||
|
||||
if (this.level().isClientSide) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (TrustEntry entry : this.trustByPlayer.values()) {
|
||||
if (entry.graceCooldown > 0) {
|
||||
entry.graceCooldown--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addAdditionalSaveData(CompoundTag tag) {
|
||||
super.addAdditionalSaveData(tag);
|
||||
tag.putBoolean(GLOWING_SAVE_KEY, this.glowing);
|
||||
|
||||
ListTag trustList = new ListTag();
|
||||
for (Map.Entry<UUID, TrustEntry> entry : this.trustByPlayer.entrySet()) {
|
||||
CompoundTag entryTag = new CompoundTag();
|
||||
entryTag.putUUID(TRUST_PLAYER_KEY, entry.getKey());
|
||||
entryTag.putInt(TRUST_FEED_COUNT_KEY, entry.getValue().feedCount);
|
||||
entryTag.putBoolean(TRUST_TRUSTED_KEY, entry.getValue().trusted);
|
||||
entryTag.putInt(TRUST_COOLDOWN_KEY, entry.getValue().graceCooldown);
|
||||
trustList.add(entryTag);
|
||||
}
|
||||
tag.put(TRUST_KEY, trustList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readAdditionalSaveData(CompoundTag tag) {
|
||||
super.readAdditionalSaveData(tag);
|
||||
this.glowing = tag.getBoolean(GLOWING_SAVE_KEY);
|
||||
this.setGlowTicks(this.glowing ? GLOW_TRANSITION_TICKS : 0);
|
||||
|
||||
this.trustByPlayer.clear();
|
||||
for (net.minecraft.nbt.Tag rawEntry : tag.getList(TRUST_KEY, net.minecraft.nbt.Tag.TAG_COMPOUND)) {
|
||||
CompoundTag entryTag = (CompoundTag) rawEntry;
|
||||
TrustEntry entry = new TrustEntry();
|
||||
entry.feedCount = entryTag.getInt(TRUST_FEED_COUNT_KEY);
|
||||
entry.trusted = entryTag.getBoolean(TRUST_TRUSTED_KEY);
|
||||
entry.graceCooldown = entryTag.getInt(TRUST_COOLDOWN_KEY);
|
||||
this.trustByPlayer.put(entryTag.getUUID(TRUST_PLAYER_KEY), entry);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData spawnGroupData) {
|
||||
GlimmerSpawnData glimmerSpawnData = spawnGroupData instanceof GlimmerSpawnData data ? data : new GlimmerSpawnData();
|
||||
SpawnGroupData result = super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData);
|
||||
|
||||
if ((spawnReason == MobSpawnType.NATURAL || spawnReason == MobSpawnType.CHUNK_GENERATION)) {
|
||||
if (glimmerSpawnData.adultSpawned) {
|
||||
this.setAge(-24000);
|
||||
} else {
|
||||
glimmerSpawnData.adultSpawned = true;
|
||||
}
|
||||
}
|
||||
|
||||
return result != null ? result : glimmerSpawnData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.minecraft.world.entity.EntityDimensions getDefaultDimensions(net.minecraft.world.entity.Pose pose) {
|
||||
net.minecraft.world.entity.EntityDimensions dimensions = super.getDefaultDimensions(pose);
|
||||
if (this.isBaby()) {
|
||||
return dimensions;
|
||||
}
|
||||
return net.minecraft.world.entity.EntityDimensions.scalable(dimensions.width() * 2.0F, dimensions.height() * 2.0F);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void ageBoundaryReached() {
|
||||
super.ageBoundaryReached();
|
||||
this.refreshDimensions();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getAmbientSound() {
|
||||
return SoundEvents.FOX_AMBIENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getHurtSound(DamageSource damageSource) {
|
||||
return SoundEvents.FOX_HURT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getDeathSound() {
|
||||
return SoundEvents.FOX_DEATH;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getSoundVolume() {
|
||||
return 0.8F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||
controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController));
|
||||
controllers.add(new AnimationController<>(this, QUIRK_CONTROLLER, 0, state -> PlayState.STOP)
|
||||
.triggerableAnim(QUIRK_TRIGGER, RawAnimation.begin().thenPlay("quirk")));
|
||||
}
|
||||
|
||||
private PlayState mainAnimController(AnimationState<GlimmerEntity> state) {
|
||||
double speedSqr = this.getDeltaMovement().horizontalDistanceSqr();
|
||||
if (speedSqr > RUN_SPEED_THRESHOLD_SQR) {
|
||||
return state.setAndContinue(RUN_ANIM);
|
||||
}
|
||||
if (speedSqr > WALK_SPEED_THRESHOLD_SQR) {
|
||||
return state.setAndContinue(WALK_ANIM);
|
||||
}
|
||||
|
||||
if (this.quirkCooldown <= 0) {
|
||||
this.quirkCooldown = this.createQuirkCooldown();
|
||||
this.triggerAnim(QUIRK_CONTROLLER, QUIRK_TRIGGER);
|
||||
}
|
||||
|
||||
return state.setAndContinue(IDLE_ANIM);
|
||||
}
|
||||
|
||||
private int createQuirkCooldown() {
|
||||
return MIN_QUIRK_COOLDOWN + this.random.nextInt(MAX_QUIRK_COOLDOWN - MIN_QUIRK_COOLDOWN + 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AnimatableInstanceCache getAnimatableInstanceCache() {
|
||||
return this.geoCache;
|
||||
}
|
||||
|
||||
private int getGlowTicks() {
|
||||
return this.entityData.get(GLOW_TICKS);
|
||||
}
|
||||
|
||||
private void setGlowTicks(int glowTicks) {
|
||||
this.entityData.set(GLOW_TICKS, Mth.clamp(glowTicks, 0, GLOW_TRANSITION_TICKS));
|
||||
}
|
||||
|
||||
private static final class TrustEntry {
|
||||
int feedCount;
|
||||
boolean trusted;
|
||||
int graceCooldown;
|
||||
}
|
||||
|
||||
private static final class GlimmerSpawnData implements SpawnGroupData {
|
||||
private boolean adultSpawned;
|
||||
}
|
||||
|
||||
private final class AvoidUntrustedPlayerGoal extends Goal {
|
||||
private final float maxDistance;
|
||||
private final double speedModifier;
|
||||
private Player avoidTarget;
|
||||
private Path path;
|
||||
|
||||
AvoidUntrustedPlayerGoal(float maxDistance, double speedModifier) {
|
||||
this.maxDistance = maxDistance;
|
||||
this.speedModifier = speedModifier;
|
||||
this.setFlags(EnumSet.of(Flag.MOVE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
if (GlimmerEntity.this.isBaby()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Player nearest = GlimmerEntity.this.level().getNearestPlayer(GlimmerEntity.this, this.maxDistance);
|
||||
if (nearest == null || nearest.isSpectator() || nearest.isCreative()
|
||||
|| GlimmerEntity.this.isTrusted(nearest.getUUID())
|
||||
|| GlimmerEntity.this.distanceToSqr(nearest) > (double) (this.maxDistance * this.maxDistance)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Path escapePath = this.findEscapePath(nearest);
|
||||
if (escapePath == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.avoidTarget = nearest;
|
||||
this.path = escapePath;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
return this.avoidTarget != null
|
||||
&& this.avoidTarget.isAlive()
|
||||
&& !GlimmerEntity.this.isTrusted(this.avoidTarget.getUUID())
|
||||
&& !GlimmerEntity.this.getNavigation().isDone();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
GlimmerEntity.this.getNavigation().moveTo(this.path, this.speedModifier);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
this.avoidTarget = null;
|
||||
this.path = null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Path findEscapePath(Player toAvoid) {
|
||||
Vec3 escapeVec = DefaultRandomPos.getPosAway(GlimmerEntity.this, 16, 7, toAvoid.position());
|
||||
if (escapeVec == null) {
|
||||
return null;
|
||||
}
|
||||
return GlimmerEntity.this.getNavigation().createPath(BlockPos.containing(escapeVec), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,265 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.Difficulty;
|
||||
import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import net.minecraft.world.entity.MobSpawnType;
|
||||
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.Goal;
|
||||
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
|
||||
import net.minecraft.world.entity.ai.goal.MeleeAttackGoal;
|
||||
import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
|
||||
import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
|
||||
import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal;
|
||||
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
|
||||
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.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.Heightmap;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
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;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class SpitBugEntity extends Monster implements GeoEntity {
|
||||
private static final EntityDataAccessor<Integer> SPIT_ANIM_TICKS =
|
||||
SynchedEntityData.defineId(SpitBugEntity.class, EntityDataSerializers.INT);
|
||||
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
|
||||
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
|
||||
private static final RawAnimation SPIT_ANIM = RawAnimation.begin().thenPlay("spit");
|
||||
|
||||
private static final double MAX_HEALTH = 50.0D;
|
||||
private static final double MOVEMENT_SPEED = 0.23D;
|
||||
private static final double ATTACK_DAMAGE = 5.0D;
|
||||
private static final double FOLLOW_RANGE = 24.0D;
|
||||
private static final double SPIT_RANGE_SQR = 14.0D * 14.0D;
|
||||
private static final double MELEE_RANGE_SQR = 3.5D * 3.5D;
|
||||
private static final int SPIT_COOLDOWN_TICKS = 55;
|
||||
private static final int SPIT_ANIMATION_TICKS = 18;
|
||||
private static final int SPIT_RELEASE_TICKS = 8;
|
||||
|
||||
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
|
||||
|
||||
private int spitCooldownTicks;
|
||||
private int spitAnimationTicks;
|
||||
private int spitReleaseTicks;
|
||||
|
||||
public SpitBugEntity(EntityType<? extends SpitBugEntity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
this.xpReward = 10;
|
||||
}
|
||||
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return Mob.createMobAttributes()
|
||||
.add(Attributes.MAX_HEALTH, MAX_HEALTH)
|
||||
.add(Attributes.MOVEMENT_SPEED, MOVEMENT_SPEED)
|
||||
.add(Attributes.ATTACK_DAMAGE, ATTACK_DAMAGE)
|
||||
.add(Attributes.FOLLOW_RANGE, FOLLOW_RANGE)
|
||||
.add(Attributes.ARMOR, 4.0D)
|
||||
.add(Attributes.KNOCKBACK_RESISTANCE, 0.2D);
|
||||
}
|
||||
|
||||
public static boolean canSpawn(EntityType<SpitBugEntity> entityType, ServerLevelAccessor level, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
|
||||
if (spawnReason == MobSpawnType.SPAWN_EGG || spawnReason == MobSpawnType.SPAWNER || spawnReason == MobSpawnType.COMMAND) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return level.getDifficulty() != Difficulty.PEACEFUL
|
||||
&& level.isEmptyBlock(pos)
|
||||
&& level.isEmptyBlock(pos.above())
|
||||
&& Monster.checkMonsterSpawnRules(entityType, level, spawnReason, pos, random);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
builder.define(SPIT_ANIM_TICKS, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
this.goalSelector.addGoal(1, new SpitAttackGoal());
|
||||
this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false));
|
||||
this.goalSelector.addGoal(3, new WaterAvoidingRandomStrollGoal(this, 0.9D));
|
||||
this.goalSelector.addGoal(4, new LookAtPlayerGoal(this, Player.class, 12.0F));
|
||||
this.goalSelector.addGoal(5, new RandomLookAroundGoal(this));
|
||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this));
|
||||
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||
controllers.add(new AnimationController<>(this, "main_controller", 2, this::mainAnimController));
|
||||
}
|
||||
|
||||
@Override
|
||||
public AnimatableInstanceCache getAnimatableInstanceCache() {
|
||||
return this.geoCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
if (this.level().isClientSide) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.spitCooldownTicks > 0) {
|
||||
this.spitCooldownTicks--;
|
||||
}
|
||||
|
||||
if (this.spitAnimationTicks > 0) {
|
||||
this.spitAnimationTicks--;
|
||||
this.entityData.set(SPIT_ANIM_TICKS, this.spitAnimationTicks);
|
||||
if (this.spitReleaseTicks > 0 && --this.spitReleaseTicks == 0) {
|
||||
this.fireSpitProjectile();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doHurtTarget(net.minecraft.world.entity.Entity target) {
|
||||
boolean hurt = super.doHurtTarget(target);
|
||||
if (hurt) {
|
||||
this.playSound(SoundEvents.SPIDER_HURT, 0.7F, 0.8F + this.random.nextFloat() * 0.2F);
|
||||
}
|
||||
return hurt;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getAmbientSound() {
|
||||
return SoundEvents.SPIDER_AMBIENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getHurtSound(DamageSource damageSource) {
|
||||
return SoundEvents.SPIDER_HURT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SoundEvent getDeathSound() {
|
||||
return SoundEvents.SPIDER_DEATH;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void playStepSound(BlockPos pos, BlockState blockState) {
|
||||
this.playSound(SoundEvents.SPIDER_STEP, 0.18F, 0.95F);
|
||||
}
|
||||
|
||||
private PlayState mainAnimController(AnimationState<SpitBugEntity> state) {
|
||||
if (this.entityData.get(SPIT_ANIM_TICKS) > 0) {
|
||||
return state.setAndContinue(SPIT_ANIM);
|
||||
}
|
||||
return state.setAndContinue(state.isMoving() ? WALK_ANIM : IDLE_ANIM);
|
||||
}
|
||||
|
||||
private boolean canSpitAt(LivingEntity target) {
|
||||
return this.spitCooldownTicks <= 0
|
||||
&& this.spitAnimationTicks <= 0
|
||||
&& this.hasLineOfSight(target)
|
||||
&& this.distanceToSqr(target) <= SPIT_RANGE_SQR
|
||||
&& this.distanceToSqr(target) > MELEE_RANGE_SQR;
|
||||
}
|
||||
|
||||
private void startSpitAttack() {
|
||||
this.spitCooldownTicks = SPIT_COOLDOWN_TICKS;
|
||||
this.spitAnimationTicks = SPIT_ANIMATION_TICKS;
|
||||
this.spitReleaseTicks = SPIT_RELEASE_TICKS;
|
||||
this.entityData.set(SPIT_ANIM_TICKS, this.spitAnimationTicks);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void fireSpitProjectile() {
|
||||
if (!(this.level() instanceof ServerLevel serverLevel)) {
|
||||
return;
|
||||
}
|
||||
|
||||
LivingEntity target = this.getTarget();
|
||||
if (target == null || !target.isAlive()) {
|
||||
return;
|
||||
}
|
||||
|
||||
EntityType<SpitBugProjectileEntity> projectileType = (EntityType<SpitBugProjectileEntity>) BuiltInRegistries.ENTITY_TYPE.getOptional(
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "spit_bug_projectile")
|
||||
).orElse(null);
|
||||
if (projectileType == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
SpitBugProjectileEntity projectile = new SpitBugProjectileEntity(projectileType, this, serverLevel);
|
||||
Vec3 origin = this.position()
|
||||
.add(0.0D, this.getBbHeight() * 0.55D, 0.0D)
|
||||
.add(this.getViewVector(0.0F).scale(1.35D));
|
||||
Vec3 aimPoint = target.getEyePosition().add(target.getDeltaMovement().scale(0.45D));
|
||||
Vec3 direction = aimPoint.subtract(origin).normalize();
|
||||
|
||||
projectile.setPos(origin.x, origin.y, origin.z);
|
||||
projectile.shoot(direction.x, direction.y, direction.z, 1.05F, 0.0F);
|
||||
serverLevel.addFreshEntity(projectile);
|
||||
this.playSound(SoundEvents.SLIME_ATTACK, 1.0F, 0.85F + this.random.nextFloat() * 0.15F);
|
||||
}
|
||||
|
||||
private final class SpitAttackGoal extends Goal {
|
||||
SpitAttackGoal() {
|
||||
this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
LivingEntity target = SpitBugEntity.this.getTarget();
|
||||
return target != null && target.isAlive();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
return this.canUse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
LivingEntity target = SpitBugEntity.this.getTarget();
|
||||
if (target == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
SpitBugEntity.this.getLookControl().setLookAt(target, 30.0F, 30.0F);
|
||||
|
||||
if (SpitBugEntity.this.canSpitAt(target)) {
|
||||
SpitBugEntity.this.getNavigation().stop();
|
||||
SpitBugEntity.this.startSpitAttack();
|
||||
return;
|
||||
}
|
||||
|
||||
if (SpitBugEntity.this.distanceToSqr(target) > 36.0D || !SpitBugEntity.this.hasLineOfSight(target)) {
|
||||
SpitBugEntity.this.getNavigation().moveTo(target, 1.0D);
|
||||
} else {
|
||||
SpitBugEntity.this.getNavigation().stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-172
@@ -1,172 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
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.world.effect.MobEffectInstance;
|
||||
import net.minecraft.world.effect.MobEffects;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.projectile.ThrowableItemProjectile;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.EntityHitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
||||
public class SpitBugProjectileEntity extends ThrowableItemProjectile {
|
||||
private static final EntityDataAccessor<Boolean> LINGERING =
|
||||
SynchedEntityData.defineId(SpitBugProjectileEntity.class, EntityDataSerializers.BOOLEAN);
|
||||
private static final int MAX_FLIGHT_TICKS = 100;
|
||||
private static final int LINGER_DURATION_TICKS = 300;
|
||||
private static final int DIRECT_HIT_DAMAGE = 8;
|
||||
private static final float LINGER_RADIUS = 1.65F;
|
||||
|
||||
private boolean lingering;
|
||||
private int lingeringTicks;
|
||||
|
||||
public SpitBugProjectileEntity(EntityType<? extends SpitBugProjectileEntity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
}
|
||||
|
||||
public SpitBugProjectileEntity(EntityType<? extends SpitBugProjectileEntity> entityType, LivingEntity owner, Level level) {
|
||||
super(entityType, owner, level);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
builder.define(LINGERING, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Item getDefaultItem() {
|
||||
return Items.SLIME_BALL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected double getDefaultGravity() {
|
||||
return 0.03D;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeCollidedWith() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAttackable() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isLingering() {
|
||||
return this.entityData.get(LINGERING);
|
||||
}
|
||||
|
||||
public float getRenderScale(float partialTick) {
|
||||
if (!this.isLingering()) {
|
||||
return 0.65F;
|
||||
}
|
||||
float progress = Math.min(1.0F, (this.lingeringTicks + partialTick) / 8.0F);
|
||||
return 0.6F + progress * 0.5F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (this.isLingering()) {
|
||||
this.tickLingering();
|
||||
return;
|
||||
}
|
||||
|
||||
super.tick();
|
||||
if (this.tickCount > MAX_FLIGHT_TICKS) {
|
||||
this.discard();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.level().isClientSide) {
|
||||
this.level().addParticle(ParticleTypes.ITEM_SLIME, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D);
|
||||
}
|
||||
}
|
||||
|
||||
private void tickLingering() {
|
||||
this.lingeringTicks++;
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
|
||||
if (this.level().isClientSide) {
|
||||
double radius = 0.4D + this.random.nextDouble() * 0.45D;
|
||||
this.level().addParticle(
|
||||
ParticleTypes.ITEM_SLIME,
|
||||
this.getX() + (this.random.nextDouble() - 0.5D) * radius,
|
||||
this.getY() + 0.04D,
|
||||
this.getZ() + (this.random.nextDouble() - 0.5D) * radius,
|
||||
0.0D,
|
||||
0.0D,
|
||||
0.0D
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.lingeringTicks % 4 == 0) {
|
||||
this.applyLingeringSpit();
|
||||
}
|
||||
|
||||
if (this.lingeringTicks >= LINGER_DURATION_TICKS) {
|
||||
this.discard();
|
||||
}
|
||||
}
|
||||
|
||||
private void applyLingeringSpit() {
|
||||
for (LivingEntity target : this.level().getEntitiesOfClass(
|
||||
LivingEntity.class,
|
||||
this.getBoundingBox().inflate(LINGER_RADIUS, 0.6D, LINGER_RADIUS),
|
||||
entity -> entity.isAlive() && entity != this.getOwner()
|
||||
)) {
|
||||
target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 30, 3, false, true, true));
|
||||
target.makeStuckInBlock(Blocks.HONEY_BLOCK.defaultBlockState(), new Vec3(0.2D, 0.0D, 0.2D));
|
||||
}
|
||||
|
||||
if (this.level() instanceof ServerLevel serverLevel) {
|
||||
serverLevel.sendParticles(ParticleTypes.ITEM_SLIME, this.getX(), this.getY() + 0.05D, this.getZ(), 3, 0.45D, 0.02D, 0.45D, 0.0D);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHitEntity(EntityHitResult result) {
|
||||
if (!this.level().isClientSide && result.getEntity() instanceof LivingEntity livingTarget) {
|
||||
Entity owner = this.getOwner();
|
||||
if (owner instanceof LivingEntity livingOwner) {
|
||||
livingTarget.hurt(this.damageSources().mobProjectile(this, livingOwner), DIRECT_HIT_DAMAGE);
|
||||
} else {
|
||||
livingTarget.hurt(this.damageSources().magic(), DIRECT_HIT_DAMAGE);
|
||||
}
|
||||
livingTarget.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 80, 3, false, true, true));
|
||||
livingTarget.makeStuckInBlock(Blocks.HONEY_BLOCK.defaultBlockState(), new Vec3(0.25D, 0.0D, 0.25D));
|
||||
}
|
||||
|
||||
this.beginLingering(result.getLocation());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHitBlock(BlockHitResult result) {
|
||||
this.beginLingering(result.getLocation());
|
||||
}
|
||||
|
||||
private void beginLingering(Vec3 location) {
|
||||
if (this.isLingering()) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.lingering = true;
|
||||
this.entityData.set(LINGERING, true);
|
||||
this.lingeringTicks = 0;
|
||||
this.noPhysics = true;
|
||||
this.setPos(location.x, location.y + 0.05D, location.z);
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
}
|
||||
}
|
||||
+31
-6
@@ -76,8 +76,6 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO
|
||||
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_SWING_LEFT = 2;
|
||||
@@ -263,8 +261,19 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO
|
||||
|
||||
LivingEntity target = this.getTarget();
|
||||
if ((target == null || !target.isAlive()) && this.tickCount % 10 == 0) {
|
||||
Player nearbyPlayer = this.level().getNearestPlayer(this, BOSS_BAR_RANGE);
|
||||
if (nearbyPlayer != null && this.canAttack(nearbyPlayer)) {
|
||||
Player nearbyPlayer = null;
|
||||
double nearestHorizontalDistanceSqr = Double.MAX_VALUE;
|
||||
for (Player player : this.level().getEntitiesOfClass(Player.class, this.getBoundingBox().inflate(this.getBossBarRange(), 192.0D, this.getBossBarRange()))) {
|
||||
if (!player.isAlive() || !this.canAttack(player) || !this.isWithinBossBarRange(player)) {
|
||||
continue;
|
||||
}
|
||||
double horizontalDistanceSqr = this.horizontalDistanceToSqr(player);
|
||||
if (horizontalDistanceSqr < nearestHorizontalDistanceSqr) {
|
||||
nearestHorizontalDistanceSqr = horizontalDistanceSqr;
|
||||
nearbyPlayer = player;
|
||||
}
|
||||
}
|
||||
if (nearbyPlayer != null) {
|
||||
this.setTarget(nearbyPlayer);
|
||||
target = nearbyPlayer;
|
||||
}
|
||||
@@ -943,11 +952,12 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO
|
||||
return;
|
||||
}
|
||||
|
||||
AABB bossBarArea = this.getBoundingBox().inflate(BOSS_BAR_RANGE, 16.0D, BOSS_BAR_RANGE);
|
||||
double bossBarRange = this.getBossBarRange();
|
||||
AABB bossBarArea = this.getBoundingBox().inflate(bossBarRange, 192.0D, bossBarRange);
|
||||
List<ServerPlayer> nearbyPlayers = serverLevel.getEntitiesOfClass(
|
||||
ServerPlayer.class,
|
||||
bossBarArea,
|
||||
player -> player.isAlive() && this.distanceToSqr(player) <= BOSS_BAR_RANGE * BOSS_BAR_RANGE
|
||||
player -> player.isAlive() && this.isWithinBossBarRange(player)
|
||||
);
|
||||
|
||||
for (ServerPlayer player : List.copyOf(this.bossEvent.getPlayers())) {
|
||||
@@ -965,6 +975,21 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO
|
||||
this.setKrakenStormActive(!nearbyPlayers.isEmpty());
|
||||
}
|
||||
|
||||
private double getBossBarRange() {
|
||||
return Math.max(40.0D, com.craisinlord.antarchy.config.AntarchySettings.krakenBossBarRange());
|
||||
}
|
||||
|
||||
private boolean isWithinBossBarRange(Entity entity) {
|
||||
double bossBarRange = this.getBossBarRange();
|
||||
return this.horizontalDistanceToSqr(entity) <= bossBarRange * bossBarRange;
|
||||
}
|
||||
|
||||
private double horizontalDistanceToSqr(Entity entity) {
|
||||
double dx = this.getX() - entity.getX();
|
||||
double dz = this.getZ() - entity.getZ();
|
||||
return dx * dx + dz * dz;
|
||||
}
|
||||
|
||||
private void applyPhaseTwoBuffs() {
|
||||
AttributeInstance movementSpeed = this.getAttribute(Attributes.MOVEMENT_SPEED);
|
||||
if (movementSpeed != null && !movementSpeed.hasModifier(PHASE_TWO_SPEED_ID)) {
|
||||
|
||||
-1
@@ -33,7 +33,6 @@ public final class MultipartFramework {
|
||||
@Nullable
|
||||
private static PartFactory partFactory;
|
||||
private static NetworkBridge networkBridge = NOOP_BRIDGE;
|
||||
|
||||
private MultipartFramework() {
|
||||
}
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.item;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.world.item.BlockItem;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.TooltipFlag;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
|
||||
public class BigBushBlockItem extends BlockItem {
|
||||
public BigBushBlockItem(Block block, Properties properties) {
|
||||
super(block, properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appendHoverText(ItemStack stack, Item.TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
|
||||
tooltipComponents.add(Component.translatable("item.antarchy.big_bush.tooltip").withStyle(ChatFormatting.GRAY));
|
||||
super.appendHoverText(stack, context, tooltipComponents, tooltipFlag);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -19,7 +19,7 @@ public final class PermanentPortalShape {
|
||||
public static final int MIN_WIDTH = 2;
|
||||
public static final int MIN_HEIGHT = 3;
|
||||
public static final int MAX_SIZE = 21;
|
||||
public static final int ACTIVE_SEARCH_RADIUS = 8;
|
||||
public static final int ACTIVE_SEARCH_RADIUS = 24;
|
||||
|
||||
private final PermanentPortalType type;
|
||||
private final Direction.Axis axis;
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ import net.minecraft.world.phys.Vec3;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public final class PermanentPortalTeleporter {
|
||||
private static final int SEARCH_RADIUS = 8;
|
||||
private static final int SEARCH_RADIUS = 24;
|
||||
private static final int VERTICAL_SEARCH = 24;
|
||||
|
||||
private PermanentPortalTeleporter() {
|
||||
|
||||
-73
@@ -1,73 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.worldgen;
|
||||
|
||||
import com.craisinlord.antarchy.content.block.BigBushBlock;
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/** Places a {@link BigBushBlock} at a fixed growth stage (age), used for sparse overworld generation. */
|
||||
public class BigBushWorldgenFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private final int age;
|
||||
|
||||
public BigBushWorldgenFeature(Codec<NoneFeatureConfiguration> codec, int age) {
|
||||
super(codec);
|
||||
this.age = age;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
WorldGenLevel level = context.level();
|
||||
BlockPos origin = context.origin();
|
||||
RandomSource random = context.random();
|
||||
|
||||
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath("antarchy", "big_bush"));
|
||||
if (!(block instanceof BigBushBlock)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Direction> facings = new ArrayList<>(Direction.Plane.HORIZONTAL.stream().toList());
|
||||
for (int i = facings.size() - 1; i > 0; i--) {
|
||||
Direction swap = facings.set(random.nextInt(i + 1), facings.get(i));
|
||||
facings.set(i, swap);
|
||||
}
|
||||
|
||||
for (Direction facing : facings) {
|
||||
BlockState grown = block.defaultBlockState().setValue(BigBushBlock.AGE, age).setValue(BigBushBlock.FACING, facing);
|
||||
if (canPlace(level, origin, grown)) {
|
||||
BigBushBlock.placeBushBlocks(level, origin, grown, Block.UPDATE_ALL);
|
||||
return true;
|
||||
}
|
||||
if (age == 0) {
|
||||
// Facing is irrelevant at age 0 (single block); no need to try every rotation.
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean canPlace(WorldGenLevel level, BlockPos origin, BlockState grown) {
|
||||
if (!BigBushBlock.hasFullSupport(grown, level, origin)) {
|
||||
return false;
|
||||
}
|
||||
List<BlockPos> positions = new ArrayList<>(BigBushBlock.partPositions(grown, origin));
|
||||
positions.add(origin);
|
||||
for (BlockPos pos : positions) {
|
||||
if (!level.getBlockState(pos).canBeReplaced()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
-35
@@ -1,35 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.worldgen;
|
||||
|
||||
import com.craisinlord.antarchy.content.block.VeryTallGrassBlock;
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
/** Places a single 3-tall {@link VeryTallGrassBlock} column, used for sparse overworld generation. */
|
||||
public class VeryTallGrassWorldgenFeature extends Feature<NoneFeatureConfiguration> {
|
||||
public VeryTallGrassWorldgenFeature(Codec<NoneFeatureConfiguration> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
|
||||
WorldGenLevel level = context.level();
|
||||
BlockPos pos = context.origin();
|
||||
if (!level.getBlockState(pos).isAir()
|
||||
|| !level.getBlockState(pos.above()).isAir()
|
||||
|| !level.getBlockState(pos.above(2)).isAir()) {
|
||||
return false;
|
||||
}
|
||||
BlockPos below = pos.below();
|
||||
if (!level.getBlockState(below).isFaceSturdy(level, below, Direction.UP)) {
|
||||
return false;
|
||||
}
|
||||
VeryTallGrassBlock.placeAt(level, pos, Block.UPDATE_ALL);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+13
-7
@@ -1,9 +1,8 @@
|
||||
package com.craisinlord.antarchy.content.worldgen.elythia;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.AntarchyObjects;
|
||||
import com.craisinlord.antarchy.content.block.BigBushBlock;
|
||||
import com.craisinlord.antarchy.content.block.VeryTallGrassBlock;
|
||||
import com.craisinlord.sizeablefoliage.content.block.BigBushBlock;
|
||||
import com.craisinlord.sizeablefoliage.content.block.VeryTallGrassBlock;
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
@@ -23,6 +22,8 @@ import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||
|
||||
public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
|
||||
private static final String SIZEABLE_FOLIAGE_MODID = "sizeable_foliage";
|
||||
|
||||
private final Variant variant;
|
||||
|
||||
public ElythiaFloraFeature(Codec<NoneFeatureConfiguration> codec, Variant variant) {
|
||||
@@ -127,7 +128,7 @@ public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
|
||||
if (this.variant == Variant.TORCHFLOWER_FIELDS) {
|
||||
float roll = random.nextFloat();
|
||||
if (roll < 0.14F) {
|
||||
return placeDouble(level, plantPos, AntarchyObjects.TORCHFLOWER_BUSH.get().defaultBlockState());
|
||||
return placeDouble(level, plantPos, torchflowerBush().defaultBlockState());
|
||||
}
|
||||
if (roll < 0.58F) {
|
||||
return placeSingle(level, plantPos, Blocks.TORCHFLOWER);
|
||||
@@ -201,17 +202,22 @@ public class ElythiaFloraFeature extends Feature<NoneFeatureConfiguration> {
|
||||
}
|
||||
|
||||
private static Block veryShortGrass() {
|
||||
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "very_short_grass"));
|
||||
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(SIZEABLE_FOLIAGE_MODID, "very_short_grass"));
|
||||
return block == Blocks.AIR ? Blocks.SHORT_GRASS : block;
|
||||
}
|
||||
|
||||
private static Block veryTallGrass() {
|
||||
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "very_tall_grass"));
|
||||
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(SIZEABLE_FOLIAGE_MODID, "very_tall_grass"));
|
||||
return block == Blocks.AIR ? Blocks.TALL_GRASS : block;
|
||||
}
|
||||
|
||||
private static Block torchflowerBush() {
|
||||
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(SIZEABLE_FOLIAGE_MODID, "torchflower_bush"));
|
||||
return block == Blocks.AIR ? Blocks.TORCHFLOWER : block;
|
||||
}
|
||||
|
||||
private boolean placeBigBushes(WorldGenLevel level, BlockPos origin, RandomSource random, int radius) {
|
||||
Block bushBlock = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "big_bush"));
|
||||
Block bushBlock = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(SIZEABLE_FOLIAGE_MODID, "big_bush"));
|
||||
if (!(bushBlock instanceof BigBushBlock)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
-53
@@ -1,53 +0,0 @@
|
||||
package com.craisinlord.antarchy.mixins;
|
||||
|
||||
import com.craisinlord.antarchy.content.block.TorchflowerBushBlock;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.item.BoneMealItem;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.DoublePlantBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(BoneMealItem.class)
|
||||
public abstract class BoneMealItemTorchflowerBushMixin {
|
||||
@Inject(method = "useOn", at = @At("HEAD"), cancellable = true)
|
||||
private void antarchy$growTorchflowerBush(UseOnContext context, CallbackInfoReturnable<InteractionResult> cir) {
|
||||
Level level = context.getLevel();
|
||||
BlockPos pos = context.getClickedPos();
|
||||
BlockState clickedState = level.getBlockState(pos);
|
||||
if (!clickedState.is(Blocks.TORCHFLOWER)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath("antarchy", "torchflower_bush"));
|
||||
if (!(block instanceof TorchflowerBushBlock)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockState lowerState = block.defaultBlockState();
|
||||
if (!level.getBlockState(pos.above()).canBeReplaced() || !lowerState.canSurvive(level, pos)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!level.isClientSide) {
|
||||
DoublePlantBlock.placeAt(level, lowerState, pos, Block.UPDATE_ALL);
|
||||
if (context.getPlayer() == null || !context.getPlayer().getAbilities().instabuild) {
|
||||
ItemStack stack = context.getItemInHand();
|
||||
stack.shrink(1);
|
||||
}
|
||||
level.levelEvent(1505, pos, 15);
|
||||
}
|
||||
|
||||
cir.setReturnValue(InteractionResult.sidedSuccess(level.isClientSide));
|
||||
}
|
||||
}
|
||||
-65
@@ -1,65 +0,0 @@
|
||||
package com.craisinlord.antarchy.mixins;
|
||||
|
||||
import com.craisinlord.antarchy.content.block.VeryTallGrassBlock;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.item.BoneMealItem;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.DoublePlantBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
|
||||
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(BoneMealItem.class)
|
||||
public abstract class BoneMealItemVeryTallGrassMixin {
|
||||
@Inject(method = "useOn", at = @At("HEAD"), cancellable = true)
|
||||
private void antarchy$growVeryTallGrass(UseOnContext context, CallbackInfoReturnable<InteractionResult> cir) {
|
||||
Level level = context.getLevel();
|
||||
BlockPos pos = context.getClickedPos();
|
||||
BlockState clickedState = level.getBlockState(pos);
|
||||
if (!clickedState.is(Blocks.TALL_GRASS)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockPos basePos = clickedState.getValue(DoublePlantBlock.HALF) == DoubleBlockHalf.LOWER ? pos : pos.below();
|
||||
BlockState baseState = level.getBlockState(basePos);
|
||||
BlockState middleState = level.getBlockState(basePos.above());
|
||||
if (!baseState.is(Blocks.TALL_GRASS)
|
||||
|| baseState.getValue(DoublePlantBlock.HALF) != DoubleBlockHalf.LOWER
|
||||
|| !middleState.is(Blocks.TALL_GRASS)
|
||||
|| middleState.getValue(DoublePlantBlock.HALF) != DoubleBlockHalf.UPPER) {
|
||||
return;
|
||||
}
|
||||
|
||||
Block block = BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath("antarchy", "very_tall_grass"));
|
||||
if (!(block instanceof VeryTallGrassBlock)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockState veryTallState = block.defaultBlockState();
|
||||
if (!level.getBlockState(basePos.above(2)).canBeReplaced()
|
||||
|| !veryTallState.canSurvive(level, basePos)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!level.isClientSide) {
|
||||
VeryTallGrassBlock.placeAt(level, basePos, Block.UPDATE_ALL);
|
||||
if (context.getPlayer() == null || !context.getPlayer().getAbilities().instabuild) {
|
||||
ItemStack stack = context.getItemInHand();
|
||||
stack.shrink(1);
|
||||
}
|
||||
level.levelEvent(1505, basePos, 15);
|
||||
}
|
||||
|
||||
cir.setReturnValue(InteractionResult.sidedSuccess(level.isClientSide));
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package com.craisinlord.antarchy.mixins;
|
||||
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
@Mixin(BlockBehaviour.BlockStateBase.class)
|
||||
/*
|
||||
* Makes torchflowers glow when the config is on.
|
||||
*/
|
||||
public abstract class TorchflowerBlockStateMixin {
|
||||
@Inject(method = "getLightEmission", at = @At("HEAD"), cancellable = true)
|
||||
private void antarchy$makeTorchflowerGlow(CallbackInfoReturnable<Integer> cir) {
|
||||
BlockState state = (BlockState) (Object) this;
|
||||
if (AntarchySettings.glowingTorchflowers() && state.is(Blocks.TORCHFLOWER)) {
|
||||
cir.setReturnValue(10);
|
||||
}
|
||||
}
|
||||
}
|
||||
-25
@@ -1,25 +0,0 @@
|
||||
package com.craisinlord.antarchy.mixins.client;
|
||||
|
||||
import com.craisinlord.antarchy.content.block.BigBushBlock;
|
||||
import com.craisinlord.antarchy.content.block.BigBushPartBlock;
|
||||
import com.craisinlord.antarchy.content.client.AlphaVertexConsumerProxy;
|
||||
import com.craisinlord.antarchy.content.client.BigBushCameraHider;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||
|
||||
@Mixin(BlockRenderDispatcher.class)
|
||||
public abstract class BlockRenderDispatcherBigBushMixin {
|
||||
@ModifyVariable(method = "renderBatched", at = @At("HEAD"), argsOnly = true)
|
||||
private VertexConsumer antarchy$fadeBigBushAroundCamera(VertexConsumer consumer, BlockState state, BlockPos pos) {
|
||||
if ((state.getBlock() instanceof BigBushBlock || state.getBlock() instanceof BigBushPartBlock)
|
||||
&& BigBushCameraHider.shouldFade(pos)) {
|
||||
return AlphaVertexConsumerProxy.wrap(consumer, 0.35F);
|
||||
}
|
||||
return consumer;
|
||||
}
|
||||
}
|
||||
-54
@@ -1,54 +0,0 @@
|
||||
package com.craisinlord.antarchy.mixins.client;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.BigBushRenderHelper;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderer;
|
||||
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||||
import net.minecraft.world.entity.LivingEntity;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(LivingEntityRenderer.class)
|
||||
public abstract class LivingEntityRendererBigBushMixin {
|
||||
@Unique
|
||||
private boolean antarchy$inBigBush;
|
||||
|
||||
@Inject(
|
||||
method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V",
|
||||
at = @At("HEAD")
|
||||
)
|
||||
private void antarchy$checkBigBush(LivingEntity entity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource buffer, int packedLight, CallbackInfo ci) {
|
||||
this.antarchy$inBigBush = BigBushRenderHelper.isInsideBigBush(entity);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@Inject(method = "getRenderType", at = @At("HEAD"), cancellable = true)
|
||||
private void antarchy$bigBushRenderType(LivingEntity entity, boolean bodyVisible, boolean translucent, boolean glowing, CallbackInfoReturnable<RenderType> cir) {
|
||||
if (bodyVisible && !translucent && !glowing && BigBushRenderHelper.isInsideBigBush(entity)) {
|
||||
cir.setReturnValue(RenderType.itemEntityTranslucentCull(((EntityRenderer) (Object) this).getTextureLocation(entity)));
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "shouldShowName(Lnet/minecraft/world/entity/LivingEntity;)Z", at = @At("HEAD"), cancellable = true)
|
||||
private void antarchy$hideBigBushNameTag(LivingEntity entity, CallbackInfoReturnable<Boolean> cir) {
|
||||
if (BigBushRenderHelper.isInsideBigBush(entity)) {
|
||||
cir.setReturnValue(false);
|
||||
}
|
||||
}
|
||||
|
||||
@ModifyArg(
|
||||
method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V",
|
||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/EntityModel;renderToBuffer(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V"),
|
||||
index = 4
|
||||
)
|
||||
private int antarchy$bigBushAlpha(int color) {
|
||||
return this.antarchy$inBigBush && color == -1 ? 0x99FFFFFF : color;
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -41,8 +41,8 @@ public abstract class MountedVehicleCameraMixin {
|
||||
}
|
||||
|
||||
if (vehicle instanceof DorrieEntity) {
|
||||
args.set(0, (Float) args.get(0) * 1.6F);
|
||||
args.set(1, (Float) args.get(1) + 0.15F);
|
||||
args.set(0, (Float) args.get(0) * 0.25F);
|
||||
args.set(1, (Float) args.get(1) + 0.1F);
|
||||
args.set(2, (Float) args.get(2) + 0.55F);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"mixins": [
|
||||
"AccessorRangedAttribute",
|
||||
"BoneMealItemVeryTallGrassMixin",
|
||||
"BoneMealItemTorchflowerBushMixin",
|
||||
"BlockEntityTypeSignMixin",
|
||||
"BloodglassMixin",
|
||||
"DreamFireBlockMixin",
|
||||
@@ -19,7 +17,6 @@
|
||||
"ServerPlayerGameModeMixin",
|
||||
"SquidzookaEnchantMixin",
|
||||
"SquidzookaMultishotMixin",
|
||||
"TorchflowerBlockStateMixin",
|
||||
"gravity.AbstractArrowGravityMixin",
|
||||
"gravity.BucketItemGravityMixin",
|
||||
"gravity.ChunkMapAccessor",
|
||||
@@ -51,13 +48,10 @@
|
||||
"multipart.EntityMultipartLifecycleMixin"
|
||||
],
|
||||
"client": [
|
||||
"client.BlockRenderDispatcherBigBushMixin",
|
||||
"client.CavarynSkyMixin",
|
||||
"client.ElythiaSkyMixin",
|
||||
"client.ElytraModelAccessor",
|
||||
"client.GameRendererSwingThroughGrassMixin",
|
||||
"client.LightningBoltRendererMixin",
|
||||
"client.LivingEntityRendererBigBushMixin",
|
||||
"client.MountedVehicleCameraMixin",
|
||||
"client.ParalyzedMouseTurnMixin",
|
||||
"client.ScreenEffectRendererFireVisualMixin",
|
||||
|
||||
+1584
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
File diff suppressed because it is too large.
Load diff
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 79 KiB |
@@ -1,150 +0,0 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen"
|
||||
},
|
||||
"when": {
|
||||
"north": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen"
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"up": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"x": 90
|
||||
},
|
||||
"when": {
|
||||
"down": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_lichen",
|
||||
"uvlock": true,
|
||||
"x": 90
|
||||
},
|
||||
"when": {
|
||||
"down": "false",
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/amber_moss_block"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,154 +0,0 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet"
|
||||
},
|
||||
"when": {
|
||||
"bottom": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet"
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall"
|
||||
},
|
||||
"when": {
|
||||
"north": "tall"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_small"
|
||||
},
|
||||
"when": {
|
||||
"north": "low"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall"
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "tall"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_small",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "low"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "tall"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_small",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "low"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "tall"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_small",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "low"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/amber_moss_carpet_side_tall",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"bottom": "false",
|
||||
"east": "none",
|
||||
"north": "none",
|
||||
"south": "none",
|
||||
"west": "none"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/bile_vein"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/broodstone"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": { "model": "antarchy:block/cavaryn_portal_x" },
|
||||
"axis=z": { "model": "antarchy:block/cavaryn_portal_z" }
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"axis=x": {
|
||||
"model": "antarchy:block/chiten_block",
|
||||
"x": 90,
|
||||
"y": 90
|
||||
},
|
||||
"axis=y": {
|
||||
"model": "antarchy:block/chiten_block"
|
||||
},
|
||||
"axis=z": {
|
||||
"model": "antarchy:block/chiten_block",
|
||||
"x": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"thickness=base,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_base" },
|
||||
"thickness=base,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_base" },
|
||||
"thickness=frustum,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_frustum" },
|
||||
"thickness=frustum,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_frustum" },
|
||||
"thickness=middle,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_middle" },
|
||||
"thickness=middle,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_middle" },
|
||||
"thickness=tip,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_tip" },
|
||||
"thickness=tip,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_tip" },
|
||||
"thickness=tip_merge,vertical_direction=down": { "model": "antarchy:block/chiten_spike_down_tip_merge" },
|
||||
"thickness=tip_merge,vertical_direction=up": { "model": "antarchy:block/chiten_spike_up_tip_merge" }
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"eggs=1,hatch=0": [
|
||||
{ "model": "antarchy:block/creeping_horror_egg_1" },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=1,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_1" },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=1,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_1" },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=0": [
|
||||
{ "model": "antarchy:block/creeping_horror_egg_2" },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_2" },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_2" },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=0": [
|
||||
{ "model": "antarchy:block/creeping_horror_egg_3" },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_3" },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_3" },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=0": [
|
||||
{ "model": "antarchy:block/creeping_horror_egg_4" },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/creeping_horror_egg_4", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_4" },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_creeping_horror_egg_4", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_4" },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_creeping_horror_egg_4", "y": 270 }
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,120 +0,0 @@
|
||||
{
|
||||
"multipart": [
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine"
|
||||
},
|
||||
"when": {
|
||||
"north": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine"
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"south": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"west": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"up": "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
"apply": {
|
||||
"model": "antarchy:block/creepvine",
|
||||
"uvlock": true,
|
||||
"x": 270
|
||||
},
|
||||
"when": {
|
||||
"east": "false",
|
||||
"north": "false",
|
||||
"south": "false",
|
||||
"up": "false",
|
||||
"west": "false"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"eggs=1,hatch=0": [
|
||||
{ "model": "antarchy:block/lurking_terror_egg_1" },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=1,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_1" },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=1,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_1" },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_1", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_1", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_1", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=0": [
|
||||
{ "model": "antarchy:block/lurking_terror_egg_2" },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_2" },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=2,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_2" },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_2", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_2", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_2", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=0": [
|
||||
{ "model": "antarchy:block/lurking_terror_egg_3" },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_3" },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=3,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_3" },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_3", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_3", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_3", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=0": [
|
||||
{ "model": "antarchy:block/lurking_terror_egg_4" },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/lurking_terror_egg_4", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=1": [
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_4" },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/slightly_cracked_lurking_terror_egg_4", "y": 270 }
|
||||
],
|
||||
"eggs=4,hatch=2": [
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_4" },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_4", "y": 90 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_4", "y": 180 },
|
||||
{ "model": "antarchy:block/very_cracked_lurking_terror_egg_4", "y": 270 }
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "antarchy:block/myrmite"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=north": {"model": "antarchy:block/termite_nest"},
|
||||
"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}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"format_version": "1.12.0",
|
||||
"minecraft:geometry": [
|
||||
{
|
||||
"description": {
|
||||
"identifier": "geometry.unknown",
|
||||
"texture_width": 128,
|
||||
"texture_height": 128,
|
||||
"visible_bounds_width": 4,
|
||||
"visible_bounds_height": 4.5,
|
||||
"visible_bounds_offset": [0, 1.75, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
"name": "Glimmer",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "Glimmer",
|
||||
"pivot": [0, 22.2, 0]
|
||||
},
|
||||
{
|
||||
"name": "right_leg",
|
||||
"parent": "body",
|
||||
"pivot": [-5, 18.5, -8],
|
||||
"cubes": [
|
||||
{"origin": [-7.5, 0, -11.5], "size": [5, 19, 7], "uv": [36, 66]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "left_leg",
|
||||
"parent": "body",
|
||||
"pivot": [5, 18.5, -8],
|
||||
"cubes": [
|
||||
{"origin": [2.5, 0, -11.5], "size": [5, 19, 7], "uv": [36, 66], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "back_right_leg",
|
||||
"parent": "body",
|
||||
"pivot": [-5, 18.5, 8],
|
||||
"cubes": [
|
||||
{"origin": [-7.5, 0, 4.5], "size": [5, 19, 7], "uv": [36, 66]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "back_left_leg",
|
||||
"parent": "body",
|
||||
"pivot": [5, 18.5, 8],
|
||||
"cubes": [
|
||||
{"origin": [2.5, 0, 4.5], "size": [5, 19, 7], "uv": [36, 66], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "torso",
|
||||
"parent": "body",
|
||||
"pivot": [0, 19, 0],
|
||||
"cubes": [
|
||||
{"origin": [-6.5, 12, -12], "size": [13, 14, 24], "uv": [0, 0]},
|
||||
{"origin": [-5.5, 15, 12], "size": [11, 16, 7], "pivot": [0, 23, 14.5], "rotation": [7.5, 0, 0], "uv": [0, 80]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 20.5, -11.5],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, 14, -16], "size": [9, 19, 7], "uv": [0, 38]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head",
|
||||
"parent": "neck",
|
||||
"pivot": [0, 33, -12.5],
|
||||
"cubes": [
|
||||
{"origin": [-4.5, 33, -17], "size": [9, 9, 9], "inflate": 0.1, "uv": [32, 38]},
|
||||
{"origin": [-18.5, 41, -12], "size": [18, 14, 0], "uv": [0, 66]},
|
||||
{"origin": [0.5, 41, -12], "size": [18, 14, 0], "uv": [0, 66], "mirror": true},
|
||||
{"origin": [-3.5, 33, -22], "size": [7, 5, 5], "uv": [32, 56]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "right_ear",
|
||||
"parent": "head",
|
||||
"pivot": [-4.5, 41.25, -13],
|
||||
"cubes": [
|
||||
{"origin": [-9.5, 40, -13], "size": [5, 4, 0], "uv": [25, 38]},
|
||||
{"origin": [-9.5, 40, -12.975], "size": [5, 4, 0], "uv": [0, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "left_ear",
|
||||
"parent": "head",
|
||||
"pivot": [4.5, 41.25, -13],
|
||||
"cubes": [
|
||||
{"origin": [4.5, 40, -12.975], "size": [5, 4, 0], "uv": [0, 20], "mirror": true},
|
||||
{"origin": [4.5, 40, -13], "size": [5, 4, 0], "uv": [25, 38], "mirror": true}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
{
|
||||
"format_version": "1.12.0",
|
||||
"minecraft:geometry": [
|
||||
{
|
||||
"description": {
|
||||
"identifier": "geometry.unknown",
|
||||
"texture_width": 128,
|
||||
"texture_height": 128,
|
||||
"visible_bounds_width": 4,
|
||||
"visible_bounds_height": 3.5,
|
||||
"visible_bounds_offset": [0, 1.25, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
"name": "Glimmer",
|
||||
"pivot": [0, 16.2, 3]
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "Glimmer",
|
||||
"pivot": [0, 16.2, 3]
|
||||
},
|
||||
{
|
||||
"name": "right_leg",
|
||||
"parent": "body",
|
||||
"pivot": [-4, 12.5, -5],
|
||||
"cubes": [
|
||||
{"origin": [-5.5, 0, -8.5], "size": [4, 13, 5], "uv": [0, 25]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "left_leg",
|
||||
"parent": "body",
|
||||
"pivot": [4, 12.5, -5],
|
||||
"cubes": [
|
||||
{"origin": [1.5, 0, -8.5], "size": [4, 13, 5], "uv": [0, 25], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "back_right_leg",
|
||||
"parent": "body",
|
||||
"pivot": [-5, 12.5, 6],
|
||||
"cubes": [
|
||||
{"origin": [-6.5, 0, 3.5], "size": [4, 13, 5], "uv": [0, 25]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "back_left_leg",
|
||||
"parent": "body",
|
||||
"pivot": [5, 12.5, 6],
|
||||
"cubes": [
|
||||
{"origin": [2.5, 0, 3.5], "size": [4, 13, 5], "uv": [0, 25], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "torso",
|
||||
"parent": "body",
|
||||
"pivot": [0, 13, 3],
|
||||
"cubes": [
|
||||
{"origin": [-5, 7, -8], "size": [10, 10, 17], "uv": [58, 0]},
|
||||
{"origin": [-5.5, 9, 8], "size": [11, 16, 7], "pivot": [0, 17, 17.5], "rotation": [7.5, 0, 0], "uv": [18, 21]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "neck",
|
||||
"parent": "torso",
|
||||
"pivot": [0, 14.5, -8.5],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 8, -13], "size": [7, 14, 7], "uv": [30, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "head",
|
||||
"parent": "neck",
|
||||
"pivot": [0, 21, -9.5],
|
||||
"cubes": [
|
||||
{"origin": [-3.5, 21, -14], "size": [7, 8, 8], "inflate": 0.1, "uv": [0, 0]},
|
||||
{"origin": [-2.5, 21, -19], "size": [5, 4, 5], "uv": [0, 16]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "right_ear",
|
||||
"parent": "head",
|
||||
"pivot": [-3.5, 27.25, -10],
|
||||
"cubes": [
|
||||
{"origin": [-7.5, 26, -10], "size": [4, 4, 0], "uv": [53, 0]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "left_ear",
|
||||
"parent": "head",
|
||||
"pivot": [3.5, 27.25, -10],
|
||||
"cubes": [
|
||||
{"origin": [3.5, 26, -10], "size": [4, 4, 0], "uv": [53, 0], "mirror": true},
|
||||
{"origin": [3.5, 26, -9.975], "size": [4, 4, 0], "uv": [61, 0], "mirror": true},
|
||||
{"origin": [-7.5, 26, -9.975], "size": [4, 4, 0], "uv": [61, 0]}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,231 +0,0 @@
|
||||
{
|
||||
"format_version": "1.12.0",
|
||||
"minecraft:geometry": [
|
||||
{
|
||||
"description": {
|
||||
"identifier": "geometry.spitbug",
|
||||
"texture_width": 256,
|
||||
"texture_height": 256,
|
||||
"visible_bounds_width": 6,
|
||||
"visible_bounds_height": 5.5,
|
||||
"visible_bounds_offset": [0, 2.25, 0]
|
||||
},
|
||||
"bones": [
|
||||
{
|
||||
"name": "root",
|
||||
"pivot": [0, 0, 0]
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"parent": "root",
|
||||
"pivot": [0, 36, 0],
|
||||
"cubes": [
|
||||
{"origin": [-11.5, 36, -18], "size": [23, 18, 37], "inflate": -0.05, "uv": [0, 103]},
|
||||
{"origin": [-9.5, 54, -35], "size": [19, 7, 59], "uv": [0, 0]},
|
||||
{"origin": [-7.5, 54, -52], "size": [15, 7, 17], "uv": [112, 28]},
|
||||
{"origin": [-6.5, 42, -51.75], "size": [3, 12, 5], "uv": [34, 23]},
|
||||
{"origin": [3.5, 42, -51.75], "size": [3, 12, 5], "uv": [34, 23], "mirror": true},
|
||||
{"origin": [-7.5, 52, -52], "size": [15, 2, 0], "uv": [0, 24]},
|
||||
{"origin": [-7.5, 44, -52], "size": [0, 10, 17], "uv": [5, 29]},
|
||||
{"origin": [-9.5, 47, -35], "size": [2, 7, 0], "uv": [37, 16]},
|
||||
{"origin": [-9.5, 45, -35], "size": [0, 9, 17], "uv": [0, 18]},
|
||||
{"origin": [9.5, 45, -35], "size": [0, 9, 17], "uv": [0, 18], "mirror": true},
|
||||
{"origin": [7.5, 47, -35], "size": [2, 7, 0], "uv": [37, 16], "mirror": true},
|
||||
{"origin": [7.5, 44, -52], "size": [0, 10, 17], "uv": [5, 29], "mirror": true},
|
||||
{"origin": [-11.5, 32.1, -18], "size": [23, 4, 33], "inflate": -0.05, "uv": [0, 66]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "jaw",
|
||||
"parent": "body",
|
||||
"pivot": [-3.07143, 33.92857, -16],
|
||||
"cubes": [
|
||||
{"origin": [-8.5, 32, -51], "size": [17, 2, 18], "uv": [97, 0]},
|
||||
{"origin": [-11.5, 30, -33], "size": [23, 4, 17], "uv": [79, 66]},
|
||||
{"origin": [-11.5, 34, -33], "size": [0, 8, 17], "uv": [0, -17]},
|
||||
{"origin": [-11.5, 34, -33], "size": [3, 8, 0], "uv": [0, 8]},
|
||||
{"origin": [8.5, 34, -33], "size": [3, 8, 0], "uv": [0, 8], "mirror": true},
|
||||
{"origin": [11.5, 34, -33], "size": [0, 8, 17], "uv": [0, -17], "mirror": true},
|
||||
{"origin": [-8.5, 34, -51], "size": [0, 8, 18], "uv": [0, -2]},
|
||||
{"origin": [-4.5, 32.5, -52.575], "size": [3, 8, 4], "pivot": [-3, 36.5, -50.575], "rotation": [22.5, 0, 0], "uv": [35, 0]},
|
||||
{"origin": [1.5, 32.5, -52.575], "size": [3, 8, 4], "pivot": [3, 36.5, -50.575], "rotation": [22.5, 0, 0], "uv": [35, 0], "mirror": true},
|
||||
{"origin": [-8.5, 34, -51], "size": [17, 8, 0], "uv": [0, 26]},
|
||||
{"origin": [8.5, 34, -51], "size": [0, 8, 18], "uv": [0, -2], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rightEye",
|
||||
"parent": "body",
|
||||
"pivot": [-11, 45.5, -17],
|
||||
"cubes": [
|
||||
{"origin": [-12, 45.5, -19], "size": [3, 3, 3], "uv": [83, 114]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "leftEye",
|
||||
"parent": "body",
|
||||
"pivot": [11, 45.5, -17],
|
||||
"cubes": [
|
||||
{"origin": [9, 45.5, -19], "size": [3, 3, 3], "uv": [83, 114], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "rightGrip",
|
||||
"parent": "body",
|
||||
"pivot": [-11.5, 54, -16],
|
||||
"rotation": [0, 0, 90]
|
||||
},
|
||||
{
|
||||
"name": "leftGrip",
|
||||
"parent": "body",
|
||||
"pivot": [11.5, 54, -16],
|
||||
"rotation": [0, 0, -90]
|
||||
},
|
||||
{
|
||||
"name": "backRightThigh",
|
||||
"parent": "root",
|
||||
"pivot": [-11.5, 37, 10],
|
||||
"cubes": [
|
||||
{"origin": [-20.5, 33, 8], "size": [9, 4, 4], "uv": [83, 120]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backRightKnee",
|
||||
"parent": "backRightThigh",
|
||||
"pivot": [-20.5, 37, 10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [-34.5, 32, 7], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backRightLeg",
|
||||
"parent": "backRightKnee",
|
||||
"pivot": [-34.5, 32, 10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [-53.5, 32, 8], "size": [19, 4, 4], "uv": [97, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backRightFoot",
|
||||
"parent": "backRightLeg",
|
||||
"pivot": [-53.5, 32, 10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [-67.5, 30, 9], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]},
|
||||
{"origin": [-76.5, 30, 10], "size": [9, 2, 0], "uv": [97, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backLeftThigh",
|
||||
"parent": "root",
|
||||
"pivot": [11.5, 37, 10],
|
||||
"cubes": [
|
||||
{"origin": [11.5, 33, 8], "size": [9, 4, 4], "uv": [83, 120]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backLeftKnee",
|
||||
"parent": "backLeftThigh",
|
||||
"pivot": [20.5, 37, 10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [20.5, 32, 7], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backLeftLeg",
|
||||
"parent": "backLeftKnee",
|
||||
"pivot": [34.5, 32, 10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [34.5, 32, 8], "size": [19, 4, 4], "uv": [97, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "backLeftFoot",
|
||||
"parent": "backLeftLeg",
|
||||
"pivot": [53.5, 32, 10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [53.5, 30, 9], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]},
|
||||
{"origin": [67.5, 30, 10], "size": [9, 2, 0], "uv": [97, 32], "mirror": true}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontRightThigh",
|
||||
"parent": "root",
|
||||
"pivot": [-11.5, 37, -10],
|
||||
"cubes": [
|
||||
{"origin": [-20.5, 33, -12], "size": [9, 4, 4], "uv": [83, 120]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontRightKnee",
|
||||
"parent": "frontRightThigh",
|
||||
"pivot": [-20.5, 37, -10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [-34.5, 32, -13], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontRightLeg",
|
||||
"parent": "frontRightKnee",
|
||||
"pivot": [-34.5, 32, -10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [-53.5, 32, -12], "size": [19, 4, 4], "uv": [97, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontRightFoot",
|
||||
"parent": "frontRightLeg",
|
||||
"pivot": [-53.5, 32, -10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [-67.5, 30, -11], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]},
|
||||
{"origin": [-76.5, 30, -10], "size": [9, 2, 0], "uv": [97, 32]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontLeftThigh",
|
||||
"parent": "root",
|
||||
"pivot": [11.5, 37, -10],
|
||||
"cubes": [
|
||||
{"origin": [11.5, 33, -12], "size": [9, 4, 4], "uv": [83, 120]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontLeftKnee",
|
||||
"parent": "frontLeftThigh",
|
||||
"pivot": [20.5, 37, -10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [20.5, 32, -13], "size": [14, 5, 6], "inflate": 0.025, "uv": [83, 103]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontLeftLeg",
|
||||
"parent": "frontLeftKnee",
|
||||
"pivot": [34.5, 32, -10],
|
||||
"rotation": [0, 0, -90],
|
||||
"cubes": [
|
||||
{"origin": [34.5, 32, -12], "size": [19, 4, 4], "uv": [97, 20]}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "frontLeftFoot",
|
||||
"parent": "frontLeftLeg",
|
||||
"pivot": [53.5, 32, -10],
|
||||
"rotation": [0, 0, 90],
|
||||
"cubes": [
|
||||
{"origin": [53.5, 30, -11], "size": [14, 2, 2], "inflate": 0.025, "uv": [97, 28]},
|
||||
{"origin": [67.5, 30, -10], "size": [9, 2, 0], "uv": [97, 32], "mirror": true}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -29,23 +29,14 @@
|
||||
"block.antarchy.very_tall_grass": "Very Tall Grass",
|
||||
"block.antarchy.umbral_moss_block": "Umbral Moss Block",
|
||||
"block.antarchy.umbral_moss_carpet": "Umbral Moss Carpet",
|
||||
"block.antarchy.amber_moss_block": "Amber Moss Block",
|
||||
"block.antarchy.amber_moss_carpet": "Amber Moss Carpet",
|
||||
"block.antarchy.amber_lichen": "Amber Lichen",
|
||||
"block.antarchy.bile_vein": "Bile Vein",
|
||||
"block.antarchy.duplicator_sapling": "Duplicator Sapling",
|
||||
"block.antarchy.creepvine": "Creepvine",
|
||||
"block.antarchy.duct_tape": "Duct Tape",
|
||||
"block.antarchy.infested_rooted_dirt": "Infested Rooted Dirt",
|
||||
"block.antarchy.infested_coarse_dirt": "Infested Coarse Dirt",
|
||||
"block.antarchy.nyxite": "Nyxite",
|
||||
"block.antarchy.myrmite": "Myrmite",
|
||||
"block.antarchy.broodstone": "Broodstone",
|
||||
"block.antarchy.polished_nyxite": "Polished Nyxite",
|
||||
"block.antarchy.chiseled_nyxite": "Chiseled Nyxite",
|
||||
"block.antarchy.nyxite_bricks": "Nyxite Bricks",
|
||||
"block.antarchy.chiten_block": "Chiten Block",
|
||||
"block.antarchy.chiten_spike": "Chiten Spike",
|
||||
"block.antarchy.shellstone": "Shellstone",
|
||||
"block.antarchy.polished_shellstone": "Polished Shellstone",
|
||||
"block.antarchy.shellstone_bricks": "Shellstone Bricks",
|
||||
@@ -83,7 +74,6 @@
|
||||
"block.antarchy.antimetal": "Antimetal",
|
||||
"block.antarchy.polished_antimetal": "Polished Antimetal",
|
||||
"block.antarchy.antimetal_scaffolding": "Antimetal Scaffolding",
|
||||
"block.antarchy.cavaryn_portal": "Cavaryn Portal",
|
||||
"block.antarchy.cornea_stalk": "Cornea Stalk",
|
||||
"block.antarchy.dream_torch": "Dream Torch",
|
||||
"block.antarchy.dream_wall_torch": "Dream Wall Torch",
|
||||
@@ -109,13 +99,10 @@
|
||||
"block.antarchy.smooth_dream_sandstone_slab": "Smooth Dream Sandstone Slab",
|
||||
"block.antarchy.cut_dream_sandstone_slab": "Cut Dream Sandstone Slab",
|
||||
"block.antarchy.bed_bug_egg": "Bed Bug Egg",
|
||||
"block.antarchy.creeping_horror_egg": "Creeping Horror Egg",
|
||||
"block.antarchy.lurking_terror_egg": "Lurking Terror Egg",
|
||||
"block.antarchy.wasp_nest": "Wasp Nest",
|
||||
"block.antarchy.red_ant_nest": "Red Ant Nest",
|
||||
"block.antarchy.brown_ant_nest": "Brown Ant Nest",
|
||||
"block.antarchy.rainbow_ant_nest": "Rainbow Ant Nest",
|
||||
"block.antarchy.termite_nest": "Termite Nest",
|
||||
"block.antarchy.uranium_ore": "Uranium Ore",
|
||||
"block.antarchy.deepslate_uranium_ore": "Deepslate Uranium Ore",
|
||||
"block.antarchy.titanium_ore": "Titanium Ore",
|
||||
@@ -149,6 +136,7 @@
|
||||
"entity.antarchy.enchanted_golden_apple_cow": "Enchanted Golden Apple Cow",
|
||||
"entity.antarchy.honeyed_apple_cow": "Honeyed Apple Cow",
|
||||
"entity.antarchy.easter_bunny": "Easter Bunny",
|
||||
"entity.antarchy.glimmer": "Glimmer",
|
||||
"entity.antarchy.flying_squirrel": "Flying Squirrel",
|
||||
"entity.antarchy.caterpillar": "Caterpillar",
|
||||
"entity.antarchy.butterfly": "Butterfly",
|
||||
@@ -156,7 +144,6 @@
|
||||
"entity.antarchy.red_ant": "Red Ant",
|
||||
"entity.antarchy.brown_ant": "Brown Ant",
|
||||
"entity.antarchy.rainbow_ant": "Rainbow Ant",
|
||||
"entity.antarchy.termite": "Termite",
|
||||
"entity.antarchy.diamond_minecart": "The Diamond Minecart",
|
||||
"entity.antarchy.dr_trayaurus": "Dr. Trayaurus",
|
||||
"entity.antarchy.cloud_shark": "Cloud Shark",
|
||||
@@ -165,9 +152,6 @@
|
||||
"entity.antarchy.octopus_bomb": "Octopus Bomb",
|
||||
"entity.antarchy.nightmare": "Nightmare",
|
||||
"entity.antarchy.bed_bug": "Bed Bug",
|
||||
"entity.antarchy.stink_bug": "Stink Bug",
|
||||
"entity.antarchy.jumpy_bug": "Jumpy Bug",
|
||||
"entity.antarchy.spit_bug": "Spit Bug",
|
||||
"entity.antarchy.wasp": "Wasp",
|
||||
"entity.antarchy.bomber": "Bomber",
|
||||
"entity.antarchy.moleworm": "Moleworm",
|
||||
@@ -177,8 +161,6 @@
|
||||
"entity.antarchy.triffid": "Triffid",
|
||||
"entity.antarchy.toreterror": "Toreterror",
|
||||
"entity.antarchy.water_bomb": "Water Bomb",
|
||||
"entity.antarchy.creeping_horror": "Creeping Horror",
|
||||
"entity.antarchy.lurking_terror": "Lurking Terror",
|
||||
"subtitles.antarchy.mantis_ambient": "Mantis clicks",
|
||||
"subtitles.antarchy.mantis_hurt": "Mantis screeches",
|
||||
"subtitles.antarchy.mantis_attack": "Mantis snaps",
|
||||
@@ -186,11 +168,8 @@
|
||||
"item.antarchy.big_bertha": "Big Bertha",
|
||||
"item.antarchy.wasp_nest": "Wasp Nest",
|
||||
"item.antarchy.stink_bug": "Stink Bug",
|
||||
"item.antarchy.stink_bug_spawn_egg": "Stink Bug Spawn Egg",
|
||||
"item.antarchy.wasp_spawn_egg": "Wasp Spawn Egg",
|
||||
"item.antarchy.bomber_spawn_egg": "Bomber Spawn Egg",
|
||||
"item.antarchy.jumpy_bug_spawn_egg": "Jumpy Bug Spawn Egg",
|
||||
"item.antarchy.spit_bug_spawn_egg": "Spit Bug Spawn Egg",
|
||||
"item.antarchy.big_bertha_blade": "Big Bertha Blade",
|
||||
"item.antarchy.big_bertha_handle": "Big Bertha Handle",
|
||||
"item.antarchy.big_bertha_hilt": "Big Bertha Hilt",
|
||||
@@ -227,7 +206,7 @@
|
||||
"item.antarchy.nightmare_boots": "Nightmare Boots",
|
||||
"item.antarchy.nightmare_sword": "Nightmare Sword",
|
||||
"tooltip.antarchy.nightmare_armor_double_damage": "%s%% chance to deal double damage",
|
||||
"tooltip.antarchy.nightmare_armor_set_bonus": "Full Set: Wither & Dread immunity",
|
||||
"tooltip.antarchy.nightmare_armor_set_bonus": "Full Set: Wither \u0026 Dread immunity",
|
||||
"tooltip.antarchy.nightmare_sword": "Deals more damage as your health drops.",
|
||||
"tooltip.antarchy.nightmare_sword_damage": "Deals %s damage",
|
||||
"tooltip.antarchy.primordial_helmet_water_breathing": "Grants the wearer Water Breathing",
|
||||
@@ -288,16 +267,6 @@
|
||||
"item.antarchy.hushweed": "Hushweed",
|
||||
"item.antarchy.umbral_moss_block": "Umbral Moss Block",
|
||||
"item.antarchy.umbral_moss_carpet": "Umbral Moss Carpet",
|
||||
"item.antarchy.amber_moss_block": "Amber Moss Block",
|
||||
"item.antarchy.amber_moss_carpet": "Amber Moss Carpet",
|
||||
"item.antarchy.amber_lichen": "Amber Lichen",
|
||||
"item.antarchy.bile_vein": "Bile Vein",
|
||||
"item.antarchy.creepvine": "Creepvine",
|
||||
"item.antarchy.chiten": "Chiten",
|
||||
"item.antarchy.chiten_block": "Chiten Block",
|
||||
"item.antarchy.chiten_spike": "Chiten Spike",
|
||||
"item.antarchy.myrmite": "Myrmite",
|
||||
"item.antarchy.broodstone": "Broodstone",
|
||||
"item.antarchy.torchflower_bush": "Torchflower Bush",
|
||||
"block.antarchy.torchflower_bush": "Torchflower Bush",
|
||||
"item.antarchy.mud_pie": "Mud Pie",
|
||||
@@ -344,7 +313,7 @@
|
||||
"tooltip.antarchy.scorpion_whip.lash": "Lashes prey from afar and embeds a venomous tether.",
|
||||
"tooltip.antarchy.scorpion_whip.reel": "Right-click to reel tethered prey.",
|
||||
"tooltip.antarchy.scorpion_whip.snap": "Left-click tethered prey again to snap the stinger free.",
|
||||
"item.antarchy.fallen_king_crown": "Fallen King's Crown",
|
||||
"item.antarchy.fallen_king_crown": "Fallen King\u0027s Crown",
|
||||
"tooltip.antarchy.fallen_king_crown.hero": "Grants Hero of the Village when you slay hostile mobs",
|
||||
"item.antarchy.vortex_eye": "Vortex Eye",
|
||||
"item.antarchy.ultimate_helmet": "Ultimate Helmet",
|
||||
@@ -385,26 +354,23 @@
|
||||
"item.antarchy.red_ant_spawn_egg": "Red Ant Spawn Egg",
|
||||
"item.antarchy.brown_ant_spawn_egg": "Brown Ant Spawn Egg",
|
||||
"item.antarchy.rainbow_ant_spawn_egg": "Rainbow Ant Spawn Egg",
|
||||
"item.antarchy.termite_spawn_egg": "Termite Spawn Egg",
|
||||
"item.antarchy.golden_apple_cow_spawn_egg": "Golden Apple Cow Spawn Egg",
|
||||
"item.antarchy.enchanted_golden_apple_cow_spawn_egg": "Enchanted Golden Apple Cow Spawn Egg",
|
||||
"item.antarchy.honeyed_apple_cow_spawn_egg": "Honeyed Apple Cow Spawn Egg",
|
||||
"item.antarchy.dr_trayaurus_spawn_egg": "Dr. Trayaurus Spawn Egg",
|
||||
"item.antarchy.easter_bunny_spawn_egg": "Easter Bunny Spawn Egg",
|
||||
"item.antarchy.glimmer_spawn_egg": "Glimmer Spawn Egg",
|
||||
"item.antarchy.flying_squirrel_spawn_egg": "Flying Squirrel Spawn Egg",
|
||||
"item.antarchy.caterpillar_spawn_egg": "Caterpillar Spawn Egg",
|
||||
"item.antarchy.butterfly_spawn_egg": "Butterfly Spawn Egg",
|
||||
"item.antarchy.brutalfly_spawn_egg": "Brutalfly Spawn Egg",
|
||||
"item.antarchy.cloud_shark_spawn_egg": "Cloud Shark Spawn Egg",
|
||||
"item.antarchy.kraken_spawn_egg": "Uh, no. Don't.",
|
||||
"item.antarchy.kraken_spawn_egg": "Uh, no. Don\u0027t.",
|
||||
"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",
|
||||
"item.antarchy.lurking_terror_spawn_egg": "Lurking Terror Spawn Egg",
|
||||
"item.antarchy.water_cannon": "Water Cannon",
|
||||
"item.antarchy.primordial_scute": "Primordial Scute",
|
||||
"item.antarchy.primordial_helmet": "Primordial Helmet",
|
||||
"item.antarchy.primordial_chestplate": "Primordial Chestplate",
|
||||
"item.antarchy.primordial_leggings": "Primordial Leggings",
|
||||
@@ -449,6 +415,7 @@
|
||||
"effect.antarchy.paralyzed": "Paralyzed",
|
||||
"effect.antarchy.inverted": "Inverted",
|
||||
"effect.antarchy.stinky": "Stinky",
|
||||
"effect.antarchy.glimmers_grace": "Glimmer's Grace",
|
||||
"effect.antarchy.shrinking": "Shrinking",
|
||||
"effect.antarchy.growth": "Growth",
|
||||
"effect.antarchy.bloodglass_ward": "Bloodglass Ward",
|
||||
@@ -486,11 +453,9 @@
|
||||
"advancements.antarchy.fallen_kingdom_castle.title": "I Used to Rule the World...",
|
||||
"advancements.antarchy.fallen_kingdom_castle.description": "Discover the Fallen Kingdom Castle.",
|
||||
"advancements.antarchy.fallen_king_crown.title": "Chunks would load when I gave the word...",
|
||||
"advancements.antarchy.fallen_king_crown.description": "Obtain the Fallen King's Crown.",
|
||||
"advancements.antarchy.visit_cavaryn.title": "You will be Termite-ated",
|
||||
"advancements.antarchy.visit_cavaryn.description": "Use a termite to reach Cavaryn.",
|
||||
"advancements.antarchy.fallen_king_crown.description": "Obtain the Fallen King\u0027s Crown.",
|
||||
"advancements.antarchy.the_lab.title": "Hello Everyone, Dan Here!",
|
||||
"advancements.antarchy.the_lab.description": "Discover Dr. Trayaurus' lab.",
|
||||
"advancements.antarchy.the_lab.description": "Discover Dr. Trayaurus\u0027 lab.",
|
||||
"advancements.antarchy.sweater_dreams.title": "Sweater Dreams",
|
||||
"advancements.antarchy.sweater_dreams.description": "Defeat the Nightmare.",
|
||||
"advancements.antarchy.stone_cold.title": "Stone Cold",
|
||||
@@ -499,11 +464,11 @@
|
||||
"advancements.antarchy.moley_poley.description": "Defeat a Molevore.",
|
||||
"advancements.antarchy.lucid_dreams.title": "Lucid Dreams",
|
||||
"advancements.antarchy.lucid_dreams.description": "Defeat a Lucid.",
|
||||
"advancements.antarchy.davy_jones_locker.title": "Davy Jones' Locker",
|
||||
"advancements.antarchy.davy_jones_locker.title": "Davy Jones\u0027 Locker",
|
||||
"advancements.antarchy.davy_jones_locker.description": "Defeat the Kraken.",
|
||||
"advancements.antarchy.shark_weak.title": "When Sharks Fly",
|
||||
"advancements.antarchy.shark_weak.description": "Defeat a Cloud Shark.",
|
||||
"advancements.antarchy.dont_let_the_bed_bugs_bite.title": "Don't Let the Bed Bugs Bite",
|
||||
"advancements.antarchy.dont_let_the_bed_bugs_bite.title": "Don\u0027t Let the Bed Bugs Bite",
|
||||
"advancements.antarchy.dont_let_the_bed_bugs_bite.description": "Defeat a Bed Bug.",
|
||||
"advancements.antarchy.soups_up.title": "Soups Up",
|
||||
"advancements.antarchy.soups_up.description": "Eat Cloud Shark Fin Soup.",
|
||||
@@ -534,8 +499,8 @@
|
||||
"message.antarchy.dread_too_scared_to_sleep": "You are too scared to sleep.",
|
||||
"death.attack.kraken_mauling": "%1$s was dragged under by the Kraken",
|
||||
"death.attack.kraken_mauling.player": "%1$s was dragged under by the Kraken while fighting %2$s",
|
||||
"death.attack.kraken_lightning": "%1$s was struck down by the Kraken's storm",
|
||||
"death.attack.kraken_lightning.player": "%1$s was struck down by the Kraken's storm while fighting %2$s",
|
||||
"death.attack.kraken_lightning": "%1$s was struck down by the Kraken\u0027s storm",
|
||||
"death.attack.kraken_lightning.player": "%1$s was struck down by the Kraken\u0027s storm while fighting %2$s",
|
||||
"death.attack.nightmare_mauling": "%1$s was devoured by the Nightmare",
|
||||
"death.attack.nightmare_mauling.player": "%1$s was devoured by the Nightmare while fighting %2$s",
|
||||
"death.attack.basilisk_bite": "%1$s was swallowed by a Basilisk",
|
||||
@@ -683,13 +648,6 @@
|
||||
"subtitles.antarchy.water_cannon_fire": "Water Cannon fires",
|
||||
"subtitles.antarchy.toreterror_jump_up": "Toreterror jumps",
|
||||
"subtitles.antarchy.toreterror_jump_land": "Toreterror lands",
|
||||
"subtitles.antarchy.creeping_horror_growl": "Creeping Horror growls",
|
||||
"subtitles.antarchy.creeping_horror_hurt": "Creeping Horror hurts",
|
||||
"subtitles.antarchy.creeping_horror_bite": "Creeping Horror bites",
|
||||
"subtitles.antarchy.lurking_terror_snarl": "Lurking Terror snarls",
|
||||
"subtitles.antarchy.lurking_terror_hurt": "Lurking Terror hurts",
|
||||
"subtitles.antarchy.lurking_terror_bite": "Lurking Terror bites",
|
||||
"subtitles.antarchy.lurking_terror_fly_loop": "Lurking Terror flies",
|
||||
"subtitles.antarchy.stinky_fly": "Stinky flies buzz",
|
||||
"item.minecraft.potion.effect.inversion": "Potion of Inversion",
|
||||
"item.minecraft.potion.effect.long_inversion": "Potion of Inversion",
|
||||
@@ -755,65 +713,18 @@
|
||||
"item.minecraft.lingering_potion.effect.strong_haste": "Lingering Potion of Haste II",
|
||||
"item.minecraft.tipped_arrow.effect.haste": "Arrow of Haste",
|
||||
"item.minecraft.tipped_arrow.effect.strong_haste": "Arrow of Haste II",
|
||||
"subtitles.antarchy.squidzooka_fire": "Squidzooka fires",
|
||||
"advancements.antarchy.visit_elythia.title": "InterdimANTsional",
|
||||
"advancements.antarchy.visit_elythia.description": "Use a brown ant to reach Elythia.",
|
||||
"advancements.antarchy.visit_thoraxis.title": "Ant-ger Management",
|
||||
"advancements.antarchy.visit_thoraxis.description": "Use a red ant to reach Thoraxis.",
|
||||
"advancements.antarchy.visit_cavaryn.title": "You will be Termite-ated",
|
||||
"advancements.antarchy.visit_cavaryn.description": "Use a termite to reach Cavaryn.",
|
||||
"advancements.antarchy.ultimate_armor.title": "Ultimate Protection",
|
||||
"advancements.antarchy.ultimate_armor.description": "Collect the full set of Ultimate Armor.",
|
||||
"advancements.antarchy.ultimate_bow.title": "Bowhemian Rhapsody",
|
||||
"advancements.antarchy.ultimate_bow.description": "Obtain an Ultimate Bow.",
|
||||
"advancements.antarchy.kill_molevore.title": "Moley Poley",
|
||||
"advancements.antarchy.kill_molevore.description": "Kill a Molevore.",
|
||||
"advancements.antarchy.water_cannon_craft.title": "Wetter is Better!",
|
||||
"advancements.antarchy.water_cannon_craft.description": "Obtain a Water Cannon.",
|
||||
"advancements.antarchy.kill_toreterror.title": "More like Tore-Terrible Aim!",
|
||||
"advancements.antarchy.kill_toreterror.description": "Defeat the Toreterror.",
|
||||
"advancements.antarchy.cancel_out.title": "1 - 1 = ?",
|
||||
"advancements.antarchy.cancel_out.description": "Have Growth and Shrinking active at the same time.",
|
||||
"death.attack.bed_bug_bite": "%1$s got bit by the bed bugs",
|
||||
"death.attack.bed_bug_bite.player": "%1$s got bit by the bed bugs while fighting %2$s",
|
||||
"death.attack.kraken_mauling": "%1$s was dragged under by the Kraken",
|
||||
"death.attack.kraken_mauling.player": "%1$s was dragged under by the Kraken while fighting %2$s",
|
||||
"death.attack.kraken_lightning": "%1$s was struck down by the Kraken's storm",
|
||||
"death.attack.kraken_lightning.player": "%1$s was struck down by the Kraken's storm while fighting %2$s",
|
||||
"death.attack.nightmare_mauling": "%1$s was devoured by the Nightmare",
|
||||
"death.attack.nightmare_mauling.player": "%1$s was devoured by the Nightmare while fighting %2$s",
|
||||
"death.attack.basilisk_bite": "%1$s was swallowed by a Basilisk",
|
||||
"death.attack.basilisk_bite.player": "%1$s was swallowed by a Basilisk while fighting %2$s",
|
||||
"death.attack.emperor_scorpion_sting": "%1$s was stung by the Emperor Scorpion",
|
||||
"death.attack.emperor_scorpion_sting.player": "%1$s was stung by the Emperor Scorpion while fighting %2$s",
|
||||
"death.attack.cornea_stalk_prick": "%1$s was pricked to death by a Cornea Stalk",
|
||||
"death.attack.toreterror_spin": "%1$s was beybladed to death by Toreterror",
|
||||
"death.attack.toreterror_spin.player": "%1$s was beybladed to death by Toreterror",
|
||||
"death.attack.toreterror_jump": "%1$s was pounded to death by Toreterror",
|
||||
"death.attack.toreterror_jump.player": "%1$s was pounded to death by Toreterror",
|
||||
"death.attack.water_soaked": "%1$s was super soaked to death by %2$s",
|
||||
"death.attack.water_soaked.player": "%1$s was super soaked to death by %2$s",
|
||||
"entity.antarchy.cheep": "Cheep",
|
||||
"entity.antarchy.dorrie": "Dorrie",
|
||||
"entity.antarchy.hercules_beetle": "Hercules Beetle",
|
||||
"item.antarchy.cheep": "Cheep",
|
||||
"item.antarchy.cheep_spawn_egg": "Cheep Spawn Egg",
|
||||
"item.antarchy.dorrie_spawn_egg": "Dorrie Spawn Egg",
|
||||
"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",
|
||||
"biome.antarchy.lucid_pools": "Lucid Pools",
|
||||
"biome.antarchy.dream_dunes": "Dream Dunes",
|
||||
"biome.antarchy.cloud_sea": "Cloud Sea",
|
||||
|
||||
"trim_material.antarchy.blood_crystal": "Blood Crystal",
|
||||
"trim_material.antarchy.nightmare_scale": "Nightmare Scale",
|
||||
"trim_material.antarchy.uranium": "Uranium",
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"particle": "antarchy:block/amber_moss/amber_lichen",
|
||||
"glow_lichen": "antarchy:block/amber_moss/amber_lichen"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [0, 0, 0.1],
|
||||
"to": [16, 16, 0.1],
|
||||
"faces": {
|
||||
"north": { "uv": [16, 0, 0, 16], "texture": "#glow_lichen" },
|
||||
"south": { "uv": [0, 0, 16, 16], "texture": "#glow_lichen" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_all",
|
||||
"textures": {
|
||||
"all": "antarchy:block/amber_moss/amber_moss_block"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/carpet",
|
||||
"textures": {
|
||||
"wool": "antarchy:block/amber_moss/amber_moss_carpet"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/mossy_carpet_side",
|
||||
"textures": {
|
||||
"side": "antarchy:block/amber_moss/amber_moss_carpet"
|
||||
}
|
||||
}
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"ambientocclusion": true,
|
||||
"textures": {
|
||||
"particle": "#side",
|
||||
"side": "antarchy:block/amber_moss/amber_moss_carpet"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [0, 0, 0.1],
|
||||
"to": [16, 16, 0.1],
|
||||
"shade": true,
|
||||
"faces": {
|
||||
"north": {"uv": [16, 0, 0, 16], "texture": "#side"},
|
||||
"south": {"uv": [0, 0, 16, 16], "texture": "#side"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_all",
|
||||
"textures": {
|
||||
"all": "antarchy:block/bile/bile_vein"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_all",
|
||||
"textures": {
|
||||
"all": "antarchy:block/broodstone/broodstone"
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"portal": "antarchy:block/cavaryn_portal",
|
||||
"particle": "antarchy:block/cavaryn_portal"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [0, 0, 7.5],
|
||||
"to": [16, 16, 8.5],
|
||||
"faces": {
|
||||
"north": { "texture": "#portal" },
|
||||
"south": { "texture": "#portal" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"portal": "antarchy:block/cavaryn_portal",
|
||||
"particle": "antarchy:block/cavaryn_portal"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [7.5, 0, 0],
|
||||
"to": [8.5, 16, 16],
|
||||
"faces": {
|
||||
"west": { "texture": "#portal" },
|
||||
"east": { "texture": "#portal" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_column",
|
||||
"textures": {
|
||||
"end": "antarchy:block/chiten_block",
|
||||
"side": "antarchy:block/chiten_block"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_down_base"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_down_frustum"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_down_middle"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_down_tip"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_down_tip_merge"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_up_base"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_up_frustum"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_up_middle"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_up_tip"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/pointed_dripstone",
|
||||
"textures": {
|
||||
"cross": "antarchy:block/chiten_spike/chiten_spike_up_tip_merge"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_turtle_egg",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_two_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_three_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_four_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg",
|
||||
"particle": "antarchy:block/creeping_horror_egg/creeping_horror_egg"
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"particle": "antarchy:block/creepvine",
|
||||
"vine": "antarchy:block/creepvine"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [0, 0, 0.8],
|
||||
"to": [16, 16, 0.8],
|
||||
"shade": false,
|
||||
"faces": {
|
||||
"north": { "uv": [16, 0, 0, 16], "texture": "#vine", "tintindex": 0 },
|
||||
"south": { "uv": [0, 0, 16, 16], "texture": "#vine", "tintindex": 0 }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_turtle_egg",
|
||||
"textures": {
|
||||
"all": "antarchy:block/lurking_terror_egg/lurking_terror_egg"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_two_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/lurking_terror_egg/lurking_terror_egg"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_three_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/lurking_terror_egg/lurking_terror_egg"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_four_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/lurking_terror_egg/lurking_terror_egg",
|
||||
"particle": "antarchy:block/lurking_terror_egg/lurking_terror_egg"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube_all",
|
||||
"textures": {
|
||||
"all": "antarchy:block/myrmite"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_turtle_egg",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg_slightly_cracked"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_two_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg_slightly_cracked"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_three_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg_slightly_cracked"
|
||||
}
|
||||
}
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_four_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg_slightly_cracked",
|
||||
"particle": "antarchy:block/creeping_horror_egg/creeping_horror_egg_slightly_cracked"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_turtle_egg",
|
||||
"textures": {
|
||||
"all": "antarchy:block/lurking_terror_egg/lurking_terror_egg_slightly_cracked"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_two_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/lurking_terror_egg/lurking_terror_egg_slightly_cracked"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_three_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/lurking_terror_egg/lurking_terror_egg_slightly_cracked"
|
||||
}
|
||||
}
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_four_turtle_eggs",
|
||||
"textures": {
|
||||
"all": "antarchy:block/lurking_terror_egg/lurking_terror_egg_slightly_cracked",
|
||||
"particle": "antarchy:block/lurking_terror_egg/lurking_terror_egg_slightly_cracked"
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/cube",
|
||||
"textures": {
|
||||
"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"
|
||||
}
|
||||
}
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"parent": "minecraft:block/template_turtle_egg",
|
||||
"textures": {
|
||||
"all": "antarchy:block/creeping_horror_egg/creeping_horror_egg_very_cracked"
|
||||
}
|
||||
}
|
||||
Loaded 100 of 321 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user