starting 1.0!

This commit is contained in:
craisinlord committed 2026-07-18 09:53:43 -05:00
1 parent e265d68526
commit 6ce167decb
571 files changed
+15338 -326

No files matched your search

@@ -53,6 +53,8 @@ public final class AntarchySettings {
private static double bigBerthaAttackDamage = 55.0D;
private static double bigBerthaReachBonus = 3.0D;
private static double bigBerthaAttackSpeed = -3.0D;
private static double attitudeAdjusterBaseDamage = 40.0D;
private static boolean attitudeAdjusterBreaksBlocks = true;
private static double krakensGraspAttackDamage = 16.0D;
private static double krakensGraspAttackSpeed = -2.9D;
private static double krakensGraspThrownDamage = 32.0D;
@@ -251,8 +253,8 @@ public final class AntarchySettings {
private static double reverieWarningThreatVerticalRange = 5.0D;
private static int reverieDuplicationCooldownTicks = 6000;
private static final boolean reverieOnlyPlayerDamage = true;
private static final double reveriePreferredFollowMinDistance = 3.0D;
private static final double reveriePreferredFollowMaxDistance = 6.0D;
private static final double reveriePreferredFollowMinDistance = 2.5D;
private static final double reveriePreferredFollowMaxDistance = 2.5D;
private static final double reverieCatchUpDistance = 12.0D;
private static final double reveriePurpleProtectRadius = 2.7D;
private static final int reverieWarningApproachTicks = 8;
@@ -690,6 +692,14 @@ public final class AntarchySettings {
return bigBerthaAttackSpeed;
}
public static double attitudeAdjusterBaseDamage() {
return attitudeAdjusterBaseDamage;
}
public static boolean attitudeAdjusterBreaksBlocks() {
return attitudeAdjusterBreaksBlocks;
}
public static double bigBerthaBasiliskCooldownSeconds() {
return bigBerthaBasiliskCooldownSeconds;
}
@@ -1232,6 +1242,14 @@ public final class AntarchySettings {
bigBerthaAttackSpeed = value;
}
public static void setAttitudeAdjusterBaseDamage(double value) {
attitudeAdjusterBaseDamage = value;
}
public static void setAttitudeAdjusterBreaksBlocks(boolean value) {
attitudeAdjusterBreaksBlocks = value;
}
public static void setBigBerthaBasiliskCooldownSeconds(double value) {
bigBerthaBasiliskCooldownSeconds = value;
}
@@ -132,6 +132,9 @@ public final class AntarchySoundEvents {
public static Supplier<SoundEvent> TORETERROR_JUMP_UP = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> TORETERROR_JUMP_LAND = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> STINKY_FLY = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> STINK_BUG_FART = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> STINK_BUG_IDLE = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> ROLLY_POLLY_IDLE = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> CREEPING_HORROR_GROWL = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> CREEPING_HORROR_HURT = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> CREEPING_HORROR_BITE = (Supplier<SoundEvent>) UNBOUND;
@@ -140,6 +143,19 @@ public final class AntarchySoundEvents {
public static Supplier<SoundEvent> LURKING_TERROR_BITE = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> LURKING_TERROR_FLY_LOOP = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> DUCT_TAPE_USE = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> HERCULES_BEETLE_IDLE = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> HERCULES_BEETLE_HURT = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> HERCULES_BEETLE_ATTACK = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> HERCULES_BEETLE_CRY = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> HERCULES_BEETLE_CHARGE_START = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> HERCULES_BEETLE_KNOCKED_DOWN = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> JUMPY_BUG_IDLE = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> SPIT_BUG_IDLE = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> JUMPY_BUG_HURT = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> JUMPY_BUG_JUMP = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> SPIT_BUG_HURT = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> SPIT_BUG_SPIT = (Supplier<SoundEvent>) UNBOUND;
public static Supplier<SoundEvent> BRUTALFLY_SPIT = (Supplier<SoundEvent>) UNBOUND;
private AntarchySoundEvents() {
}
@@ -268,6 +284,9 @@ public final class AntarchySoundEvents {
Supplier<SoundEvent> toreterrorJumpUp,
Supplier<SoundEvent> toreterrorJumpLand,
Supplier<SoundEvent> stinkyFly,
Supplier<SoundEvent> stinkBugFart,
Supplier<SoundEvent> stinkBugIdle,
Supplier<SoundEvent> rollyPollyIdle,
Supplier<SoundEvent> creepingHorrorGrowl,
Supplier<SoundEvent> creepingHorrorHurt,
Supplier<SoundEvent> creepingHorrorBite,
@@ -275,7 +294,20 @@ public final class AntarchySoundEvents {
Supplier<SoundEvent> lurkingTerrorHurt,
Supplier<SoundEvent> lurkingTerrorBite,
Supplier<SoundEvent> lurkingTerrorFlyLoop,
Supplier<SoundEvent> ductTapeUse
Supplier<SoundEvent> ductTapeUse,
Supplier<SoundEvent> herculesBeetleIdle,
Supplier<SoundEvent> herculesBeetleHurt,
Supplier<SoundEvent> herculesBeetleAttack,
Supplier<SoundEvent> herculesBeetleCry,
Supplier<SoundEvent> herculesBeetleChargeStart,
Supplier<SoundEvent> herculesBeetleKnockedDown,
Supplier<SoundEvent> jumpyBugIdle,
Supplier<SoundEvent> spitBugIdle,
Supplier<SoundEvent> jumpyBugHurt,
Supplier<SoundEvent> jumpyBugJump,
Supplier<SoundEvent> spitBugHurt,
Supplier<SoundEvent> spitBugSpit,
Supplier<SoundEvent> brutalflySpit
) {
SQUIDZOOKA_FIRE = squidzookaFire;
SHRINK_RAY_SOUND = shrinkRaySound;
@@ -400,6 +432,9 @@ public final class AntarchySoundEvents {
TORETERROR_JUMP_UP = toreterrorJumpUp;
TORETERROR_JUMP_LAND = toreterrorJumpLand;
STINKY_FLY = stinkyFly;
STINK_BUG_FART = stinkBugFart;
STINK_BUG_IDLE = stinkBugIdle;
ROLLY_POLLY_IDLE = rollyPollyIdle;
CREEPING_HORROR_GROWL = creepingHorrorGrowl;
CREEPING_HORROR_HURT = creepingHorrorHurt;
CREEPING_HORROR_BITE = creepingHorrorBite;
@@ -408,5 +443,18 @@ public final class AntarchySoundEvents {
LURKING_TERROR_BITE = lurkingTerrorBite;
LURKING_TERROR_FLY_LOOP = lurkingTerrorFlyLoop;
DUCT_TAPE_USE = ductTapeUse;
HERCULES_BEETLE_IDLE = herculesBeetleIdle;
HERCULES_BEETLE_HURT = herculesBeetleHurt;
HERCULES_BEETLE_ATTACK = herculesBeetleAttack;
HERCULES_BEETLE_CRY = herculesBeetleCry;
HERCULES_BEETLE_CHARGE_START = herculesBeetleChargeStart;
HERCULES_BEETLE_KNOCKED_DOWN = herculesBeetleKnockedDown;
JUMPY_BUG_IDLE = jumpyBugIdle;
SPIT_BUG_IDLE = spitBugIdle;
JUMPY_BUG_HURT = jumpyBugHurt;
JUMPY_BUG_JUMP = jumpyBugJump;
SPIT_BUG_HURT = spitBugHurt;
SPIT_BUG_SPIT = spitBugSpit;
BRUTALFLY_SPIT = brutalflySpit;
}
}
@@ -36,6 +36,7 @@ public final class AntarchyTags {
public static final TagKey<Block> ELYTHIA_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("elythia_portal_frames"));
public static final TagKey<Block> THORAXIS_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("thoraxis_portal_frames"));
public static final TagKey<Block> CAVARYN_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("cavaryn_portal_frames"));
public static final TagKey<Block> ROLLY_CAVERN_CARVEABLE = TagKey.create(Registries.BLOCK, id("rolly_cavern_carveable"));
public static final TagKey<Block> MINERS_DREAM_CARVABLE = TagKey.create(Registries.BLOCK, id("miners_dream_carvable"));
private Blocks() {
@@ -45,7 +45,8 @@ public final class CreativeTabOrder {
"cut_dream_sandstone_slab" -> 4;
case "umbral_moss_block", "umbral_moss_carpet",
"blush_moss_block", "blush_moss_carpet" -> 4;
case "uranium_ore", "deepslate_uranium_ore", "titanium_ore", "deepslate_titanium_ore",
case "uranium_ore", "deepslate_uranium_ore", "broodstone_uranium_ore",
"titanium_ore", "deepslate_titanium_ore", "broodstone_titanium_ore",
"uranium_block", "titanium_block",
"cut_uranium", "cut_titanium", "cut_uranium_slab", "cut_titanium_slab",
"cut_uranium_stairs", "cut_titanium_stairs",
@@ -56,10 +57,15 @@ public final class CreativeTabOrder {
"raw_uranium_block", "raw_titanium_block" -> 7;
case "blood_crystal_block", "small_blood_crystal_bud", "medium_blood_crystal_bud",
"large_blood_crystal_bud", "budding_blood_crystal", "blood_crystal_cluster",
"myrmite", "broodstone", "chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet" -> 8;
"myrmite", "broodstone", "polished_broodstone", "chiseled_broodstone", "broodstone_bricks",
"broodstone_stairs", "broodstone_slab", "broodstone_wall",
"polished_broodstone_stairs", "polished_broodstone_slab", "polished_broodstone_wall",
"broodstone_brick_stairs", "broodstone_brick_slab", "broodstone_brick_wall",
"chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet",
"glowcap_mushroom", "glowcap_mushroom_block" -> 8;
case "ouranwood_leaves", "peach_leaves" -> 9;
case "duplicator_sapling", "ouranwood_acorn", "peach_sapling", "corn_seeds" -> 10;
case "orange_milkweed", "pink_milkweed", "camellia", "spider_lily", "lotus", "hushweed", "amber_lichen", "creepvine",
case "orange_milkweed", "pink_milkweed", "camellia", "spider_lily", "lotus", "hushweed", "hanging_creeproots", "molting_vines", "amber_lichen", "creepvine",
"triffid_goo_block", "cloud_block", "wasp_nest",
"red_ant_nest", "brown_ant_nest", "rainbow_ant_nest", "termite_nest",
"star_coral", "star_coral_fan", "star_coral_block",
@@ -67,14 +73,14 @@ public final class CreativeTabOrder {
case "dream_torch", "dream_lantern", "dream_campfire", "dream_fire", "dream_fire_ceiling",
"lumen_froglight", "roseate_froglight" -> 12;
case "antimetal_scaffolding" -> 13;
case "infested_rooted_dirt", "infested_coarse_dirt", "bed_bug_egg" -> 14;
case "infested_rooted_dirt", "infested_coarse_dirt", "bed_bug_egg", "creeping_horror_egg", "lurking_terror_egg", "jumpy_bug_egg" -> 14;
case "ultimate_pickaxe", "ultimate_axe", "ultimate_shovel", "ultimate_hoe",
"duct_tape", "diamond_minecart", "critter_cage", "gravity_sculk_sensor", "miners_dream" -> 15;
case "bile_bucket", "ichor_bucket", "antiwater_bucket", "cloud_bucket", "lumen_bucket" -> 16;
case "moggles", "brutalfly_elytra", "fallen_king_crown", "jumpy_boots" -> 17;
case "battle_axe", "basilisk_dagger", "squidzooka", "rpo_launcher", "shrink_ray", "growth_ray",
"gravity_gun", "water_cannon", "nightmare_sword", "lucid_pearl", "scorpion_whip", "blood_crystal_katana",
"big_bertha", "big_bertha_blade", "big_bertha_handle", "big_bertha_hilt",
"attitude_adjuster", "big_bertha", "big_bertha_blade", "big_bertha_handle", "big_bertha_hilt",
"ultimate_sword", "ultimate_mace", "krakens_grasp" -> 18;
case "primordial_helmet", "primordial_chestplate",
"primordial_leggings", "primordial_boots",
@@ -87,12 +93,12 @@ public final class CreativeTabOrder {
case "ultimate_bow", "ultimate_crossbow" -> 20;
case "cloud_shark_fin_soup", "mud_pie", "peach_pie", "cornbread", "popcorn", "rainbow_sugar",
"blood_crystal_apple", "spirit_apple", "peach", "raw_corndog", "cooked_corndog",
"raw_venison", "cooked_venison" -> 21;
"raw_venison", "cooked_venison", "raw_bug_meat", "cooked_bug_meat", "broodfruit" -> 21;
case "blood_crystal_shard", "cloud_shark_fin", "basilisk_fang", "kraken_tooth", "kraken_tentacle",
"emperor_scorpion_stinger", "nightmare_scale", "molevore_nose",
"moleworm", "uranium_nugget", "titanium_nugget",
"uranium_ingot", "titanium_ingot", "lucid_eye",
"mantis_claw", "jumpy_bug_leg", "brutalfly_wing", "cornea_ear",
"mantis_claw", "hercules_horn", "jumpy_bug_leg", "brutalfly_wing", "cornea_ear",
"primordial_scute", "triffid_goo", "vortex_eye",
"king_scale", "queen_scale", "chiten", "stink_bug", "corn", "high_fructose_corn_syrup" -> 22;
case "reverie_bottle", "glimmer_bottle", "root_beer" -> 24;
@@ -102,7 +108,7 @@ public final class CreativeTabOrder {
"moleworm_spawn_egg", "mantis_spawn_egg", "alpha_mantis_spawn_egg", "rolly_polly_spawn_egg",
"molevore_spawn_egg", "triffid_spawn_egg", "apple_cow_spawn_egg", "golden_apple_cow_spawn_egg",
"enchanted_golden_apple_cow_spawn_egg", "dr_trayaurus_spawn_egg", "wasp_spawn_egg",
"bomber_spawn_egg", "jumpy_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg",
"bomber_spawn_egg", "jumpy_bug_spawn_egg", "spit_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg",
"kraken_spawn_egg", "missile_squid_spawn_egg", "octopus_bomb_spawn_egg",
"nightmare_spawn_egg", "bed_bug_spawn_egg", "lucid_spawn_egg", "scorpion_spawn_egg",
"basilisk_spawn_egg", "emperor_scorpion_spawn_egg", "toreterror_spawn_egg",
@@ -163,6 +169,8 @@ public final class CreativeTabOrder {
case "camellia" -> 2;
case "spider_lily" -> 3;
case "hushweed" -> 4;
case "hanging_creeproots" -> 21;
case "molting_vines" -> 22;
case "amber_lichen" -> 5;
case "creepvine" -> 6;
case "triffid_goo_block" -> 7;
@@ -187,14 +195,30 @@ public final class CreativeTabOrder {
case "blood_crystal_cluster" -> 5;
case "myrmite" -> 6;
case "broodstone" -> 7;
case "chiten_block" -> 8;
case "chiten_spike" -> 9;
case "amber_moss_block" -> 10;
case "amber_moss_carpet" -> 11;
case "polished_broodstone" -> 8;
case "chiseled_broodstone" -> 9;
case "broodstone_bricks" -> 10;
case "broodstone_stairs" -> 11;
case "broodstone_slab" -> 12;
case "broodstone_wall" -> 13;
case "polished_broodstone_stairs" -> 14;
case "polished_broodstone_slab" -> 15;
case "polished_broodstone_wall" -> 16;
case "broodstone_brick_stairs" -> 17;
case "broodstone_brick_slab" -> 18;
case "broodstone_brick_wall" -> 19;
case "chiten_block" -> 20;
case "chiten_spike" -> 21;
case "amber_moss_block" -> 22;
case "amber_moss_carpet" -> 23;
case "glowcap_mushroom" -> 24;
case "glowcap_mushroom_block" -> 25;
case "uranium_ore" -> 0;
case "deepslate_uranium_ore" -> 1;
case "titanium_ore" -> 2;
case "deepslate_titanium_ore" -> 3;
case "broodstone_uranium_ore" -> 2;
case "titanium_ore" -> 3;
case "deepslate_titanium_ore" -> 4;
case "broodstone_titanium_ore" -> 5;
case "uranium_block" -> 4;
case "titanium_block" -> 5;
case "cut_uranium" -> 6;
@@ -256,16 +280,17 @@ public final class CreativeTabOrder {
case "gravity_gun" -> 6;
case "water_cannon" -> 7;
case "nightmare_sword" -> 8;
case "lucid_pearl" -> 9;
case "scorpion_whip" -> 10;
case "blood_crystal_katana" -> 11;
case "big_bertha" -> 12;
case "big_bertha_blade" -> 13;
case "big_bertha_handle" -> 14;
case "big_bertha_hilt" -> 15;
case "ultimate_sword" -> 16;
case "ultimate_mace" -> 17;
case "krakens_grasp" -> 18;
case "attitude_adjuster" -> 9;
case "lucid_pearl" -> 10;
case "scorpion_whip" -> 11;
case "blood_crystal_katana" -> 12;
case "big_bertha" -> 13;
case "big_bertha_blade" -> 14;
case "big_bertha_handle" -> 15;
case "big_bertha_hilt" -> 16;
case "ultimate_sword" -> 17;
case "ultimate_mace" -> 18;
case "krakens_grasp" -> 19;
case "primordial_helmet" -> 0;
case "primordial_chestplate" -> 1;
case "primordial_leggings" -> 2;
@@ -294,6 +319,9 @@ public final class CreativeTabOrder {
case "cooked_corndog" -> 7;
case "raw_venison" -> 8;
case "cooked_venison" -> 9;
case "raw_bug_meat" -> 10;
case "cooked_bug_meat" -> 11;
case "broodfruit" -> 12;
case "blood_crystal_apple" -> 10;
case "spirit_apple" -> 11;
case "peach" -> 12;
@@ -315,18 +343,19 @@ public final class CreativeTabOrder {
case "titanium_ingot" -> 12;
case "lucid_eye" -> 13;
case "mantis_claw" -> 14;
case "jumpy_bug_leg" -> 15;
case "brutalfly_wing" -> 16;
case "cornea_ear" -> 17;
case "primordial_scute" -> 18;
case "triffid_goo" -> 19;
case "vortex_eye" -> 20;
case "king_scale" -> 21;
case "queen_scale" -> 22;
case "chiten" -> 23;
case "stink_bug" -> 24;
case "corn" -> 25;
case "high_fructose_corn_syrup" -> 26;
case "hercules_horn" -> 15;
case "jumpy_bug_leg" -> 16;
case "brutalfly_wing" -> 17;
case "cornea_ear" -> 18;
case "primordial_scute" -> 19;
case "triffid_goo" -> 20;
case "vortex_eye" -> 21;
case "king_scale" -> 22;
case "queen_scale" -> 23;
case "chiten" -> 24;
case "stink_bug" -> 25;
case "corn" -> 26;
case "high_fructose_corn_syrup" -> 27;
default -> 0;
};
}
@@ -2,11 +2,14 @@ package com.craisinlord.antarchy.content.block;
import com.craisinlord.antarchy.content.AntarchyObjects;
import com.craisinlord.antarchy.content.block.entity.CritterCageBlockEntity;
import com.craisinlord.antarchy.content.entity.ant.AntTeleportHelper;
import com.mojang.serialization.MapCodec;
import java.util.List;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.player.Player;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BaseEntityBlock;
import net.minecraft.world.level.block.Block;
@@ -16,6 +19,9 @@ import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
@@ -62,10 +68,24 @@ public class CritterCageBlock extends BaseEntityBlock {
}
@Override
public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack stack) {
super.playerDestroy(level, player, pos, state, blockEntity, stack);
if (level instanceof ServerLevel serverLevel && blockEntity instanceof CritterCageBlockEntity critterCageBlockEntity) {
Block.popResource(serverLevel, pos, critterCageBlockEntity.toItemStack());
}
protected List<ItemStack> getDrops(BlockState state, LootParams.Builder params) {
BlockEntity blockEntity = params.getOptionalParameter(LootContextParams.BLOCK_ENTITY);
if (blockEntity instanceof CritterCageBlockEntity critterCageBlockEntity) {
return List.of(critterCageBlockEntity.toItemStack());
}
return super.getDrops(state, params);
}
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
if (!(player instanceof ServerPlayer serverPlayer)) {
return InteractionResult.SUCCESS;
}
if (!(level.getBlockEntity(pos) instanceof CritterCageBlockEntity blockEntity)) {
return InteractionResult.PASS;
}
return AntTeleportHelper.handleCagedAntTeleport(serverPlayer, blockEntity.entityTypeId(), blockEntity.entityData());
}
}
@@ -0,0 +1,115 @@
package com.craisinlord.antarchy.content.block;
import com.craisinlord.antarchy.Antarchy;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.level.Level;
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.BushBlock;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public class GlowcapMushroomBlock extends BushBlock implements BonemealableBlock {
public static final MapCodec<GlowcapMushroomBlock> CODEC = Block.simpleCodec(GlowcapMushroomBlock::new);
private static final VoxelShape SHAPE = Block.box(3.9D, 0.0D, 3.9D, 12.1D, 12.0D, 12.1D);
private static final ResourceKey<ConfiguredFeature<?, ?>> HUGE_GLOWCAP_MUSHROOM = ResourceKey.create(
Registries.CONFIGURED_FEATURE,
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "huge_glowcap_mushroom")
);
private static final int SPREAD_ATTEMPTS = 4;
private static final int MAX_LIGHT_LEVEL = 13;
public GlowcapMushroomBlock(BlockBehaviour.Properties properties) {
super(properties);
}
@Override
public MapCodec<GlowcapMushroomBlock> codec() {
return CODEC;
}
@Override
protected VoxelShape getShape(BlockState state, net.minecraft.world.level.BlockGetter level, BlockPos pos, CollisionContext context) {
return SHAPE;
}
@Override
protected boolean mayPlaceOn(BlockState state, net.minecraft.world.level.BlockGetter level, BlockPos pos) {
return state.is(BlockTags.MUSHROOM_GROW_BLOCK) || state.isFaceSturdy(level, pos, Direction.UP);
}
@Override
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
BlockPos belowPos = pos.below();
BlockState below = level.getBlockState(belowPos);
return this.mayPlaceOn(below, level, belowPos) && (below.is(BlockTags.MUSHROOM_GROW_BLOCK) || level.getRawBrightness(pos, 0) < MAX_LIGHT_LEVEL);
}
@Override
protected boolean isRandomlyTicking(BlockState state) {
return true;
}
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (random.nextInt(25) != 0) {
return;
}
int spreadRange = 4;
BlockPos targetPos = pos;
for (int i = 0; i < SPREAD_ATTEMPTS; i++) {
targetPos = pos.offset(
random.nextInt(spreadRange * 2 + 1) - spreadRange,
random.nextInt(3) - 1,
random.nextInt(spreadRange * 2 + 1) - spreadRange
);
if (level.isEmptyBlock(targetPos) && canSpreadTo(level, targetPos)) {
level.setBlock(targetPos, this.defaultBlockState(), 2);
break;
}
}
}
private boolean canSpreadTo(ServerLevel level, BlockPos pos) {
if (level.getRawBrightness(pos, 0) > MAX_LIGHT_LEVEL) {
return false;
}
BlockState below = level.getBlockState(pos.below());
return this.mayPlaceOn(below, level, pos.below());
}
@Override
public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
return true;
}
@Override
public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) {
return random.nextFloat() < 0.4F;
}
@Override
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
Holder.Reference<ConfiguredFeature<?, ?>> feature = level.registryAccess()
.lookupOrThrow(Registries.CONFIGURED_FEATURE)
.getOrThrow(HUGE_GLOWCAP_MUSHROOM);
level.removeBlock(pos, false);
if (!feature.value().place(level, level.getChunkSource().getGenerator(), random, pos)) {
level.setBlock(pos, state, 3);
}
}
}
@@ -0,0 +1,93 @@
package com.craisinlord.antarchy.content.block;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockGetter;
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.BushBlock;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public class HangingCreeprootsBlock extends BushBlock {
public static final MapCodec<HangingCreeprootsBlock> CODEC = Block.simpleCodec(HangingCreeprootsBlock::new);
public static final IntegerProperty DISTANCE = IntegerProperty.create("distance", 0, 4);
public static final BooleanProperty BOTTOM = BooleanProperty.create("bottom");
private static final int MAX_DISTANCE = 4;
private static final VoxelShape SHAPE = Block.box(4.0D, 0.0D, 4.0D, 12.0D, 16.0D, 12.0D);
public HangingCreeprootsBlock(BlockBehaviour.Properties properties) {
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(DISTANCE, 0).setValue(BOTTOM, true));
}
@Override
public MapCodec<HangingCreeprootsBlock> codec() {
return CODEC;
}
@Override
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
return SHAPE;
}
@Override
protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) {
return state.is(this) || state.isFaceSturdy(level, pos, Direction.DOWN);
}
@Override
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
BlockPos abovePos = pos.above();
return this.mayPlaceOn(level.getBlockState(abovePos), level, abovePos);
}
@Override
protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) {
if (!state.canSurvive(level, pos)) {
return net.minecraft.world.level.block.Blocks.AIR.defaultBlockState();
}
if (direction == Direction.DOWN) {
boolean bottom = !neighborState.is(this);
if (bottom != state.getValue(BOTTOM)) {
state = state.setValue(BOTTOM, bottom);
}
}
return state;
}
@Override
protected boolean isRandomlyTicking(BlockState state) {
return state.getValue(BOTTOM) && state.getValue(DISTANCE) < MAX_DISTANCE;
}
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (!state.getValue(BOTTOM) || state.getValue(DISTANCE) >= MAX_DISTANCE) {
return;
}
BlockPos belowPos = pos.below();
if (random.nextInt(4) != 0 || !level.getBlockState(belowPos).isAir()) {
return;
}
int distance = state.getValue(DISTANCE);
level.setBlock(pos, state.setValue(BOTTOM, false), Block.UPDATE_CLIENTS);
level.setBlock(belowPos, this.defaultBlockState().setValue(DISTANCE, distance + 1).setValue(BOTTOM, true), Block.UPDATE_ALL);
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(DISTANCE, BOTTOM);
}
}
@@ -29,6 +29,7 @@ import net.minecraft.world.phys.shapes.VoxelShape;
import org.jetbrains.annotations.Nullable;
public class HushweedBlock extends BaseEntityBlock {
private static final VoxelShape SHAPE = Block.box(4.0D, 0.0D, 4.0D, 12.0D, 18.0D, 12.0D);
public static final DirectionProperty FACING = BlockStateProperties.VERTICAL_DIRECTION;
public static final MapCodec<HushweedBlock> CODEC = Block.simpleCodec(HushweedBlock::new);
@@ -61,12 +62,12 @@ public class HushweedBlock extends BaseEntityBlock {
@Override
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
return Blocks.AZALEA.defaultBlockState().getShape(level, pos, context);
return SHAPE;
}
@Override
protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
return Blocks.AZALEA.defaultBlockState().getCollisionShape(level, pos, context);
return SHAPE;
}
@Override
@@ -0,0 +1,145 @@
package com.craisinlord.antarchy.content.block;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.entity.JumpyBugEntity;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.EntityType;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
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.Blocks;
import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public class JumpyBugEggBlock extends Block {
public static final MapCodec<JumpyBugEggBlock> CODEC = Block.simpleCodec(JumpyBugEggBlock::new);
public static final IntegerProperty HATCH = BlockStateProperties.HATCH;
public static final BooleanProperty HANGING = BlockStateProperties.HANGING;
public static final BooleanProperty ROTATED = BooleanProperty.create("rotated");
private static final int MAX_HATCH = 2;
private static final VoxelShape FLOOR_SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D);
private static final VoxelShape CEILING_SHAPE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D);
private static final ResourceLocation JUMPY_BUG_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "jumpy_bug");
public JumpyBugEggBlock(BlockBehaviour.Properties properties) {
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(HATCH, 0).setValue(HANGING, false).setValue(ROTATED, false));
}
@Override
public MapCodec<JumpyBugEggBlock> codec() {
return CODEC;
}
@Override
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
return state.getValue(HANGING) ? CEILING_SHAPE : FLOOR_SHAPE;
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
boolean hanging = context.getClickedFace() == Direction.DOWN
|| (context.getClickedFace() != Direction.UP && !canSupportFloor(context.getLevel(), context.getClickedPos()) && canSupportCeiling(context.getLevel(), context.getClickedPos()));
boolean rotated = context.getHorizontalDirection().getAxis() == Direction.Axis.X;
return this.defaultBlockState().setValue(HANGING, hanging).setValue(ROTATED, rotated);
}
@Override
protected BlockState rotate(BlockState state, Rotation rotation) {
return rotation == Rotation.CLOCKWISE_90 || rotation == Rotation.COUNTERCLOCKWISE_90
? state.setValue(ROTATED, !state.getValue(ROTATED))
: state;
}
@Override
protected BlockState mirror(BlockState state, Mirror mirror) {
return state;
}
@Override
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
return state.getValue(HANGING) ? canSupportCeiling(level, pos) : canSupportFloor(level, pos);
}
@Override
protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) {
return state.canSurvive(level, pos) ? super.updateShape(state, direction, neighborState, level, pos, neighborPos) : Blocks.AIR.defaultBlockState();
}
private static boolean canSupportFloor(LevelReader level, BlockPos pos) {
return level.getBlockState(pos.below()).isFaceSturdy(level, pos.below(), Direction.UP);
}
private static boolean canSupportCeiling(LevelReader level, BlockPos pos) {
return level.getBlockState(pos.above()).isFaceSturdy(level, pos.above(), Direction.DOWN);
}
@Override
protected boolean isRandomlyTicking(BlockState state) {
return true;
}
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (!this.shouldUpdateHatchLevel(level, pos, state)) {
return;
}
int hatch = state.getValue(HATCH);
if (hatch < MAX_HATCH) {
level.setBlock(pos, state.setValue(HATCH, hatch + 1), 2);
level.playSound(null, pos, SoundEvents.TURTLE_EGG_CRACK, SoundSource.BLOCKS, 0.7F, 0.95F + random.nextFloat() * 0.1F);
return;
}
this.hatch(level, pos, random);
}
private boolean shouldUpdateHatchLevel(Level level, BlockPos pos, BlockState state) {
BlockPos checkPos = state.getValue(HANGING) ? pos.above() : pos.below();
boolean onAmberMoss = level.getBlockState(checkPos).getBlock() instanceof AmberMossBlock;
return level.random.nextInt(onAmberMoss ? 150 : 500) == 0;
}
private void hatch(ServerLevel level, BlockPos pos, RandomSource random) {
level.removeBlock(pos, false);
level.playSound(null, pos, SoundEvents.TURTLE_EGG_HATCH, SoundSource.BLOCKS, 0.75F, 0.95F + random.nextFloat() * 0.1F);
@SuppressWarnings("unchecked")
EntityType<JumpyBugEntity> jumpyBugType = (EntityType<JumpyBugEntity>) (EntityType<?>) BuiltInRegistries.ENTITY_TYPE.getOptional(JUMPY_BUG_ID).orElse(null);
if (jumpyBugType == null) {
return;
}
JumpyBugEntity entity = jumpyBugType.create(level);
if (entity == null) {
return;
}
double spawnX = pos.getX() + 0.25D + random.nextDouble() * 0.5D;
double spawnZ = pos.getZ() + 0.25D + random.nextDouble() * 0.5D;
entity.moveTo(spawnX, pos.getY() + 0.1D, spawnZ, random.nextFloat() * 360.0F, 0.0F);
level.addFreshEntity(entity);
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(HATCH, HANGING, ROTATED);
}
}
@@ -0,0 +1,204 @@
package com.craisinlord.antarchy.content.block;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.ItemInteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
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.BushBlock;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public class MoltingVinesBlock extends BushBlock implements BonemealableBlock {
public static final MapCodec<MoltingVinesBlock> CODEC = Block.simpleCodec(MoltingVinesBlock::new);
public static final EnumProperty<Direction> GROWTH_DIRECTION = EnumProperty.create("growth_direction", Direction.class, Direction.UP, Direction.DOWN);
public static final BooleanProperty TOP_CAP = BooleanProperty.create("top_cap");
public static final BooleanProperty BOTTOM_CAP = BooleanProperty.create("bottom_cap");
public static final BooleanProperty BROODFRUIT = BooleanProperty.create("broodfruit");
public static final IntegerProperty DISTANCE = IntegerProperty.create("distance", 0, 6);
private static final int MAX_DISTANCE = 6;
private static final int NATURAL_FRUIT_CHANCE = 40;
private static final VoxelShape SHAPE = Block.box(5.0D, 0.0D, 5.0D, 11.0D, 16.0D, 11.0D);
private static final ResourceLocation BROODFRUIT_ITEM_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "broodfruit");
public MoltingVinesBlock(BlockBehaviour.Properties properties) {
super(properties);
this.registerDefaultState(this.stateDefinition.any()
.setValue(GROWTH_DIRECTION, Direction.DOWN)
.setValue(TOP_CAP, false)
.setValue(BOTTOM_CAP, true)
.setValue(BROODFRUIT, false)
.setValue(DISTANCE, 0));
}
@Override
public MapCodec<MoltingVinesBlock> codec() {
return CODEC;
}
@Override
protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
return SHAPE;
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
BlockGetter level = context.getLevel();
BlockPos pos = context.getClickedPos();
Direction growthDirection = resolveGrowthDirection(level, pos);
return computeState(this.defaultBlockState().setValue(GROWTH_DIRECTION, growthDirection).setValue(DISTANCE, 0), level, pos);
}
private Direction resolveGrowthDirection(BlockGetter level, BlockPos pos) {
BlockState belowState = level.getBlockState(pos.below());
if (belowState.is(this) && belowState.getValue(GROWTH_DIRECTION) == Direction.UP) {
return Direction.UP;
}
BlockState aboveState = level.getBlockState(pos.above());
if (aboveState.is(this) && aboveState.getValue(GROWTH_DIRECTION) == Direction.DOWN) {
return Direction.DOWN;
}
return hasSturdyAnchor(level, pos, Direction.UP) ? Direction.DOWN : Direction.UP;
}
private static boolean hasSturdyAnchor(BlockGetter level, BlockPos pos, Direction towardAnchor) {
BlockPos anchorPos = pos.relative(towardAnchor);
BlockState anchorState = level.getBlockState(anchorPos);
return anchorState.isFaceSturdy(level, anchorPos, towardAnchor.getOpposite());
}
@Override
protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) {
return state.is(this) || state.isFaceSturdy(level, pos, Direction.DOWN) || state.isFaceSturdy(level, pos, Direction.UP);
}
@Override
protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) {
Direction anchorDirection = state.getValue(GROWTH_DIRECTION).getOpposite();
BlockPos anchorPos = pos.relative(anchorDirection);
BlockState anchorState = level.getBlockState(anchorPos);
if (anchorState.is(this)) {
return true;
}
return anchorState.isFaceSturdy(level, anchorPos, anchorDirection.getOpposite());
}
@Override
protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) {
if (!state.canSurvive(level, pos)) {
return net.minecraft.world.level.block.Blocks.AIR.defaultBlockState();
}
if (direction == Direction.UP || direction == Direction.DOWN) {
return computeState(state, level, pos);
}
return state;
}
private static BlockState computeState(BlockState state, BlockGetter level, BlockPos pos) {
boolean aboveIsSame = level.getBlockState(pos.above()).is(state.getBlock());
boolean belowIsSame = level.getBlockState(pos.below()).is(state.getBlock());
Direction growthDirection = state.getValue(GROWTH_DIRECTION);
boolean topCap = growthDirection == Direction.UP && !aboveIsSame;
boolean bottomCap = growthDirection == Direction.DOWN && !belowIsSame;
state = state.setValue(TOP_CAP, topCap).setValue(BOTTOM_CAP, bottomCap);
if (topCap || bottomCap) {
state = state.setValue(BROODFRUIT, false);
}
return state;
}
@Override
protected boolean isRandomlyTicking(BlockState state) {
return true;
}
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
boolean isTip = state.getValue(GROWTH_DIRECTION) == Direction.DOWN ? state.getValue(BOTTOM_CAP) : state.getValue(TOP_CAP);
if (isTip && state.getValue(DISTANCE) < MAX_DISTANCE && random.nextInt(6) == 0) {
BlockPos growPos = pos.relative(state.getValue(GROWTH_DIRECTION));
if (level.getBlockState(growPos).isAir()) {
BlockState grownState = this.defaultBlockState()
.setValue(GROWTH_DIRECTION, state.getValue(GROWTH_DIRECTION))
.setValue(DISTANCE, state.getValue(DISTANCE) + 1);
level.setBlock(growPos, grownState, Block.UPDATE_ALL);
BlockState posState = level.getBlockState(pos);
if (posState.is(this)) {
level.setBlock(pos, computeState(posState, level, pos), Block.UPDATE_CLIENTS);
}
BlockState growState = level.getBlockState(growPos);
if (growState.is(this)) {
level.setBlock(growPos, computeState(growState, level, growPos), Block.UPDATE_CLIENTS);
}
}
}
if (!state.getValue(TOP_CAP) && !state.getValue(BOTTOM_CAP) && !state.getValue(BROODFRUIT) && random.nextInt(NATURAL_FRUIT_CHANCE) == 0) {
level.setBlock(pos, state.setValue(BROODFRUIT, true), Block.UPDATE_ALL);
}
}
@Override
public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
return !state.getValue(TOP_CAP) && !state.getValue(BOTTOM_CAP) && !state.getValue(BROODFRUIT);
}
@Override
public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) {
return true;
}
@Override
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
level.setBlock(pos, state.setValue(BROODFRUIT, true), Block.UPDATE_ALL);
}
@Override
protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) {
if (!state.getValue(BROODFRUIT)) {
return super.useItemOn(stack, state, level, pos, player, hand, hitResult);
}
if (!level.isClientSide) {
BuiltInRegistries.ITEM.getOptional(BROODFRUIT_ITEM_ID).ifPresent(item -> harvestFruit(level, pos, item));
level.setBlock(pos, state.setValue(BROODFRUIT, false), Block.UPDATE_ALL);
}
return ItemInteractionResult.sidedSuccess(level.isClientSide);
}
private static void harvestFruit(Level level, BlockPos pos, Item item) {
Block.popResource(level, pos, new ItemStack(item, 1));
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(GROWTH_DIRECTION, TOP_CAP, BOTTOM_CAP, BROODFRUIT, DISTANCE);
}
}
@@ -95,6 +95,16 @@ public class CritterCageBlockEntity extends BlockEntity {
return this.secondaryColor;
}
@Nullable
public ResourceLocation entityTypeId() {
return this.entityTypeId;
}
@Nullable
public CompoundTag entityData() {
return this.entityData == null ? null : this.entityData.copy();
}
@Nullable
public Entity getOrCreateClientDisplayEntity(Level level) {
if (level == null || level.isClientSide == false) {
@@ -16,7 +16,14 @@ public final class CameraShakeClientState {
private record Source(double range, float strength, BooleanSupplier active) {
}
private record Impact(Vec3 position, float intensity, int remainingTicks, int totalTicks, float radius) {
private Impact ticked() {
return new Impact(position, intensity, remainingTicks - 1, totalTicks, radius);
}
}
private static final Map<LivingEntity, Source> SOURCES = new HashMap<>();
private static final java.util.List<Impact> IMPACTS = new java.util.ArrayList<>();
private CameraShakeClientState() {
}
@@ -26,10 +33,6 @@ public final class CameraShakeClientState {
}
public static float getStrength(Vec3 cameraPos) {
if (SOURCES.isEmpty()) {
return 0.0F;
}
float total = 0.0F;
Iterator<Map.Entry<LivingEntity, Source>> iterator = SOURCES.entrySet().iterator();
while (iterator.hasNext()) {
@@ -49,10 +52,41 @@ public final class CameraShakeClientState {
total += (float) ((1.0D - distance / source.range()) * source.strength());
}
Iterator<Impact> impactIterator = IMPACTS.iterator();
while (impactIterator.hasNext()) {
Impact impact = impactIterator.next();
if (impact.remainingTicks() <= 0) {
impactIterator.remove();
continue;
}
double distance = Math.sqrt(cameraPos.distanceToSqr(impact.position()));
if (distance > impact.radius()) {
continue;
}
total += (float) ((1.0D - distance / impact.radius()) * impact.intensity() * (impact.remainingTicks() / (float) Math.max(1, impact.totalTicks())));
}
return total;
}
public static void triggerImpact(Vec3 position, float intensity, int durationTicks, float radius) {
int ticks = Math.max(1, durationTicks);
IMPACTS.add(new Impact(position, intensity, ticks, ticks, Math.max(1.0F, radius)));
}
public static void tick() {
for (int i = IMPACTS.size() - 1; i >= 0; i--) {
Impact impact = IMPACTS.get(i);
if (impact.remainingTicks() <= 1) {
IMPACTS.remove(i);
} else {
IMPACTS.set(i, impact.ticked());
}
}
}
public static void clear() {
SOURCES.clear();
IMPACTS.clear();
}
}
@@ -6,6 +6,8 @@ import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.GeoModel;
public class BasiliskModel extends GeoModel<BasiliskEntity> {
public static final ResourceLocation EMISSIVE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/basilisk_emissive.png");
@Override
public ResourceLocation getModelResource(BasiliskEntity animatable) {
@@ -6,6 +6,9 @@ import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.GeoModel;
public class BedBugModel extends GeoModel<BedBugEntity> {
public static final ResourceLocation EMISSIVE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/bed_bug_emissive.png");
@Override
public ResourceLocation getModelResource(BedBugEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/bed_bug.geo.json");
@@ -6,6 +6,9 @@ import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.GeoModel;
public class BrutalflyModel extends GeoModel<BrutalflyEntity> {
public static final ResourceLocation EMISSIVE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/brutalfly_emissive.png");
@Override
public ResourceLocation getModelResource(BrutalflyEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/brutalfly.geo.json");
@@ -10,6 +10,8 @@ public class HerculesBeetleModel extends GeoModel<HerculesBeetleEntity> {
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/hercules_beetle/hercules_beetle.png");
private static final ResourceLocation TEXTURE_SADDLED =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/hercules_beetle/hercules_beetle_saddle.png");
public static final ResourceLocation EMISSIVE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/hercules_beetle/hercules_beetle_emissive.png");
@Override
public ResourceLocation getModelResource(HerculesBeetleEntity animatable) {
@@ -6,6 +6,9 @@ import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.GeoModel;
public class JumpyBugModel extends GeoModel<JumpyBugEntity> {
public static final ResourceLocation EMISSIVE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/jumpy_bug_emissive.png");
@Override
public ResourceLocation getModelResource(JumpyBugEntity animatable) {
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/jumpy_bug.geo.json");
@@ -1,10 +1,14 @@
package com.craisinlord.antarchy.content.client.model;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity;
import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.GeoModel;
public class KrakenModel extends GeoModel<KrakenEntity> {
public static final ResourceLocation EMISSIVE_TEXTURE =
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/kraken_emissive.png");
@Override
public ResourceLocation getModelResource(KrakenEntity animatable) {
return ResourceLocation.fromNamespaceAndPath("antarchy", "geo/kraken.geo.json");
@@ -0,0 +1,23 @@
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");
}
}
@@ -5,16 +5,20 @@ import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity;
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 BasiliskRenderer extends GeoEntityRenderer<BasiliskEntity> {
public BasiliskRenderer(EntityRendererProvider.Context context) {
super(context, new BasiliskModel());
this.shadowRadius = 1.0F;
this.addRenderLayer(new BasiliskEmissiveLayer(this));
}
@Override
@@ -31,4 +35,30 @@ public class BasiliskRenderer extends GeoEntityRenderer<BasiliskEntity> {
protected float getDeathMaxRotation(BasiliskEntity animatable) {
return 0.0F;
}
private static final class BasiliskEmissiveLayer extends GeoRenderLayer<BasiliskEntity> {
private BasiliskEmissiveLayer(GeoEntityRenderer<BasiliskEntity> renderer) {
super(renderer);
}
@Override
public void render(PoseStack poseStack, BasiliskEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
int packedLight, int packedOverlay) {
RenderType emissiveType = RenderType.eyes(BasiliskModel.EMISSIVE_TEXTURE);
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
this.getRenderer().reRender(
bakedModel,
poseStack,
bufferSource,
animatable,
emissiveType,
emissiveBuffer,
partialTick,
0xF000F0,
OverlayTexture.NO_OVERLAY,
0xFFFFFFFF
);
}
}
}
@@ -5,10 +5,13 @@ import com.craisinlord.antarchy.content.entity.BedBugEntity;
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 BedBugRenderer extends GeoEntityRenderer<BedBugEntity> {
private static final float ADULT_SCALE = 0.9F;
@@ -19,6 +22,7 @@ public class BedBugRenderer extends GeoEntityRenderer<BedBugEntity> {
super(context, new BedBugModel());
this.shadowRadius = ADULT_SHADOW_RADIUS;
this.withScale(ADULT_SCALE);
this.addRenderLayer(new BedBugEmissiveLayer(this));
}
@Override
@@ -32,4 +36,30 @@ public class BedBugRenderer extends GeoEntityRenderer<BedBugEntity> {
this.shadowRadius = ADULT_SHADOW_RADIUS;
}
}
private static final class BedBugEmissiveLayer extends GeoRenderLayer<BedBugEntity> {
private BedBugEmissiveLayer(GeoEntityRenderer<BedBugEntity> renderer) {
super(renderer);
}
@Override
public void render(PoseStack poseStack, BedBugEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
int packedLight, int packedOverlay) {
RenderType emissiveType = RenderType.eyes(BedBugModel.EMISSIVE_TEXTURE);
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
this.getRenderer().reRender(
bakedModel,
poseStack,
bufferSource,
animatable,
emissiveType,
emissiveBuffer,
partialTick,
0xF000F0,
OverlayTexture.NO_OVERLAY,
0xFFFFFFFF
);
}
}
}
@@ -7,11 +7,13 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.MultiBufferSource;
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.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 BrutalflyRenderer extends GeoEntityRenderer<BrutalflyEntity> {
@@ -20,6 +22,7 @@ public class BrutalflyRenderer extends GeoEntityRenderer<BrutalflyEntity> {
public BrutalflyRenderer(EntityRendererProvider.Context context) {
super(context, new BrutalflyModel());
this.shadowRadius = 1.35F;
this.addRenderLayer(new BrutalflyEmissiveLayer(this));
}
@Override
@@ -53,4 +56,30 @@ public class BrutalflyRenderer extends GeoEntityRenderer<BrutalflyEntity> {
protected float getDeathMaxRotation(BrutalflyEntity animatable) {
return 0.0F;
}
private static final class BrutalflyEmissiveLayer extends GeoRenderLayer<BrutalflyEntity> {
private BrutalflyEmissiveLayer(GeoEntityRenderer<BrutalflyEntity> renderer) {
super(renderer);
}
@Override
public void render(PoseStack poseStack, BrutalflyEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
int packedLight, int packedOverlay) {
RenderType emissiveType = RenderType.eyes(BrutalflyModel.EMISSIVE_TEXTURE);
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
this.getRenderer().reRender(
bakedModel,
poseStack,
bufferSource,
animatable,
emissiveType,
emissiveBuffer,
partialTick,
0xF000F0,
OverlayTexture.NO_OVERLAY,
0xFFFFFFFF
);
}
}
}
@@ -2,11 +2,46 @@ package com.craisinlord.antarchy.content.client.renderer;
import com.craisinlord.antarchy.content.client.model.HerculesBeetleModel;
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
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 HerculesBeetleRenderer extends GeoEntityRenderer<HerculesBeetleEntity> {
public HerculesBeetleRenderer(EntityRendererProvider.Context context) {
super(context, new HerculesBeetleModel());
this.addRenderLayer(new HerculesBeetleEmissiveLayer(this));
}
private static final class HerculesBeetleEmissiveLayer extends GeoRenderLayer<HerculesBeetleEntity> {
private HerculesBeetleEmissiveLayer(GeoEntityRenderer<HerculesBeetleEntity> renderer) {
super(renderer);
}
@Override
public void render(PoseStack poseStack, HerculesBeetleEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
int packedLight, int packedOverlay) {
RenderType emissiveType = RenderType.eyes(HerculesBeetleModel.EMISSIVE_TEXTURE);
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
this.getRenderer().reRender(
bakedModel,
poseStack,
bufferSource,
animatable,
emissiveType,
emissiveBuffer,
partialTick,
0xF000F0,
OverlayTexture.NO_OVERLAY,
0xFFFFFFFF
);
}
}
}
@@ -8,16 +8,19 @@ import com.mojang.math.Axis;
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;
import software.bernie.geckolib.util.Color;
public class JumpyBugRenderer extends GeoEntityRenderer<JumpyBugEntity> {
public JumpyBugRenderer(EntityRendererProvider.Context context) {
super(context, new JumpyBugModel());
this.shadowRadius = 6.0F;
this.addRenderLayer(new JumpyBugEmissiveLayer(this));
}
@Override
@@ -41,4 +44,34 @@ public class JumpyBugRenderer extends GeoEntityRenderer<JumpyBugEntity> {
poseStack.mulPose(Axis.ZP.rotationDegrees(180.0F));
}
}
private static final class JumpyBugEmissiveLayer extends GeoRenderLayer<JumpyBugEntity> {
private JumpyBugEmissiveLayer(GeoEntityRenderer<JumpyBugEntity> renderer) {
super(renderer);
}
@Override
public void render(PoseStack poseStack, JumpyBugEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
int packedLight, int packedOverlay) {
RenderType emissiveType = animatable.isCamouflaged()
? RenderType.entityTranslucent(JumpyBugModel.EMISSIVE_TEXTURE)
: RenderType.eyes(JumpyBugModel.EMISSIVE_TEXTURE);
int alpha = Math.max(10, Math.min(255, Math.round(animatable.getVisualAlpha(partialTick) * 255.0F)));
int colour = (alpha << 24) | 0x00FFFFFF;
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
this.getRenderer().reRender(
bakedModel,
poseStack,
bufferSource,
animatable,
emissiveType,
emissiveBuffer,
partialTick,
0xF000F0,
OverlayTexture.NO_OVERLAY,
colour
);
}
}
}
@@ -2,13 +2,48 @@ package com.craisinlord.antarchy.content.client.renderer;
import com.craisinlord.antarchy.content.client.model.KrakenModel;
import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity;
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 KrakenRenderer extends GeoEntityRenderer<KrakenEntity> {
public KrakenRenderer(EntityRendererProvider.Context context) {
super(context, new KrakenModel());
this.shadowRadius = 2.0F;
this.withScale(1.5F);
this.addRenderLayer(new KrakenEmissiveLayer(this));
}
private static final class KrakenEmissiveLayer extends GeoRenderLayer<KrakenEntity> {
private KrakenEmissiveLayer(GeoEntityRenderer<KrakenEntity> renderer) {
super(renderer);
}
@Override
public void render(PoseStack poseStack, KrakenEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType,
MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick,
int packedLight, int packedOverlay) {
RenderType emissiveType = RenderType.eyes(KrakenModel.EMISSIVE_TEXTURE);
VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType);
this.getRenderer().reRender(
bakedModel,
poseStack,
bufferSource,
animatable,
emissiveType,
emissiveBuffer,
partialTick,
0xF000F0,
OverlayTexture.NO_OVERLAY,
0xFFFFFFFF
);
}
}
}
@@ -0,0 +1,73 @@
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;
}
}
@@ -0,0 +1,14 @@
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);
}
}
@@ -49,8 +49,8 @@ public class GlimmerRenderer extends GeoEntityRenderer<GlimmerEntity> {
poseStack.scale(growth, growth, growth);
// Compute body yaw directly from the entity's own tracked fields rather than trusting
// the ambient entityYaw parameter, so the body pose and the head-offset math below are
// always self-consistent (this is what caused the head to look "detached" from the body).
// the ambient entityYaw parameter, so the body pose and the head-offset math below stay
// self-consistent.
float bodyYaw = Mth.rotLerp(partialTick, entity.yBodyRotO, entity.yBodyRot);
poseStack.mulPose(Axis.YP.rotationDegrees(180.0F - bodyYaw));
poseStack.scale(-1.0F, -1.0F, 1.0F);
@@ -115,6 +115,34 @@ public final class AntarchyDamageSources {
);
}
public static DamageSource spitBugDisrespect(ServerLevel level, @Nullable Entity directEntity, @Nullable Entity causingEntity) {
return new DamageSource(
level.registryAccess()
.registryOrThrow(Registries.DAMAGE_TYPE)
.getHolderOrThrow(AntarchyDamageTypes.SPIT_BUG_DISRESPECT),
directEntity,
causingEntity
);
}
public static DamageSource jumpyBugJump(ServerLevel level, Entity attacker) {
return new DamageSource(
level.registryAccess()
.registryOrThrow(Registries.DAMAGE_TYPE)
.getHolderOrThrow(AntarchyDamageTypes.JUMPY_BUG_JUMP),
attacker
);
}
public static DamageSource herculesBeetleObliteration(ServerLevel level, Entity attacker) {
return new DamageSource(
level.registryAccess()
.registryOrThrow(Registries.DAMAGE_TYPE)
.getHolderOrThrow(AntarchyDamageTypes.HERCULES_BEETLE_OBLITERATION),
attacker
);
}
public static DamageSource waterSoaked(Level level, @Nullable Entity directEntity, @Nullable Entity causingEntity) {
return new DamageSource(
level.registryAccess()
@@ -85,6 +85,24 @@ public final class AntarchyDamageTypes {
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "rpo_launcher_blast")
);
public static final ResourceKey<DamageType> SPIT_BUG_DISRESPECT =
ResourceKey.create(
Registries.DAMAGE_TYPE,
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "spit_bug_disrespect")
);
public static final ResourceKey<DamageType> JUMPY_BUG_JUMP =
ResourceKey.create(
Registries.DAMAGE_TYPE,
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "jumpy_bug_jump")
);
public static final ResourceKey<DamageType> HERCULES_BEETLE_OBLITERATION =
ResourceKey.create(
Registries.DAMAGE_TYPE,
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hercules_beetle_obliteration")
);
private AntarchyDamageTypes() {
}
}
@@ -28,6 +28,7 @@ public class DrTrayaurusEntity extends AbstractVillager {
public DrTrayaurusEntity(EntityType<? extends AbstractVillager> entityType, Level level) {
super(entityType, level);
this.setCustomName(DISPLAY_NAME);
}
@Override
@@ -1,7 +1,9 @@
package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchySoundEvents;
import com.craisinlord.antarchy.content.AntarchyTags;
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
import com.craisinlord.antarchy.content.item.BigBerthaItem;
import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakeSync;
import java.util.EnumSet;
@@ -18,6 +20,7 @@ import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerBossEvent;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
@@ -315,6 +318,10 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
this.flightCooldown--;
}
if (this.isFlying() && this.tickCount % 16 == 0) {
this.playSound(AntarchySoundEvents.MANTIS_FLY_LOOP.get(), 0.5F, 0.85F + this.random.nextFloat() * 0.1F);
}
if (!this.level().isClientSide && !this.isKnockedDown() && this.isInWall()) {
this.breakBlocksForSuffocation();
}
@@ -564,6 +571,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
this.setDeltaMovement(Vec3.ZERO);
this.actionTicks = KNOCKED_DOWN_TICKS;
this.setAnimationState(ANIM_KNOCKED_DOWN);
this.playSound(AntarchySoundEvents.HERCULES_BEETLE_KNOCKED_DOWN.get(), 1.2F, 0.9F);
}
@Override
@@ -578,6 +586,9 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
if (this.random.nextInt(3) == 0) {
this.setTame(true, true);
this.setOwnerUUID(player.getUUID());
if (player instanceof ServerPlayer serverPlayer) {
CriteriaTriggers.TAME_ANIMAL.trigger(serverPlayer, this);
}
this.setKnockedDown(false);
this.heal(this.getMaxHealth());
this.setTarget(null);
@@ -702,7 +713,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
this.cryCooldown = CRY_COOLDOWN_TICKS;
this.combatCryDone = true;
this.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 200, 1));
this.playSound(SoundEvents.RAVAGER_ROAR, 1.5F, 0.7F);
this.playSound(AntarchySoundEvents.HERCULES_BEETLE_CRY.get(), 1.5F, 0.7F);
}
private void startRegularAttack(boolean flyingAttack, @Nullable LivingEntity target) {
@@ -727,14 +738,16 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
}
}
}
this.playSound(SoundEvents.RAVAGER_ATTACK, 1.2F, flyingAttack ? 1.1F : 0.9F);
this.playSound(AntarchySoundEvents.HERCULES_BEETLE_ATTACK.get(), 1.2F, flyingAttack ? 1.1F : 0.9F);
}
private boolean hurtAndLaunchTarget(LivingEntity target, float damage, double horizontalKnockback) {
if (!this.canHarm(target)) {
return false;
}
boolean hurt = target.hurt(this.damageSources().mobAttack(this), damage);
boolean hurt = this.level() instanceof ServerLevel serverLevel
? target.hurt(AntarchyDamageSources.herculesBeetleObliteration(serverLevel, this), damage)
: target.hurt(this.damageSources().mobAttack(this), damage);
if (hurt) {
Vec3 push = target.position().subtract(this.position()).multiply(1.0D, 0.0D, 1.0D);
if (push.lengthSqr() < 1.0E-4D) {
@@ -770,7 +783,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
this.pendingMountedCharge = mountedCharge;
this.setAnimationState(ANIM_CHARGE_START);
this.actionTicks = CHARGE_START_TICKS;
this.playSound(SoundEvents.ENDER_DRAGON_FLAP, 1.3F, 0.7F);
this.playSound(AntarchySoundEvents.HERCULES_BEETLE_CHARGE_START.get(), 1.3F, 0.7F);
}
private void beginChargeLoop() {
@@ -802,7 +815,7 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
if (victim == this) {
continue;
}
if (victim.hurt(this.damageSources().mobAttack(this), damage)) {
if (victim.hurt(AntarchyDamageSources.herculesBeetleObliteration(serverLevel, this), damage)) {
Vec3 push = victim.position().subtract(this.position());
if (push.lengthSqr() < 1.0E-4D) {
push = this.chargeDirection;
@@ -1175,17 +1188,17 @@ public class HerculesBeetleEntity extends TamableAnimal implements GeoEntity, Fl
@Override
protected SoundEvent getAmbientSound() {
return this.isKnockedDown() ? null : SoundEvents.RAVAGER_AMBIENT;
return this.isKnockedDown() ? null : AntarchySoundEvents.HERCULES_BEETLE_IDLE.get();
}
@Override
protected SoundEvent getHurtSound(DamageSource damageSource) {
return SoundEvents.RAVAGER_HURT;
return AntarchySoundEvents.HERCULES_BEETLE_HURT.get();
}
@Override
protected SoundEvent getDeathSound() {
return SoundEvents.RAVAGER_DEATH;
return AntarchySoundEvents.HERCULES_BEETLE_HURT.get();
}
@Override
@@ -1,6 +1,8 @@
package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchySoundEvents;
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
import com.mojang.serialization.Codec;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
@@ -71,6 +73,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
private static final double MELEE_WALK_RANGE = 4.0D;
private static final double CHASE_LEAP_RANGE_SQR = 8.0D * 8.0D;
private static final int DEFAULT_POUNCE_COOLDOWN = 60;
private static final int POUNCE_PREFERENCE_CHANCE = 7;
private static final int DEFAULT_RECOVERY_TICKS = 20;
private static final int CHASE_JUMP_COOLDOWN = 25;
private static final double POUNCE_HORIZONTAL_SPEED = 0.92D;
@@ -79,12 +82,15 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
private static final double CHASE_LEAP_VERTICAL = 0.55D;
private static final double QUICK_MOVE_SQR = 0.14D * 0.14D;
private static final double POUNCE_LAND_DAMAGE_RANGE = 5.0D;
private static final int MAX_POUNCE_TICKS = 60;
private static final int CEILING_SEARCH_RANGE = 30;
private static final double CAMOUFLAGE_PLAYER_RANGE = 24.0D;
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk");
private static final RawAnimation JUMP_ANIM = RawAnimation.begin().thenLoop("jump");
private static final RawAnimation JUMP_ANIM = RawAnimation.begin().thenPlay("jump_start").thenLoop("jump_loop");
private static final RawAnimation JUMP_END_ANIM = RawAnimation.begin().thenPlay("jump_end");
private static final RawAnimation HANGING_ANIM = RawAnimation.begin().thenLoop("hanging");
private static final RawAnimation ATTACK_ANIM = RawAnimation.begin().thenPlay("attack");
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
@@ -94,6 +100,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
private int pounceTicks;
private int leapingTicks;
private int chaseJumpCooldownTicks;
private boolean preferPounceThisWindow = true;
private float visualAlpha = 1.0F;
private float previousVisualAlpha = 1.0F;
@@ -130,8 +137,8 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
@Override
protected void registerGoals() {
this.goalSelector.addGoal(0, new FloatGoal(this));
this.goalSelector.addGoal(1, new CloseMeleeGoal());
this.goalSelector.addGoal(2, new PounceAttackGoal());
this.goalSelector.addGoal(1, new PounceAttackGoal());
this.goalSelector.addGoal(2, new CloseMeleeGoal());
this.goalSelector.addGoal(3, new HideOnCeilingGoal());
this.goalSelector.addGoal(4, new ChaseTargetGoal());
this.goalSelector.addGoal(5, new WanderGoal());
@@ -192,6 +199,9 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
if (this.pounceCooldownTicks > 0) {
this.pounceCooldownTicks--;
if (this.pounceCooldownTicks == 0) {
this.preferPounceThisWindow = this.random.nextInt(10) < POUNCE_PREFERENCE_CHANCE;
}
}
if (this.recoveryTicks > 0) {
this.recoveryTicks--;
@@ -252,14 +262,21 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
return false;
}
@Override
public boolean doHurtTarget(Entity target) {
return target instanceof LivingEntity livingTarget && this.level() instanceof ServerLevel serverLevel
? livingTarget.hurt(AntarchyDamageSources.jumpyBugJump(serverLevel, this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE))
: super.doHurtTarget(target);
}
@Override
protected SoundEvent getAmbientSound() {
return SoundEvents.SPIDER_AMBIENT;
return AntarchySoundEvents.JUMPY_BUG_IDLE.get();
}
@Override
protected SoundEvent getHurtSound(DamageSource damageSource) {
return SoundEvents.SPIDER_HURT;
return AntarchySoundEvents.JUMPY_BUG_HURT.get();
}
@Override
@@ -314,11 +331,14 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
private PlayState mainAnimController(AnimationState<JumpyBugEntity> state) {
AttackState attackState = this.getAttackState();
if (attackState == AttackState.POUNCING || attackState == AttackState.CLINGING || attackState == AttackState.LEAPING_TO_CEILING) {
if (attackState == AttackState.CLINGING) {
return state.setAndContinue(HANGING_ANIM);
}
if ((attackState == AttackState.POUNCING || attackState == AttackState.LEAPING_TO_CEILING) && !this.onGround()) {
return state.setAndContinue(JUMP_ANIM);
}
if (attackState == AttackState.RECOVERING) {
return state.setAndContinue(ATTACK_ANIM);
return state.setAndContinue(JUMP_END_ANIM);
}
return state.setAndContinue(state.isMoving() ? WALK_ANIM : IDLE_ANIM);
}
@@ -345,11 +365,15 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
this.setCamouflaged(false);
this.pounceTicks++;
if (this.onGround() && this.pounceTicks > 8) {
if ((this.onGround() && this.pounceTicks > 8) || this.pounceTicks > MAX_POUNCE_TICKS) {
LivingEntity target = this.getTarget();
if (target != null && target.isAlive() && this.distanceToSqr(target) <= POUNCE_LAND_DAMAGE_RANGE * POUNCE_LAND_DAMAGE_RANGE) {
if (this.level() instanceof ServerLevel serverLevel) {
target.hurt(AntarchyDamageSources.jumpyBugJump(serverLevel, this), (float) AntarchySettings.jumpyBugPounceDamage());
} else {
target.hurt(this.damageSources().mobAttack(this), (float) AntarchySettings.jumpyBugPounceDamage());
}
}
this.finishPounce(false);
}
}
@@ -437,6 +461,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
double upwardSpeed = Math.min(2.5D, Math.sqrt(0.16D * Math.max(dy, 1.0D)) + 0.4D);
this.setDeltaMovement(0.0D, upwardSpeed, 0.0D);
this.hasImpulse = true;
this.playSound(AntarchySoundEvents.JUMPY_BUG_JUMP.get(), 1.0F, 0.95F + this.random.nextFloat() * 0.1F);
}
private void cancelLeap() {
@@ -460,6 +485,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
double upward = POUNCE_UPWARD_SPEED + Mth.clamp(to.y * 0.08D, -0.04D, 0.22D);
this.setDeltaMovement(direction.x * POUNCE_HORIZONTAL_SPEED, upward, direction.z * POUNCE_HORIZONTAL_SPEED);
this.hasImpulse = true;
this.playSound(AntarchySoundEvents.JUMPY_BUG_JUMP.get(), 1.0F, 0.95F + this.random.nextFloat() * 0.1F);
}
private void finishPounce(boolean keepMomentum) {
@@ -573,6 +599,7 @@ public class JumpyBugEntity extends Monster implements GeoEntity {
&& target.isAlive()
&& JumpyBugEntity.this.canUseAmbush()
&& JumpyBugEntity.this.pounceCooldownTicks <= 0
&& JumpyBugEntity.this.preferPounceThisWindow
&& (JumpyBugEntity.this.hasLineOfSight(target) || JumpyBugEntity.this.distanceToSqr(target) <= 9.0D);
}
@@ -268,8 +268,6 @@ public class MantisEntity extends Monster implements GeoEntity {
@Override
public void setYBodyRot(float yBodyRot) {
// Only sync yRot from body rotation during flight — on the ground this
// conflicted with navigation and contributed to post-attack spinning
if (this.isFlyingNow()) {
this.setYRot(yBodyRot);
}
@@ -330,8 +328,6 @@ public class MantisEntity extends Monster implements GeoEntity {
}
private void updateFlightRotation() {
// Only override rotation during actual flight — on the ground this fought the
// navigation system, causing the mantis to spin 180° after each attack
if (!this.isFlyingNow()) {
return;
}
@@ -2,6 +2,7 @@ package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchyTags;
import com.craisinlord.antarchy.content.AntarchySoundEvents;
import java.util.EnumSet;
import net.minecraft.core.BlockPos;
@@ -13,6 +14,7 @@ import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.BlockTags;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.InteractionHand;
@@ -39,6 +41,7 @@ import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
import net.minecraft.world.entity.ai.util.DefaultRandomPos;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.Level;
@@ -93,6 +96,14 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
super(entityType, level);
}
public static boolean canSpawn(EntityType<RollyPollyEntity> entityType, net.minecraft.world.level.ServerLevelAccessor level, net.minecraft.world.entity.MobSpawnType spawnReason, BlockPos pos, net.minecraft.util.RandomSource random) {
if (spawnReason == net.minecraft.world.entity.MobSpawnType.SPAWN_EGG || spawnReason == net.minecraft.world.entity.MobSpawnType.SPAWNER || spawnReason == net.minecraft.world.entity.MobSpawnType.COMMAND) {
return true;
}
return Mob.checkMobSpawnRules(entityType, level, spawnReason, pos, random);
}
public static AttributeSupplier.Builder createAttributes() {
return Mob.createMobAttributes()
.add(Attributes.MAX_HEALTH, AntarchySettings.rollyPollyHealth())
@@ -155,6 +166,9 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
if (this.random.nextInt(AntarchySettings.rollyPollyTameChance()) == 0) {
this.setTame(true, true);
this.setOwnerUUID(player.getUUID());
if (player instanceof ServerPlayer serverPlayer) {
CriteriaTriggers.TAME_ANIMAL.trigger(serverPlayer, this);
}
this.stopDefensiveCurl();
this.setTarget(null);
this.level().broadcastEntityEvent(this, (byte) 7);
@@ -241,14 +255,19 @@ public class RollyPollyEntity extends TamableAnimal implements GeoEntity {
this.unrolling = false;
this.rollTransitionTicks = ROLL_UP_TICKS;
this.setAnimationState(ANIM_ROLL_UP);
this.playSound(SoundEvents.ARMOR_EQUIP_TURTLE.value(), 0.8F, 1.4F);
this.playSound(SoundEvents.ARMADILLO_ROLL, 0.8F, 1.0F);
}
private void startUnroll() {
this.unrolling = true;
this.rollTransitionTicks = UNROLL_TICKS;
this.setAnimationState(ANIM_UNROLL);
this.playSound(SoundEvents.ARMOR_EQUIP_TURTLE.value(), 0.8F, 1.1F);
this.playSound(SoundEvents.ARMADILLO_UNROLL_START, 0.8F, 1.0F);
}
@Override
protected SoundEvent getAmbientSound() {
return AntarchySoundEvents.ROLLY_POLLY_IDLE.get();
}
private void stopDefensiveCurl() {
@@ -0,0 +1,269 @@
package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.AntarchySoundEvents;
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
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 = target instanceof LivingEntity livingTarget && this.level() instanceof ServerLevel serverLevel
? livingTarget.hurt(AntarchyDamageSources.spitBugDisrespect(serverLevel, this, this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE))
: 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 AntarchySoundEvents.SPIT_BUG_IDLE.get();
}
@Override
protected SoundEvent getHurtSound(DamageSource damageSource) {
return AntarchySoundEvents.SPIT_BUG_HURT.get();
}
@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(AntarchySoundEvents.SPIT_BUG_SPIT.get(), 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();
}
}
}
}
@@ -0,0 +1,175 @@
package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.content.damage.AntarchyDamageSources;
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 SpitBugEntity && this.level() instanceof ServerLevel serverLevel) {
livingTarget.hurt(AntarchyDamageSources.spitBugDisrespect(serverLevel, this, owner), DIRECT_HIT_DAMAGE);
} else 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);
}
}
@@ -1,6 +1,7 @@
package com.craisinlord.antarchy.content.entity;
import com.craisinlord.antarchy.content.AntarchyObjects;
import com.craisinlord.antarchy.content.AntarchySoundEvents;
import com.craisinlord.antarchy.content.StinkyBehavior;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
@@ -20,6 +21,7 @@ import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.entity.player.Player;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor;
@@ -67,7 +69,7 @@ public class StinkBugEntity extends Animal implements GeoEntity {
return true;
}
return level.getDifficulty() != Difficulty.PEACEFUL
&& Animal.checkAnimalSpawnRules(entityType, level, spawnReason, pos, random);
&& Mob.checkMobSpawnRules(entityType, level, spawnReason, pos, random);
}
@Override
@@ -86,6 +88,7 @@ public class StinkBugEntity extends Animal implements GeoEntity {
if (this.fartAnimationTicks > 0) {
this.fartAnimationTicks--;
if (this.fartAnimationTicks == FART_RELEASE_TICKS && this.pendingFartBurst && !this.level().isClientSide()) {
this.playSound(AntarchySoundEvents.STINK_BUG_FART.get(), 0.85F, 0.9F + this.random.nextFloat() * 0.1F);
StinkyBehavior.emitBurst(this, STINK_BURST_PARTICLES);
StinkyBehavior.applyBurstStinkyEffect(this, STINK_BURST_RADIUS, STINK_BURST_DURATION_TICKS);
this.pendingFartBurst = false;
@@ -121,6 +124,11 @@ public class StinkBugEntity extends Animal implements GeoEntity {
.triggerableAnim(FART_TRIGGER, FART_ANIM));
}
@Override
protected SoundEvent getAmbientSound() {
return AntarchySoundEvents.STINK_BUG_IDLE.get();
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.geoCache;
@@ -7,8 +7,10 @@ import java.util.List;
import java.util.Set;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceKey;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.PlayerRespawnLogic;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
@@ -98,6 +100,47 @@ public final class AntTeleportHelper {
return moved instanceof Mob mob ? mob : null;
}
public static InteractionResult teleportPlayerToDimension(ServerPlayer player, ResourceKey<Level> destinationKey) {
ServerLevel destination = player.server.getLevel(destinationKey);
if (destination == null) {
return InteractionResult.PASS;
}
Vec3 destinationPos = getDestinationPosition(player, destination);
teleportPlayerWithCompanions(player, destination, destinationPos);
player.playSound(SoundEvents.ENDERMAN_TELEPORT, 1.0F, 1.0F);
return InteractionResult.CONSUME;
}
public static InteractionResult teleportPlayerToReturnDestination(ServerPlayer player) {
ServerLevel destination = resolveReturnDestinationLevel(player);
Vec3 destinationPos = getDestinationPosition(player, destination);
teleportPlayerWithCompanions(player, destination, destinationPos);
player.playSound(SoundEvents.ENDERMAN_TELEPORT, 1.0F, 1.0F);
return InteractionResult.CONSUME;
}
public static InteractionResult handleCagedAntTeleport(ServerPlayer player, @Nullable ResourceLocation entityTypeId, @Nullable CompoundTag entityData) {
if (entityTypeId == null) {
return InteractionResult.PASS;
}
if (entityTypeId.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "brown_ant"))) {
return teleportPlayerToDimension(player, AntarchySettings.brownAntDestinationDimension());
}
if (entityTypeId.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "red_ant"))) {
return teleportPlayerToDimension(player, AntarchySettings.redAntDestinationDimension());
}
if (entityTypeId.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "termite"))) {
return teleportPlayerToDimension(player, AntarchySettings.termiteDestinationDimension());
}
if (entityTypeId.equals(ResourceLocation.fromNamespaceAndPath("antarchy", "rainbow_ant"))) {
return RainbowAntEntity.teleportPlayerFromStoredData(player, entityData);
}
return InteractionResult.PASS;
}
static InteractionResult handleInteraction(BaseAntEntity ant, Player player, ItemStack itemStack) {
if (ant.requiresActivationReagent() && !ant.isTeleportActivatedState()) {
if (!(player instanceof ServerPlayer serverPlayer)) {
@@ -161,7 +204,6 @@ public final class AntTeleportHelper {
return destination;
}
// If the player's respawn is not in the overworld, return them to overworld spawn instead
return player.server.overworld();
}
@@ -24,6 +24,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.storage.LevelResource;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.animatable.GeoEntity;
import java.io.IOException;
@@ -46,6 +47,29 @@ public class RainbowAntEntity extends BaseAntEntity implements GeoEntity {
super(entityType, level);
}
public static InteractionResult teleportPlayerFromStoredData(ServerPlayer player, @Nullable CompoundTag entityData) {
if (!AntarchySettings.rainbowAntsLeadToInfinityDimensions() || !InfinityCompat.get().isAvailable()) {
return AntTeleportHelper.teleportPlayerToDimension(player, AntarchySettings.rainbowAntNonInfinityFallbackDimension());
}
if (INFINITY_NAMESPACE.equals(player.serverLevel().dimension().location().getNamespace())) {
return AntTeleportHelper.teleportPlayerToReturnDestination(player);
}
ResourceLocation dimensionId = parseStoredDimensionId(entityData);
if (dimensionId == null) {
return AntTeleportHelper.teleportPlayerToDimension(player, AntarchySettings.rainbowAntNonInfinityFallbackDimension());
}
if (!InfinityCompat.get().requestWarp(player, dimensionId)) {
player.displayClientMessage(Component.translatable("message.antarchy.rainbow_ant_failed_dimension_create"), true);
return InteractionResult.CONSUME;
}
player.playSound(SoundEvents.ENDERMAN_TELEPORT, 1.0F, 1.0F);
return InteractionResult.CONSUME;
}
@Override
public boolean requiresCustomPersistence() {
return this.hasActiveInfinityDestination() || super.requiresCustomPersistence();
@@ -281,6 +305,20 @@ public class RainbowAntEntity extends BaseAntEntity implements GeoEntity {
}
}
@Nullable
private static ResourceLocation parseStoredDimensionId(@Nullable CompoundTag entityData) {
if (entityData == null || !entityData.contains(DIMENSION_ID_TAG)) {
return null;
}
try {
String storedDimensionId = entityData.getString(DIMENSION_ID_TAG);
return storedDimensionId.isEmpty() ? null : ResourceLocation.parse(storedDimensionId);
} catch (Throwable throwable) {
return null;
}
}
private boolean teleportToInfinity(ServerPlayer player, ResourceLocation dimensionId) {
if (!InfinityCompat.get().requestWarp(player, dimensionId)) {
this.deleteGeneratedArtifacts(player.server, dimensionId);
@@ -14,6 +14,7 @@ import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.pathfinder.Path;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.animatable.GeoEntity;
@@ -149,7 +150,7 @@ public class TermiteEntity extends BaseAntEntity implements GeoEntity {
@Nullable
private BlockPos getCurrentWoodTarget() {
if (this.targetWoodPos != null && this.isValidWoodTarget(this.targetWoodPos)) {
if (this.targetWoodPos != null && this.isValidWoodTarget(this.targetWoodPos) && this.canReachWoodTarget(this.targetWoodPos)) {
return this.targetWoodPos;
}
@@ -221,28 +222,44 @@ public class TermiteEntity extends BaseAntEntity implements GeoEntity {
return this.level().getBlockState(targetPos).is(AntarchyTags.Blocks.TERMITE_FOODS);
}
private boolean canReachWoodTarget(BlockPos targetPos) {
BlockPos approachPos = this.getWoodApproachBlockPos(targetPos);
if (approachPos == null) {
return false;
}
Path path = this.getNavigation().createPath(approachPos, 0);
return path != null && path.canReach();
}
@Nullable
private Vec3 getWoodApproachTarget(BlockPos targetPos) {
private BlockPos getWoodApproachBlockPos(BlockPos targetPos) {
BlockPos belowTarget = targetPos.below();
if (this.isWalkableStandPos(belowTarget)) {
return Vec3.atBottomCenterOf(belowTarget);
return belowTarget;
}
for (Direction direction : Direction.Plane.HORIZONTAL) {
BlockPos sidePos = targetPos.relative(direction);
if (this.isWalkableStandPos(sidePos)) {
return Vec3.atBottomCenterOf(sidePos);
return sidePos;
}
BlockPos belowSidePos = sidePos.below();
if (this.isWalkableStandPos(belowSidePos)) {
return Vec3.atBottomCenterOf(belowSidePos);
return belowSidePos;
}
}
return null;
}
@Nullable
private Vec3 getWoodApproachTarget(BlockPos targetPos) {
BlockPos approachPos = this.getWoodApproachBlockPos(targetPos);
return approachPos == null ? null : Vec3.atBottomCenterOf(approachPos);
}
private boolean isWalkableStandPos(BlockPos pos) {
BlockPos floor = pos.below();
BlockState floorState = this.level().getBlockState(floor);
@@ -496,6 +496,7 @@ public class BrutalflyEntity extends Monster implements GeoEntity {
}
Vec3 origin = this.getSpitOrigin();
this.playSound(AntarchySoundEvents.BRUTALFLY_SPIT.get(), 1.0F, 0.9F + this.random.nextFloat() * 0.2F);
switch (this.getFightPhase()) {
case PHASE_THREE -> {
this.launchOrb(serverLevel, origin, target, BrutalflyOrbEntity.OrbVariant.POISON, -8.0F);
@@ -57,7 +57,7 @@ public class GlimmerAntBehavior implements GlimmerVariantBehavior {
@Override
public ResourceLocation emissiveTexture(GlimmerEntity entity) {
return rl("textures/entity/glimmer/glimmer_ant_emmisive.png");
return rl("textures/entity/glimmer/glimmer_ant_emissive.png");
}
@Override
@@ -60,7 +60,7 @@ public class GlimmerElkaBehavior implements GlimmerVariantBehavior {
@Override
public ResourceLocation emissiveTexture(GlimmerEntity entity) {
return rl("textures/entity/glimmer/elka_glimmer_emmisive.png");
return rl("textures/entity/glimmer/elka_glimmer_emissive.png");
}
@Override
@@ -91,7 +91,7 @@ public class GlimmerFrogBehavior implements GlimmerVariantBehavior {
@Override
public ResourceLocation emissiveTexture(GlimmerEntity entity) {
return rl("textures/entity/glimmer/frog_glimmer_emmisive.png");
return rl("textures/entity/glimmer/frog_glimmer_emissive.png");
}
@Override
@@ -0,0 +1,97 @@
package com.craisinlord.antarchy.content.item;
import com.craisinlord.antarchy.config.AntarchySettings;
import java.util.List;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SwordItem;
import net.minecraft.world.item.Tier;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.UseAnim;
import net.minecraft.world.item.component.ItemAttributeModifiers;
import net.minecraft.world.level.Level;
public class AttitudeAdjusterItem extends SwordItem {
private static final float ATTACK_SPEED = -3.6F;
private static final int USE_DURATION = 12;
private final Tier tier;
public AttitudeAdjusterItem(Tier tier, Item.Properties properties) {
super(tier, properties);
this.tier = tier;
}
@Override
public ItemAttributeModifiers getDefaultAttributeModifiers() {
return SwordItem.createAttributes(
this.tier,
(int) Math.round(AntarchySettings.attitudeAdjusterBaseDamage()),
ATTACK_SPEED
);
}
@Override
public void appendHoverText(ItemStack stack, Item.TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
tooltipComponents.add(Component.translatable("tooltip.antarchy.attitude_adjuster.grounded").withStyle(ChatFormatting.DARK_GRAY));
tooltipComponents.add(Component.translatable("tooltip.antarchy.attitude_adjuster.slam").withStyle(ChatFormatting.YELLOW));
super.appendHoverText(stack, context, tooltipComponents, tooltipFlag);
}
@Override
public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
boolean hurt = super.hurtEnemy(stack, target, attacker);
if (!hurt || !(attacker instanceof Player player) || attacker.level().isClientSide || player.getMainHandItem() != stack || !(attacker.level() instanceof ServerLevel serverLevel)) {
return hurt;
}
if (!AttitudeAdjusterSlamManager.consumeSpecialHit(player)) {
return hurt;
}
if (target.onGround()) {
AttitudeAdjusterSlamManager.onGroundedHit(serverLevel, player, target);
} else {
AttitudeAdjusterSlamManager.onAirborneHit(serverLevel, player, target);
}
return hurt;
}
@Override
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
if (!(player instanceof ServerPlayer serverPlayer) || serverPlayer.getCooldowns().isOnCooldown(this)) {
return InteractionResultHolder.pass(stack);
}
if (!AttitudeAdjusterSlamManager.tryStartPlayerSlam(serverPlayer, hand)) {
return InteractionResultHolder.pass(stack);
}
return InteractionResultHolder.sidedSuccess(stack, level.isClientSide);
}
@Override
public boolean isEnchantable(ItemStack stack) {
return stack.getCount() == 1;
}
@Override
public boolean canAttackBlock(net.minecraft.world.level.block.state.BlockState state, Level level, net.minecraft.core.BlockPos pos, Player miner) {
return !miner.isCreative();
}
@Override
public int getUseDuration(ItemStack stack, LivingEntity entity) {
return USE_DURATION;
}
@Override
public UseAnim getUseAnimation(ItemStack stack) {
return UseAnim.SPEAR;
}
}
@@ -0,0 +1,311 @@
package com.craisinlord.antarchy.content.item;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.network.ImpactShakePayload;
import com.craisinlord.antarchy.content.network.ImpactShakeSync;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.particles.BlockParticleOption;
import net.minecraft.core.particles.DustParticleOptions;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.joml.Vector3f;
public final class AttitudeAdjusterSlamManager {
private static final int SLAM_TIMEOUT_TICKS = 40;
private static final int PLAYER_SLAM_COOLDOWN_TICKS = 28;
private static final double GROUNDED_VERTICAL_KNOCKBACK = 1.35D;
private static final double GROUNDED_HORIZONTAL_KNOCKBACK = 0.5D;
private static final double AIRBORNE_SLAM_DOWNWARD_VELOCITY = -1.8D;
private static final double SLAM_BONUS_DAMAGE_SCALE = 10.0D;
private static final double SLAM_MAX_BONUS_DAMAGE = 18.0D;
private static final double SLAM_IMPACT_RADIUS = 3.75D;
private static final double SLAM_RADIAL_KNOCKBACK = 0.55D;
private static final double PLAYER_SLAM_START_VELOCITY = -2.15D;
private static final double PLAYER_SLAM_RADIUS = 4.75D;
private static final double PLAYER_SLAM_BASE_DAMAGE = 12.0D;
private static final double PLAYER_SLAM_DAMAGE_SCALE = 0.85D;
private static final double PLAYER_SLAM_MAX_DAMAGE = 24.0D;
private static final double PLAYER_SLAM_UPWARD_KNOCKBACK = 0.9D;
private static final double PLAYER_SLAM_HORIZONTAL_KNOCKBACK = 0.9D;
private static final float NORMAL_SHAKE_INTENSITY = 0.5F;
private static final int NORMAL_SHAKE_DURATION = 10;
private static final float ENEMY_SLAM_SHAKE_INTENSITY = 0.95F;
private static final int ENEMY_SLAM_SHAKE_DURATION = 16;
private static final float PLAYER_SLAM_SHAKE_INTENSITY = 1.2F;
private static final int PLAYER_SLAM_SHAKE_DURATION = 20;
private static final float IMPACT_SHAKE_RADIUS = 24.0F;
private static final float NORMAL_BREAK_HARDNESS_LIMIT = 6.0F;
private static final int MAX_BROKEN_BLOCKS = 9;
private static final Map<UUID, SlammedTargetState> SLAMMED_TARGETS = new HashMap<>();
private static final Map<UUID, PlayerSlamState> PLAYER_SLAMS = new HashMap<>();
private static final Map<UUID, Long> SPECIAL_HIT_MARKS = new HashMap<>();
private AttitudeAdjusterSlamManager() {
}
public static void markSpecialHit(Player player) {
SPECIAL_HIT_MARKS.put(player.getUUID(), player.level().getGameTime());
}
public static boolean consumeSpecialHit(Player player) {
Long markedTime = SPECIAL_HIT_MARKS.get(player.getUUID());
if (markedTime == null || markedTime != player.level().getGameTime()) {
return false;
}
SPECIAL_HIT_MARKS.remove(player.getUUID());
return true;
}
public static void onGroundedHit(ServerLevel level, Player attacker, LivingEntity target) {
Vec3 push = horizontalAway(attacker.position(), target.position(), attacker.getLookAngle()).scale(GROUNDED_HORIZONTAL_KNOCKBACK);
double resistanceScale = resistanceScale(target);
Vec3 motion = target.getDeltaMovement().add(push.x * resistanceScale, Math.max(GROUNDED_VERTICAL_KNOCKBACK * resistanceScale, 0.45D), push.z * resistanceScale);
target.setDeltaMovement(motion);
target.hurtMarked = true;
playNormalImpact(level, target.position().add(0.0D, target.getBbHeight() * 0.5D, 0.0D), target.getOnPosLegacy());
}
public static void onAirborneHit(ServerLevel level, Player attacker, LivingEntity target) {
Vec3 push = horizontalAway(attacker.position(), target.position(), attacker.getLookAngle()).scale(0.18D);
target.setDeltaMovement(push.x, Math.min(target.getDeltaMovement().y, AIRBORNE_SLAM_DOWNWARD_VELOCITY), push.z);
target.hurtMarked = true;
SLAMMED_TARGETS.put(target.getUUID(), new SlammedTargetState(
target.getUUID(),
attacker.getUUID(),
level.dimension().location().toString(),
level.getGameTime() + SLAM_TIMEOUT_TICKS,
target.getDeltaMovement().y,
target.fallDistance
));
level.playSound(null, target.getX(), target.getY(), target.getZ(), SoundEvents.ANVIL_LAND, SoundSource.PLAYERS, 1.0F, 0.7F);
}
public static boolean tryStartPlayerSlam(ServerPlayer player, net.minecraft.world.InteractionHand hand) {
if (player.onGround() || player.isInWaterOrBubble() || player.isInLava() || player.isFallFlying() || player.getAbilities().flying || PLAYER_SLAMS.containsKey(player.getUUID())) {
return false;
}
PLAYER_SLAMS.put(player.getUUID(), new PlayerSlamState(player.getUUID(), player.serverLevel().dimension().location().toString(), player.serverLevel().getGameTime() + SLAM_TIMEOUT_TICKS, player.fallDistance));
Vec3 motion = player.getDeltaMovement();
player.setDeltaMovement(motion.x * 0.25D, PLAYER_SLAM_START_VELOCITY, motion.z * 0.25D);
player.hurtMarked = true;
player.fallDistance = 0.0F;
player.swing(hand, true);
player.serverLevel().playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.MACE_SMASH_AIR, SoundSource.PLAYERS, 1.0F, 0.8F);
return true;
}
public static void tick(ServerLevel level) {
tickSlammedTargets(level);
tickPlayerSlams(level);
}
private static void tickSlammedTargets(ServerLevel level) {
Iterator<SlammedTargetState> iterator = SLAMMED_TARGETS.values().iterator();
while (iterator.hasNext()) {
SlammedTargetState state = iterator.next();
if (!state.dimensionId.equals(level.dimension().location().toString())) {
continue;
}
Entity entity = level.getEntity(state.targetId);
if (!(entity instanceof LivingEntity target) || !target.isAlive() || level.getGameTime() > state.expiresAt || target.isInWaterOrBubble() || target.isInLava() || target.isFallFlying() || (target instanceof Player player && player.getAbilities().flying)) {
iterator.remove();
continue;
}
if (!target.onGround()) {
continue;
}
Player attacker = level.getPlayerByUUID(state.attackerId);
double impactSpeed = Math.max(Math.abs(Math.min(target.getDeltaMovement().y, state.startDownwardVelocity)), Math.max(0.0D, target.fallDistance * 0.125D));
float bonusDamage = (float) Mth.clamp(impactSpeed * SLAM_BONUS_DAMAGE_SCALE, 4.0D, SLAM_MAX_BONUS_DAMAGE);
if (attacker != null) {
target.hurt(level.damageSources().playerAttack(attacker), bonusDamage);
} else {
target.hurt(level.damageSources().generic(), bonusDamage);
}
Vec3 impactPos = target.position();
BlockPos groundPos = target.getOnPosLegacy();
playSlamImpact(level, impactPos, groundPos, true);
knockbackNearby(level, impactPos, target, SLAM_IMPACT_RADIUS, SLAM_RADIAL_KNOCKBACK, 0.3D);
iterator.remove();
}
}
private static void tickPlayerSlams(ServerLevel level) {
Iterator<PlayerSlamState> iterator = PLAYER_SLAMS.values().iterator();
while (iterator.hasNext()) {
PlayerSlamState state = iterator.next();
if (!state.dimensionId.equals(level.dimension().location().toString())) {
continue;
}
Player entity = level.getPlayerByUUID(state.playerId);
if (!(entity instanceof ServerPlayer player) || !player.isAlive() || level.getGameTime() > state.expiresAt || player.isInWaterOrBubble() || player.isInLava() || player.isFallFlying() || player.getAbilities().flying) {
iterator.remove();
continue;
}
player.fallDistance = 0.0F;
if (!player.onGround()) {
continue;
}
Vec3 impactPos = player.position();
BlockPos groundPos = player.getOnPosLegacy();
double impactStrength = Math.max(Math.abs(Math.min(player.getDeltaMovement().y, PLAYER_SLAM_START_VELOCITY)), Math.max(state.startFallDistance, player.fallDistance) * 0.15D);
float damage = (float) Mth.clamp(PLAYER_SLAM_BASE_DAMAGE + impactStrength * PLAYER_SLAM_DAMAGE_SCALE * 10.0D, PLAYER_SLAM_BASE_DAMAGE, PLAYER_SLAM_MAX_DAMAGE);
AABB area = new AABB(impactPos.x - PLAYER_SLAM_RADIUS, impactPos.y - 1.5D, impactPos.z - PLAYER_SLAM_RADIUS, impactPos.x + PLAYER_SLAM_RADIUS, impactPos.y + 2.5D, impactPos.z + PLAYER_SLAM_RADIUS);
for (LivingEntity target : level.getEntitiesOfClass(LivingEntity.class, area, candidate -> candidate.isAlive() && candidate != player)) {
if (!target.hurt(level.damageSources().playerAttack(player), damage)) {
continue;
}
Vec3 away = horizontalAway(impactPos, target.position(), player.getLookAngle()).scale(PLAYER_SLAM_HORIZONTAL_KNOCKBACK);
double resistanceScale = resistanceScale(target);
target.setDeltaMovement(target.getDeltaMovement().add(away.x * resistanceScale, Math.max(PLAYER_SLAM_UPWARD_KNOCKBACK * resistanceScale, 0.35D), away.z * resistanceScale));
target.hurtMarked = true;
}
playSlamImpact(level, impactPos, groundPos, false);
if (AntarchySettings.attitudeAdjusterBreaksBlocks()) {
breakBlocks(level, player, groundPos);
}
if (player.getMainHandItem().getItem() instanceof AttitudeAdjusterItem item) {
player.getCooldowns().addCooldown(item, PLAYER_SLAM_COOLDOWN_TICKS);
}
iterator.remove();
}
}
private static void breakBlocks(ServerLevel level, ServerPlayer player, BlockPos center) {
int broken = 0;
for (int y = -1; y <= 0 && broken < MAX_BROKEN_BLOCKS; y++) {
for (int x = -1; x <= 1 && broken < MAX_BROKEN_BLOCKS; x++) {
for (int z = -1; z <= 1 && broken < MAX_BROKEN_BLOCKS; z++) {
BlockPos pos = center.offset(x, y, z);
BlockState state = level.getBlockState(pos);
BlockEntity blockEntity = level.getBlockEntity(pos);
if (state.isAir() || blockEntity != null || state.getDestroySpeed(level, pos) < 0.0F || state.getDestroySpeed(level, pos) > NORMAL_BREAK_HARDNESS_LIMIT) {
continue;
}
if (!state.isFaceSturdy(level, pos, Direction.UP) && pos.getY() < center.getY()) {
continue;
}
if (player.gameMode.destroyBlock(pos)) {
broken++;
}
}
}
}
}
private static void playNormalImpact(ServerLevel level, Vec3 impactPos, BlockPos groundPos) {
level.playSound(null, impactPos.x, impactPos.y, impactPos.z, SoundEvents.MACE_SMASH_GROUND_HEAVY, SoundSource.PLAYERS, 0.95F, 0.75F);
spawnImpactParticles(level, impactPos, groundPos, 10, 20);
shake(level, impactPos, NORMAL_SHAKE_INTENSITY, NORMAL_SHAKE_DURATION);
}
private static void playSlamImpact(ServerLevel level, Vec3 impactPos, BlockPos groundPos, boolean enemySlam) {
level.playSound(null, impactPos.x, impactPos.y, impactPos.z, enemySlam ? SoundEvents.GENERIC_EXPLODE.value() : SoundEvents.MACE_SMASH_GROUND, SoundSource.PLAYERS, enemySlam ? 1.2F : 1.35F, enemySlam ? 0.65F : 0.55F);
spawnImpactParticles(level, impactPos, groundPos, enemySlam ? 20 : 28, enemySlam ? 32 : 42);
spawnShockwaveParticles(level, impactPos, enemySlam ? 18 : 28);
shake(level, impactPos, enemySlam ? ENEMY_SLAM_SHAKE_INTENSITY : PLAYER_SLAM_SHAKE_INTENSITY, enemySlam ? ENEMY_SLAM_SHAKE_DURATION : PLAYER_SLAM_SHAKE_DURATION);
level.gameEvent(GameEvent.EXPLODE, impactPos, GameEvent.Context.of(level.getBlockState(groundPos)));
}
private static void spawnImpactParticles(ServerLevel level, Vec3 impactPos, BlockPos groundPos, int dustCount, int debrisCount) {
level.sendParticles(new DustParticleOptions(new Vector3f(1.00F, 0.92F, 0.18F), 1.35F), impactPos.x, impactPos.y + 0.1D, impactPos.z, dustCount, 0.45D, 0.15D, 0.45D, 0.035D);
BlockState groundState = level.getBlockState(groundPos);
if (!groundState.isAir()) {
level.sendParticles(new BlockParticleOption(ParticleTypes.BLOCK, groundState), impactPos.x, impactPos.y + 0.05D, impactPos.z, debrisCount, 0.7D, 0.15D, 0.7D, 0.06D);
}
level.sendParticles(ParticleTypes.POOF, impactPos.x, impactPos.y + 0.2D, impactPos.z, 8, 0.45D, 0.05D, 0.45D, 0.02D);
}
private static void spawnShockwaveParticles(ServerLevel level, Vec3 impactPos, int count) {
for (int i = 0; i < count; i++) {
double angle = (Math.PI * 2.0D * i) / count;
double x = impactPos.x + Math.cos(angle) * 0.6D;
double z = impactPos.z + Math.sin(angle) * 0.6D;
double dx = Math.cos(angle) * 0.18D;
double dz = Math.sin(angle) * 0.18D;
level.sendParticles(new DustParticleOptions(new Vector3f(1.00F, 0.85F, 0.22F), 0.95F), x, impactPos.y + 0.05D, z, 1, dx, 0.01D, dz, 0.0D);
}
}
private static void knockbackNearby(ServerLevel level, Vec3 center, LivingEntity ignored, double radius, double horizontalStrength, double verticalStrength) {
AABB area = new AABB(center.x - radius, center.y - 1.5D, center.z - radius, center.x + radius, center.y + 2.5D, center.z + radius);
for (LivingEntity entity : level.getEntitiesOfClass(LivingEntity.class, area, candidate -> candidate.isAlive() && candidate != ignored)) {
Vec3 away = horizontalAway(center, entity.position(), entity.getLookAngle()).scale(horizontalStrength);
double resistanceScale = resistanceScale(entity);
entity.setDeltaMovement(entity.getDeltaMovement().add(away.x * resistanceScale, Math.max(verticalStrength * resistanceScale, 0.1D), away.z * resistanceScale));
entity.hurtMarked = true;
}
}
private static void shake(ServerLevel level, Vec3 pos, float intensity, int durationTicks) {
ImpactShakePayload payload = new ImpactShakePayload(pos.x, pos.y, pos.z, intensity, durationTicks, IMPACT_SHAKE_RADIUS);
double radiusSqr = IMPACT_SHAKE_RADIUS * IMPACT_SHAKE_RADIUS;
for (ServerPlayer player : level.players()) {
if (player.distanceToSqr(pos.x, pos.y, pos.z) <= radiusSqr) {
ImpactShakeSync.send(player, payload);
}
}
}
private static Vec3 horizontalAway(Vec3 from, Vec3 to, Vec3 fallback) {
Vec3 horizontal = to.subtract(from).multiply(1.0D, 0.0D, 1.0D);
if (horizontal.lengthSqr() < 1.0E-4D) {
horizontal = fallback.multiply(1.0D, 0.0D, 1.0D);
}
return horizontal.lengthSqr() < 1.0E-4D ? new Vec3(1.0D, 0.0D, 0.0D) : horizontal.normalize();
}
private static double resistanceScale(LivingEntity entity) {
return Mth.clamp(1.0D - entity.getAttributeValue(net.minecraft.world.entity.ai.attributes.Attributes.KNOCKBACK_RESISTANCE), 0.15D, 1.0D);
}
private static final class SlammedTargetState {
private final UUID targetId;
private final UUID attackerId;
private final String dimensionId;
private final long expiresAt;
private final double startDownwardVelocity;
private final float startFallDistance;
private SlammedTargetState(UUID targetId, UUID attackerId, String dimensionId, long expiresAt, double startDownwardVelocity, float startFallDistance) {
this.targetId = targetId;
this.attackerId = attackerId;
this.dimensionId = dimensionId;
this.expiresAt = expiresAt;
this.startDownwardVelocity = startDownwardVelocity;
this.startFallDistance = startFallDistance;
}
}
private static final class PlayerSlamState {
private final UUID playerId;
private final String dimensionId;
private final long expiresAt;
private final float startFallDistance;
private PlayerSlamState(UUID playerId, String dimensionId, long expiresAt, float startFallDistance) {
this.playerId = playerId;
this.dimensionId = dimensionId;
this.expiresAt = expiresAt;
this.startFallDistance = startFallDistance;
}
}
}
@@ -27,7 +27,7 @@ public class PrimordialArmorItem extends ArmorItem {
private final Type armorType;
public PrimordialArmorItem(Holder<ArmorMaterial> material, Type type, Properties properties) {
super(material, type, properties);
super(material, type, properties.stacksTo(1).durability(resolveDurability(type)));
this.armorType = type;
}
@@ -141,4 +141,13 @@ public class PrimordialArmorItem extends ArmorItem {
case BOOTS -> 0.20D;
};
}
private static int resolveDurability(Type armorType) {
return switch (armorType) {
case HELMET -> Type.HELMET.getDurability(37);
case CHESTPLATE, BODY -> Type.CHESTPLATE.getDurability(37);
case LEGGINGS -> Type.LEGGINGS.getDurability(37);
case BOOTS -> Type.BOOTS.getDurability(37);
};
}
}
@@ -0,0 +1,33 @@
package com.craisinlord.antarchy.content.network;
import com.craisinlord.antarchy.Antarchy;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
public record ImpactShakePayload(double x, double y, double z, float intensity, int durationTicks, float radius) implements CustomPacketPayload {
public static final Type<ImpactShakePayload> TYPE =
new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "impact_shake"));
public static final StreamCodec<ByteBuf, ImpactShakePayload> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.DOUBLE,
ImpactShakePayload::x,
ByteBufCodecs.DOUBLE,
ImpactShakePayload::y,
ByteBufCodecs.DOUBLE,
ImpactShakePayload::z,
ByteBufCodecs.FLOAT,
ImpactShakePayload::intensity,
ByteBufCodecs.VAR_INT,
ImpactShakePayload::durationTicks,
ByteBufCodecs.FLOAT,
ImpactShakePayload::radius,
ImpactShakePayload::new
);
@Override
public Type<ImpactShakePayload> type() {
return TYPE;
}
}
@@ -0,0 +1,21 @@
package com.craisinlord.antarchy.content.network;
import java.util.function.BiConsumer;
import net.minecraft.server.level.ServerPlayer;
public final class ImpactShakeSync {
private static final BiConsumer<ServerPlayer, ImpactShakePayload> NOOP = (player, payload) -> {
};
private static volatile BiConsumer<ServerPlayer, ImpactShakePayload> sink = NOOP;
private ImpactShakeSync() {
}
public static void setSink(BiConsumer<ServerPlayer, ImpactShakePayload> sink) {
ImpactShakeSync.sink = sink == null ? NOOP : sink;
}
public static void send(ServerPlayer player, ImpactShakePayload payload) {
sink.accept(player, payload);
}
}
@@ -220,7 +220,13 @@ public final class PermanentPortalTeleporter {
BlockPos preferred = BlockPos.containing(safePos);
int minY = destination.getMinBuildHeight() + 2;
int maxY = destination.getMaxBuildHeight() - 4;
int clampedY = Mth.clamp(preferred.getY(), minY, maxY);
int startY = Mth.clamp(preferred.getY(), minY, maxY);
for (int yOff = 0; yOff <= 6; yOff++) {
for (int y : new int[]{startY + yOff, startY - yOff}) {
if (y < minY || y > maxY) {
continue;
}
for (int radius = 0; radius <= 4; radius++) {
for (int xOff = -radius; xOff <= radius; xOff++) {
@@ -229,7 +235,7 @@ public final class PermanentPortalTeleporter {
continue;
}
BlockPos anchor = new BlockPos(preferred.getX() + xOff, clampedY, preferred.getZ() + zOff);
BlockPos anchor = new BlockPos(preferred.getX() + xOff, y, preferred.getZ() + zOff);
PermanentPortalShape xShape = PermanentPortalShape.create(destination, anchor, type, Direction.Axis.X);
if (xShape != null) {
return xShape;
@@ -241,6 +247,8 @@ public final class PermanentPortalTeleporter {
}
}
}
}
}
return null;
}
@@ -0,0 +1,109 @@
package com.craisinlord.antarchy.content.worldgen.cavaryn;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.block.HangingCreeprootsBlock;
import com.mojang.serialization.Codec;
import java.util.Optional;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.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;
public final class HangingCreeprootsFeature extends Feature<NoneFeatureConfiguration> {
private static final ResourceLocation HANGING_CREEPROOTS_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hanging_creeproots");
private static final int SEARCH_RADIUS = 8;
private static final int SEARCH_ATTEMPTS = 24;
private static final int VERTICAL_SCAN = 12;
public HangingCreeprootsFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
Block block = getBlock(HANGING_CREEPROOTS_ID);
if (!(block instanceof HangingCreeprootsBlock rootsBlock)) {
return false;
}
WorldGenLevel level = context.level();
RandomSource random = context.random();
BlockPos anchor = findAnchor(level, context.origin(), random);
if (anchor == null) {
return false;
}
return placeColumn(level, rootsBlock, anchor, random);
}
private static BlockPos findAnchor(WorldGenLevel level, BlockPos origin, RandomSource random) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
int x = origin.getX() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
int z = origin.getZ() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
int startY = origin.getY() + random.nextInt(VERTICAL_SCAN * 2 + 1) - VERTICAL_SCAN;
startY = Math.max(level.getMinBuildHeight() + 3, Math.min(level.getMaxBuildHeight() - 3, startY));
for (int y = startY; y <= Math.min(level.getMaxBuildHeight() - 2, startY + VERTICAL_SCAN); y++) {
mutable.set(x, y, z);
if (!level.getBlockState(mutable).canBeReplaced()) {
continue;
}
BlockPos abovePos = mutable.above();
BlockState aboveState = level.getBlockState(abovePos);
if (aboveState.isFaceSturdy(level, abovePos, net.minecraft.core.Direction.DOWN)) {
return mutable.immutable();
}
}
}
return null;
}
private static boolean placeColumn(WorldGenLevel level, HangingCreeprootsBlock rootsBlock, BlockPos startPos, RandomSource random) {
boolean placedAny = false;
int length = 1 + random.nextInt(5);
for (int offset = 0; offset < length; offset++) {
BlockPos rootsPos = startPos.below(offset);
if (rootsPos.getY() <= level.getMinBuildHeight()) {
break;
}
BlockState existing = level.getBlockState(rootsPos);
if (!existing.canBeReplaced() && !existing.is(rootsBlock)) {
break;
}
int distance = Math.min(offset, 4);
boolean bottom = offset == length - 1 || !level.getBlockState(rootsPos.below()).canBeReplaced();
BlockState state = rootsBlock.defaultBlockState()
.setValue(HangingCreeprootsBlock.DISTANCE, distance)
.setValue(HangingCreeprootsBlock.BOTTOM, bottom);
if (!state.canSurvive(level, rootsPos)) {
break;
}
level.setBlock(rootsPos, state, 3);
placedAny = true;
if (!bottom && !level.getBlockState(rootsPos.below()).canBeReplaced()) {
level.setBlock(rootsPos, state.setValue(HangingCreeprootsBlock.BOTTOM, true), 3);
break;
}
}
return placedAny;
}
private static Block getBlock(ResourceLocation id) {
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
return block.orElse(null);
}
}
@@ -0,0 +1,82 @@
package com.craisinlord.antarchy.content.worldgen.cavaryn;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.block.JumpyBugEggBlock;
import com.mojang.serialization.Codec;
import java.util.Optional;
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;
public final class JumpyBugEggCeilingFeature extends Feature<NoneFeatureConfiguration> {
private static final ResourceLocation JUMPY_BUG_EGG_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "jumpy_bug_egg");
private static final int SEARCH_RADIUS = 8;
private static final int VERTICAL_SCAN = 6;
private static final int SEARCH_ATTEMPTS = 10;
private static final float PLACE_CHANCE = 0.5F;
public JumpyBugEggCeilingFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
Block eggBlock = getBlock(JUMPY_BUG_EGG_ID);
if (eggBlock == null) {
return false;
}
WorldGenLevel level = context.level();
RandomSource random = context.random();
BlockPos origin = context.origin();
boolean placedAny = false;
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
if (random.nextFloat() > PLACE_CHANCE) {
continue;
}
int x = origin.getX() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
int z = origin.getZ() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
int y = origin.getY() + random.nextInt(VERTICAL_SCAN * 2 + 1) - VERTICAL_SCAN;
mutable.set(x, y, z);
if (!isValidCeilingSpot(level, mutable)) {
continue;
}
BlockState eggState = eggBlock.defaultBlockState()
.setValue(JumpyBugEggBlock.HANGING, true)
.setValue(JumpyBugEggBlock.ROTATED, random.nextBoolean());
level.setBlock(mutable, eggState, 3);
placedAny = true;
}
return placedAny;
}
private static boolean isValidCeilingSpot(WorldGenLevel level, BlockPos pos) {
BlockState state = level.getBlockState(pos);
if (!state.isAir()) {
return false;
}
BlockPos abovePos = pos.above();
BlockState aboveState = level.getBlockState(abovePos);
return aboveState.isFaceSturdy(level, abovePos, Direction.DOWN);
}
private static Block getBlock(ResourceLocation id) {
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
return block.orElse(null);
}
}
@@ -0,0 +1,118 @@
package com.craisinlord.antarchy.content.worldgen.cavaryn;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.block.MoltingVinesBlock;
import com.mojang.serialization.Codec;
import java.util.Optional;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.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;
public final class MoltingVinesFeature extends Feature<NoneFeatureConfiguration> {
private static final ResourceLocation MOLTING_VINES_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "molting_vines");
private static final int SEARCH_RADIUS = 8;
private static final int SEARCH_ATTEMPTS = 24;
private static final int VERTICAL_SCAN = 12;
private static final int MIN_LENGTH = 2;
private static final int MAX_LENGTH = 6;
private static final int BROODFRUIT_CHANCE = 3;
public MoltingVinesFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
Block block = getBlock(MOLTING_VINES_ID);
if (!(block instanceof MoltingVinesBlock moltingVinesBlock)) {
return false;
}
WorldGenLevel level = context.level();
RandomSource random = context.random();
BlockPos anchorPos = findAnchor(level, context.origin(), random);
if (anchorPos == null) {
return false;
}
return placeColumn(level, moltingVinesBlock, anchorPos, random);
}
private static BlockPos findAnchor(WorldGenLevel level, BlockPos origin, RandomSource random) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
int minY = level.getMinBuildHeight() + 2;
int maxY = level.getMaxBuildHeight() - 2;
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
int x = origin.getX() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
int z = origin.getZ() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
int startY = origin.getY() + random.nextInt(VERTICAL_SCAN * 2 + 1) - VERTICAL_SCAN;
startY = Math.max(minY, Math.min(maxY, startY));
for (int y = startY; y >= Math.max(minY, startY - VERTICAL_SCAN); y--) {
mutable.set(x, y, z);
if (!level.getBlockState(mutable).canBeReplaced()) {
continue;
}
BlockPos abovePos = mutable.above();
BlockState aboveState = level.getBlockState(abovePos);
if (!aboveState.isFaceSturdy(level, abovePos, net.minecraft.core.Direction.DOWN)) {
continue;
}
if (!level.getBlockState(mutable.below()).canBeReplaced()) {
continue;
}
return mutable.immutable();
}
}
return null;
}
private static boolean placeColumn(WorldGenLevel level, MoltingVinesBlock block, BlockPos anchorPos, RandomSource random) {
int maxLength = MIN_LENGTH + random.nextInt(MAX_LENGTH - MIN_LENGTH + 1);
int length = 0;
BlockPos.MutableBlockPos mutable = anchorPos.mutable();
while (length < maxLength && mutable.getY() > level.getMinBuildHeight()) {
BlockState existing = level.getBlockState(mutable);
if (!existing.canBeReplaced()) {
break;
}
length++;
mutable.move(0, -1, 0);
}
if (length < MIN_LENGTH) {
return false;
}
int fruitIndex = -1;
if (length >= 3 && random.nextInt(BROODFRUIT_CHANCE) == 0) {
fruitIndex = 1 + random.nextInt(length - 2);
}
for (int offset = 0; offset < length; offset++) {
BlockPos pos = anchorPos.below(offset);
BlockState state = block.defaultBlockState()
.setValue(MoltingVinesBlock.DISTANCE, Math.min(offset, MoltingVinesBlock.DISTANCE.getPossibleValues().stream().max(Integer::compareTo).orElse(6)))
.setValue(MoltingVinesBlock.BOTTOM_CAP, offset == length - 1)
.setValue(MoltingVinesBlock.BROODFRUIT, offset == fruitIndex);
if (!state.canSurvive(level, pos)) {
return false;
}
level.setBlock(pos, state, 3);
}
return true;
}
private static Block getBlock(ResourceLocation id) {
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
return block.orElse(null);
}
}
@@ -0,0 +1,486 @@
package com.craisinlord.antarchy.content.worldgen.cavaryn;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.AntarchyTags;
import com.mojang.serialization.Codec;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.CaveVinesBlock;
import net.minecraft.world.level.block.RotatedPillarBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.Tilt;
import net.minecraft.world.level.biome.Biome;
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;
public final class RollyCavesGiantCavernFeature extends Feature<NoneFeatureConfiguration> {
private static final ResourceKey<Biome> ROLLY_CAVES = ResourceKey.create(
Registries.BIOME, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "rolly_caves"));
private static final ResourceLocation GLOWCAP_MUSHROOM_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glowcap_mushroom");
private static final ResourceLocation AMBER_MOSS_BLOCK_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "amber_moss_block");
private static final ResourceLocation OURANWOOD_WOOD_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "ouranwood_wood");
private static final ResourceLocation MOSSY_OURANWOOD_WOOD_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "mossy_ouranwood_wood");
private static final ResourceLocation MOSSY_OURANWOOD_LOG_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "mossy_ouranwood_log");
private static final int TRUNK_RADIUS = 2;
private static final int MOSSY_PATCH_CHANCE = 4;
private static final int BIOME_SAMPLE_RADIUS = 10;
private static final int BIOME_SAMPLE_STEP = 5;
private static final int MIN_BIOME_SAMPLE_MATCHES = 5;
private static final int MIN_NATURAL_CLEARANCE = 6;
private static final int SCAN_LIMIT = 48;
private static final int CHAMBER_HEIGHT_MIN = 26;
private static final int CHAMBER_HEIGHT_MAX = 46;
private static final int CHAMBER_RADIUS_MIN = 8;
private static final int CHAMBER_RADIUS_MAX = 12;
private static final int BLOB_LAYER_COUNT = 9;
private static final double MAX_DRIFT_FROM_CENTER = 6.0;
private static final int MAX_PROCESSED_POSITIONS = 60000;
private static final int FLOOR_DECORATION_ATTEMPTS = 40;
private static final int CEILING_DECORATION_ATTEMPTS = 30;
private static final int MAX_VINE_LENGTH = 10;
public RollyCavesGiantCavernFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
try {
return tryPlace(context);
} catch (RuntimeException exception) {
return false;
}
}
private boolean tryPlace(FeaturePlaceContext<NoneFeatureConfiguration> context) {
WorldGenLevel level = context.level();
RandomSource random = context.random();
BlockPos origin = context.origin();
if (!isSurroundedByRollyCaves(level, origin)) {
return false;
}
NaturalPocket pocket = findNaturalPocket(level, origin);
if (pocket == null) {
return false;
}
List<Blob> blobs = buildBlobs(random, pocket.center());
int carvedPositions = carveBlobs(level, blobs);
if (carvedPositions == 0) {
return false;
}
placeTrunk(level, random, blobs);
decorateFloor(level, random, blobs);
decorateCeiling(level, random, blobs);
return true;
}
private static void placeTrunk(WorldGenLevel level, RandomSource random, List<Blob> blobs) {
Block woodBlock = getBlock(OURANWOOD_WOOD_ID);
Block mossyWoodBlock = getBlock(MOSSY_OURANWOOD_WOOD_ID);
Block mossyLogBlock = getBlock(MOSSY_OURANWOOD_LOG_ID);
if (woodBlock == null || mossyWoodBlock == null || mossyLogBlock == null) {
return;
}
Blob bottom = blobs.get(0);
Blob top = blobs.get(blobs.size() - 1);
int trunkBottomY = (int) Math.floor(bottom.y() - bottom.verticalRadius()) + 1;
int trunkTopY = (int) Math.ceil(top.y() + top.verticalRadius()) - 1;
BlockState woodState = woodBlock.defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y);
BlockState mossyWoodState = mossyWoodBlock.defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y);
BlockState mossyLogState = mossyLogBlock.defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y);
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int y = trunkBottomY; y <= trunkTopY; y++) {
double[] center = interpolateCenter(blobs, y);
int centerX = (int) Math.round(center[0]);
int centerZ = (int) Math.round(center[1]);
for (int dx = -TRUNK_RADIUS; dx <= TRUNK_RADIUS; dx++) {
for (int dz = -TRUNK_RADIUS; dz <= TRUNK_RADIUS; dz++) {
if (dx * dx + dz * dz > TRUNK_RADIUS * TRUNK_RADIUS) {
continue;
}
mutable.set(centerX + dx, y, centerZ + dz);
BlockState existing = level.getBlockState(mutable);
if (existing.is(Blocks.BEDROCK) || level.getBlockEntity(mutable) != null) {
continue;
}
if (!existing.getFluidState().isEmpty()) {
continue;
}
boolean surface = dx * dx + dz * dz >= (TRUNK_RADIUS - 1) * (TRUNK_RADIUS - 1);
BlockState toPlace = woodState;
if (surface && random.nextInt(MOSSY_PATCH_CHANCE) == 0) {
toPlace = random.nextBoolean() ? mossyWoodState : mossyLogState;
}
level.setBlock(mutable, toPlace, 2);
}
}
}
}
private static double[] interpolateCenter(List<Blob> blobs, int y) {
Blob lower = blobs.get(0);
Blob upper = blobs.get(blobs.size() - 1);
for (int i = 0; i < blobs.size() - 1; i++) {
if (y >= blobs.get(i).y() && y <= blobs.get(i + 1).y()) {
lower = blobs.get(i);
upper = blobs.get(i + 1);
break;
}
}
double span = upper.y() - lower.y();
double t = span == 0 ? 0 : (y - lower.y()) / span;
t = Math.max(0.0, Math.min(1.0, t));
double x = lower.x() + (upper.x() - lower.x()) * t;
double z = lower.z() + (upper.z() - lower.z()) * t;
return new double[] {x, z};
}
private static boolean isSurroundedByRollyCaves(WorldGenLevel level, BlockPos origin) {
int matches = 0;
int samples = 0;
for (int dx = -BIOME_SAMPLE_RADIUS; dx <= BIOME_SAMPLE_RADIUS; dx += BIOME_SAMPLE_STEP) {
for (int dz = -BIOME_SAMPLE_RADIUS; dz <= BIOME_SAMPLE_RADIUS; dz += BIOME_SAMPLE_STEP) {
samples++;
if (level.getBiome(origin.offset(dx, 0, dz)).is(ROLLY_CAVES)) {
matches++;
}
}
}
return samples > 0 && matches >= MIN_BIOME_SAMPLE_MATCHES;
}
private static NaturalPocket findNaturalPocket(WorldGenLevel level, BlockPos origin) {
BlockPos.MutableBlockPos cursor = origin.mutable();
if (!level.getBlockState(cursor).isAir()) {
boolean found = false;
for (int radius = 1; radius <= 6 && !found; radius++) {
for (Direction direction : Direction.Plane.HORIZONTAL) {
BlockPos candidate = origin.relative(direction, radius);
if (level.getBlockState(candidate).isAir()) {
cursor.set(candidate);
found = true;
break;
}
}
}
if (!found) {
return null;
}
}
int floorY = cursor.getY();
for (int steps = 0; steps < SCAN_LIMIT; steps++) {
BlockPos below = new BlockPos(cursor.getX(), floorY - 1, cursor.getZ());
if (!level.getBlockState(below).isAir()) {
break;
}
floorY--;
}
int ceilingY = cursor.getY();
for (int steps = 0; steps < SCAN_LIMIT; steps++) {
BlockPos above = new BlockPos(cursor.getX(), ceilingY + 1, cursor.getZ());
if (!level.getBlockState(above).isAir()) {
break;
}
ceilingY++;
}
int clearance = ceilingY - floorY;
if (clearance < MIN_NATURAL_CLEARANCE) {
return null;
}
BlockPos center = new BlockPos(cursor.getX(), (floorY + ceilingY) / 2, cursor.getZ());
return new NaturalPocket(center);
}
private static List<Blob> buildBlobs(RandomSource random, BlockPos center) {
int chamberHeight = CHAMBER_HEIGHT_MIN + random.nextInt(CHAMBER_HEIGHT_MAX - CHAMBER_HEIGHT_MIN + 1);
int baseY = center.getY() - chamberHeight / 2;
List<Blob> blobs = new ArrayList<>(BLOB_LAYER_COUNT);
double driftX = center.getX();
double driftZ = center.getZ();
for (int i = 0; i < BLOB_LAYER_COUNT; i++) {
double t = (double) i / (BLOB_LAYER_COUNT - 1);
double taper = Math.sin(Math.PI * t);
int layerY = baseY + (int) Math.round(t * chamberHeight);
double baseRadius = CHAMBER_RADIUS_MIN + (CHAMBER_RADIUS_MAX - CHAMBER_RADIUS_MIN) * taper;
double jitter = 0.85 + random.nextDouble() * 0.3;
double horizontalRadius = Math.max(2.5, baseRadius * jitter);
double verticalRadius = Math.max(3.0, chamberHeight / (double) BLOB_LAYER_COUNT * 1.6);
driftX = clampDrift(driftX + (random.nextDouble() - 0.5) * 3.0, center.getX());
driftZ = clampDrift(driftZ + (random.nextDouble() - 0.5) * 3.0, center.getZ());
blobs.add(new Blob(driftX, layerY, driftZ, horizontalRadius, verticalRadius));
}
return blobs;
}
private static double clampDrift(double value, double center) {
return Math.max(center - MAX_DRIFT_FROM_CENTER, Math.min(center + MAX_DRIFT_FROM_CENTER, value));
}
private static int carveBlobs(WorldGenLevel level, List<Blob> blobs) {
int minX = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int minY = Integer.MAX_VALUE;
int maxY = Integer.MIN_VALUE;
int minZ = Integer.MAX_VALUE;
int maxZ = Integer.MIN_VALUE;
for (Blob blob : blobs) {
minX = Math.min(minX, (int) Math.floor(blob.x() - blob.horizontalRadius()));
maxX = Math.max(maxX, (int) Math.ceil(blob.x() + blob.horizontalRadius()));
minY = Math.min(minY, (int) Math.floor(blob.y() - blob.verticalRadius()));
maxY = Math.max(maxY, (int) Math.ceil(blob.y() + blob.verticalRadius()));
minZ = Math.min(minZ, (int) Math.floor(blob.z() - blob.horizontalRadius()));
maxZ = Math.max(maxZ, (int) Math.ceil(blob.z() + blob.horizontalRadius()));
}
BlockState caveAir = Blocks.CAVE_AIR.defaultBlockState();
int processed = 0;
int carved = 0;
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int x = minX; x <= maxX && processed < MAX_PROCESSED_POSITIONS; x++) {
for (int y = minY; y <= maxY && processed < MAX_PROCESSED_POSITIONS; y++) {
for (int z = minZ; z <= maxZ && processed < MAX_PROCESSED_POSITIONS; z++) {
processed++;
if (!insideAnyBlob(blobs, x, y, z)) {
continue;
}
mutable.set(x, y, z);
BlockState state = level.getBlockState(mutable);
if (state.is(Blocks.BEDROCK) || !state.getFluidState().isEmpty()) {
continue;
}
if (level.getBlockEntity(mutable) != null) {
continue;
}
if (state.isAir()) {
continue;
}
if (!state.is(AntarchyTags.Blocks.ROLLY_CAVERN_CARVEABLE)) {
continue;
}
level.setBlock(mutable, caveAir, 2);
carved++;
}
}
}
return carved;
}
private static boolean insideAnyBlob(List<Blob> blobs, int x, int y, int z) {
for (Blob blob : blobs) {
double dx = (x + 0.5 - blob.x()) / blob.horizontalRadius();
double dy = (y + 0.5 - blob.y()) / blob.verticalRadius();
double dz = (z + 0.5 - blob.z()) / blob.horizontalRadius();
if (dx * dx + dy * dy + dz * dz <= 1.0) {
return true;
}
}
return false;
}
private static void decorateFloor(WorldGenLevel level, RandomSource random, List<Blob> blobs) {
Blob widest = widestBlob(blobs);
Block glowcap = getBlock(GLOWCAP_MUSHROOM_ID);
Block amberMoss = getBlock(AMBER_MOSS_BLOCK_ID);
for (int attempt = 0; attempt < FLOOR_DECORATION_ATTEMPTS; attempt++) {
double angle = random.nextDouble() * Math.PI * 2;
double distance = random.nextDouble() * widest.horizontalRadius();
int x = (int) Math.round(widest.x() + Math.cos(angle) * distance);
int z = (int) Math.round(widest.z() + Math.sin(angle) * distance);
BlockPos floorPos = findFloor(level, x, (int) Math.round(widest.y()), z);
if (floorPos == null) {
continue;
}
BlockPos abovePos = floorPos.above();
if (!level.getBlockState(abovePos).isAir()) {
continue;
}
int roll = random.nextInt(100);
if (roll < 28) {
level.setBlock(floorPos, Blocks.MOSS_BLOCK.defaultBlockState(), 2);
if (random.nextBoolean()) {
level.setBlock(abovePos, Blocks.MOSS_CARPET.defaultBlockState(), 2);
}
} else if (roll < 40) {
level.setBlock(abovePos, Blocks.SHORT_GRASS.defaultBlockState(), 2);
} else if (roll < 50) {
level.setBlock(abovePos, Blocks.SMALL_DRIPLEAF.defaultBlockState(), 2);
} else if (roll < 58) {
placeBigDripleaf(level, random, abovePos);
} else if (roll < 74 && glowcap != null && amberMoss != null) {
level.setBlock(floorPos, amberMoss.defaultBlockState(), 2);
level.setBlock(abovePos, glowcap.defaultBlockState(), 2);
}
}
}
private static void placeBigDripleaf(WorldGenLevel level, RandomSource random, BlockPos basePos) {
int height = 1 + random.nextInt(3);
BlockPos.MutableBlockPos cursor = basePos.mutable();
for (int i = 0; i < height; i++) {
if (!level.getBlockState(cursor).isAir()) {
return;
}
level.setBlock(cursor, Blocks.BIG_DRIPLEAF_STEM.defaultBlockState(), 2);
cursor.move(Direction.UP);
}
if (level.getBlockState(cursor).isAir()) {
level.setBlock(cursor, Blocks.BIG_DRIPLEAF.defaultBlockState().setValue(BlockStateProperties.TILT, Tilt.NONE), 2);
}
}
private static void decorateCeiling(WorldGenLevel level, RandomSource random, List<Blob> blobs) {
Blob widest = widestBlob(blobs);
for (int attempt = 0; attempt < CEILING_DECORATION_ATTEMPTS; attempt++) {
double angle = random.nextDouble() * Math.PI * 2;
double distance = random.nextDouble() * widest.horizontalRadius();
int x = (int) Math.round(widest.x() + Math.cos(angle) * distance);
int z = (int) Math.round(widest.z() + Math.sin(angle) * distance);
BlockPos ceilingAttach = findCeiling(level, x, (int) Math.round(widest.y()), z);
if (ceilingAttach == null) {
continue;
}
BlockPos hangPos = ceilingAttach.below();
if (!level.getBlockState(hangPos).isAir()) {
continue;
}
int roll = random.nextInt(100);
if (roll < 30) {
level.setBlock(hangPos, Blocks.SPORE_BLOSSOM.defaultBlockState(), 2);
} else {
placeCaveVineCurtain(level, random, hangPos);
}
}
}
private static void placeCaveVineCurtain(WorldGenLevel level, RandomSource random, BlockPos hangPos) {
int length = availableAirLength(level, hangPos, MAX_VINE_LENGTH);
if (length <= 0) {
return;
}
BlockPos.MutableBlockPos cursor = hangPos.mutable();
for (int i = 0; i < length - 1; i++) {
boolean berries = random.nextInt(4) == 0;
level.setBlock(cursor, Blocks.CAVE_VINES_PLANT.defaultBlockState().setValue(CaveVinesBlock.BERRIES, berries), 2);
cursor.move(Direction.DOWN);
}
boolean tipBerries = random.nextInt(3) == 0;
level.setBlock(cursor, Blocks.CAVE_VINES.defaultBlockState().setValue(CaveVinesBlock.BERRIES, tipBerries), 2);
}
private static int availableAirLength(WorldGenLevel level, BlockPos start, int cap) {
BlockPos.MutableBlockPos cursor = start.mutable();
int length = 0;
while (length < cap && level.getBlockState(cursor).isAir()) {
length++;
cursor.move(Direction.DOWN);
}
return length;
}
private static BlockPos findFloor(WorldGenLevel level, int x, int startY, int z) {
BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(x, startY, z);
for (int steps = 0; steps < SCAN_LIMIT; steps++) {
BlockState state = level.getBlockState(cursor);
BlockState below = level.getBlockState(cursor.below());
if (state.isAir() && !below.isAir() && below.isFaceSturdy(level, cursor.below(), Direction.UP)) {
return cursor.immutable();
}
cursor.move(Direction.DOWN);
}
return null;
}
private static BlockPos findCeiling(WorldGenLevel level, int x, int startY, int z) {
BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(x, startY, z);
for (int steps = 0; steps < SCAN_LIMIT; steps++) {
BlockState state = level.getBlockState(cursor);
BlockState above = level.getBlockState(cursor.above());
if (state.isAir() && !above.isAir() && above.isFaceSturdy(level, cursor.above(), Direction.DOWN)) {
return cursor.above().immutable();
}
cursor.move(Direction.UP);
}
return null;
}
private static Blob widestBlob(List<Blob> blobs) {
Blob widest = blobs.get(0);
for (Blob blob : blobs) {
if (blob.horizontalRadius() > widest.horizontalRadius()) {
widest = blob;
}
}
return widest;
}
private static Block getBlock(ResourceLocation id) {
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
return block.orElse(null);
}
private record NaturalPocket(BlockPos center) {
}
private record Blob(double x, double y, double z, double horizontalRadius, double verticalRadius) {
}
}
@@ -0,0 +1,158 @@
package com.craisinlord.antarchy.content.worldgen.mushroom;
import com.craisinlord.antarchy.Antarchy;
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.tags.BlockTags;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.HugeMushroomBlock;
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;
public final class GlowcapHugeMushroomFeature extends Feature<NoneFeatureConfiguration> {
private static final ResourceLocation GLOWCAP_MUSHROOM_BLOCK_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glowcap_mushroom_block");
private static final int MIN_STEM_HEIGHT = 5;
private static final int MAX_STEM_HEIGHT = 8;
private static final int CAP_RADIUS = 2;
private static final int TOP_RADIUS = 1;
public GlowcapHugeMushroomFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
Block glowcapBlock = getBlock(GLOWCAP_MUSHROOM_BLOCK_ID);
if (glowcapBlock == null || !(glowcapBlock.defaultBlockState().getBlock() instanceof HugeMushroomBlock)) {
return false;
}
WorldGenLevel level = context.level();
RandomSource random = context.random();
int stemHeight = MIN_STEM_HEIGHT + random.nextInt(MAX_STEM_HEIGHT - MIN_STEM_HEIGHT + 1);
BlockPos origin = context.origin();
if (!isValidPlacementOrigin(level, origin, stemHeight + 2)) {
return false;
}
BlockState capBase = glowcapBlock.defaultBlockState();
BlockState stemState = Blocks.MUSHROOM_STEM.defaultBlockState();
Direction lean = Direction.Plane.HORIZONTAL.getRandomDirection(random);
BlockPos.MutableBlockPos cursor = origin.mutable();
boolean placedAny = false;
for (int i = 0; i < stemHeight; i++) {
if (i > 1 && i % 2 == 0) {
cursor.move(lean);
}
cursor.setY(origin.getY() + i);
if (!canReplace(level, cursor)) {
continue;
}
level.setBlock(cursor, stemState, 3);
placedAny = true;
}
BlockPos capCenter = cursor.above().immutable();
placedAny |= placeUmbrellaCap(level, random, capCenter, capBase);
return placedAny;
}
private static boolean isValidPlacementOrigin(WorldGenLevel level, BlockPos origin, int clearanceHeight) {
if (!level.getBlockState(origin).isAir()) {
return false;
}
BlockPos belowPos = origin.below();
BlockState belowState = level.getBlockState(belowPos);
if (!belowState.is(BlockTags.MUSHROOM_GROW_BLOCK) && !belowState.isFaceSturdy(level, belowPos, Direction.UP)) {
return false;
}
return hasVerticalClearance(level, origin, clearanceHeight);
}
private static boolean hasVerticalClearance(WorldGenLevel level, BlockPos origin, int clearanceHeight) {
for (int offset = 0; offset <= clearanceHeight; offset++) {
if (!canReplace(level, origin.above(offset))) {
return false;
}
}
return true;
}
private boolean placeUmbrellaCap(WorldGenLevel level, RandomSource random, BlockPos capCenter, BlockState capBase) {
boolean placedAny = false;
BlockState stemState = Blocks.MUSHROOM_STEM.defaultBlockState();
for (int dx = -CAP_RADIUS; dx <= CAP_RADIUS; dx++) {
for (int dz = -CAP_RADIUS; dz <= CAP_RADIUS; dz++) {
boolean isCenter = dx == 0 && dz == 0;
boolean coveredByTopTier = Math.abs(dx) <= TOP_RADIUS && Math.abs(dz) <= TOP_RADIUS;
BlockPos pos = new BlockPos(capCenter.getX() + dx, capCenter.getY(), capCenter.getZ() + dz);
if (!canReplace(level, pos)) {
continue;
}
if (isCenter) {
level.setBlock(pos, stemState, 3);
placedAny = true;
continue;
}
BlockState state = capBase
.setValue(HugeMushroomBlock.NORTH, dz == -CAP_RADIUS)
.setValue(HugeMushroomBlock.SOUTH, dz == CAP_RADIUS)
.setValue(HugeMushroomBlock.EAST, dx == CAP_RADIUS)
.setValue(HugeMushroomBlock.WEST, dx == -CAP_RADIUS)
.setValue(HugeMushroomBlock.UP, !coveredByTopTier)
.setValue(HugeMushroomBlock.DOWN, true);
level.setBlock(pos, state, 3);
placedAny = true;
}
}
int topY = capCenter.getY() + 1;
for (int dx = -TOP_RADIUS; dx <= TOP_RADIUS; dx++) {
for (int dz = -TOP_RADIUS; dz <= TOP_RADIUS; dz++) {
BlockPos pos = new BlockPos(capCenter.getX() + dx, topY, capCenter.getZ() + dz);
if (!canReplace(level, pos)) {
continue;
}
BlockState state = capBase
.setValue(HugeMushroomBlock.NORTH, dz == -TOP_RADIUS)
.setValue(HugeMushroomBlock.SOUTH, dz == TOP_RADIUS)
.setValue(HugeMushroomBlock.EAST, dx == TOP_RADIUS)
.setValue(HugeMushroomBlock.WEST, dx == -TOP_RADIUS)
.setValue(HugeMushroomBlock.UP, true)
.setValue(HugeMushroomBlock.DOWN, false);
level.setBlock(pos, state, 3);
placedAny = true;
}
}
return placedAny;
}
private static boolean canReplace(WorldGenLevel level, BlockPos pos) {
BlockState existing = level.getBlockState(pos);
return existing.isAir() || existing.canBeReplaced();
}
private static Block getBlock(ResourceLocation id) {
return BuiltInRegistries.BLOCK.getOptional(id).orElse(null);
}
}
@@ -0,0 +1,180 @@
package com.craisinlord.antarchy.content.worldgen.mushroom;
import com.craisinlord.antarchy.Antarchy;
import com.mojang.serialization.Codec;
import java.util.Optional;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.HugeMushroomBlock;
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;
public final class GlowcapHugeMushroomWorldgenFeature extends Feature<NoneFeatureConfiguration> {
private static final ResourceLocation GLOWCAP_MUSHROOM_BLOCK_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glowcap_mushroom_block");
private static final int MIN_STEM_HEIGHT = 5;
private static final int MAX_STEM_HEIGHT = 8;
private static final int CAP_RADIUS = 2;
private static final int TOP_RADIUS = 1;
private static final int SEARCH_RADIUS = 6;
private static final int SEARCH_ATTEMPTS = 20;
private static final int VERTICAL_SCAN = 12;
public GlowcapHugeMushroomWorldgenFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> context) {
Block glowcapBlock = getBlock(GLOWCAP_MUSHROOM_BLOCK_ID);
if (glowcapBlock == null || !(glowcapBlock.defaultBlockState().getBlock() instanceof HugeMushroomBlock)) {
return false;
}
WorldGenLevel level = context.level();
RandomSource random = context.random();
int stemHeight = MIN_STEM_HEIGHT + random.nextInt(MAX_STEM_HEIGHT - MIN_STEM_HEIGHT + 1);
BlockPos origin = findPlacementOrigin(level, context.origin(), random, stemHeight + 2);
if (origin == null) {
return false;
}
BlockState capBase = glowcapBlock.defaultBlockState();
BlockState stemState = Blocks.MUSHROOM_STEM.defaultBlockState();
Direction lean = Direction.Plane.HORIZONTAL.getRandomDirection(random);
BlockPos.MutableBlockPos cursor = origin.mutable();
boolean placedAny = false;
for (int i = 0; i < stemHeight; i++) {
if (i > 1 && i % 2 == 0) {
cursor.move(lean);
}
cursor.setY(origin.getY() + i);
if (!canReplace(level, cursor)) {
continue;
}
level.setBlock(cursor, stemState, 3);
placedAny = true;
}
BlockPos capCenter = cursor.above().immutable();
placedAny |= placeUmbrellaCap(level, capCenter, capBase);
return placedAny;
}
private static BlockPos findPlacementOrigin(WorldGenLevel level, BlockPos origin, RandomSource random, int clearanceHeight) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
int minY = Math.max(level.getMinBuildHeight() + 2, origin.getY() - VERTICAL_SCAN);
int maxY = Math.min(level.getMaxBuildHeight() - clearanceHeight - 2, origin.getY() + VERTICAL_SCAN);
for (int attempt = 0; attempt < SEARCH_ATTEMPTS; attempt++) {
int x = origin.getX() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
int z = origin.getZ() + random.nextInt(SEARCH_RADIUS * 2 + 1) - SEARCH_RADIUS;
for (int y = maxY; y >= minY; y--) {
mutable.set(x, y, z);
if (!isValidPlacementOrigin(level, mutable, clearanceHeight)) {
continue;
}
return mutable.immutable();
}
}
return null;
}
private static boolean isValidPlacementOrigin(WorldGenLevel level, BlockPos origin, int clearanceHeight) {
if (!level.getBlockState(origin).isAir()) {
return false;
}
BlockPos belowPos = origin.below();
BlockState belowState = level.getBlockState(belowPos);
if (!belowState.is(BlockTags.MUSHROOM_GROW_BLOCK) && !belowState.isFaceSturdy(level, belowPos, Direction.UP)) {
return false;
}
return hasVerticalClearance(level, origin, clearanceHeight);
}
private static boolean hasVerticalClearance(WorldGenLevel level, BlockPos origin, int clearanceHeight) {
for (int offset = 0; offset <= clearanceHeight; offset++) {
if (!canReplace(level, origin.above(offset))) {
return false;
}
}
return true;
}
private static boolean placeUmbrellaCap(WorldGenLevel level, BlockPos capCenter, BlockState capBase) {
boolean placedAny = false;
BlockState stemState = Blocks.MUSHROOM_STEM.defaultBlockState();
for (int dx = -CAP_RADIUS; dx <= CAP_RADIUS; dx++) {
for (int dz = -CAP_RADIUS; dz <= CAP_RADIUS; dz++) {
boolean isCenter = dx == 0 && dz == 0;
boolean coveredByTopTier = Math.abs(dx) <= TOP_RADIUS && Math.abs(dz) <= TOP_RADIUS;
BlockPos pos = new BlockPos(capCenter.getX() + dx, capCenter.getY(), capCenter.getZ() + dz);
if (!canReplace(level, pos)) {
continue;
}
if (isCenter) {
level.setBlock(pos, stemState, 3);
placedAny = true;
continue;
}
BlockState state = capBase
.setValue(HugeMushroomBlock.NORTH, dz == -CAP_RADIUS)
.setValue(HugeMushroomBlock.SOUTH, dz == CAP_RADIUS)
.setValue(HugeMushroomBlock.EAST, dx == CAP_RADIUS)
.setValue(HugeMushroomBlock.WEST, dx == -CAP_RADIUS)
.setValue(HugeMushroomBlock.UP, !coveredByTopTier)
.setValue(HugeMushroomBlock.DOWN, true);
level.setBlock(pos, state, 3);
placedAny = true;
}
}
int topY = capCenter.getY() + 1;
for (int dx = -TOP_RADIUS; dx <= TOP_RADIUS; dx++) {
for (int dz = -TOP_RADIUS; dz <= TOP_RADIUS; dz++) {
BlockPos pos = new BlockPos(capCenter.getX() + dx, topY, capCenter.getZ() + dz);
if (!canReplace(level, pos)) {
continue;
}
BlockState state = capBase
.setValue(HugeMushroomBlock.NORTH, dz == -TOP_RADIUS)
.setValue(HugeMushroomBlock.SOUTH, dz == TOP_RADIUS)
.setValue(HugeMushroomBlock.EAST, dx == TOP_RADIUS)
.setValue(HugeMushroomBlock.WEST, dx == -TOP_RADIUS)
.setValue(HugeMushroomBlock.UP, true)
.setValue(HugeMushroomBlock.DOWN, false);
level.setBlock(pos, state, 3);
placedAny = true;
}
}
return placedAny;
}
private static boolean canReplace(WorldGenLevel level, BlockPos pos) {
BlockState existing = level.getBlockState(pos);
return existing.isAir() || existing.canBeReplaced();
}
private static Block getBlock(ResourceLocation id) {
Optional<Block> block = BuiltInRegistries.BLOCK.getOptional(id);
return block.orElse(null);
}
}
@@ -1,14 +1,11 @@
package com.craisinlord.antarchy.content.worldgen.thoraxis;
import com.craisinlord.antarchy.content.AntarchyObjects;
import com.craisinlord.antarchy.content.block.PotentNyxiteBlock;
import com.craisinlord.antarchy.content.block.state.PotentNyxiteState;
import com.mojang.serialization.Codec;
import net.minecraft.core.BlockPos;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FluidState;
@@ -60,7 +57,6 @@ public final class LucidAntiwaterPoolFeature extends Feature<ThoraxisAntiwaterPo
placedAny |= placeCeilingBasin(level, random, offsetX, floorY, offsetZ, lobeRadius, ceilingY, profile, basaltState, antiwaterSourceState);
placedAny |= placeAntiwaterSources(level, random, offsetX, floorY, offsetZ, Math.max(2, lobeRadius - 1), ventBudget, antiwaterSourceState);
// placedAny |= maybePlacePotentNyxite(level, random, offsetX, floorY, offsetZ, Math.max(2, lobeRadius - 1));
}
return placedAny;
@@ -229,54 +225,6 @@ public final class LucidAntiwaterPoolFeature extends Feature<ThoraxisAntiwaterPo
return placedAny;
}
private static boolean maybePlacePotentNyxite(
WorldGenLevel level,
RandomSource random,
int centerX,
int floorY,
int centerZ,
int radius
) {
if (random.nextInt(8) != 0) {
return false;
}
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
BlockState magmaState = Blocks.MAGMA_BLOCK.defaultBlockState();
BlockState potentState = AntarchyObjects.POTENT_NYXITE.get()
.defaultBlockState()
.setValue(PotentNyxiteBlock.STATE, PotentNyxiteState.DORMANT);
for (int attempt = 0; attempt < 12; attempt++) {
int dx = random.nextInt(radius * 2 + 1) - radius;
int dz = random.nextInt(radius * 2 + 1) - radius;
if (dx * dx + dz * dz > radius * radius) {
continue;
}
int worldX = centerX + dx;
int worldZ = centerZ + dz;
int localCeilingY = findCeilingY(level, worldX, worldZ, floorY);
if (localCeilingY <= floorY + MIN_CAVITY_HEIGHT) {
continue;
}
BlockPos magmaPos = new BlockPos(worldX, localCeilingY, worldZ);
BlockPos potentPos = magmaPos.below();
if (!isSolidSurface(level.getBlockState(magmaPos)) || !isOpenBlock(level.getBlockState(potentPos))) {
continue;
}
mutable.set(magmaPos);
level.setBlock(mutable, magmaState, 2);
mutable.set(potentPos);
level.setBlock(mutable, potentState, 2);
return true;
}
return false;
}
private static BlockPos findSupportedSourcePos(WorldGenLevel level, int x, int floorY, int z) {
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (int y = floorY + 2; y >= floorY - 3; y--) {
@@ -56,6 +56,7 @@
"multipart.EntityMultipartLifecycleMixin"
],
"client": [
"client.CavarynSkyMixin",
"client.ElythiaSkyMixin",
"client.ElytraModelAccessor",
"client.FrogRendererElythiaMixin",
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,150 @@
{
"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"
}
}
]
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/amber_moss_block"
}
}
}
@@ -0,0 +1,154 @@
{
"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"
}
}
]
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/bile_vein"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/broodstone"
}
}
}
@@ -0,0 +1,13 @@
{
"variants": {
"type=double": {
"model": "antarchy:block/broodstone_bricks"
},
"type=bottom": {
"model": "antarchy:block/broodstone_brick_slab"
},
"type=top": {
"model": "antarchy:block/broodstone_brick_slab_top"
}
}
}
@@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "antarchy:block/broodstone_brick_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "antarchy:block/broodstone_brick_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "antarchy:block/broodstone_brick_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "antarchy:block/broodstone_brick_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "antarchy:block/broodstone_brick_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "antarchy:block/broodstone_brick_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "antarchy:block/broodstone_brick_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "antarchy:block/broodstone_brick_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "antarchy:block/broodstone_brick_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "antarchy:block/broodstone_brick_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "antarchy:block/broodstone_brick_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "antarchy:block/broodstone_brick_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "antarchy:block/broodstone_brick_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "antarchy:block/broodstone_brick_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}
@@ -0,0 +1,40 @@
{
"multipart": [
{
"when": { "up": "true" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_post" }
},
{
"when": { "north": "low" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_side", "uvlock": true }
},
{
"when": { "east": "low" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_side", "y": 90, "uvlock": true }
},
{
"when": { "south": "low" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_side", "y": 180, "uvlock": true }
},
{
"when": { "west": "low" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_side", "y": 270, "uvlock": true }
},
{
"when": { "north": "tall" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_side_tall", "uvlock": true }
},
{
"when": { "east": "tall" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_side_tall", "y": 90, "uvlock": true }
},
{
"when": { "south": "tall" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_side_tall", "y": 180, "uvlock": true }
},
{
"when": { "west": "tall" },
"apply": { "model": "antarchy:block/broodstone_brick_wall_side_tall", "y": 270, "uvlock": true }
}
]
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/broodstone_bricks"
}
}
}
@@ -0,0 +1,13 @@
{
"variants": {
"type=double": {
"model": "antarchy:block/broodstone"
},
"type=bottom": {
"model": "antarchy:block/broodstone_slab"
},
"type=top": {
"model": "antarchy:block/broodstone_slab_top"
}
}
}
@@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "antarchy:block/broodstone_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "antarchy:block/broodstone_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "antarchy:block/broodstone_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "antarchy:block/broodstone_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "antarchy:block/broodstone_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "antarchy:block/broodstone_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "antarchy:block/broodstone_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "antarchy:block/broodstone_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "antarchy:block/broodstone_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "antarchy:block/broodstone_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "antarchy:block/broodstone_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "antarchy:block/broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "antarchy:block/broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "antarchy:block/broodstone_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/broodstone_titanium_ore"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/broodstone_uranium_ore"
}
}
}
@@ -0,0 +1,40 @@
{
"multipart": [
{
"when": { "up": "true" },
"apply": { "model": "antarchy:block/broodstone_wall_post" }
},
{
"when": { "north": "low" },
"apply": { "model": "antarchy:block/broodstone_wall_side", "uvlock": true }
},
{
"when": { "east": "low" },
"apply": { "model": "antarchy:block/broodstone_wall_side", "y": 90, "uvlock": true }
},
{
"when": { "south": "low" },
"apply": { "model": "antarchy:block/broodstone_wall_side", "y": 180, "uvlock": true }
},
{
"when": { "west": "low" },
"apply": { "model": "antarchy:block/broodstone_wall_side", "y": 270, "uvlock": true }
},
{
"when": { "north": "tall" },
"apply": { "model": "antarchy:block/broodstone_wall_side_tall", "uvlock": true }
},
{
"when": { "east": "tall" },
"apply": { "model": "antarchy:block/broodstone_wall_side_tall", "y": 90, "uvlock": true }
},
{
"when": { "south": "tall" },
"apply": { "model": "antarchy:block/broodstone_wall_side_tall", "y": 180, "uvlock": true }
},
{
"when": { "west": "tall" },
"apply": { "model": "antarchy:block/broodstone_wall_side_tall", "y": 270, "uvlock": true }
}
]
}
@@ -0,0 +1,6 @@
{
"variants": {
"axis=x": { "model": "antarchy:block/cavaryn_portal_x" },
"axis=z": { "model": "antarchy:block/cavaryn_portal_z" }
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/chiseled_broodstone"
}
}
}
@@ -0,0 +1,16 @@
{
"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
}
}
}
@@ -0,0 +1,14 @@
{
"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" }
}
}
@@ -0,0 +1,76 @@
{
"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 }
]
}
}
@@ -0,0 +1,120 @@
{
"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"
}
}
]
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/glowcap_mushroom"
}
}
}
@@ -0,0 +1,115 @@
{
"multipart": [
{
"apply": {
"model": "antarchy:block/glowcap_mushroom_block"
},
"when": {
"north": "true"
}
},
{
"apply": {
"model": "antarchy:block/glowcap_mushroom_block",
"uvlock": true,
"y": 90
},
"when": {
"east": "true"
}
},
{
"apply": {
"model": "antarchy:block/glowcap_mushroom_block",
"uvlock": true,
"y": 180
},
"when": {
"south": "true"
}
},
{
"apply": {
"model": "antarchy:block/glowcap_mushroom_block",
"uvlock": true,
"y": 270
},
"when": {
"west": "true"
}
},
{
"apply": {
"model": "antarchy:block/glowcap_mushroom_block",
"uvlock": true,
"x": 270
},
"when": {
"up": "true"
}
},
{
"apply": {
"model": "antarchy:block/glowcap_mushroom_block",
"uvlock": true,
"x": 90
},
"when": {
"down": "true"
}
},
{
"apply": {
"model": "minecraft:block/mushroom_block_inside"
},
"when": {
"north": "false"
}
},
{
"apply": {
"model": "minecraft:block/mushroom_block_inside",
"y": 90
},
"when": {
"east": "false"
}
},
{
"apply": {
"model": "minecraft:block/mushroom_block_inside",
"y": 180
},
"when": {
"south": "false"
}
},
{
"apply": {
"model": "minecraft:block/mushroom_block_inside",
"y": 270
},
"when": {
"west": "false"
}
},
{
"apply": {
"model": "minecraft:block/mushroom_block_inside",
"x": 270
},
"when": {
"up": "false"
}
},
{
"apply": {
"model": "minecraft:block/mushroom_block_inside",
"x": 90
},
"when": {
"down": "false"
}
}
]
}
@@ -0,0 +1,10 @@
{
"variants": {
"bottom=false": {
"model": "antarchy:block/hanging_creeproots"
},
"bottom=true": {
"model": "antarchy:block/hanging_creeproots_bottom"
}
}
}
@@ -0,0 +1,20 @@
{
"variants": {
"hanging=false,rotated=false": {
"model": "antarchy:block/jumpy_bug_egg"
},
"hanging=false,rotated=true": {
"model": "antarchy:block/jumpy_bug_egg",
"y": 90
},
"hanging=true,rotated=false": {
"model": "antarchy:block/jumpy_bug_egg",
"x": 180
},
"hanging=true,rotated=true": {
"model": "antarchy:block/jumpy_bug_egg",
"x": 180,
"y": 90
}
}
}
@@ -0,0 +1,76 @@
{
"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 }
]
}
}
@@ -0,0 +1,22 @@
{
"variants": {
"growth_direction=up,top_cap=true,bottom_cap=false,broodfruit=false": {
"model": "antarchy:block/molting_vines_top"
},
"growth_direction=up,top_cap=false,bottom_cap=false,broodfruit=false": {
"model": "antarchy:block/molting_vines"
},
"growth_direction=up,top_cap=false,bottom_cap=false,broodfruit=true": {
"model": "antarchy:block/molting_vines_broodfruit"
},
"growth_direction=down,top_cap=false,bottom_cap=true,broodfruit=false": {
"model": "antarchy:block/molting_vines_bottom"
},
"growth_direction=down,top_cap=false,bottom_cap=false,broodfruit=false": {
"model": "antarchy:block/molting_vines"
},
"growth_direction=down,top_cap=false,bottom_cap=false,broodfruit=true": {
"model": "antarchy:block/molting_vines_broodfruit"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/myrmite"
}
}
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/polished_broodstone"
}
}
}
@@ -0,0 +1,13 @@
{
"variants": {
"type=double": {
"model": "antarchy:block/polished_broodstone"
},
"type=bottom": {
"model": "antarchy:block/polished_broodstone_slab"
},
"type=top": {
"model": "antarchy:block/polished_broodstone_slab_top"
}
}
}
@@ -0,0 +1,209 @@
{
"variants": {
"facing=east,half=bottom,shape=inner_left": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=inner_right": {
"model": "antarchy:block/polished_broodstone_stairs_inner"
},
"facing=east,half=bottom,shape=outer_left": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=east,half=bottom,shape=outer_right": {
"model": "antarchy:block/polished_broodstone_stairs_outer"
},
"facing=east,half=bottom,shape=straight": {
"model": "antarchy:block/polished_broodstone_stairs"
},
"facing=east,half=top,shape=inner_left": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=inner_right": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=outer_left": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=east,half=top,shape=outer_right": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=east,half=top,shape=straight": {
"model": "antarchy:block/polished_broodstone_stairs",
"uvlock": true,
"x": 180
},
"facing=north,half=bottom,shape=inner_left": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=inner_right": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=outer_left": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=north,half=bottom,shape=outer_right": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"y": 270
},
"facing=north,half=bottom,shape=straight": {
"model": "antarchy:block/polished_broodstone_stairs",
"uvlock": true,
"y": 270
},
"facing=north,half=top,shape=inner_left": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=inner_right": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=outer_left": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=north,half=top,shape=outer_right": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"x": 180
},
"facing=north,half=top,shape=straight": {
"model": "antarchy:block/polished_broodstone_stairs",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=south,half=bottom,shape=inner_left": {
"model": "antarchy:block/polished_broodstone_stairs_inner"
},
"facing=south,half=bottom,shape=inner_right": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=outer_left": {
"model": "antarchy:block/polished_broodstone_stairs_outer"
},
"facing=south,half=bottom,shape=outer_right": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=south,half=bottom,shape=straight": {
"model": "antarchy:block/polished_broodstone_stairs",
"uvlock": true,
"y": 90
},
"facing=south,half=top,shape=inner_left": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=inner_right": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=outer_left": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=south,half=top,shape=outer_right": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=south,half=top,shape=straight": {
"model": "antarchy:block/polished_broodstone_stairs",
"uvlock": true,
"x": 180,
"y": 90
},
"facing=west,half=bottom,shape=inner_left": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=inner_right": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=outer_left": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"y": 90
},
"facing=west,half=bottom,shape=outer_right": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"y": 180
},
"facing=west,half=bottom,shape=straight": {
"model": "antarchy:block/polished_broodstone_stairs",
"uvlock": true,
"y": 180
},
"facing=west,half=top,shape=inner_left": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=inner_right": {
"model": "antarchy:block/polished_broodstone_stairs_inner",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=outer_left": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 180
},
"facing=west,half=top,shape=outer_right": {
"model": "antarchy:block/polished_broodstone_stairs_outer",
"uvlock": true,
"x": 180,
"y": 270
},
"facing=west,half=top,shape=straight": {
"model": "antarchy:block/polished_broodstone_stairs",
"uvlock": true,
"x": 180,
"y": 180
}
}
}
@@ -0,0 +1,40 @@
{
"multipart": [
{
"when": { "up": "true" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_post" }
},
{
"when": { "north": "low" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_side", "uvlock": true }
},
{
"when": { "east": "low" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_side", "y": 90, "uvlock": true }
},
{
"when": { "south": "low" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_side", "y": 180, "uvlock": true }
},
{
"when": { "west": "low" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_side", "y": 270, "uvlock": true }
},
{
"when": { "north": "tall" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_side_tall", "uvlock": true }
},
{
"when": { "east": "tall" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_side_tall", "y": 90, "uvlock": true }
},
{
"when": { "south": "tall" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_side_tall", "y": 180, "uvlock": true }
},
{
"when": { "west": "tall" },
"apply": { "model": "antarchy:block/polished_broodstone_wall_side_tall", "y": 270, "uvlock": true }
}
]
}
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "antarchy:block/potted_glowcap_mushroom"
}
}
}
@@ -0,0 +1,8 @@
{
"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,231 @@
{
"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}
]
}
]
}
]
}
@@ -209,6 +209,9 @@
"item.antarchy.big_bertha_handle": "Big Bertha Handle",
"item.antarchy.big_bertha_hilt": "Big Bertha Hilt",
"item.antarchy.battle_axe": "Battle Axe",
"item.antarchy.attitude_adjuster": "Attitude Adjuster",
"tooltip.antarchy.attitude_adjuster.grounded": "Smashes targets on the ground upward, targets in the air slam onto the ground.",
"tooltip.antarchy.attitude_adjuster.slam": "Right-click while airborne to ground slam.",
"item.antarchy.cloud_shark_fin": "Cloud Shark Fin",
"item.antarchy.cloud_shark_fin_soup": "Cloud Shark Fin Soup",
"tooltip.antarchy.cloud_shark_fin_soup": "Grants Strength and Slow Falling.",
@@ -487,11 +490,13 @@
"item.antarchy.mantis_spawn_egg": "Mantis Spawn Egg",
"item.antarchy.alpha_mantis_spawn_egg": "Alpha Mantis Spawn Egg",
"biome.antarchy.moleworm_caves": "Moleworm Caves",
"biome.antarchy.elythia_meadow": "Elythian Meadows",
"biome.antarchy.butterfly_fields": "Butterfly Fields",
"biome.antarchy.ouranwood_forest": "Ouranwood Forest",
"biome.antarchy.glimmering_pools": "Glimmering Pools",
"biome.antarchy.peach_forest": "Peach Forest",
"biome.antarchy.fungal_ouranwood_forest": "Fungal Ouranwood Forest",
"biome.antarchy.glowcap_caves": "Glowcap Caves",
"message.antarchy.brown_ant_activated": "The brown ant is ready to open its destination.",
"message.antarchy.brown_ant_needs_reagent": "This brown ant needs a reagent before it can open its destination.",
"message.antarchy.rainbow_ant_activated": "The rainbow ant hums with a new Infinity destination.",
@@ -504,6 +509,9 @@
"message.antarchy.red_ant_needs_reagent": "This red ant needs a reagent before it can open its destination.",
"message.antarchy.termite_activated": "The termite is ready to open its destination.",
"message.antarchy.termite_needs_reagent": "This termite needs a reagent before it can open its destination.",
"death.attack.spit_bug_disrespect": "%1$s was disrespected by Spit Bug",
"death.attack.jumpy_bug_jump": "%1$s was jumped by Jumpy Bug",
"death.attack.hercules_beetle_obliteration": "%1$s was obliterated by Hercules Beetle",
"message.antarchy.big_bertha.mode": "Big Bertha Mode: %s",
"message.antarchy.big_bertha.mode.basilisk": "Basilisk",
"message.antarchy.big_bertha.mode.lucid": "Lucid",
@@ -850,5 +858,90 @@
"advancements.antarchy.rocket_powered_octopus.title": "Rocket Powered Octopus",
"advancements.antarchy.rocket_powered_octopus.description": "Craft an R.P.O. Launcher.",
"advancements.antarchy.gravity_gun_craft.title": "Pick Up Artist",
"advancements.antarchy.gravity_gun_craft.description": "Craft a Gravity Gun."
"advancements.antarchy.gravity_gun_craft.description": "Craft a Gravity Gun.",
"block.antarchy.cavaryn_portal": "Cavaryn Portal",
"block.antarchy.termite_nest": "Termite Nest",
"block.antarchy.chiten_spike": "Chiten Spike",
"block.antarchy.chiten_block": "Chiten Block",
"block.antarchy.myrmite": "Myrmite",
"block.antarchy.broodstone": "Broodstone",
"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.creepvine": "Creepvine",
"block.antarchy.creeping_horror_egg": "Creeping Horror Egg",
"block.antarchy.lurking_terror_egg": "Lurking Terror Egg",
"entity.antarchy.termite": "Termite",
"entity.antarchy.jumpy_bug": "Jumpy Bug",
"entity.antarchy.spit_bug": "Spit Bug",
"entity.antarchy.stink_bug": "Stink Bug",
"entity.antarchy.rolly_polly": "Rolly Polly",
"entity.antarchy.creeping_horror": "Creeping Horror",
"entity.antarchy.lurking_terror": "Lurking Terror",
"entity.antarchy.hercules_beetle": "Hercules Beetle",
"item.antarchy.jumpy_bug_spawn_egg": "Jumpy Bug Spawn Egg",
"item.antarchy.spit_bug_spawn_egg": "Spit Bug Spawn Egg",
"item.antarchy.stink_bug_spawn_egg": "Stink Bug Spawn Egg",
"item.antarchy.termite_spawn_egg": "Termite Spawn Egg",
"item.antarchy.rolly_polly_spawn_egg": "Rolly Polly Spawn Egg",
"item.antarchy.creeping_horror_spawn_egg": "Creeping Horror Spawn Egg",
"item.antarchy.lurking_terror_spawn_egg": "Lurking Terror Spawn Egg",
"item.antarchy.hercules_beetle_spawn_egg": "Hercules Beetle Spawn Egg",
"item.antarchy.chiten": "Chiten",
"block.antarchy.polished_broodstone": "Polished Broodstone",
"block.antarchy.chiseled_broodstone": "Chiseled Broodstone",
"block.antarchy.broodstone_bricks": "Broodstone Bricks",
"block.antarchy.broodstone_stairs": "Broodstone Stairs",
"block.antarchy.broodstone_slab": "Broodstone Slab",
"block.antarchy.broodstone_wall": "Broodstone Wall",
"block.antarchy.polished_broodstone_stairs": "Polished Broodstone Stairs",
"block.antarchy.polished_broodstone_slab": "Polished Broodstone Slab",
"block.antarchy.polished_broodstone_wall": "Polished Broodstone Wall",
"block.antarchy.broodstone_brick_stairs": "Broodstone Brick Stairs",
"block.antarchy.broodstone_brick_slab": "Broodstone Brick Slab",
"block.antarchy.broodstone_brick_wall": "Broodstone Brick Wall",
"block.antarchy.broodstone_uranium_ore": "Broodstone Uranium Ore",
"block.antarchy.broodstone_titanium_ore": "Broodstone Titanium Ore",
"item.antarchy.raw_bug_meat": "Raw Bug Meat",
"item.antarchy.cooked_bug_meat": "Cooked Bug Meat",
"item.antarchy.hercules_horn": "Hercules Horn",
"block.antarchy.hanging_creeproots": "Hanging Creeproots",
"block.antarchy.glowcap_mushroom": "Glowcap Mushroom",
"block.antarchy.potted_glowcap_mushroom": "Potted Glowcap Mushroom",
"block.antarchy.glowcap_mushroom_block": "Glowcap Mushroom Block",
"block.antarchy.molting_vines": "Molting Vines",
"item.antarchy.broodfruit": "Broodfruit",
"block.antarchy.jumpy_bug_egg": "Jumpy Bug Egg",
"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.stink_bug_fart": "Stink Bug farts",
"subtitles.antarchy.stink_bug_idle": "Stink Bug idles",
"subtitles.antarchy.rolly_polly_idle": "Rolly Polly idles",
"subtitles.antarchy.hercules_beetle_idle": "Hercules Beetle idles",
"subtitles.antarchy.hercules_beetle_hurt": "Hercules Beetle hurts",
"subtitles.antarchy.hercules_beetle_attack": "Hercules Beetle attacks",
"subtitles.antarchy.hercules_beetle_cry": "Hercules Beetle roars",
"subtitles.antarchy.hercules_beetle_charge_start": "Hercules Beetle charges up",
"subtitles.antarchy.hercules_beetle_knocked_down": "Hercules Beetle is knocked down",
"subtitles.antarchy.jumpy_bug_idle": "Jumpy Bug idles",
"subtitles.antarchy.spit_bug_idle": "Spit Bug idles",
"subtitles.antarchy.jumpy_bug_hurt": "Jumpy Bug hurts",
"subtitles.antarchy.jumpy_bug_jump": "Jumpy Bug jumps",
"subtitles.antarchy.spit_bug_hurt": "Spit Bug hurts",
"subtitles.antarchy.spit_bug_spit": "Spit Bug spits",
"subtitles.antarchy.brutalfly_spit": "Brutalfly spits",
"advancements.antarchy.bug_apetit.title": "Bug Apétit",
"advancements.antarchy.bug_apetit.description": "Eat Cooked Bug Meat.",
"advancements.antarchy.behavioral_correction.title": "Behavioral Correction",
"advancements.antarchy.behavioral_correction.description": "Obtain an Attitude Adjuster.",
"advancements.antarchy.beetle_buddies.title": "Beetle Buddies",
"advancements.antarchy.beetle_buddies.description": "Tame a Hercules Beetle.",
"advancements.antarchy.herculean_task.title": "Herculean Task",
"advancements.antarchy.herculean_task.description": "Slay a Hercules Beetle."
}
@@ -0,0 +1,834 @@
{
"block.antarchy.duplicator_log": "Бревно-дупликатор",
"block.antarchy.ouranwood_log": "Оурановое бревно",
"block.antarchy.ouranwood_wood": "Оурановое дерево",
"block.antarchy.mossy_ouranwood_log": "Замшелое оурановое бревно",
"block.antarchy.mossy_ouranwood_wood": "Замшелое оурановое дерево",
"block.antarchy.stripped_ouranwood_log": "Обтёсанное оурановое бревно",
"block.antarchy.stripped_ouranwood_wood": "Обтёсанное оурановое дерево",
"block.antarchy.ouranwood_planks": "Оурановые доски",
"block.antarchy.ouranwood_stairs": "Оурановые ступени",
"block.antarchy.ouranwood_slab": "Оурановая плита",
"block.antarchy.ouranwood_fence": "Оурановый забор",
"block.antarchy.ouranwood_fence_gate": "Оурановая калитка",
"block.antarchy.ouranwood_door": "Оурановая дверь",
"block.antarchy.ouranwood_trapdoor": "Оурановый люк",
"block.antarchy.ouranwood_pressure_plate": "Оурановая нажимная плита",
"block.antarchy.ouranwood_button": "Оурановая кнопка",
"block.antarchy.ouranwood_leaves": "Листья оуранового дерева",
"block.antarchy.ouranwood_acorn": "Оурановый жёлудь",
"block.antarchy.ouranwood_sign": "Оурановая табличка",
"block.antarchy.ouranwood_hanging_sign": "Оурановая подвесная табличка",
"block.antarchy.peach_log": "Персиковое бревно",
"block.antarchy.peach_wood": "Персиковое дерево",
"block.antarchy.stripped_peach_log": "Обтёсанное персиковое бревно",
"block.antarchy.stripped_peach_wood": "Обтёсанное персиковое дерево",
"block.antarchy.peach_planks": "Персиковые доски",
"block.antarchy.peach_stairs": "Персиковые ступени",
"block.antarchy.peach_slab": "Персиковая плита",
"block.antarchy.peach_fence": "Персиковый забор",
"block.antarchy.peach_fence_gate": "Персиковая калитка",
"block.antarchy.peach_door": "Персиковая дверь",
"block.antarchy.peach_trapdoor": "Персиковый люк",
"block.antarchy.peach_pressure_plate": "Персиковая нажимная плита",
"block.antarchy.peach_button": "Персиковая кнопка",
"block.antarchy.peach_leaves": "Листья персикового дерева",
"block.antarchy.hanging_peach": "Висячий персик",
"block.antarchy.peach_sapling": "Саженец персикового дерева",
"block.antarchy.peach_sign": "Персиковая табличка",
"block.antarchy.peach_hanging_sign": "Персиковая подвесная табличка",
"block.antarchy.orange_milkweed": "Оранжевый ваточник",
"block.antarchy.pink_milkweed": "Розовый ваточник",
"block.antarchy.camellia": "Камелия",
"block.antarchy.spider_lily": "Паучья лилия",
"block.antarchy.hushweed": "Тишь-трава",
"block.antarchy.umbral_moss_block": "Блок теневого мха",
"block.antarchy.umbral_moss_carpet": "Ковёр из теневого мха",
"block.antarchy.blush_moss_block": "Блок румяного мха",
"block.antarchy.blush_moss_carpet": "Ковёр из румяного мха",
"block.antarchy.duplicator_sapling": "Саженец дупликатора",
"block.antarchy.duct_tape": "Клейкая лента",
"block.antarchy.infested_rooted_dirt": "Заражённая корнями земля",
"block.antarchy.infested_coarse_dirt": "Заражённая каменистая земля",
"block.antarchy.nyxite": "Никсит",
"block.antarchy.polished_nyxite": "Полированный никсит",
"block.antarchy.chiseled_nyxite": "Резной никсит",
"block.antarchy.nyxite_bricks": "Никситовые кирпичи",
"block.antarchy.shellstone": "Ракушечник",
"block.antarchy.polished_shellstone": "Полированный ракушечник",
"block.antarchy.shellstone_bricks": "Кирпичи из ракушечника",
"block.antarchy.chiseled_shellstone": "Резной ракушечник",
"block.antarchy.mossy_shellstone_bricks": "Замшелые кирпичи из ракушечника",
"block.antarchy.mossy_shellstone_brick_stairs": "Ступени из замшелого ракушечника",
"block.antarchy.mossy_shellstone_brick_slab": "Плита из замшелого ракушечника",
"block.antarchy.mossy_shellstone_brick_wall": "Ограда из замшелого ракушечника",
"block.antarchy.cracked_shellstone_bricks": "Потрескавшиеся кирпичи из ракушечника",
"block.antarchy.shellstone_stairs": "Ступени из ракушечника",
"block.antarchy.shellstone_slab": "Плита из ракушечника",
"block.antarchy.shellstone_wall": "Ограда из ракушечника",
"block.antarchy.polished_shellstone_stairs": "Ступени из полированного ракушечника",
"block.antarchy.polished_shellstone_slab": "Плита из полированного ракушечника",
"block.antarchy.polished_shellstone_wall": "Ограда из полированного ракушечника",
"block.antarchy.shellstone_brick_stairs": "Ступени из кирпичей ракушечника",
"block.antarchy.shellstone_brick_slab": "Плита из кирпичей ракушечника",
"block.antarchy.shellstone_brick_wall": "Ограда из кирпичей ракушечника",
"block.antarchy.nyxite_stairs": "Никситовые ступени",
"block.antarchy.nyxite_slab": "Никситовая плита",
"block.antarchy.nyxite_wall": "Никситовая ограда",
"block.antarchy.polished_nyxite_stairs": "Ступени из полированного никсита",
"block.antarchy.polished_nyxite_slab": "Плита из полированного никсита",
"block.antarchy.polished_nyxite_wall": "Ограда из полированного никсита",
"block.antarchy.nyxite_brick_stairs": "Ступени из никситового кирпича",
"block.antarchy.nyxite_brick_slab": "Плита из никситового кирпича",
"block.antarchy.nyxite_brick_wall": "Ограда из никситового кирпича",
"block.antarchy.pale_nyxite": "Бледный никсит",
"block.antarchy.nyxite_spike": "Никситовый шип",
"block.antarchy.potent_nyxite": "Насыщенный никсит",
"block.antarchy.triffid_goo_block": "Блок слизи триффида",
"block.antarchy.elythia_portal": "Портал в Элитию",
"block.antarchy.cloud_block": "Облачный блок",
"block.antarchy.thoraxis_portal": "Портал в Тораксис",
"block.antarchy.antimetal": "Антиметалл",
"block.antarchy.polished_antimetal": "Полированный антиметалл",
"block.antarchy.antimetal_scaffolding": "Антиметаллические подмостки",
"block.antarchy.cornea_stalk": "Глазной стебель",
"block.antarchy.corn_crop": "Посевы кукурузы",
"block.antarchy.dream_torch": "Факел сновидений",
"block.antarchy.dream_wall_torch": "Настенный факел сновидений",
"block.antarchy.dream_lantern": "Фонарь сновидений",
"block.antarchy.dream_campfire": "Костёр сновидений",
"block.antarchy.dream_fire": "Огонь сновидений",
"block.antarchy.dream_fire_ceiling": "Огонь сновидений",
"block.antarchy.budding_blood_crystal": "Цветущий кровавый кристалл",
"block.antarchy.blood_crystal_block": "Блок кровавого кристалла",
"block.antarchy.small_blood_crystal_bud": "Малый бутон кровавого кристалла",
"block.antarchy.medium_blood_crystal_bud": "Средний бутон кровавого кристалла",
"block.antarchy.large_blood_crystal_bud": "Большой бутон кровавого кристалла",
"block.antarchy.blood_crystal_cluster": "Скопление кровавого кристалла",
"block.antarchy.dream_sand": "Песок сновидений",
"block.antarchy.dream_sandstone": "Песчаник сновидений",
"block.antarchy.chiseled_dream_sandstone": "Резной песчаник сновидений",
"block.antarchy.cut_dream_sandstone": "Гладкий песчаник сновидений",
"block.antarchy.smooth_dream_sandstone": "Пиленый песчаник сновидений",
"block.antarchy.dream_sandstone_stairs": "Ступени из песчаника сновидений",
"block.antarchy.dream_sandstone_slab": "Плита из песчаника сновидений",
"block.antarchy.dream_sandstone_wall": "Ограда из песчаника сновидений",
"block.antarchy.smooth_dream_sandstone_stairs": "Ступени из гладкого песчаника сновидений",
"block.antarchy.smooth_dream_sandstone_slab": "Плита из гладкого песчаника сновидений",
"block.antarchy.cut_dream_sandstone_slab": "Плита из пиленого песчаника сновидений",
"block.antarchy.bed_bug_egg": "Яйцо постельного клопа",
"block.antarchy.wasp_nest": "Осиное гнездо",
"block.antarchy.red_ant_nest": "Гнездо красных муравьёв",
"block.antarchy.brown_ant_nest": "Гнездо коричневых муравьёв",
"block.antarchy.rainbow_ant_nest": "Гнездо радужных муравьёв",
"block.antarchy.uranium_ore": "Урановая руда",
"block.antarchy.deepslate_uranium_ore": "Глубинная урановая руда",
"block.antarchy.titanium_ore": "Титановая руда",
"block.antarchy.deepslate_titanium_ore": "Глубинная титановая руда",
"block.antarchy.uranium_block": "Урановый блок",
"block.antarchy.titanium_block": "Титановый блок",
"block.antarchy.raw_uranium_block": "Блок неочищенного урана",
"block.antarchy.raw_titanium_block": "Блок неочищенного титана",
"block.antarchy.cut_uranium": "Огранённый уран",
"block.antarchy.cut_titanium": "Огранённый титан",
"block.antarchy.cut_uranium_slab": "Плита из огранённого урана",
"block.antarchy.cut_titanium_slab": "Плита из огранённого титана",
"block.antarchy.cut_uranium_stairs": "Ступени из огранённого урана",
"block.antarchy.cut_titanium_stairs": "Ступени из огранённого титана",
"block.antarchy.chiseled_uranium": "Резной уран",
"block.antarchy.chiseled_titanium": "Резной титан",
"block.antarchy.uranium_bulb": "Урановая лампа",
"block.antarchy.titanium_bulb": "Титановая лампа",
"block.antarchy.uranium_door": "Урановая дверь",
"block.antarchy.titanium_door": "Титановая дверь",
"block.antarchy.uranium_trapdoor": "Урановый люк",
"block.antarchy.titanium_trapdoor": "Титановый люк",
"block.antarchy.uranium_bars": "Урановые прутья",
"block.antarchy.titanium_bars": "Титановые прутья",
"tooltip.antarchy.signal_saving_bulb": "Включается и выключается. Уровень излучаемого света равен силе сохранённого редстоун-сигнала.",
"block.antarchy.bile": "Желчь",
"block.antarchy.ichor": "Ихор",
"block.antarchy.antiwater": "Антивода",
"block.antarchy.lumen": "Люмен",
"block.antarchy.lumen_froglight": "Люменовый квампост",
"block.antarchy.roseate_froglight": "Розоватый квампост",
"entity.antarchy.apple_cow": "Яблочная корова",
"entity.antarchy.golden_apple_cow": "Золотая яблочная корова",
"entity.antarchy.enchanted_golden_apple_cow": "Зачарованная золотая яблочная корова",
"entity.antarchy.easter_bunny": "Пасхальный кролик",
"entity.antarchy.glimmer": "Блик",
"entity.antarchy.ouranwood_deer": "Оурановый олень",
"entity.antarchy.elka": "Элка",
"entity.antarchy.dorrie": "Дорри",
"entity.antarchy.flying_squirrel": "Белка-летяга",
"entity.antarchy.caterpillar": "Гусеница",
"entity.antarchy.butterfly": "Бабочка",
"entity.antarchy.brutalfly": "Жестококрыл",
"entity.antarchy.red_ant": "Красный муравей",
"entity.antarchy.brown_ant": "Коричневый муравей",
"entity.antarchy.rainbow_ant": "Радужный муравей",
"entity.antarchy.diamond_minecart": "Алмазная вагонетка",
"entity.antarchy.dr_trayaurus": "Доктор Траяурус",
"entity.antarchy.cloud_shark": "Облачная акула",
"entity.antarchy.kraken": "Кракен",
"entity.antarchy.missile_squid": "Кальмар-ракета",
"entity.antarchy.octopus_bomb": "Осьминог-бомба",
"entity.antarchy.nightmare": "Кошмар",
"entity.antarchy.bed_bug": "Постельный клоп",
"entity.antarchy.wasp": "Оса",
"entity.antarchy.bomber": "Бомбардир",
"entity.antarchy.moleworm": "Кроточервь",
"entity.antarchy.molevore": "Кротожор",
"entity.antarchy.mantis": "Богомол",
"entity.antarchy.alpha_mantis": "Альфа-богомол",
"entity.antarchy.triffid": "Триффид",
"entity.antarchy.toreterror": "Тортеррор",
"entity.antarchy.water_bomb": "Водяная бомба",
"subtitles.antarchy.mantis_ambient": "Богомол щёлкает",
"subtitles.antarchy.mantis_hurt": "Богомол визжит",
"subtitles.antarchy.mantis_attack": "Богомол кусает",
"subtitles.antarchy.mantis_fly_loop": "Крылья богомола жужжат",
"item.antarchy.big_bertha": "Большая Берта",
"item.antarchy.wasp_nest": "Осиное гнездо",
"item.antarchy.stink_bug": "Клоп-вонючка",
"item.antarchy.wasp_spawn_egg": "Яйцо призыва осы",
"item.antarchy.bomber_spawn_egg": "Яйцо призыва бомбардира",
"item.antarchy.big_bertha_blade": "Лезвие Большой Берты",
"item.antarchy.big_bertha_handle": "Рукоять Большой Берты",
"item.antarchy.big_bertha_hilt": "Эфес Большой Берты",
"item.antarchy.battle_axe": "Боевой топор",
"item.antarchy.cloud_shark_fin": "Плавник облачной акулы",
"item.antarchy.cloud_shark_fin_soup": "Суп из плавников облачной акулы",
"tooltip.antarchy.cloud_shark_fin_soup": "Даёт Силу и Плавное падение.",
"item.antarchy.kraken_tooth": "Зуб кракена",
"item.antarchy.basilisk_fang": "Клык василиска",
"item.antarchy.basilisk_dagger": "Кинжал василиска",
"item.antarchy.blood_crystal_block": "Блок кровавого кристалла",
"item.antarchy.small_blood_crystal_bud": "Малый бутон кровавого кристалла",
"item.antarchy.medium_blood_crystal_bud": "Средний бутон кровавого кристалла",
"item.antarchy.large_blood_crystal_bud": "Большой бутон кровавого кристалла",
"item.antarchy.blood_crystal_cluster": "Скопление кровавого кристалла",
"item.antarchy.dream_sand": "Песок сновидений",
"item.antarchy.dream_sandstone": "Песчаник сновидений",
"item.antarchy.chiseled_dream_sandstone": "Резной песчаник сновидений",
"item.antarchy.cut_dream_sandstone": "Пиленый песчаник сновидений",
"item.antarchy.smooth_dream_sandstone": "Гладкий песчаник сновидений",
"item.antarchy.dream_sandstone_stairs": "Ступени из песчаника сновидений",
"item.antarchy.dream_sandstone_slab": "Плита из песчаника сновидений",
"item.antarchy.dream_sandstone_wall": "Ограда из песчаника сновидений",
"item.antarchy.smooth_dream_sandstone_stairs": "Ступени из гладкого песчаника сновидений",
"item.antarchy.smooth_dream_sandstone_slab": "Плита из гладкого песчаника сновидений",
"item.antarchy.cut_dream_sandstone_slab": "Плита из пиленого песчаника сновидений",
"item.antarchy.dream_torch": "Факел сновидений",
"item.antarchy.dream_lantern": "Фонарь сновидений",
"item.antarchy.dream_campfire": "Костёр сновидений",
"item.antarchy.nightmare_scale": "Чешуйка кошмара",
"item.antarchy.nightmare_helmet": "Шлем кошмара",
"item.antarchy.nightmare_chestplate": "Нагрудник кошмара",
"item.antarchy.nightmare_leggings": "Поножи кошмара",
"item.antarchy.nightmare_boots": "Ботинки кошмара",
"item.antarchy.nightmare_sword": "Меч кошмара",
"tooltip.antarchy.nightmare_armor_double_damage": "%s%% шанс нанести двойной урон",
"tooltip.antarchy.nightmare_armor_set_bonus": "Полный комплект: Иммунитет к Иссушению и Ужасу",
"tooltip.antarchy.nightmare_sword": "Наносит больше урона по мере снижения вашего здоровья.",
"tooltip.antarchy.nightmare_sword_damage": "Наносит %s урона",
"tooltip.antarchy.primordial_helmet_water_breathing": "Даёт владельцу Подводное дыхание",
"tooltip.antarchy.primordial_armor_knockback_dealt": "Добавляет %s к отбрасыванию при атаке за каждый элемент",
"tooltip.antarchy.primordial_armor_set_bonus": "Полный комплект: Атаки игнорируют сопротивление отбрасыванию у врагов",
"attribute.antarchy.double_damage_chance": "Шанс двойного урона",
"attribute.antarchy.bloodglass_max_hearts": "Макс. сердец кровавого стекла",
"item.antarchy.molevore_nose": "Нос кротожора",
"item.antarchy.moleworm": "Кроточервь",
"item.antarchy.triffid_spawn_egg": "Яйцо призыва триффида",
"item.antarchy.infested_rooted_dirt": "Заражённая корнями земля",
"item.antarchy.infested_coarse_dirt": "Заражённая каменистая земля",
"item.antarchy.pale_nyxite": "Бледный никсит",
"item.antarchy.polished_nyxite": "Полированный никсит",
"item.antarchy.chiseled_nyxite": "Резной никсит",
"item.antarchy.nyxite_bricks": "Никситовые кирпичи",
"item.antarchy.shellstone": "Ракушечник",
"item.antarchy.polished_shellstone": "Полированный ракушечник",
"item.antarchy.shellstone_bricks": "Кирпичи из ракушечника",
"item.antarchy.chiseled_shellstone": "Резной ракушечник",
"item.antarchy.mossy_shellstone_bricks": "Замшелые кирпичи из ракушечника",
"item.antarchy.mossy_shellstone_brick_stairs": "Ступени из замшелого ракушечника",
"item.antarchy.mossy_shellstone_brick_slab": "Плита из замшелого ракушечника",
"item.antarchy.mossy_shellstone_brick_wall": "Ограда из замшелого ракушечника",
"item.antarchy.cracked_shellstone_bricks": "Потрескавшиеся кирпичи из ракушечника",
"item.antarchy.shellstone_stairs": "Ступени из ракушечника",
"item.antarchy.shellstone_slab": "Плита из ракушечника",
"item.antarchy.shellstone_wall": "Ограда из ракушечника",
"item.antarchy.polished_shellstone_stairs": "Ступени из полированного ракушечника",
"item.antarchy.polished_shellstone_slab": "Плита из полированного ракушечника",
"item.antarchy.polished_shellstone_wall": "Ограда из полированного ракушечника",
"item.antarchy.shellstone_brick_stairs": "Ступени из кирпичей ракушечника",
"item.antarchy.shellstone_brick_slab": "Плита из кирпичей ракушечника",
"item.antarchy.shellstone_brick_wall": "Ограда из кирпичей ракушечника",
"item.antarchy.nyxite_stairs": "Никситовые ступени",
"item.antarchy.nyxite_slab": "Никситовая плита",
"item.antarchy.nyxite_wall": "Никситовая ограда",
"item.antarchy.polished_nyxite_stairs": "Ступени из полированного никсита",
"item.antarchy.polished_nyxite_slab": "Плита из полированного никсита",
"item.antarchy.polished_nyxite_wall": "Ограда из полированного никсита",
"item.antarchy.nyxite_brick_stairs": "Ступени из никситового кирпича",
"item.antarchy.nyxite_brick_slab": "Плита из никситового кирпича",
"item.antarchy.nyxite_brick_wall": "Ограда из никситового кирпича",
"item.antarchy.potent_nyxite": "Насыщенный никсит",
"item.antarchy.antimetal": "Антиметалл",
"item.antarchy.polished_antimetal": "Полированный антиметалл",
"item.antarchy.antimetal_scaffolding": "Антиметаллические подмостки",
"item.antarchy.ouranwood_acorn": "Оурановый жёлудь",
"item.antarchy.ouranwood_boat": "Оурановая лодка",
"item.antarchy.ouranwood_chest_boat": "Оурановая лодка с сундуком",
"item.antarchy.raw_venison": "Сырая оленина",
"item.antarchy.cooked_venison": "Жареная оленина",
"item.antarchy.peach_sapling": "Саженец персикового дерева",
"item.antarchy.peach": "Персик",
"item.antarchy.peach_pie": "Персиковый пирог",
"item.antarchy.cornbread": "Кукурузный хлеб",
"item.antarchy.popcorn": "Попкорн",
"item.antarchy.peach_sign": "Персиковая табличка",
"item.antarchy.peach_hanging_sign": "Персиковая подвесная табличка",
"item.antarchy.peach_boat": "Персиковая лодка",
"item.antarchy.peach_chest_boat": "Персиковая лодка с сундуком",
"item.antarchy.orange_milkweed": "Оранжевый ваточник",
"item.antarchy.pink_milkweed": "Розовый ваточник",
"item.antarchy.camellia": "Камелия",
"item.antarchy.spider_lily": "Паучья лилия",
"item.antarchy.hushweed": "Тишь-трава",
"item.antarchy.umbral_moss_block": "Блок теневого мха",
"item.antarchy.umbral_moss_carpet": "Ковёр из теневого мха",
"item.antarchy.blush_moss_block": "Блок румяного мха",
"item.antarchy.blush_moss_carpet": "Ковёр из румяного мха",
"item.antarchy.mud_pie": "Грязевой пирог",
"item.antarchy.duct_tape": "Клейкая лента",
"item.antarchy.duct_tape.tooltip": "Разместите и нажмите ПКМ, чтобы починить инструменты",
"item.antarchy.rainbow_sugar": "Радужный сахар",
"item.antarchy.uranium_nugget": "Кусочек урана",
"item.antarchy.titanium_nugget": "Кусочек титана",
"item.antarchy.raw_uranium_scrap": "Осколок неочищенного урана",
"item.antarchy.raw_titanium_scrap": "Осколок неочищенного титана",
"item.antarchy.raw_uranium": "Неочищенный уран",
"item.antarchy.raw_titanium": "Неочищенный титан",
"item.antarchy.uranium_ingot": "Урановый слиток",
"item.antarchy.titanium_ingot": "Титановый слиток",
"item.antarchy.blood_crystal_shard": "Осколок кровавого кристалла",
"item.antarchy.blood_crystal_apple": "Яблоко кровавого кристалла",
"item.antarchy.blood_crystal_katana": "Катана из кровавого кристалла",
"item.antarchy.blood_crystal_helmet": "Шлем из кровавого кристалла",
"item.antarchy.blood_crystal_chestplate": "Нагрудник из кровавого кристалла",
"item.antarchy.blood_crystal_leggings": "Поножи из кровавого кристалла",
"item.antarchy.blood_crystal_boots": "Ботинки из кровавого кристалла",
"item.antarchy.blood_crystal_armor.tooltip": "Даёт Сердце кровавого стекла, которое блокирует один входящий удар, разбивается, а затем восстанавливается.",
"item.antarchy.blood_crystal_boots.tooltip2": "Отменяет урон от падения при падении вверх во время инверсии гравитации.",
"item.antarchy.blood_crystal_apple.tooltip": "Даёт Защиту кровавого стекла, предоставляя временные Сердца кровавого стекла, которые восстанавливаются, пока длится эффект.",
"tooltip.antarchy.blood_crystal_katana.launch": "Толкает вас вперёд при ударе.",
"tooltip.antarchy.blood_crystal_katana.trail": "Оставляет за вами багровый след.",
"item.antarchy.mantis_claw": "Клешня богомола",
"item.antarchy.king_scale": "Чешуйка короля",
"item.antarchy.queen_scale": "Чешуйка королевы",
"item.antarchy.jumpy_bug_leg": "Ножка прыгучего жука",
"item.antarchy.jumpy_boots": "Прыгучие ботинки",
"tooltip.antarchy.jumpy_boots": "Зажмите Shift, чтобы зарядить, затем прыгните, чтобы взмыть вверх.",
"item.antarchy.brutalfly_wing": "Крыло жестококрыла",
"item.antarchy.brutalfly_elytra": "Элитры жестококрыла",
"tooltip.antarchy.brutalfly_elytra.flap": "Во время полёта зажмите %s, чтобы махать крыльями",
"item.antarchy.cornea_ear": "Глазной початок",
"item.antarchy.corn": "Кукуруза",
"item.antarchy.corn_seeds": "Семена кукурузы",
"item.antarchy.raw_corndog": "Сырой корндог",
"item.antarchy.cooked_corndog": "Готовый корндог",
"item.antarchy.high_fructose_corn_syrup": "Кукурузный сироп",
"jei.antarchy.americanize": "Американизировать",
"item.antarchy.american_name": "Американский %s",
"item.antarchy.root_beer": "Рутбир",
"item.antarchy.primordial_scute": "Первобытный щиток",
"item.antarchy.triffid_goo": "Слизь триффида",
"item.antarchy.triffid_goo_block": "Блок слизи триффида",
"tooltip.antarchy.triffid_goo_block": "При высокой скорости отталкивает вверх, иначе засасывает.",
"item.antarchy.cloud_bucket": "Ведро облаков",
"tooltip.antarchy.cloud_bucket.midair": "Можно разместить прямо в воздухе",
"item.antarchy.lumen_bucket": "Ведро люмена",
"item.antarchy.scorpion_whip": "Хлыст императорского скорпиона",
"tooltip.antarchy.scorpion_whip.lash": "Атакует жертву издалека и внедряет ядовитую привязь.",
"tooltip.antarchy.scorpion_whip.reel": "Нажмите ПКМ, чтобы притянуть привязанную добычу.",
"tooltip.antarchy.scorpion_whip.snap": "Нажмите ЛКМ по привязанной добыче, чтобы вырвать жало.",
"item.antarchy.fallen_king_crown": "Корона павшего короля",
"tooltip.antarchy.fallen_king_crown.hero": "Даёт эффект «Герой деревни» при убийстве враждебных мобов",
"item.antarchy.vortex_eye": "Око вихря",
"item.antarchy.ultimate_helmet": "Ультимативный шлем",
"item.antarchy.ultimate_chestplate": "Ультимативный нагрудник",
"item.antarchy.ultimate_leggings": "Ультимативные поножи",
"item.antarchy.ultimate_boots": "Ультимативные ботинки",
"item.antarchy.ultimate_sword": "Ультимативный меч",
"item.antarchy.ultimate_pickaxe": "Ультимативная кирка",
"item.antarchy.ultimate_axe": "Ультимативный топор",
"item.antarchy.ultimate_shovel": "Ультимативная лопата",
"item.antarchy.ultimate_hoe": "Ультимативная мотыга",
"item.antarchy.ultimate_bow": "Ультимативный лук",
"item.antarchy.ultimate_crossbow": "Ультимативный арбалет",
"item.antarchy.ultimate_crossbow.capacity": "Заряжает до 16 стрел одновременно",
"item.antarchy.ultimate_crossbow.arrows_remaining": "%1$s %2$s заряжено",
"item.antarchy.ultimate_mace": "Ультимативная булава",
"item.antarchy.moggles": "Могглы",
"itemGroup.antarchy.antarchy": "Antarchy",
"item.antarchy.bile_bucket": "Ведро желчи",
"item.antarchy.ichor_bucket": "Ведро ихора",
"item.antarchy.antiwater_bucket": "Ведро антиводы",
"item.antarchy.reverie_bottle": "Бутылочка с грёзой",
"item.antarchy.squidzooka": "Сквидзука",
"item.antarchy.shrink_ray": "Уменьшитель",
"item.antarchy.growth_ray": "Увеличитель",
"tooltip.antarchy.shrink_ray": "Навсегда уменьшает цель. Зажмите, чтобы зарядить.",
"tooltip.antarchy.growth_ray": "Навсегда увеличивает цель. Зажмите, чтобы зарядить.",
"tooltip.antarchy.reverie_bottle.capture": "Нажмите ПКМ стеклянной бутылочкой по грёзе, чтобы поймать её.",
"tooltip.antarchy.reverie_bottle.release": "Нажмите ПКМ, чтобы выпустить грёзу.",
"item.antarchy.gravity_gun": "Гравитационная пушка",
"item.antarchy.miners_dream": "Мечта шахтёра",
"tooltip.antarchy.miners_dream.line1": "Нажмите ПКМ, чтобы вырезать извилистую пещеру.",
"tooltip.antarchy.miners_dream.line2": "Оставляет ценные блоки нетронутыми.",
"message.antarchy.miners_dream_disabled": "Мечта шахтёра отключена.",
"message.antarchy.miners_dream_busy": "Ваша предыдущая мечта всё ещё воплощается.",
"item.antarchy.diamond_minecart": "Алмазная вагонетка",
"item.antarchy.cogwheel_pet": "Шестерёнка-питомец",
"item.antarchy.fire_dragon_pet": "Огненный дракон-питомец",
"item.antarchy.ice_dragon_pet": "Ледяной дракон-питомец",
"item.antarchy.lightning_dragon_pet": "Электрический дракон-питомец",
"item.antarchy.gorgon_pet": "Горгона-питомец",
"item.antarchy.apple_cow_spawn_egg": "Яйцо призыва яблочной коровы",
"item.antarchy.red_ant_spawn_egg": "Яйцо призыва красного муравья",
"item.antarchy.brown_ant_spawn_egg": "Яйцо призыва коричневого муравья",
"item.antarchy.rainbow_ant_spawn_egg": "Яйцо призыва радужного муравья",
"item.antarchy.golden_apple_cow_spawn_egg": "Яйцо призыва золотой яблочной коровы",
"item.antarchy.enchanted_golden_apple_cow_spawn_egg": "Яйцо призыва зачарованной золотой яблочной коровы",
"item.antarchy.dr_trayaurus_spawn_egg": "Яйцо призыва доктора Траяуруса",
"item.antarchy.easter_bunny_spawn_egg": "Яйцо призыва пасхального кролика",
"item.antarchy.glimmer_spawn_egg": "Яйцо призыва блика",
"item.antarchy.ouranwood_deer_spawn_egg": "Яйцо призыва оуранового оленя",
"item.antarchy.spirit_apple": "Духовное яблоко",
"item.antarchy.elka_spawn_egg": "Яйцо призыва Элки",
"item.antarchy.glimmer_bottle": "Бутылочка с бликом",
"item.antarchy.glimmer_bottle.contains": "Содержит: %s",
"glimmer_variant.antarchy.apple_cow": "Яблочная корова",
"glimmer_variant.antarchy.ouranwood_deer": "Оурановый олень",
"glimmer_variant.antarchy.frog": "Жаба",
"glimmer_variant.antarchy.ant": "Муравей",
"glimmer_variant.antarchy.elka": "Элка",
"entity.antarchy.glimmer.set_sit": "Блик теперь сидит.",
"entity.antarchy.glimmer.set_follow": "Блик теперь следует за вами.",
"entity.antarchy.glimmer.set_wander": "Блик теперь бродит.",
"entity.antarchy.glimmer.ability.ant": "Ваш муравей натравливает вас на %s!",
"entity.antarchy.glimmer.ability.apple_cow": "Ваша яблочная корова мычит и кормит вас!",
"entity.antarchy.glimmer.ability.elka": "Ваша Элка издаёт крик и разрушает защиту!",
"entity.antarchy.glimmer.ability.deer": "Ваш оурановый олень проносится сквозь врага!",
"entity.antarchy.glimmer.ability.frog": "Ваша жаба проглотила %s!",
"item.antarchy.glimmer_bottle.passive.apple_cow": "Пассивный эффект: Голод тратится на 25% медленнее",
"item.antarchy.glimmer_bottle.ability.apple_cow": "Способность: Мычит и даёт Насыщение и Регенерацию, когда у вас мало еды",
"item.antarchy.glimmer_bottle.passive.ouranwood_deer": "Пассивный эффект: Скорость I",
"item.antarchy.glimmer_bottle.ability.ouranwood_deer": "Способность: Прорывается сквозь враждебных мобов, когда вы бежите на них, подкидывая их в воздух",
"item.antarchy.glimmer_bottle.passive.frog": "Пассивный эффект: Прыгучесть I",
"item.antarchy.glimmer_bottle.ability.frog": "Способность: Пожирает ближайшего враждебного моба, становясь больше и сильнее на время",
"item.antarchy.glimmer_bottle.passive.ant": "Пассивный эффект: Слегка увеличенная дальность атаки",
"item.antarchy.glimmer_bottle.ability.ant": "Способность: Удар по крупному врагу даёт вам кратковременную Силу II",
"item.antarchy.glimmer_bottle.passive.elka": "Пассивный эффект: Защита кровавого стекла II",
"item.antarchy.glimmer_bottle.ability.elka": "Способность: Кричит и вызывает ударную волну при разрушении одного из сердец защиты",
"advancements.antarchy.spirant_animal.title": "Муравьиная душа",
"advancements.antarchy.spirant_animal.description": "Приручите муравья-блика",
"advancements.antarchy.hoppy_together.title": "Вместе веселее",
"advancements.antarchy.hoppy_together.description": "Приручите жабу-блика",
"advancements.antarchy.deerly_beloved.title": "Дорогой олень",
"advancements.antarchy.deerly_beloved.description": "Приручите оленя-блика",
"advancements.antarchy.elkcellent_choice.title": "Отличный выбор",
"advancements.antarchy.elkcellent_choice.description": "Приручите Элку-блика",
"advancements.antarchy.apple_of_my_eye.title": "Яблоко от яблони",
"advancements.antarchy.apple_of_my_eye.description": "Приручите корову-блика",
"item.antarchy.dorrie_spawn_egg": "Яйцо призыва Дорри",
"item.antarchy.flying_squirrel_spawn_egg": "Яйцо призыва белки-летяги",
"item.antarchy.caterpillar_spawn_egg": "Яйцо призыва гусеницы",
"item.antarchy.butterfly_spawn_egg": "Яйцо призыва бабочки",
"item.antarchy.brutalfly_spawn_egg": "Яйцо призыва жестококрыла",
"item.antarchy.cloud_shark_spawn_egg": "Яйцо призыва облачной акулы",
"item.antarchy.kraken_spawn_egg": "Ох, нет. Не стоит.",
"item.antarchy.missile_squid_spawn_egg": "Яйцо призыва кальмара-ракеты",
"item.antarchy.octopus_bomb_spawn_egg": "Яйцо призыва осьминога-бомбы",
"item.antarchy.nightmare_spawn_egg": "Яйцо призыва кошмара",
"item.antarchy.toreterror_spawn_egg": "Яйцо призыва тортеррора",
"item.antarchy.water_cannon": "Водяная пушка",
"item.antarchy.primordial_helmet": "Первобытный шлем",
"item.antarchy.primordial_chestplate": "Первобытный нагрудник",
"item.antarchy.primordial_leggings": "Первобытные поножи",
"item.antarchy.primordial_boots": "Первобытные ботинки",
"item.antarchy.bed_bug_spawn_egg": "Яйцо призыва постельного клопа",
"item.antarchy.moleworm_spawn_egg": "Яйцо призыва кроточервя",
"item.antarchy.molevore_spawn_egg": "Яйцо призыва кротожора",
"item.antarchy.reverie_spawn_egg": "Яйцо призыва грёзы",
"item.antarchy.mantis_spawn_egg": "Яйцо призыва богомола",
"item.antarchy.alpha_mantis_spawn_egg": "Яйцо призыва альфа-богомола",
"biome.antarchy.moleworm_caves": "Пещеры кроточервей",
"biome.antarchy.butterfly_fields": "Поля бабочек",
"biome.antarchy.ouranwood_forest": "Оурановый лес",
"biome.antarchy.glimmering_pools": "Мерцающие пруды",
"biome.antarchy.peach_forest": "Персиковый лес",
"biome.antarchy.fungal_ouranwood_forest": "Грибной оурановый лес",
"message.antarchy.brown_ant_activated": "Коричневый муравей готов открыть путь в свой мир.",
"message.antarchy.brown_ant_needs_reagent": "Этому коричневому муравью нужен реагент, чтобы открыть путь в свой мир.",
"message.antarchy.rainbow_ant_activated": "Радужный муравей гудит новым измерением из Infinity.",
"message.antarchy.rainbow_ant_activated_inherited": "Радужный муравей гудит унаследованным измерением из Infinity.",
"message.antarchy.rainbow_ant_activated_inherited_existing": "Радужный муравей переподключается к унаследованному измерению Infinity.",
"message.antarchy.rainbow_ant_failed_dimension_create": "Не удалось создать измерение. Вероятно, ошибка в конфигурации мода Infinity. Перезапустите игру и попробуйте снова.",
"message.antarchy.rainbow_ant_infinity_missing": "Мод Infinity должен быть установлен, чтобы миры радужных муравьёв работали.",
"message.antarchy.rainbow_ant_needs_reagent": "Этому радужному муравью нужен реагент, чтобы открыть измерение.",
"message.antarchy.red_ant_activated": "Красный муравей готов открыть путь в свой мир.",
"message.antarchy.red_ant_needs_reagent": "Этому красному муравью нужен реагент, чтобы открыть путь в свой мир.",
"message.antarchy.termite_activated": "Термит готов открыть путь к своей цели.",
"message.antarchy.termite_needs_reagent": "Этому термиту нужен реагент, чтобы открыть путь к своей цели.",
"message.antarchy.big_bertha.mode": "Режим Большой Берты: %s",
"message.antarchy.big_bertha.mode.basilisk": "Василиск",
"message.antarchy.big_bertha.mode.lucid": "Люцид",
"message.antarchy.big_bertha.mode.nightmare": "Кошмар",
"message.antarchy.big_bertha.mode.kraken": "Кракен",
"message.antarchy.big_bertha.mode.molevore": "Кротожор",
"message.antarchy.big_bertha.mode.toreterror": "Тортеррор",
"message.antarchy.ultimate_tool.mode_3x3": "Включено копание 3x3",
"message.antarchy.ultimate_tool.mode_default": "Включено обычное копание",
"advancements.antarchy.hey_listen.title": "Эй, послушай",
"advancements.antarchy.hey_listen.description": "К вам присоединилась грёза.",
"advancements.antarchy.very_hungry_caterpillar.title": "Очень голодная гусеница",
"advancements.antarchy.very_hungry_caterpillar.description": "Помогите гусенице вырасти.",
"effect.antarchy.dread": "Ужас",
"effect.antarchy.paralyzed": "Паралич",
"effect.antarchy.inverted": "Инверсия",
"effect.antarchy.stinky": "Вонючесть",
"effect.antarchy.shrinking": "Уменьшение",
"effect.antarchy.growth": "Увеличение",
"effect.antarchy.bloodglass_ward": "Защита кровавого стекла",
"death.attack.triffid_mauling": "%1$s был растерзан растением",
"death.attack.triffid_mauling.player": "%1$s был растерзан растением",
"death.attack.triffid_swallow": "%1$s был проглочен триффидом",
"death.attack.triffid_swallow.player": "%1$s был проглочен триффидом",
"potion.antarchy.haste": "Зелье спешки",
"potion.antarchy.strong_haste": "Мощное зелье спешки",
"tooltip.antarchy.big_bertha.mode": "Режим: %s",
"tooltip.antarchy.big_bertha.toggle_mode": "Shift + ПКМ для переключения режимов босса.",
"tooltip.antarchy.big_bertha.mode.basilisk": "ПКМ парализует цель. Удары накладывают отравление и замедление.",
"tooltip.antarchy.big_bertha.mode.lucid": "Удары инвертируют цель на несколько секунд. Удары наносят больше урона, когда вы инвертированы.",
"tooltip.antarchy.big_bertha.mode.nightmare": "Игроки страдают от Ужаса; удары накладывают слабость.",
"tooltip.antarchy.big_bertha.mode.kraken": "Удары отбрасывают цели и вызывают молнию.",
"tooltip.antarchy.big_bertha.mode.molevore": "ПКМ для рывка вперёд и бурения сквозь блоки кротожора.",
"tooltip.antarchy.big_bertha.mode.toreterror": "ПКМ запускает вас в воздух и обрушивает вниз с ударной волной по площади.",
"tooltip.antarchy.ultimate_tools_3x3": "Shift + ПКМ для переключения режима копания 3x3.",
"tooltip.antarchy.moggles.reveal": "Дают ночное зрение и указывают на ближайшие пещеры.",
"tooltip.antarchy.moggles.underground": "Работает только если над вами нет открытого неба.",
"tooltip.antarchy.cornea_ear.vision": "Даёт Ночное зрение на %s секунд.",
"tooltip.antarchy.mob_coming_soon": "Моб появится в будущем!",
"tooltip.antarchy.gravity_gun.primary": "ЛКМ: отбрасывает ближайших сущностей или бросает удерживаемую цель.",
"tooltip.antarchy.gravity_gun.secondary": "ПКМ: притягивает сущность или подходящий блок.",
"tooltip.antarchy.gravity_gun.scroll": "Удерживайте Ctrl и крутите колёсико мыши, чтобы приблизить или отдалить удерживаемую цель.",
"tooltip.antarchy.gravity_gun.blacklist": "Не действует на блоки и сущности из чёрного списка.",
"tooltip.antarchy.antimetal_inversion": "Инвертирует сущности прямо под собой",
"tooltip.antarchy.diamond_minecart.forward": "Будет добавлено позже.",
"tooltip.antarchy.diamond_minecart.rails": " ",
"tooltip.antarchy.rainbow_sugar": "Активирует измерения радужного муравья. Съешьте, находясь в нём, чтобы вернуться домой.",
"advancements.antarchy.visit_elythia.title": "Межмуравьиное пространство",
"advancements.antarchy.visit_elythia.description": "Используйте коричневого муравья, чтобы попасть в Элитию.",
"advancements.antarchy.visit_thoraxis.title": "Муравьиный гнев",
"advancements.antarchy.visit_thoraxis.description": "Используйте красного муравья, чтобы попасть в Тораксис.",
"advancements.antarchy.fallen_kingdom_castle.title": "Я когда-то правил миром...",
"advancements.antarchy.fallen_kingdom_castle.description": "Найдите замок падшего королевства.",
"advancements.antarchy.fallen_king_crown.title": "Чанки грузились по моему приказу...",
"advancements.antarchy.fallen_king_crown.description": "Добудьте корону павшего короля.",
"advancements.antarchy.the_lab.title": "Всем привет, с вами Дэн!",
"advancements.antarchy.the_lab.description": "Найдите лабораторию доктора Траяуруса.",
"advancements.antarchy.sweater_dreams.title": "Тёплые сны",
"advancements.antarchy.sweater_dreams.description": "Победите Кошмара.",
"advancements.antarchy.stone_cold.title": "Холодный как камень",
"advancements.antarchy.stone_cold.description": "Победите василиска.",
"advancements.antarchy.moley_poley.title": "Кротовьи забавы",
"advancements.antarchy.moley_poley.description": "Победите кротожора.",
"advancements.antarchy.lucid_dreams.title": "Осознанные сновидения",
"advancements.antarchy.lucid_dreams.description": "Победите люцида.",
"advancements.antarchy.davy_jones_locker.title": "Тайник Дэйви Джонса",
"advancements.antarchy.davy_jones_locker.description": "Победите кракена.",
"advancements.antarchy.shark_weak.title": "Когда акулы полетят",
"advancements.antarchy.shark_weak.description": "Победите облачную акулу.",
"advancements.antarchy.dont_let_the_bed_bugs_bite.title": "И пусть клопы не кусают",
"advancements.antarchy.dont_let_the_bed_bugs_bite.description": "Победите постельного клопа.",
"advancements.antarchy.soups_up.title": "Суп готов",
"advancements.antarchy.soups_up.description": "Съешьте суп из плавников облачной акулы.",
"advancements.antarchy.in_the_upside_down.title": "Вверх тормашками",
"advancements.antarchy.in_the_upside_down.description": "Окажитесь под эффектом инверсии впервые.",
"advancements.antarchy.whoever_smelt_it_dealt_it.title": "Кто унюхал, тот и пукнул",
"advancements.antarchy.whoever_smelt_it_dealt_it.description": "Окажитесь вонючим в первый раз.",
"advancements.antarchy.ultimate_armor.title": "Абсолютная защита",
"advancements.antarchy.ultimate_armor.description": "Соберите полный комплект ультимативной брони.",
"advancements.antarchy.ultimate_bow.title": "Богемская рапсодия",
"advancements.antarchy.ultimate_bow.description": "Добудьте ультимативный лук.",
"advancements.antarchy.brutalfly.title": "Порхай как жестококрыл, жаль как пчела",
"advancements.antarchy.brutalfly.description": "Получите элитры жестококрыла.",
"advancements.antarchy.now_watch_me_whip.title": "А теперь смотри",
"advancements.antarchy.now_watch_me_whip.description": "А теперь смотри, как я делаю нэй-нэй",
"advancements.antarchy.kill_molevore.title": "Кротовьи забавы",
"advancements.antarchy.kill_molevore.description": "Убейте кротожора.",
"advancements.antarchy.water_cannon_craft.title": "Мокрее — лучше!",
"advancements.antarchy.water_cannon_craft.description": "Создайте водяную пушку.",
"advancements.antarchy.kill_toreterror.title": "Тортеррор сбежал!",
"advancements.antarchy.kill_toreterror.description": "Победите тортеррора.",
"advancements.antarchy.challenge_games.title": "Испытания начинаются!",
"advancements.antarchy.challenge_games.description": "Войдите на Разрушенную арену.",
"advancements.antarchy.bugged_out.title": "Жук-переросток",
"advancements.antarchy.bugged_out.description": "Победите альфа-богомола.",
"death.attack.bed_bug_bite": "%1$s был покусан постельными клопами",
"death.attack.bed_bug_bite.player": "%1$s был покусан постельными клопами во время сражения с %2$s",
"message.antarchy.dread_too_scared_to_sleep": "Вы слишком напуганы, чтобы уснуть.",
"death.attack.kraken_mauling": "%1$s был затянут на дно кракеном",
"death.attack.kraken_mauling.player": "%1$s был затянут на дно кракеном во время сражения с %2$s",
"death.attack.kraken_lightning": "%1$s был поражён штормом кракена",
"death.attack.kraken_lightning.player": "%1$s был поражён штормом кракена во время сражения с %2$s",
"death.attack.nightmare_mauling": "%1$s был сожран кошмаром",
"death.attack.nightmare_mauling.player": "%1$s был сожран кошмаром во время сражения с %2$s",
"death.attack.basilisk_bite": "%1$s был проглочен василиском",
"death.attack.basilisk_bite.player": "%1$s был проглочен василиском во время сражения с %2$s",
"death.attack.emperor_scorpion_sting": "%1$s был ужален императорским скорпионом",
"death.attack.emperor_scorpion_sting.player": "%1$s был ужален императорским скорпионом во время сражения с %2$s",
"death.attack.cornea_stalk_prick": "%1$s был заколот насмерть глазным стеблем",
"death.attack.toreterror_spin": "%1$s был закручен до смерти тортеррором",
"death.attack.toreterror_spin.player": "%1$s был закручен до смерти тортеррором",
"death.attack.toreterror_jump": "%1$s был раздавлен насмерть тортеррором",
"death.attack.toreterror_jump.player": "%1$s был раздавлен насмерть тортеррором",
"death.attack.water_soaked": "%1$s был намочен до смерти сущностью %2$s",
"death.attack.water_soaked.player": "%1$s был намочен до смерти сущностью %2$s",
"entity.antarchy.lucid": "Люцид",
"item.antarchy.lucid_spawn_egg": "Яйцо призыва люцида",
"item.antarchy.lucid_eye": "Глаз люцида",
"entity.antarchy.scorpion": "Скорпион",
"item.antarchy.scorpion_spawn_egg": "Яйцо призыва скорпиона",
"entity.antarchy.basilisk": "Василиск",
"item.antarchy.basilisk_spawn_egg": "Яйцо призыва василиска",
"entity.antarchy.emperor_scorpion": "Императорский скорпион",
"item.antarchy.emperor_scorpion_spawn_egg": "Яйцо призыва императорского скорпиона",
"item.antarchy.emperor_scorpion_stinger": "Жало императорского скорпиона",
"item.antarchy.lucid_pearl": "Жемчуг люцида",
"tooltip.antarchy.lucid_pearl": "Бросает снаряд, инвертирующий гравитацию.",
"tooltip.antarchy.lucid_pearl.detail": "Телепортирует вас в точку падения и накладывает Инверсию.",
"subtitles.antarchy.squidzooka_fire": "Сквидзука стреляет",
"subtitles.antarchy.shrink_ray": "Уменьшитель стреляет",
"subtitles.antarchy.growth_ray": "Увеличитель стреляет",
"subtitles.antarchy.size_ray_charge": "Лучевое ружьё заряжается",
"subtitles.antarchy.ant_ambient": "Муравьи стрекочут",
"subtitles.antarchy.ant_idle": "Муравьи шевелятся",
"subtitles.antarchy.ant_hurt": "Муравью больно",
"subtitles.antarchy.ant_bite": "Муравьи кусают",
"subtitles.antarchy.ant_gather": "Муравьи собираются",
"subtitles.antarchy.ant_nest": "Муравейник шуршит",
"subtitles.antarchy.cloud_shark_bite": "Облачная акула кусает",
"subtitles.antarchy.cloud_shark_idle": "Облачная акула парит",
"subtitles.antarchy.cloud_shark_hurt": "Облачной акуле больно",
"subtitles.antarchy.cloud_shark_death": "Облачная акула умирает",
"subtitles.antarchy.cloud_shark_fly": "Облачная акула летит",
"subtitles.antarchy.caterpillar_idle": "Гусеница шевелится",
"subtitles.antarchy.caterpillar_hurt": "Гусенице больно",
"subtitles.antarchy.caterpillar_crawl": "Гусеница ползёт",
"subtitles.antarchy.butterfly_hurt": "Бабочке больно",
"subtitles.antarchy.brutalfly_idle": "Жестококрыл парит",
"subtitles.antarchy.brutalfly_death": "Жестококрыл умирает",
"subtitles.antarchy.thoraxis_nightmare_wastes_ambient": "Пустоши кошмара гудят",
"subtitles.antarchy.thoraxis_nightmare_wastes_additions": "Пустоши кошмара волнуются",
"subtitles.antarchy.thoraxis_nightmare_wastes_mood": "Пустоши кошмара шепчут",
"subtitles.antarchy.thoraxis_dream_dunes_ambient": "Дюны сновидений шепчут",
"subtitles.antarchy.thoraxis_dream_dunes_additions": "Дюны сновидений шуршат",
"subtitles.antarchy.thoraxis_dream_dunes_mood": "Дюны сновидений вздыхают",
"subtitles.antarchy.thoraxis_lucid_pools_ambient": "Пруды люцидов гудят",
"subtitles.antarchy.thoraxis_lucid_pools_additions": "Пруды люцидов зловеще шумят",
"subtitles.antarchy.thoraxis_lucid_pools_mood": "Пруды люцидов бормочут",
"subtitles.antarchy.lucid_ambient": "Люцид гудит",
"subtitles.antarchy.lucid_flying": "Люцид порхает",
"subtitles.antarchy.lucid_attack": "Люцид атакует",
"subtitles.antarchy.lucid_bolt": "Люцид стреляет",
"subtitles.antarchy.lucid_hurt": "Люциду больно",
"subtitles.antarchy.lucid_death": "Люцид умирает",
"subtitles.antarchy.reverie_idle": "Грёза дрейфует",
"subtitles.antarchy.reverie_hurt": "Грёзе больно",
"subtitles.antarchy.reverie_worry": "Грёза тревожится",
"subtitles.antarchy.reverie_save": "Грёза спасает вас",
"subtitles.antarchy.reverie_join_player": "Грёза присоединяется к вам",
"subtitles.antarchy.reverie_alert": "Грёза предупреждает вас",
"subtitles.antarchy.flying_squirrel_idle": "Белка-летяга щебечет",
"subtitles.antarchy.flying_squirrel_beg": "Белка-летяга просит еду",
"subtitles.antarchy.flying_squirrel_nut": "Белка-летяга ест",
"subtitles.antarchy.flying_squirrel_glide_loop": "Белка-летяга парит",
"subtitles.antarchy.flying_squirrel_hurt": "Белке-летяге больно",
"subtitles.antarchy.flying_squirrel_death": "Белка-летяга умирает",
"subtitles.antarchy.nightmare_idle": "Кошмар рычит",
"subtitles.antarchy.nightmare_hurt": "Кошмару больно",
"subtitles.antarchy.nightmare_roar": "Кошмар ревёт",
"subtitles.antarchy.nightmare_death": "Кошмар умирает",
"subtitles.antarchy.nightmare_bite": "Кошмар кусает",
"subtitles.antarchy.nightmare_flap": "Кошмар машет крыльями",
"subtitles.antarchy.triffid_attack": "Триффид атакует",
"subtitles.antarchy.triffid_grab": "Триффид хватает",
"subtitles.antarchy.triffid_hurt": "Триффиду больно",
"subtitles.antarchy.triffid_death": "Триффид умирает",
"subtitles.antarchy.triffid_hiss": "Триффид шипит",
"subtitles.antarchy.triffid_growl": "Триффид урчит",
"subtitles.antarchy.gravity_gun_pickup": "Пушка притягивает",
"subtitles.antarchy.gravity_gun_drop": "Пушка отпускает",
"subtitles.antarchy.gravity_gun_hold_loop": "Пушка гудит",
"subtitles.antarchy.gravity_gun_launch": "Пушка стреляет",
"subtitles.antarchy.gravity_gun_dryfire": "Осечка пушки",
"subtitles.antarchy.bed_bug_ambient": "Постельный клоп стрекочет",
"subtitles.antarchy.bed_bug_hurt": "Постельному клопу больно",
"subtitles.antarchy.bed_bug_attack": "Постельный клоп кусает",
"subtitles.antarchy.wasp_idle": "Оса жужжит",
"subtitles.antarchy.wasp_hurt": "Осе больно",
"subtitles.antarchy.wasp_attack": "Оса жалит",
"subtitles.antarchy.wasp_death": "Оса умирает",
"subtitles.antarchy.scorpion_ambient": "Скорпион гремит",
"subtitles.antarchy.scorpion_hurt": "Скорпиону больно",
"subtitles.antarchy.scorpion_attack": "Скорпион атакует",
"subtitles.antarchy.emperor_scorpion_ambient": "Императорский скорпион гремит",
"subtitles.antarchy.emperor_scorpion_hurt": "Императорскому скорпиону больно",
"subtitles.antarchy.emperor_scorpion_attack": "Императорский скорпион атакует",
"subtitles.antarchy.emperor_scorpion_roar": "Императорский скорпион ревёт",
"subtitles.antarchy.moleworm_ambient": "Кроточервь шуршит",
"subtitles.antarchy.moleworm_hurt": "Кроточервю больно",
"subtitles.antarchy.moleworm_attack": "Кроточервь атакует",
"subtitles.antarchy.moleworm_dig": "Кроточервь копает",
"subtitles.antarchy.molevore_ambient": "Кротожор урчит",
"subtitles.antarchy.molevore_hurt": "Кротожору больно",
"subtitles.antarchy.molevore_attack": "Кротожор атакует",
"subtitles.antarchy.molevore_dig": "Кротожор копает",
"subtitles.antarchy.duct_tape_use": "Лента рвётся",
"subtitles.antarchy.potent_nyxite_hypnotic_gas": "Насыщенный никсит шипит",
"subtitles.antarchy.potent_nyxite_geyser_eruption": "Насыщенный никсит извергается",
"subtitles.antarchy.potent_nyxite_geyser_continuous": "Гейзер насыщенного никсита ревёт",
"subtitles.antarchy.missile_squid_ambient": "Кальмар-ракета гудит",
"subtitles.antarchy.missile_squid_hurt": "Кальмару-ракете больно",
"subtitles.antarchy.missile_squid_death": "Кальмар-ракета умирает",
"subtitles.antarchy.missile_squid_attack": "Кальмар-ракета атакует",
"subtitles.antarchy.kraken_flying_loop": "Кракен парит",
"subtitles.antarchy.kraken_flying_sideways_loop": "Кракен кружит",
"subtitles.antarchy.kraken_attack": "Кракен бьёт",
"subtitles.antarchy.kraken_spin": "Кракен вращается",
"subtitles.antarchy.kraken_roar": "Кракен ревёт",
"subtitles.antarchy.kraken_summon": "Кракен появляется",
"subtitles.antarchy.kraken_hurt": "Кракену больно",
"subtitles.antarchy.kraken_death": "Кракен умирает",
"subtitles.antarchy.basilisk_idle_loop": "Василиск шипит",
"subtitles.antarchy.basilisk_slither_loop": "Василиск ползёт",
"subtitles.antarchy.basilisk_bite": "Василиск кусает",
"subtitles.antarchy.basilisk_hiss": "Василиск шипит",
"subtitles.antarchy.basilisk_hurt": "Василиску больно",
"subtitles.antarchy.basilisk_death": "Василиск умирает",
"subtitles.antarchy.bomber_walk": "Бомбардир идёт",
"subtitles.antarchy.bomber_knock": "Бомбардир получает удар",
"subtitles.antarchy.bomber_explode": "Фитиль бомбардира шипит",
"subtitles.antarchy.toreterror_idle": "Тортеррор дышит",
"subtitles.antarchy.toreterror_hurt": "Тортеррору больно",
"subtitles.antarchy.toreterror_death": "Тортеррор умирает",
"subtitles.antarchy.toreterror_bomber_fire": "Тортеррор выпускает бомбардиров",
"subtitles.antarchy.toreterror_spin": "Тортеррор крутится",
"subtitles.antarchy.toreterror_ricochet": "Тортеррор рикошетит",
"subtitles.antarchy.water_cannon_fire": "Водяная пушка стреляет",
"subtitles.antarchy.toreterror_jump_up": "Тортеррор прыгает",
"subtitles.antarchy.toreterror_jump_land": "Тортеррор приземляется",
"subtitles.antarchy.stinky_fly": "Вонючие мухи жужжат",
"item.minecraft.potion.effect.inversion": "Зелье инверсии",
"item.minecraft.potion.effect.long_inversion": "Зелье инверсии",
"item.minecraft.splash_potion.effect.inversion": "Взрывное зелье инверсии",
"item.minecraft.splash_potion.effect.long_inversion": "Взрывное зелье инверсии",
"item.minecraft.lingering_potion.effect.inversion": "Туманное зелье инверсии",
"item.minecraft.lingering_potion.effect.long_inversion": "Туманное зелье инверсии",
"item.minecraft.tipped_arrow.effect.inversion": "Стрела инверсии",
"item.minecraft.tipped_arrow.effect.long_inversion": "Стрела инверсии",
"item.minecraft.potion.effect.paralysis": "Зелье паралича",
"item.minecraft.potion.effect.long_paralysis": "Зелье паралича",
"item.minecraft.splash_potion.effect.paralysis": "Взрывное зелье паралича",
"item.minecraft.splash_potion.effect.long_paralysis": "Взрывное зелье паралича",
"item.minecraft.lingering_potion.effect.paralysis": "Туманное зелье паралича",
"item.minecraft.lingering_potion.effect.long_paralysis": "Туманное зелье паралича",
"item.minecraft.tipped_arrow.effect.paralysis": "Стрела паралича",
"item.minecraft.tipped_arrow.effect.long_paralysis": "Стрела паралича",
"item.minecraft.potion.effect.shrinking": "Зелье уменьшения",
"item.minecraft.potion.effect.strong_shrinking": "Зелье уменьшения II",
"item.minecraft.potion.effect.extreme_shrinking": "Зелье уменьшения III",
"item.minecraft.splash_potion.effect.shrinking": "Взрывное зелье уменьшения",
"item.minecraft.splash_potion.effect.strong_shrinking": "Взрывное зелье уменьшения II",
"item.minecraft.splash_potion.effect.extreme_shrinking": "Взрывное зелье уменьшения III",
"item.minecraft.lingering_potion.effect.shrinking": "Туманное зелье уменьшения",
"item.minecraft.lingering_potion.effect.strong_shrinking": "Туманное зелье уменьшения II",
"item.minecraft.lingering_potion.effect.extreme_shrinking": "Туманное зелье уменьшения III",
"item.minecraft.tipped_arrow.effect.shrinking": "Стрела уменьшения",
"item.minecraft.tipped_arrow.effect.strong_shrinking": "Стрела уменьшения II",
"item.minecraft.tipped_arrow.effect.extreme_shrinking": "Стрела уменьшения III",
"item.minecraft.potion.effect.growing": "Зелье увеличения",
"item.minecraft.potion.effect.strong_growing": "Зелье увеличения II",
"item.minecraft.potion.effect.extreme_growing": "Зелье увеличения III",
"item.minecraft.splash_potion.effect.growing": "Взрывное зелье увеличения",
"item.minecraft.splash_potion.effect.strong_growing": "Взрывное зелье увеличения II",
"item.minecraft.splash_potion.effect.extreme_growing": "Взрывное зелье увеличения III",
"item.minecraft.lingering_potion.effect.growing": "Туманное зелье увеличения",
"item.minecraft.lingering_potion.effect.strong_growing": "Туманное зелье увеличения II",
"item.minecraft.lingering_potion.effect.extreme_growing": "Туманное зелье увеличения III",
"item.minecraft.tipped_arrow.effect.growing": "Стрела увеличения",
"item.minecraft.tipped_arrow.effect.strong_growing": "Стрела увеличения II",
"item.minecraft.tipped_arrow.effect.extreme_growing": "Стрела увеличения III",
"item.minecraft.potion.effect.dread": "Зелье ужаса",
"item.minecraft.potion.effect.long_dread": "Зелье ужаса",
"item.minecraft.splash_potion.effect.dread": "Взрывное зелье ужаса",
"item.minecraft.splash_potion.effect.long_dread": "Взрывное зелье ужаса",
"item.minecraft.lingering_potion.effect.dread": "Туманное зелье ужаса",
"item.minecraft.lingering_potion.effect.long_dread": "Туманное зелье ужаса",
"item.minecraft.tipped_arrow.effect.dread": "Стрела ужаса",
"item.minecraft.tipped_arrow.effect.long_dread": "Стрела ужаса",
"item.minecraft.potion.effect.stinky": "Зелье вонючести",
"item.minecraft.potion.effect.long_stinky": "Зелье вонючести",
"item.minecraft.splash_potion.effect.stinky": "Взрывное зелье вонючести",
"item.minecraft.splash_potion.effect.long_stinky": "Взрывное зелье вонючести",
"item.minecraft.lingering_potion.effect.stinky": "Туманное зелье вонючести",
"item.minecraft.lingering_potion.effect.long_stinky": "Туманное зелье вонючести",
"item.minecraft.tipped_arrow.effect.stinky": "Стрела вонючести",
"item.minecraft.tipped_arrow.effect.long_stinky": "Стрела вонючести",
"item.minecraft.potion.effect.haste": "Зелье спешки",
"item.minecraft.potion.effect.strong_haste": "Зелье спешки II",
"item.minecraft.splash_potion.effect.haste": "Взрывное зелье спешки",
"item.minecraft.splash_potion.effect.strong_haste": "Взрывное зелье спешки II",
"item.minecraft.lingering_potion.effect.haste": "Туманное зелье спешки",
"item.minecraft.lingering_potion.effect.strong_haste": "Туманное зелье спешки II",
"item.minecraft.tipped_arrow.effect.haste": "Стрела спешки",
"item.minecraft.tipped_arrow.effect.strong_haste": "Стрела спешки II",
"advancements.antarchy.cancel_out.title": "1 - 1 = ?",
"advancements.antarchy.cancel_out.description": "Имейте эффекты увеличения и уменьшения активными одновременно.",
"entity.antarchy.cheep": "Чип",
"item.antarchy.cheep": "Чип",
"item.antarchy.cheep_spawn_egg": "Яйцо призыва чипа",
"entity.antarchy.reverie": "Грёза",
"biome.antarchy.thoraxis": "Тораксис",
"biome.antarchy.nightmare_wastes": "Пустоши кошмара",
"biome.antarchy.umbral_hills": "Теневые холмы",
"biome.antarchy.lucid_pools": "Пруды люцидов",
"biome.antarchy.dream_dunes": "Дюны сновидений",
"biome.antarchy.cloud_sea": "Облачное море",
"block.antarchy.wild_corn": "Дикая кукуруза",
"trim_material.antarchy.blood_crystal": "Кровавый кристалл",
"trim_material.antarchy.nightmare_scale": "Чешуя кошмара",
"trim_material.antarchy.uranium": "Уран",
"trim_material.antarchy.titanium": "Титан",
"advancements.antarchy.duct_tape.title": "Я распилил эту лодку пополам!",
"advancements.antarchy.duct_tape.description": "и починил её с помощью силы клейкой ленты!",
"key.categories.antarchy": "Antarchy",
"key.antarchy.brutalfly_flap": "Элитры жестококрыла: Взмах крыльями",
"advancements.antarchy.shrink_ray_craft.title": "Дорогая, я уменьшил мобов",
"advancements.antarchy.shrink_ray_craft.description": "Создайте уменьшитель.",
"advancements.antarchy.growth_ray_craft.title": "Размер имеет значение",
"advancements.antarchy.growth_ray_craft.description": "Создайте увеличитель.",
"advancements.antarchy.squidzooka_craft.title": "Чернильный армагеддон",
"advancements.antarchy.squidzooka_craft.description": "Создайте сквидзуку.",
"advancements.antarchy.gravity_gun_craft.title": "Мастер притяжения",
"advancements.antarchy.gravity_gun_craft.description": "Создайте гравитационную пушку."
"subtitles.antarchy.stink_bug_fart": "Вонь жука пукает",
"subtitles.antarchy.stink_bug_idle": "Вонь жук бурчит",
"subtitles.antarchy.rolly_polly_idle": "Rolly Polly бурчит",
"death.attack.spit_bug_disrespect": "%1$s был унижен Spit Bug",
"death.attack.jumpy_bug_jump": "%1$s был атакован Jumpy Bug",
"death.attack.hercules_beetle_obliteration": "%1$s был стёрт Hercules Beetle"
}
@@ -0,0 +1,17 @@
{
"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" }
}
}
]
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "antarchy:block/amber_moss/amber_moss_block"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/carpet",
"textures": {
"wool": "antarchy:block/amber_moss/amber_moss_carpet"
}
}
@@ -0,0 +1,6 @@
{
"parent": "minecraft:block/mossy_carpet_side",
"textures": {
"side": "antarchy:block/amber_moss/amber_moss_carpet"
}
}
Loaded 100 of 571 files, more files were not shown because too many files have changed in this diff. Show more