fix king and queen attack anim bug

stabalize RainbowAntEntity dims
patch config inconsitency
fixed undervault
performance improvements
This commit is contained in:
craisinlord committed 2026-09-12 23:58:24 -05:00
1 parent 377f3785af
commit 37e941915d
47 files changed
+784 -231

No files matched your search

@@ -0,0 +1,20 @@
package com.craisinlord.antarchy.neoforge;
import net.minecraft.resources.ResourceLocation;
public final class InfinityGenerationFailure {
private static final ThreadLocal<ResourceLocation> FAILURE = new ThreadLocal<>();
private InfinityGenerationFailure() {
}
public static void mark(ResourceLocation dimensionId) {
FAILURE.set(dimensionId);
}
public static boolean consume(ResourceLocation dimensionId) {
ResourceLocation failed = FAILURE.get();
FAILURE.remove();
return dimensionId.equals(failed);
}
}
@@ -2,6 +2,7 @@ package com.craisinlord.antarchy.neoforge;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.compat.infinity.InfinityCompatBridge;
import com.craisinlord.antarchy.compat.infinity.InfinityWarpResult;
import net.lerariemann.infinity.InfinityMod;
import net.lerariemann.infinity.util.InfinityMethods;
import net.lerariemann.infinity.util.teleport.PortalCreator;
@@ -69,13 +70,15 @@ public final class NeoForgeInfinityCompat implements InfinityCompatBridge {
}
@Override
public boolean requestWarp(ServerPlayer player, ResourceLocation dimensionId) {
public InfinityWarpResult requestWarp(ServerPlayer player, ResourceLocation dimensionId) {
try {
WarpLogic.requestWarp(player, dimensionId, false);
return true;
return InfinityWarpResult.PENDING;
} catch (Throwable throwable) {
Antarchy.LOGGER.error("[Antarchy] Failed to request an Infinity warp to {}", dimensionId, throwable);
return false;
return InfinityGenerationFailure.consume(dimensionId)
? InfinityWarpResult.FAILED_GENERATION
: InfinityWarpResult.REJECTED;
}
}
@@ -4,6 +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 net.minecraft.nbt.CompoundTag;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
@@ -67,17 +69,27 @@ public class MultipartPartEntity extends PartEntity<Entity> implements OwnableEn
return;
}
AntarchyGravityApi.applySyncedState(
this,
AntarchyGravityApi.getGravityDirection(parent),
AntarchyGravityApi.getPrevGravityDirection(parent),
AntarchyGravityApi.isGravityForced(parent),
AntarchyGravityApi.getTransitionDuration(parent),
AntarchyGravityApi.getTransitionRemaining(parent)
);
double oldX = this.getX();
double oldY = this.getY();
double oldZ = this.getZ();
double yawRadians = Math.toRadians(parent.getYRot());
Vec3 forward = new Vec3(-Math.sin(yawRadians), 0.0D, Math.cos(yawRadians));
Vec3 right = new Vec3(forward.z, 0.0D, -forward.x);
Vec3 position = new Vec3(
parent.getX() + forward.x * this.definition.forwardOffset() + right.x * this.definition.lateralOffset(),
parent.getY() + this.definition.yOffset(),
parent.getZ() + forward.z * this.definition.forwardOffset() + right.z * this.definition.lateralOffset()
);
Vec3 localOffset = new Vec3(
forward.x * this.definition.forwardOffset() + right.x * this.definition.lateralOffset(),
this.definition.yOffset() + (AntarchyGravityApi.isGravityInverted(parent) ? this.definition.height() : 0.0D),
forward.z * this.definition.forwardOffset() + right.z * this.definition.lateralOffset());
Vec3 offset = AntarchyGravityRotationUtil.vecPlayerToWorld(localOffset, AntarchyGravityApi.getGravityDirection(parent));
Vec3 position = parent.position().add(offset);
this.setPos(position.x, position.y, position.z);
this.setRot(parent.getYRot(), parent.getXRot());
this.xo = oldX;
@@ -9,11 +9,6 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(value = ConfigGenInvocation.class, remap = false)
/*
* Guards against a NPE in Infinite Dimensions' SurfaceRuleScanner when another mod
* registers a surface rule with a missing "biome_is" field. Without this, the crash
* propagates up through PlayerList.placeNewPlayer and kicks the player on login
*/
public class ConfigGenInvocationMixin {
@Redirect(
@@ -0,0 +1,35 @@
package com.craisinlord.antarchy.neoforge.mixins.infinity;
import com.craisinlord.antarchy.neoforge.InfinityGenerationFailure;
import net.lerariemann.infinity.access.MinecraftServerAccess;
import net.lerariemann.infinity.util.teleport.PortalCreator;
import net.lerariemann.infinity.util.teleport.WarpLogic;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(value = WarpLogic.class, remap = false)
public interface WarpLogicMixin {
@Redirect(
method = "requestWarp(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/resources/ResourceLocation;Z)V",
at = @At(value = "INVOKE", target = "Lnet/lerariemann/infinity/util/teleport/PortalCreator;tryAddInfinityDimension(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/resources/ResourceLocation;)Z"),
remap = false
)
private static boolean antarchy$queuedDimensionCountsAsNew(MinecraftServer server, ResourceLocation dimensionId) throws Throwable {
ResourceKey<Level> key = ResourceKey.create(Registries.DIMENSION, dimensionId);
if (server instanceof MinecraftServerAccess access && access.infinity$hasToAdd(key)) {
return true;
}
try {
return PortalCreator.tryAddInfinityDimension(server, dimensionId);
} catch (Throwable throwable) {
InfinityGenerationFailure.mark(dimensionId);
throw throwable;
}
}
}
@@ -57,8 +57,7 @@ public final class MultipartNetworking {
return;
}
DamageSource source = serverPlayer.level().damageSources().playerAttack(serverPlayer);
owner.antarchy$hurtMultipartPart(part, source, payload.damage());
serverPlayer.attack(part);
});
}
@@ -143,6 +143,8 @@ public final class AntarchyNeoForgeEvents {
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleBloodglassPlayerDeath);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleBloodglassRespawn);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleBloodglassLogin);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleTimeDilationLogin);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleTimeDilationRespawn);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleCavarynHordeKill);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleCavarynHordeBlockBreak);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickCavarynHordes);
@@ -213,7 +215,8 @@ public final class AntarchyNeoForgeEvents {
&& tickEnd > 0L
&& now - tickEnd >= SERVER_IDLE_BUSY_WARN_NANOS
&& state != Thread.State.WAITING
&& state != Thread.State.TIMED_WAITING;
&& state != Thread.State.TIMED_WAITING
&& !antarchy$isServerThreadIdleWait(tickThread);
if (idleBusy) {
antarchy$dumpServerThreadWatchdog(
"server thread busy outside active tick",
@@ -238,6 +241,18 @@ public final class AntarchyNeoForgeEvents {
}
}
private static boolean antarchy$isServerThreadIdleWait(Thread tickThread) {
for (StackTraceElement element : tickThread.getStackTrace()) {
String method = element.getMethodName();
if (method.equals("waitUntilNextTick")
|| method.equals("waitForTasks")
|| method.equals("managedBlock")) {
return true;
}
}
return false;
}
static void onVillagerTrades(VillagerTradesEvent event) {
if (event.getType() == VillagerProfession.FARMER) {
event.getTrades().get(1).add(emeraldForItems(AntarchyObjects.CORN.get(), 20, 16, 2));
@@ -384,6 +399,18 @@ public final class AntarchyNeoForgeEvents {
}
}
static void handleTimeDilationLogin(PlayerEvent.PlayerLoggedInEvent event) {
if (event.getEntity() instanceof ServerPlayer player) {
TimeDilationManager.resyncPersistentEffects(player);
}
}
static void handleTimeDilationRespawn(PlayerEvent.PlayerRespawnEvent event) {
if (event.getEntity() instanceof ServerPlayer player) {
TimeDilationManager.resyncPersistentEffects(player);
}
}
static void handleTigerEyeLogout(PlayerEvent.PlayerLoggedOutEvent event) {
if (event.getEntity() instanceof ServerPlayer player) {
TigerEyeCamouflageController.deactivate(player, false);
@@ -561,15 +588,6 @@ public final class AntarchyNeoForgeEvents {
}
if (existingInverted == null || existingInverted.getDuration() <= ANTIMETAL_INVERTED_REFRESH_THRESHOLD_TICKS) {
if (livingEntity instanceof Player || livingEntity.level().dimension().location().toString().equals("antarchy:thoraxis")) {
Antarchy.LOGGER.info(
"[antarchy-gravity] overhead antimetal applying inverted effect targetType={} uuid={} pos=({}, {}, {}) dim={} existingDuration={} gameTime={}",
livingEntity.getType(), livingEntity.getUUID(), livingEntity.getX(), livingEntity.getY(), livingEntity.getZ(),
livingEntity.level().dimension().location(),
existingInverted != null ? existingInverted.getDuration() : -1,
gameTime
);
}
livingEntity.addEffect(new MobEffectInstance(AntarchyNeoforgeMisc.INVERTED, ANTIMETAL_INVERTED_REFRESH_TICKS, 0, false, false, false));
spawnAntimetalInversionParticles(livingEntity);
}
@@ -717,8 +717,8 @@ public final class AntarchyNeoforgeItems {
public static final DeferredItem<MantisClawItem> MANTIS_CLAW = ITEMS.register("mantis_claw",
() -> new MantisClawItem(Tiers.IRON, new Item.Properties().stacksTo(1).durability(50).rarity(Rarity.UNCOMMON)));
public static final DeferredItem<Item> HERCULES_HORN = ITEMS.registerSimpleItem("hercules_horn", new Item.Properties().rarity(Rarity.UNCOMMON));
public static final DeferredItem<Item> KING_SCALE = ITEMS.registerSimpleItem("king_scale", new Item.Properties().rarity(Rarity.RARE));
public static final DeferredItem<Item> QUEEN_SCALE = ITEMS.registerSimpleItem("queen_scale", new Item.Properties().rarity(Rarity.RARE));
public static final DeferredItem<Item> KING_SCALE = ITEMS.registerSimpleItem("king_scale", new Item.Properties().rarity(Rarity.RARE).fireResistant());
public static final DeferredItem<Item> QUEEN_SCALE = ITEMS.registerSimpleItem("queen_scale", new Item.Properties().rarity(Rarity.RARE).fireResistant());
public static final DeferredItem<Item> CHITIN = ITEMS.registerSimpleItem("chitin", new Item.Properties().rarity(Rarity.UNCOMMON));
public static final DeferredItem<Item> JERRY_NUCLEUS = ITEMS.register("jerry_nucleus",
() -> new com.craisinlord.antarchy.content.item.JerryNucleusItem(new Item.Properties().rarity(Rarity.UNCOMMON)
@@ -12,6 +12,7 @@
"infinity.AmendmentRareOresMixin",
"infinity.ConfigGenInvocationMixin",
"infinity.PortalCreatorMixin",
"infinity.WarpLogicMixin",
"level.ClientLevelPartEntitiesAccessor",
"level.ServerLevelPartEntitiesAccessor"
],