Move gravity direction system to Anthology

Gravity API, mixins, projectile compat, inverted effect, gravity sync and
/gravity now live in the Anthology library. Antarchy registers the Underside
region, antiwater, stale-inversion cleanup and portal gun camera roll through
GravityHooks, and depends on the local Anthology jar in anthology_jars/.
This commit is contained in:
craisinlord committed 2026-10-12 15:37:13 -05:00
1 parent 0cad456efd
commit bba2a56671
140 files changed
+570 -4947

No files matched your search

+2
View File
@@ -59,6 +59,8 @@ dependencies {
compileOnly("curse.maven:intapi-${intapi_curseforge_id}:${intapi_curseforge_file_id_neoforge}")
runtimeOnly("curse.maven:intapi-${intapi_curseforge_id}:${intapi_curseforge_file_id_neoforge}")
implementation "software.bernie.geckolib:geckolib-neoforge-1.21.1:${geckolib_version}"
compileOnly(files(rootProject.file("anthology_jars/anthology-${anthology_version}+1.21.1-neoforge.jar")))
runtimeOnly(files(rootProject.file("anthology_jars/anthology-${anthology_version}+1.21.1-neoforge.jar")))
compileOnly(files(rootProject.file("infinite_dimensions_jars/infinity-2.7.3+1.21.1-neoforge.jar")))
compileOnly(files(rootProject.file("infinite_dimensions_jars/stellarview-1.21.1-0.5.3-neoforge.jar")))
runtimeOnly(files(rootProject.file("infinite_dimensions_jars/infinity-2.7.3+1.21.1-neoforge.jar")))
@@ -1,5 +1,6 @@
package com.craisinlord.antarchy.neoforge;
import com.craisinlord.anthology.effect.AnthologyEffects;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.compat.infinity.InfinityCompat;
import com.craisinlord.antarchy.compat.infinity.InfinityCompatVersion;
@@ -13,7 +14,6 @@ import com.craisinlord.antarchy.content.network.BloodCrystalKatanaTrailPayload;
import com.craisinlord.antarchy.content.tigereye.TigerEyeCamouflageSync;
import com.craisinlord.antarchy.content.portal.PermanentPortalType;
import com.craisinlord.antarchy.neoforge.registry.*;
import com.craisinlord.antarchy.neoforge.network.AntarchyGravityNetworking;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.ModList;
@@ -272,7 +272,6 @@ public class AntarchyNeoforge {
player,
TigerEyeCamouflageSync.payload(player)
));
com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setSyncDispatcher(AntarchyGravityNetworking::syncEntity);
com.craisinlord.antarchy.content.time.TimeDilationApi.setSyncDispatcher(
com.craisinlord.antarchy.neoforge.network.AntarchyTimeDilationNetworking::syncRate
);
@@ -411,7 +410,7 @@ public class AntarchyNeoforge {
() -> AntarchyNeoforgeItems.STINK_BUG.get(),
() -> AntarchyNeoforgeMisc.DREAD,
() -> AntarchyNeoforgeMisc.PARALYZED,
() -> AntarchyNeoforgeMisc.INVERTED,
AnthologyEffects::inverted,
() -> AntarchyNeoforgeMisc.STINKY,
() -> AntarchyNeoforgeBlocks.OURANWOOD_ACORN_BLOCK.get(),
() -> AntarchyNeoforgeBlocks.MOSSY_OURANWOOD_LOG.get(),
@@ -4,7 +4,6 @@ import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.command.CavarynCommand;
import com.craisinlord.antarchy.content.command.CaterpillarCommand;
import com.craisinlord.antarchy.content.command.DimensionalTearCommand;
import com.craisinlord.antarchy.content.command.GravityCommand;
import com.craisinlord.antarchy.content.command.QueenLocateCommand;
import com.craisinlord.antarchy.content.command.RoyalCommand;
import com.craisinlord.antarchy.content.time.TimeDilationCommand;
@@ -23,7 +22,6 @@ public final class AntarchyNeoforgeEvents {
@SubscribeEvent
public static void onRegisterCommands(RegisterCommandsEvent event) {
CavarynCommand.register(event.getDispatcher());
GravityCommand.register(event.getDispatcher());
CaterpillarCommand.register(event.getDispatcher());
DimensionalTearCommand.register(event.getDispatcher());
QueenLocateCommand.register(event.getDispatcher());
@@ -117,6 +117,7 @@ public final class AntarchyNeoForgeClient {
@SubscribeEvent
public static void clientSetup(FMLClientSetupEvent event) {
Antarchy.physicalClient = true;
com.craisinlord.antarchy.content.movement.AntarchyGravityHooks.registerClient();
event.enqueueWork(() -> {
AntarchyArchivePreviews.register();
AntarchyComputerGames.register();
@@ -1,8 +1,8 @@
package com.craisinlord.antarchy.neoforge.content.fluid;
import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi;
import com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection;
import com.craisinlord.antarchy.content.gravity.AntarchyGravityRotationUtil;
import com.craisinlord.anthology.gravity.GravityApi;
import com.craisinlord.anthology.gravity.GravityDirection;
import com.craisinlord.anthology.gravity.GravityRotationUtil;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.item.ItemEntity;
@@ -31,9 +31,9 @@ public class AntiwaterFluidType extends FluidType {
motion = new Vec3(motion.x, 0.2, motion.z);
}
AntarchyGravityDirection gravityDirection = AntarchyGravityApi.getGravityDirection(entity);
GravityDirection gravityDirection = GravityApi.getGravityDirection(entity);
Vec3 worldMotion = gravityDirection.isInverted()
? AntarchyGravityRotationUtil.vecPlayerToWorld(motion, gravityDirection)
? GravityRotationUtil.vecPlayerToWorld(motion, gravityDirection)
: motion;
double drag = entity.isSwimming() ? 0.9 : 0.8;
@@ -45,7 +45,7 @@ public class AntiwaterFluidType extends FluidType {
entity.setDeltaMovement(
gravityDirection.isInverted()
? AntarchyGravityRotationUtil.vecWorldToPlayer(worldMotion, gravityDirection)
? GravityRotationUtil.vecWorldToPlayer(worldMotion, gravityDirection)
: worldMotion
);
if (entity.horizontalCollision && entity.isFree(
@@ -55,7 +55,7 @@ public class AntiwaterFluidType extends FluidType {
Vec3 boostedWorldMotion = new Vec3(worldMotion.x, 0.3D, worldMotion.z);
entity.setDeltaMovement(
gravityDirection.isInverted()
? AntarchyGravityRotationUtil.vecWorldToPlayer(boostedWorldMotion, gravityDirection)
? GravityRotationUtil.vecWorldToPlayer(boostedWorldMotion, gravityDirection)
: boostedWorldMotion
);
}
@@ -4,8 +4,8 @@ import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner;
import com.craisinlord.antarchy.content.entity.multipart.MultipartFramework;
import com.craisinlord.antarchy.content.entity.multipart.MultipartPartAccess;
import com.craisinlord.antarchy.content.entity.multipart.MultipartPartDefinition;
import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi;
import com.craisinlord.antarchy.content.gravity.AntarchyGravityRotationUtil;
import com.craisinlord.anthology.gravity.GravityApi;
import com.craisinlord.anthology.gravity.GravityRotationUtil;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
@@ -69,13 +69,13 @@ public class MultipartPartEntity extends PartEntity<Entity> implements OwnableEn
return;
}
AntarchyGravityApi.applySyncedState(
GravityApi.applySyncedState(
this,
AntarchyGravityApi.getGravityDirection(parent),
AntarchyGravityApi.getPrevGravityDirection(parent),
AntarchyGravityApi.isGravityForced(parent),
AntarchyGravityApi.getTransitionDuration(parent),
AntarchyGravityApi.getTransitionRemaining(parent)
GravityApi.getGravityDirection(parent),
GravityApi.getPrevGravityDirection(parent),
GravityApi.isGravityForced(parent),
GravityApi.getTransitionDuration(parent),
GravityApi.getTransitionRemaining(parent)
);
double oldX = this.getX();
@@ -88,7 +88,7 @@ public class MultipartPartEntity extends PartEntity<Entity> implements OwnableEn
forward.x * this.definition.forwardOffset() + right.x * this.definition.lateralOffset(),
this.definition.yOffset(),
forward.z * this.definition.forwardOffset() + right.z * this.definition.lateralOffset());
Vec3 offset = AntarchyGravityRotationUtil.vecPlayerToWorld(localOffset, AntarchyGravityApi.getGravityDirection(parent));
Vec3 offset = GravityRotationUtil.vecPlayerToWorld(localOffset, GravityApi.getGravityDirection(parent));
Vec3 position = parent.position().add(offset);
this.setPos(position.x, position.y, position.z);
this.setRot(parent.getYRot(), parent.getXRot());
@@ -1,7 +1,6 @@
package com.craisinlord.antarchy.neoforge.network;
import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity;
import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi;
import com.craisinlord.antarchy.content.item.BigBerthaItem;
import com.craisinlord.antarchy.content.item.EyeOfTheStormItem;
import com.craisinlord.antarchy.content.item.GravityGunItem;
@@ -13,11 +12,9 @@ import com.craisinlord.antarchy.content.network.GravityGunPrimaryPayload;
import com.craisinlord.antarchy.content.network.GravityGunScrollPayload;
import com.craisinlord.antarchy.content.network.TemporalTunerScrollPayload;
import com.craisinlord.antarchy.content.item.TemporalTunerItem;
import com.craisinlord.antarchy.content.network.GravityStatePayload;
import com.craisinlord.antarchy.content.network.ImpactShakePayload;
import com.craisinlord.antarchy.content.network.PortalGunPrimaryPayload;
import com.craisinlord.antarchy.content.client.CameraShakeClientState;
import net.minecraft.world.entity.Entity;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
@@ -39,10 +36,6 @@ public final class AntarchyGravityNetworking {
com.craisinlord.antarchy.content.network.PortalGunIndicatorRequestPayload.TYPE,
com.craisinlord.antarchy.content.network.PortalGunIndicatorRequestPayload.STREAM_CODEC,
AntarchyGravityNetworking::handlePortalGunIndicatorRequest
).playToClient(
GravityStatePayload.TYPE,
GravityStatePayload.STREAM_CODEC,
AntarchyGravityNetworking::handleGravityState
).playToClient(
ImpactShakePayload.TYPE,
ImpactShakePayload.STREAM_CODEC,
@@ -112,53 +105,6 @@ public final class AntarchyGravityNetworking {
);
}
public static void syncToPlayer(ServerPlayer target, Entity entity) {
GravityStatePayload payload = new GravityStatePayload(
entity.getId(),
AntarchyGravityApi.getGravityDirection(entity),
AntarchyGravityApi.getPrevGravityDirection(entity),
AntarchyGravityApi.isGravityForced(entity),
AntarchyGravityApi.getTransitionDuration(entity),
AntarchyGravityApi.getTransitionRemaining(entity)
);
PacketDistributor.sendToPlayer(target, payload);
}
public static void syncEntity(Entity entity) {
GravityStatePayload payload = new GravityStatePayload(
entity.getId(),
AntarchyGravityApi.getGravityDirection(entity),
AntarchyGravityApi.getPrevGravityDirection(entity),
AntarchyGravityApi.isGravityForced(entity),
AntarchyGravityApi.getTransitionDuration(entity),
AntarchyGravityApi.getTransitionRemaining(entity)
);
PacketDistributor.sendToPlayersTrackingEntityAndSelf(entity, payload);
}
private static void handleGravityState(GravityStatePayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
Entity entity = context.player().level().getEntity(payload.entityId());
// On relog the local player entity may not yet be in the level's entity lookup,
// so fall back to context.player() to ensure the local player always gets synced.
if (entity == null && context.player().getId() == payload.entityId()) {
entity = context.player();
}
if (entity == null) {
return;
}
AntarchyGravityApi.applySyncedState(
entity,
payload.direction(),
payload.previousDirection(),
payload.forced(),
payload.transitionDuration(),
payload.transitionRemaining()
);
});
}
private static void handleImpactShake(ImpactShakePayload payload, IPayloadContext context) {
context.enqueueWork(() -> CameraShakeClientState.triggerImpact(
new Vec3(payload.x(), payload.y(), payload.z()),
@@ -1,5 +1,6 @@
package com.craisinlord.antarchy.neoforge.registry;
import com.craisinlord.anthology.effect.AnthologyEffects;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.config.AntarchySettings;
import com.craisinlord.antarchy.content.AntarchyObjects;
@@ -36,7 +37,6 @@ import com.craisinlord.antarchy.content.tigereye.TigerEyeCamouflageController;
import com.craisinlord.antarchy.content.tigereye.TigerEyeCamouflageSync;
import com.craisinlord.antarchy.neoforge.AntarchyNeoForgeFluidTypes;
import com.craisinlord.antarchy.neoforge.entity.multipart.MultipartPartEntity;
import com.craisinlord.antarchy.neoforge.network.AntarchyGravityNetworking;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.BuiltInRegistries;
@@ -326,7 +326,6 @@ public final class AntarchyNeoForgeEvents {
return;
}
AntarchyGravityNetworking.syncEntity(event.getTarget());
if (event.getTarget() instanceof com.craisinlord.antarchy.content.time.TimeDilationEntityAccess access
&& event.getEntity() instanceof ServerPlayer trackingPlayer) {
com.craisinlord.antarchy.neoforge.network.AntarchyTimeDilationNetworking.syncRateToPlayer(
@@ -495,7 +494,7 @@ public final class AntarchyNeoForgeEvents {
return;
}
MobEffectInstance existingInverted = livingEntity.getEffect(AntarchyNeoforgeMisc.INVERTED);
MobEffectInstance existingInverted = livingEntity.getEffect(AnthologyEffects.inverted());
long gameTime = livingEntity.level().getGameTime();
if (!shouldScanOverheadAntimetal(livingEntity, existingInverted, gameTime)) {
return;
@@ -511,8 +510,8 @@ public final class AntarchyNeoForgeEvents {
"[antarchy-gravity] slow overhead antimetal scan targetType={} uuid={} pos=({}, {}, {}) dim={} elapsedMs={} inverted={} forced={} gameTime={}",
livingEntity.getType(), livingEntity.getUUID(), livingEntity.getX(), livingEntity.getY(), livingEntity.getZ(),
livingEntity.level().dimension().location(), elapsedMs,
com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.isGravityInverted(livingEntity),
com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.isGravityForced(livingEntity),
com.craisinlord.anthology.gravity.GravityApi.isGravityInverted(livingEntity),
com.craisinlord.anthology.gravity.GravityApi.isGravityForced(livingEntity),
gameTime
);
}
@@ -521,7 +520,7 @@ public final class AntarchyNeoForgeEvents {
}
if (existingInverted == null || existingInverted.getDuration() <= ANTIMETAL_INVERTED_REFRESH_THRESHOLD_TICKS) {
livingEntity.addEffect(new MobEffectInstance(AntarchyNeoforgeMisc.INVERTED, ANTIMETAL_INVERTED_REFRESH_TICKS, 0, false, false, false));
livingEntity.addEffect(new MobEffectInstance(AnthologyEffects.inverted(), ANTIMETAL_INVERTED_REFRESH_TICKS, 0, false, false, false));
spawnAntimetalInversionParticles(livingEntity);
}
}
@@ -826,7 +825,7 @@ public final class AntarchyNeoForgeEvents {
static void handleBloodCrystalBootsFall(LivingFallEvent event) {
if (!(event.getEntity() instanceof Player player)) return;
if (!com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.isGravityInverted(player)) return;
if (!com.craisinlord.anthology.gravity.GravityApi.isGravityInverted(player)) return;
if (com.craisinlord.antarchy.content.enchantment.AntarchyEnchantments.featherRisingLevel(player) <= 0) return;
event.setCanceled(true);
}
@@ -1160,10 +1159,10 @@ public final class AntarchyNeoForgeEvents {
static void onInvertedEffectExpired(MobEffectEvent.Expired event) {
if (event.getEffectInstance() == null) return;
if (!event.getEffectInstance().is(AntarchyNeoforgeMisc.INVERTED)) return;
if (!event.getEffectInstance().is(AnthologyEffects.inverted())) return;
LivingEntity entity = event.getEntity();
if (!entity.level().isClientSide()) {
com.craisinlord.antarchy.content.gravity.AntarchyMountedGravityHelper.syncConnectedStackIgnoring(entity, entity);
com.craisinlord.anthology.gravity.MountedGravityHelper.syncConnectedStackIgnoring(entity, entity);
if (entity instanceof Player player) {
notifyNearbyReveriesOfInversionChange(player);
}
@@ -1261,7 +1260,7 @@ public final class AntarchyNeoForgeEvents {
}
if (event.getEntity().getType().is(AntarchyTags.Entities.INVERTED_IMMUNE)
&& event.getEffectInstance().is(AntarchyNeoforgeMisc.INVERTED)) {
&& event.getEffectInstance().is(AnthologyEffects.inverted())) {
event.setResult(MobEffectEvent.Applicable.Result.DO_NOT_APPLY);
return;
}
@@ -1279,18 +1278,18 @@ public final class AntarchyNeoForgeEvents {
}
if (event.getEntity() instanceof Player player
&& event.getEffectInstance().is(AntarchyNeoforgeMisc.INVERTED)
&& !player.hasEffect(AntarchyNeoforgeMisc.INVERTED)) {
&& event.getEffectInstance().is(AnthologyEffects.inverted())
&& !player.hasEffect(AnthologyEffects.inverted())) {
notifyNearbyReveriesOfInversionChange(player);
}
}
static void onInvertedEffectRemoved(MobEffectEvent.Remove event) {
if (!event.getEffect().is(AntarchyNeoforgeMisc.INVERTED)) return;
if (!event.getEffect().is(AnthologyEffects.inverted())) return;
LivingEntity entity = event.getEntity();
if (!entity.level().isClientSide()) {
com.craisinlord.antarchy.content.gravity.AntarchyMountedGravityHelper.syncConnectedStackIgnoring(entity, entity);
com.craisinlord.anthology.gravity.MountedGravityHelper.syncConnectedStackIgnoring(entity, entity);
if (entity instanceof Player player) {
notifyNearbyReveriesOfInversionChange(player);
}
@@ -1387,7 +1386,7 @@ public final class AntarchyNeoForgeEvents {
DispenserBlock.registerBehavior(Items.HOPPER_MINECART, antimetalMinecartDispenseBehavior);
DispenserBlock.registerBehavior(Items.COMMAND_BLOCK_MINECART, antimetalMinecartDispenseBehavior);
LucidEyeProjectileEntity.defaultItemSupplier = () -> AntarchyNeoforgeItems.LUCID_PEARL.get();
LucidEntity.invertedEffectSupplier = () -> AntarchyNeoforgeMisc.INVERTED;
LucidEntity.invertedEffectSupplier = AnthologyEffects::inverted;
FluidInteractionRegistry.addInteraction(
AntarchyNeoForgeFluidTypes.ANTIWATER_TYPE.get(),
new FluidInteractionRegistry.InteractionInformation(
@@ -1398,8 +1397,8 @@ public final class AntarchyNeoForgeEvents {
)
);
LucidEntity.boltEntityTypeSupplier = () -> AntarchyNeoforgeEntites.LUCID_BOLT.get();
LucidBoltEntity.invertedEffectSupplier = () -> AntarchyNeoforgeMisc.INVERTED;
LucidEyeProjectileEntity.invertedEffectSupplier = () -> AntarchyNeoforgeMisc.INVERTED;
LucidBoltEntity.invertedEffectSupplier = AnthologyEffects::inverted;
LucidEyeProjectileEntity.invertedEffectSupplier = AnthologyEffects::inverted;
VortexEntity.windVortexTypeSupplier = () -> AntarchyNeoforgeEntites.WIND_VORTEX.get();
VortexChargeProjectileEntity.defaultItemSupplier = () -> AntarchyNeoforgeItems.VORTEX_CHARGE.get();
VortexChargeProjectileEntity.projectileTypeSupplier = () -> AntarchyNeoforgeEntites.VORTEX_CHARGE_PROJECTILE.get();
@@ -1,5 +1,6 @@
package com.craisinlord.antarchy.neoforge.registry;
import com.craisinlord.anthology.effect.AnthologyEffects;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.client.particle.InvertedGeyserBaseParticleOptions;
import com.craisinlord.antarchy.content.client.particle.InvertedGeyserParticleOptions;
@@ -8,7 +9,6 @@ import com.craisinlord.antarchy.content.effect.BleedingMobEffect;
import com.craisinlord.antarchy.content.effect.BloodMoonMobEffect;
import com.craisinlord.antarchy.content.effect.GoopedMobEffect;
import com.craisinlord.antarchy.content.effect.GrowthMobEffect;
import com.craisinlord.antarchy.content.effect.InvertedMobEffect;
import com.craisinlord.antarchy.content.effect.CommandedMobEffect;
import com.craisinlord.antarchy.content.effect.DilatedMobEffect;
import com.craisinlord.antarchy.content.effect.ContractedMobEffect;
@@ -178,7 +178,6 @@ public final class AntarchyNeoforgeMisc {
public static final DeferredHolder<MobEffect, BleedingMobEffect> BLEEDING = MOB_EFFECTS.register("bleeding", BleedingMobEffect::new);
public static final DeferredHolder<MobEffect, BloodMoonMobEffect> BLOOD_MOON = MOB_EFFECTS.register("blood_moon", BloodMoonMobEffect::new);
public static final DeferredHolder<MobEffect, ParalyzedMobEffect> PARALYZED = MOB_EFFECTS.register("paralyzed", ParalyzedMobEffect::new);
public static final DeferredHolder<MobEffect, InvertedMobEffect> INVERTED = MOB_EFFECTS.register("inverted", InvertedMobEffect::new);
public static final DeferredHolder<MobEffect, CommandedMobEffect> COMMANDED = MOB_EFFECTS.register("commanded", CommandedMobEffect::new);
public static final DeferredHolder<MobEffect, DilatedMobEffect> DILATED = MOB_EFFECTS.register("dilated", DilatedMobEffect::new);
public static final DeferredHolder<MobEffect, ContractedMobEffect> CONTRACTED = MOB_EFFECTS.register("contracted", ContractedMobEffect::new);
@@ -193,9 +192,9 @@ public final class AntarchyNeoforgeMisc {
// Potions
public static final DeferredHolder<Potion, Potion> INVERSION = POTIONS.register("inversion",
() -> new Potion(new MobEffectInstance(INVERTED, 600)));
() -> new Potion(new MobEffectInstance(AnthologyEffects.inverted(), 600)));
public static final DeferredHolder<Potion, Potion> LONG_INVERSION = POTIONS.register("long_inversion",
() -> new Potion("inversion", new MobEffectInstance(INVERTED, 2400)));
() -> new Potion("inversion", new MobEffectInstance(AnthologyEffects.inverted(), 2400)));
public static final DeferredHolder<Potion, Potion> COMMAND = POTIONS.register("command",
() -> new Potion(new MobEffectInstance(COMMANDED, 600)));
public static final DeferredHolder<Potion, Potion> LONG_COMMAND = POTIONS.register("long_command",
@@ -35,6 +35,13 @@ displayURL="https://www.curseforge.com/minecraft/mc-mods/antarchy"
ordering="AFTER"
side="BOTH"
[[dependencies.antarchy]]
modId="anthology"
type="required"
versionRange="[1.0.0,)"
ordering="AFTER"
side="BOTH"
[[dependencies.antarchy]]
modId="antos"
type="required"