moved miners dream to seperate mod

new portal gun draft
fixed scorched guns mixin
sodium compat layer
This commit is contained in:
craisinlord committed 2026-09-29 23:37:11 -05:00
1 parent 23599c4c59
commit c7cb48edfb
193 files changed
+6528 -2821

No files matched your search

+3
View File
@@ -46,6 +46,9 @@ neoForge {
}
dependencies {
if (providers.gradleProperty('antarchySodiumCompatTest').orNull == 'true') {
runtimeOnly(files(rootProject.file("infinite_dimensions_jars/sodium-neoforge-0.8.13+mc1.21.1.jar")))
}
compileOnly(files(rootProject.file("infinite_dimensions_jars/antos-neoforge-1.21.1-${antos_version}.jar")))
runtimeOnly(files(rootProject.file("infinite_dimensions_jars/antos-neoforge-1.21.1-${antos_version}.jar")))
compileOnly("curse.maven:intapi-${intapi_curseforge_id}:${intapi_curseforge_file_id_neoforge}")
@@ -630,11 +630,6 @@ public final class AntarchyConfigModuleNeoforge {
AntarchySettings.setCritterCageMaxCapturableWidth(AntarchyToolsConfig.critterCageMaxCapturableWidth());
AntarchySettings.setCritterCageMaxCapturableHeight(AntarchyToolsConfig.critterCageMaxCapturableHeight());
AntarchySettings.setMinersDreamEnabled(AntarchyToolsConfig.minersDreamEnabled());
AntarchySettings.setMinersDreamMinimumRange(AntarchyToolsConfig.minersDreamMinimumRange());
AntarchySettings.setMinersDreamMaximumRange(AntarchyToolsConfig.minersDreamMaximumRange());
AntarchySettings.setMinersDreamTorchSpacing(AntarchyToolsConfig.minersDreamTorchSpacing());
AntarchySettings.setMinersDreamBlocksPerTick(AntarchyToolsConfig.minersDreamBlocksPerTick());
AntarchySettings.setDuctTapeRepairPercentPerUse(AntarchyToolsConfig.ductTapeRepairPercentPerUse());
AntarchySettings.setPotentNyxiteInvertedDurationSeconds(AntarchyToolsConfig.potentNyxiteInvertedDurationSeconds());
@@ -669,6 +664,15 @@ public final class AntarchyConfigModuleNeoforge {
AntarchySettings.setElythiaPortalEnabled(AntarchyMiscConfig.elythiaPortalEnabled());
AntarchySettings.setThoraxisPortalEnabled(AntarchyMiscConfig.thoraxisPortalEnabled());
AntarchySettings.setCavarynPortalEnabled(AntarchyMiscConfig.cavarynPortalEnabled());
AntarchySettings.setPortalGunCanFireThroughGlass(AntarchyMiscConfig.portalGunCanFireThroughGlass());
AntarchySettings.setPortalGunCanFireThroughLiquid(AntarchyMiscConfig.portalGunCanFireThroughLiquid());
AntarchySettings.setPortalGunCanPortalsResizeWhenCreated(AntarchyMiscConfig.portalGunCanPortalsResizeWhenCreated());
AntarchySettings.setPortalGunCanPortalProjectilesChunkload(AntarchyMiscConfig.portalGunCanPortalProjectilesChunkload());
AntarchySettings.setPortalGunSeeThroughPortals(AntarchyMiscConfig.portalGunSeeThroughPortals());
AntarchySettings.setPortalGunFancyPortals(AntarchyMiscConfig.portalGunFancyPortals());
AntarchySettings.setPortalGunMaxShootDistance(AntarchyMiscConfig.portalGunMaxShootDistance());
AntarchySettings.setPortalGunEntityGrabWeightBase(AntarchyMiscConfig.portalGunEntityGrabWeightBase());
AntarchySettings.setPortalGunIndicatorSize(AntarchyMiscConfig.portalGunIndicatorSize());
// Misc
@@ -32,6 +32,15 @@ public final class AntarchyMiscConfig {
private static final ModConfigSpec.BooleanValue ELYTHIA_PORTAL_ENABLED;
private static final ModConfigSpec.BooleanValue THORAXIS_PORTAL_ENABLED;
private static final ModConfigSpec.BooleanValue CAVARYN_PORTAL_ENABLED;
private static final ModConfigSpec.BooleanValue PORTAL_GUN_CAN_FIRE_THROUGH_GLASS;
private static final ModConfigSpec.BooleanValue PORTAL_GUN_CAN_FIRE_THROUGH_LIQUID;
private static final ModConfigSpec.BooleanValue PORTAL_GUN_CAN_PORTALS_RESIZE_WHEN_CREATED;
private static final ModConfigSpec.BooleanValue PORTAL_GUN_CAN_PORTAL_PROJECTILES_CHUNKLOAD;
private static final ModConfigSpec.BooleanValue PORTAL_GUN_SEE_THROUGH_PORTALS;
private static final ModConfigSpec.BooleanValue PORTAL_GUN_FANCY_PORTALS;
private static final ModConfigSpec.IntValue PORTAL_GUN_MAX_SHOOT_DISTANCE;
private static final ModConfigSpec.IntValue PORTAL_GUN_ENTITY_GRAB_WEIGHT_BASE;
private static final ModConfigSpec.IntValue PORTAL_GUN_INDICATOR_SIZE;
// Diamond Minecart
private static final ModConfigSpec.BooleanValue DIAMOND_MINECART_ENABLED;
@@ -129,6 +138,18 @@ public final class AntarchyMiscConfig {
CAVARYN_PORTAL_ENABLED = b.comment("Whether Myrmite portals to Cavaryn can activate and function.").define("cavarynPortalEnabled", true);
b.pop();
b.push("portalGun");
PORTAL_GUN_CAN_FIRE_THROUGH_GLASS = b.define("canFireThroughGlass", false);
PORTAL_GUN_CAN_FIRE_THROUGH_LIQUID = b.define("canFireThroughLiquid", false);
PORTAL_GUN_CAN_PORTALS_RESIZE_WHEN_CREATED = b.define("canPortalsResizeWhenCreated", true);
PORTAL_GUN_CAN_PORTAL_PROJECTILES_CHUNKLOAD = b.define("canPortalProjectilesChunkload", true);
PORTAL_GUN_SEE_THROUGH_PORTALS = b.define("seeThroughPortals", true);
PORTAL_GUN_FANCY_PORTALS = b.define("fancyPortals", true);
PORTAL_GUN_MAX_SHOOT_DISTANCE = b.defineInRange("maxShootDistance", 10000, 1, Integer.MAX_VALUE);
PORTAL_GUN_ENTITY_GRAB_WEIGHT_BASE = b.defineInRange("entityGrabWeightBase", 100, 0, 1000);
PORTAL_GUN_INDICATOR_SIZE = b.defineInRange("indicatorSize", 30, 0, 100);
b.pop();
// Diamond Minecart
@@ -196,6 +217,15 @@ public final class AntarchyMiscConfig {
public static boolean elythiaPortalEnabled() { return ELYTHIA_PORTAL_ENABLED.get(); }
public static boolean thoraxisPortalEnabled() { return THORAXIS_PORTAL_ENABLED.get(); }
public static boolean cavarynPortalEnabled() { return CAVARYN_PORTAL_ENABLED.get(); }
public static boolean portalGunCanFireThroughGlass() { return PORTAL_GUN_CAN_FIRE_THROUGH_GLASS.get(); }
public static boolean portalGunCanFireThroughLiquid() { return PORTAL_GUN_CAN_FIRE_THROUGH_LIQUID.get(); }
public static boolean portalGunCanPortalsResizeWhenCreated() { return PORTAL_GUN_CAN_PORTALS_RESIZE_WHEN_CREATED.get(); }
public static boolean portalGunCanPortalProjectilesChunkload() { return PORTAL_GUN_CAN_PORTAL_PROJECTILES_CHUNKLOAD.get(); }
public static boolean portalGunSeeThroughPortals() { return PORTAL_GUN_SEE_THROUGH_PORTALS.get(); }
public static boolean portalGunFancyPortals() { return PORTAL_GUN_FANCY_PORTALS.get(); }
public static int portalGunMaxShootDistance() { return PORTAL_GUN_MAX_SHOOT_DISTANCE.get(); }
public static int portalGunEntityGrabWeightBase() { return PORTAL_GUN_ENTITY_GRAB_WEIGHT_BASE.get(); }
public static int portalGunIndicatorSize() { return PORTAL_GUN_INDICATOR_SIZE.get(); }
static boolean diamondMinecartEnabled() { return DIAMOND_MINECART_ENABLED.get(); }
static boolean diamondMinecartPlacesRails() { return DIAMOND_MINECART_PLACES_RAILS.get(); }
@@ -11,6 +11,7 @@ import com.craisinlord.antarchy.content.time.TimeDilationCommand;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.server.ServerStoppingEvent;
import net.minecraft.commands.Commands;
import net.minecraft.network.chat.Component;
@@ -29,4 +30,9 @@ public final class AntarchyNeoforgeEvents {
TimeDilationCommand.register(event.getDispatcher());
RoyalCommand.register(event.getDispatcher());
}
@SubscribeEvent
public static void onServerStopping(ServerStoppingEvent event) {
com.craisinlord.antarchy.content.portalgun.PortalGunProjectileEntity.releaseAllProjectileTickets();
}
}
@@ -258,11 +258,6 @@ public final class AntarchyToolsConfig {
// Miner's Dream
private static final ModConfigSpec.BooleanValue MINERS_DREAM_ENABLED;
private static final ModConfigSpec.IntValue MINERS_DREAM_MINIMUM_RANGE;
private static final ModConfigSpec.IntValue MINERS_DREAM_MAXIMUM_RANGE;
private static final ModConfigSpec.IntValue MINERS_DREAM_TORCH_SPACING;
private static final ModConfigSpec.IntValue MINERS_DREAM_BLOCKS_PER_TICK;
// Miscellaneous items / consumables
@@ -635,16 +630,6 @@ public final class AntarchyToolsConfig {
b.pop();
// Miner's Dream
b.push("minersDream");
MINERS_DREAM_ENABLED = b.comment("Master toggle. If false, the item remains craftable but cannot be used.").define("enabled", true);
MINERS_DREAM_MINIMUM_RANGE = b.comment("Minimum cave length in blocks. Clamped to [8, 256].") .defineInRange("minimumRange", 48, 8, 256);
MINERS_DREAM_MAXIMUM_RANGE = b.comment("Maximum cave length in blocks. Clamped to [8, 256].") .defineInRange("maximumRange", 96, 8, 256);
MINERS_DREAM_TORCH_SPACING = b.comment("Approximate blocks between torch placements along the cave.") .defineInRange("torchSpacing", 10, 4, 64);
MINERS_DREAM_BLOCKS_PER_TICK = b.comment("Maximum blocks removed per server tick while excavating.") .defineInRange("blocksPerTick", 150, 1, 2000);
b.pop();
// Miscellaneous items / consumables
@@ -833,11 +818,6 @@ public final class AntarchyToolsConfig {
static double critterCageMaxCapturableWidth() { return CRITTER_CAGE_MAX_CAPTURABLE_WIDTH.get(); }
static double critterCageMaxCapturableHeight() { return CRITTER_CAGE_MAX_CAPTURABLE_HEIGHT.get(); }
static boolean minersDreamEnabled() { return MINERS_DREAM_ENABLED.get(); }
static int minersDreamMinimumRange() { return MINERS_DREAM_MINIMUM_RANGE.get(); }
static int minersDreamMaximumRange() { return MINERS_DREAM_MAXIMUM_RANGE.get(); }
static int minersDreamTorchSpacing() { return MINERS_DREAM_TORCH_SPACING.get(); }
static int minersDreamBlocksPerTick() { return MINERS_DREAM_BLOCKS_PER_TICK.get(); }
static double ductTapeRepairPercentPerUse() { return DUCT_TAPE_REPAIR_PERCENT_PER_USE.get(); }
static double potentNyxiteInvertedDurationSeconds() { return POTENT_NYXITE_INVERTED_DURATION_SECONDS.get(); }
@@ -58,6 +58,27 @@ public final class AntarchyKeyBindings {
InputConstants.KEY_B,
CATEGORY
);
public static final KeyMapping PORTAL_GUN_ZOOM = new KeyMapping(
"key.antarchy.portal_gun_zoom",
KeyConflictContext.IN_GAME,
InputConstants.Type.MOUSE,
InputConstants.MOUSE_BUTTON_MIDDLE,
CATEGORY
);
public static final KeyMapping PORTAL_GUN_GRAB = new KeyMapping(
"key.antarchy.portal_gun_grab",
KeyConflictContext.IN_GAME,
InputConstants.Type.KEYSYM,
InputConstants.KEY_G,
CATEGORY
);
public static final KeyMapping PORTAL_GUN_RESET = new KeyMapping(
"key.antarchy.portal_gun_reset",
KeyConflictContext.IN_GAME,
InputConstants.Type.KEYSYM,
InputConstants.KEY_R,
CATEGORY
);
private AntarchyKeyBindings() {}
@@ -69,6 +90,9 @@ public final class AntarchyKeyBindings {
event.register(TIGERS_EYE_CAMOUFLAGE);
event.register(ROYAL_INVERSION_TOGGLE);
event.register(ROYAL_BOUNDARY);
event.register(PORTAL_GUN_ZOOM);
event.register(PORTAL_GUN_GRAB);
event.register(PORTAL_GUN_RESET);
}
public static boolean isMountFlightTogglePressed() {
@@ -90,4 +114,20 @@ public final class AntarchyKeyBindings {
public static boolean consumeRoyalBoundaryPressed() {
return ROYAL_BOUNDARY.consumeClick();
}
public static boolean consumePortalGunZoomPressed() {
return PORTAL_GUN_ZOOM.consumeClick();
}
public static boolean consumePortalGunGrabPressed() {
return PORTAL_GUN_GRAB.consumeClick();
}
public static boolean consumePortalGunResetPressed() {
return PORTAL_GUN_RESET.consumeClick();
}
public static boolean isPortalGunResetDown() {
return PORTAL_GUN_RESET.isDown() || PORTAL_GUN_RESET.consumeClick();
}
}
@@ -2,6 +2,7 @@ package com.craisinlord.antarchy.neoforge.client;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.client.GoopedHudRenderer;
import com.craisinlord.antarchy.content.client.PortalGunCrosshairRenderer;
import com.craisinlord.antarchy.content.client.AntarchyArchivePreviews;
import com.craisinlord.antarchy.content.client.game.AntarchyComputerGames;
import com.craisinlord.antarchy.content.client.HordeHudRenderer;
@@ -16,6 +17,7 @@ import com.craisinlord.antarchy.neoforge.registry.AntarchyNeoforgeItems;
import com.craisinlord.antarchy.neoforge.registry.AntarchyNeoforgeMisc;
import com.mojang.blaze3d.shaders.FogShape;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.BoatModel;
import net.minecraft.client.model.ArmorStandModel;
@@ -38,6 +40,7 @@ import net.minecraft.client.renderer.BiomeColors;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.ShaderInstance;
import net.minecraft.client.renderer.blockentity.CampfireRenderer;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.client.renderer.item.ItemProperties;
@@ -56,6 +59,7 @@ import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent;
import net.neoforged.neoforge.client.event.RegisterShadersEvent;
import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent;
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
import net.neoforged.neoforge.client.event.EntityRenderersEvent;
@@ -98,6 +102,19 @@ public final class AntarchyNeoForgeClient {
private AntarchyNeoForgeClient() {
}
@SubscribeEvent
public static void registerPortalViewShader(RegisterShadersEvent event) {
PortalGunPortalViewRenderer.clearPortalViewShader();
try {
event.registerShader(
new ShaderInstance(event.getResourceProvider(), ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "portal_view"), DefaultVertexFormat.POSITION_TEX),
PortalGunPortalViewRenderer::setPortalViewShader
);
} catch (java.io.IOException | RuntimeException exception) {
Antarchy.LOGGER.error("Failed to register portal view shader", exception);
}
}
@SubscribeEvent
public static void clientSetup(FMLClientSetupEvent event) {
Antarchy.physicalClient = true;
@@ -368,6 +385,11 @@ public final class AntarchyNeoForgeClient {
@SubscribeEvent
public static void registerGuiLayers(RegisterGuiLayersEvent event) {
event.registerAbove(
VanillaGuiLayers.CROSSHAIR,
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "portal_gun_crosshair"),
(guiGraphics, partialTick) -> PortalGunCrosshairRenderer.render(guiGraphics)
);
event.registerAboveAll(
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "dread_darkness"),
(guiGraphics, partialTick) -> DreadHudRenderer.render(guiGraphics)
@@ -2,7 +2,9 @@ package com.craisinlord.antarchy.neoforge.client;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.item.PortalGunItem;
import com.craisinlord.antarchy.content.client.PortalGunZoomClientState;
import com.craisinlord.antarchy.content.network.PortalGunPrimaryPayload;
import com.craisinlord.antarchy.content.network.PortalGunGrabPayload;
import net.minecraft.client.Minecraft;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
@@ -20,19 +22,40 @@ public final class PortalGunClientHandler {
@SubscribeEvent
public static void onClientTick(ClientTickEvent.Post event) {
Minecraft mc = Minecraft.getInstance();
if (mc.player == null) {
com.craisinlord.antarchy.content.client.PortalGunGrabClientState.clear();
com.craisinlord.antarchy.content.client.PortalGunResetClientState.clear();
}
com.craisinlord.antarchy.content.client.PortalGunIndicatorClientState.setRequestSender(net.neoforged.neoforge.network.PacketDistributor::sendToServer);
boolean hasPortalGun = mc.player != null && (mc.player.getMainHandItem().getItem() instanceof PortalGunItem || mc.player.getOffhandItem().getItem() instanceof PortalGunItem);
boolean gameplayInput = mc.screen == null;
boolean held = hasPortalGun && gameplayInput;
boolean zoomPressed = AntarchyKeyBindings.consumePortalGunZoomPressed();
PortalGunZoomClientState.tick(mc, hasPortalGun, zoomPressed && gameplayInput);
boolean resetActive = com.craisinlord.antarchy.content.client.PortalGunResetClientState.tick(
mc,
held,
AntarchyKeyBindings.isPortalGunResetDown(),
net.neoforged.neoforge.network.PacketDistributor::sendToServer
);
if (held && AntarchyKeyBindings.consumePortalGunGrabPressed()) {
PacketDistributor.sendToServer(new PortalGunGrabPayload());
}
if (mc.player == null || mc.level == null || mc.screen != null) {
lastAttackDown = false;
return;
}
if (!(mc.player.getMainHandItem().getItem() instanceof PortalGunItem)) {
boolean offhand = !(mc.player.getMainHandItem().getItem() instanceof PortalGunItem)
&& mc.player.getOffhandItem().getItem() instanceof PortalGunItem;
if (!offhand && !(mc.player.getMainHandItem().getItem() instanceof PortalGunItem)) {
lastAttackDown = false;
return;
}
boolean attackDown = mc.options.keyAttack.isDown();
if (attackDown && !lastAttackDown) {
PacketDistributor.sendToServer(new PortalGunPrimaryPayload());
if (attackDown && !lastAttackDown && !resetActive) {
PacketDistributor.sendToServer(new PortalGunPrimaryPayload(offhand));
}
lastAttackDown = attackDown;
}
@@ -2,26 +2,24 @@ package com.craisinlord.antarchy.neoforge.client;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.client.renderer.PortalGunPortalViewRenderer;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
@EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT)
public final class PortalGunPortalViewRenderHandler {
private static long lastStageLogNanos;
private PortalGunPortalViewRenderHandler() {
}
@SubscribeEvent
public static void onRenderLevelStage(RenderLevelStageEvent event) {
if (!PortalGunPortalViewRenderer.isEnabled()) {
return;
}
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) {
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_BLOCK_ENTITIES) {
return;
}
long now = System.nanoTime();
if (now - lastStageLogNanos > 5_000_000_000L) {
lastStageLogNanos = now;
Antarchy.LOGGER.info("Portal gun NeoForge render stage fired stage={} partial={}", event.getStage(), event.getPartialTick().getGameTimeDeltaPartialTick(false));
}
PortalGunPortalViewRenderer.render(event.getCamera(), event.getPoseStack().last().pose(), event.getPartialTick());
PortalGunPortalViewRenderer.render(event.getCamera(), event.getModelViewMatrix(), event.getProjectionMatrix(), event.getPartialTick());
}
}
@@ -19,6 +19,7 @@ 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;
import net.neoforged.neoforge.network.PacketDistributor;
import net.neoforged.neoforge.network.handling.IPayloadContext;
@@ -29,7 +30,21 @@ public final class AntarchyGravityNetworking {
}
public static void register(PayloadRegistrar registrar) {
com.craisinlord.antarchy.content.portalgun.PortalGunIndicatorSync.setSender(PacketDistributor::sendToPlayer);
com.craisinlord.antarchy.content.portalgun.PortalGunGrabManager.setStateSender(PacketDistributor::sendToPlayer);
registrar.playToClient(
com.craisinlord.antarchy.content.network.PortalGunIndicatorPayload.TYPE,
com.craisinlord.antarchy.content.network.PortalGunIndicatorPayload.STREAM_CODEC,
(payload, context) -> context.enqueueWork(() -> com.craisinlord.antarchy.content.client.PortalGunIndicatorClientState.update(payload))
).playToServer(
com.craisinlord.antarchy.content.network.PortalGunIndicatorRequestPayload.TYPE,
com.craisinlord.antarchy.content.network.PortalGunIndicatorRequestPayload.STREAM_CODEC,
AntarchyGravityNetworking::handlePortalGunIndicatorRequest
).playToClient(
com.craisinlord.antarchy.content.network.PortalGunGrabStatePayload.TYPE,
com.craisinlord.antarchy.content.network.PortalGunGrabStatePayload.STREAM_CODEC,
(payload, context) -> context.enqueueWork(() -> com.craisinlord.antarchy.content.client.PortalGunGrabClientState.update(payload.active()))
).playToClient(
GravityStatePayload.TYPE,
GravityStatePayload.STREAM_CODEC,
AntarchyGravityNetworking::handleGravityState
@@ -45,6 +60,18 @@ public final class AntarchyGravityNetworking {
PortalGunPrimaryPayload.TYPE,
PortalGunPrimaryPayload.STREAM_CODEC,
AntarchyGravityNetworking::handlePortalGunPrimary
).playToServer(
com.craisinlord.antarchy.content.network.PortalGunGrabPayload.TYPE,
com.craisinlord.antarchy.content.network.PortalGunGrabPayload.STREAM_CODEC,
AntarchyGravityNetworking::handlePortalGunGrab
).playToServer(
com.craisinlord.antarchy.content.network.PortalGunResetPayload.TYPE,
com.craisinlord.antarchy.content.network.PortalGunResetPayload.STREAM_CODEC,
(payload, context) -> context.enqueueWork(() -> {
if (context.player() instanceof ServerPlayer serverPlayer) {
com.craisinlord.antarchy.content.portalgun.PortalGunResetManager.handleInput(serverPlayer, payload.action());
}
})
).playToServer(
EyeOfStormPrimaryPayload.TYPE,
EyeOfStormPrimaryPayload.STREAM_CODEC,
@@ -203,11 +230,28 @@ public final class AntarchyGravityNetworking {
return;
}
if (!(serverPlayer.getMainHandItem().getItem() instanceof PortalGunItem portalGunItem)) {
ItemStack stack = payload.offhand() ? serverPlayer.getOffhandItem() : serverPlayer.getMainHandItem();
if (!(stack.getItem() instanceof PortalGunItem portalGunItem)) {
return;
}
portalGunItem.firePrimary(serverPlayer.serverLevel(), serverPlayer, serverPlayer.getMainHandItem());
portalGunItem.firePrimary(serverPlayer.serverLevel(), serverPlayer, stack, payload.offhand());
});
}
private static void handlePortalGunGrab(com.craisinlord.antarchy.content.network.PortalGunGrabPayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
if (context.player() instanceof ServerPlayer serverPlayer) {
com.craisinlord.antarchy.content.portalgun.PortalGunGrabManager.toggle(serverPlayer);
}
});
}
private static void handlePortalGunIndicatorRequest(com.craisinlord.antarchy.content.network.PortalGunIndicatorRequestPayload payload, IPayloadContext context) {
context.enqueueWork(() -> {
if (context.player() instanceof ServerPlayer serverPlayer) {
com.craisinlord.antarchy.content.portalgun.PortalGunIndicatorSync.handleRequest(serverPlayer, payload);
}
});
}
@@ -88,29 +88,18 @@ import net.neoforged.neoforge.event.village.VillagerTradesEvent;
import net.neoforged.neoforge.event.village.WandererTradesEvent;
import net.neoforged.neoforge.event.tick.PlayerTickEvent;
import net.neoforged.neoforge.event.tick.ServerTickEvent;
import com.craisinlord.antarchy.content.item.MinersDreamExcavationManager;
import net.neoforged.neoforge.fluids.FluidInteractionRegistry;
import net.neoforged.neoforge.network.PacketDistributor;
public final class AntarchyNeoForgeEvents {
private static final long SERVER_HANG_WARN_NANOS = 5_000_000_000L;
private static final long SERVER_IDLE_BUSY_WARN_NANOS = 30_000_000_000L;
private static final long SERVER_HANG_REPEAT_NANOS = 30_000_000_000L;
private static final double OVERHEAD_INVERSION_WARN_MS = 10.0D;
private static final long OVERHEAD_INVERSION_WARN_INTERVAL_TICKS = 100L;
private static volatile boolean serverHangWatchdogStarted;
private static volatile long serverTickStartNanos;
private static volatile long serverTickEndNanos;
private static volatile long serverHangLastDumpNanos;
private static volatile Thread serverTickThread;
private static long lastOverheadInversionWarnTick = Long.MIN_VALUE / 2L;
private AntarchyNeoForgeEvents() {}
public static void register(IEventBus modEventBus) {
modEventBus.addListener(AntarchyNeoForgeEvents::onCommonSetup);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::beginServerTickWatchdog);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::endServerTickWatchdog);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::onMissileSquidDeath);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::onPermanentPortalSacrifice);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::onLivingBreathe);
@@ -126,6 +115,7 @@ public final class AntarchyNeoForgeEvents {
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleBossMagicBurstMitigation);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleScorpionWhipAttackEntity);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleAttitudeAdjusterAttackEntity);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handlePortalGunAttackEntity);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleScorpionWhipLeftClickBlock);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handlePortalGunLeftClickBlock);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleScorpionWhipRightClickBlock);
@@ -140,7 +130,7 @@ public final class AntarchyNeoForgeEvents {
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickDreadAndIchor);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickScorpionWhips);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickWormHooks);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickMinersDreamExcavations);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickAttitudeAdjusterSlams);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleAntiwaterDamage);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleAntiwaterFall);
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleBloodCrystalBootsFall);
@@ -178,92 +168,6 @@ public final class AntarchyNeoForgeEvents {
NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::onWandererTrades);
}
static void beginServerTickWatchdog(ServerTickEvent.Pre event) {
ensureServerHangWatchdogStarted();
serverTickThread = Thread.currentThread();
serverTickStartNanos = System.nanoTime();
}
static void endServerTickWatchdog(ServerTickEvent.Post event) {
serverTickEndNanos = System.nanoTime();
serverTickStartNanos = 0L;
}
private static synchronized void ensureServerHangWatchdogStarted() {
if (serverHangWatchdogStarted) {
return;
}
serverHangWatchdogStarted = true;
Thread watchdog = new Thread(() -> {
while (true) {
try {
Thread.sleep(2_000L);
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
return;
}
long tickStart = serverTickStartNanos;
long tickEnd = serverTickEndNanos;
Thread tickThread = serverTickThread;
long now = System.nanoTime();
if (tickThread == null || now - serverHangLastDumpNanos < SERVER_HANG_REPEAT_NANOS) {
continue;
}
if (tickStart > 0L && now - tickStart >= SERVER_HANG_WARN_NANOS) {
antarchy$dumpServerThreadWatchdog(
"server thread appears hung",
(now - tickStart) / 1_000_000.0D,
tickThread
);
serverHangLastDumpNanos = now;
continue;
}
Thread.State state = tickThread.getState();
boolean idleBusy = tickStart <= 0L
&& tickEnd > 0L
&& now - tickEnd >= SERVER_IDLE_BUSY_WARN_NANOS
&& state != Thread.State.WAITING
&& state != Thread.State.TIMED_WAITING
&& !antarchy$isServerThreadIdleWait(tickThread);
if (idleBusy) {
antarchy$dumpServerThreadWatchdog(
"server thread busy outside active tick",
(now - tickEnd) / 1_000_000.0D,
tickThread
);
serverHangLastDumpNanos = now;
}
}
}, "Antarchy Server Hang Watchdog");
watchdog.setDaemon(true);
watchdog.start();
}
private static void antarchy$dumpServerThreadWatchdog(String message, double elapsedMs, Thread tickThread) {
Antarchy.LOGGER.error(
"[antarchy-watchdog] {} elapsedMs={} thread={} state={}",
message, elapsedMs, tickThread.getName(), tickThread.getState()
);
for (StackTraceElement element : tickThread.getStackTrace()) {
Antarchy.LOGGER.error("[antarchy-watchdog] at {}", element);
}
}
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() == AntarchyNeoforgeMisc.COMPUTER_SCIENTIST.get()) {
int[] slots = ComputerScientistTradeManager.slotsPerLevel();
@@ -1093,6 +997,13 @@ public final class AntarchyNeoForgeEvents {
AttitudeAdjusterSlamManager.markSpecialHit(player);
}
static void handlePortalGunAttackEntity(AttackEntityEvent event) {
if (event.getEntity().getMainHandItem().getItem() instanceof com.craisinlord.antarchy.content.item.PortalGunItem
|| event.getEntity().getOffhandItem().getItem() instanceof com.craisinlord.antarchy.content.item.PortalGunItem) {
event.setCanceled(true);
}
}
static void handleScorpionWhipLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) {
if (!(event.getEntity() instanceof ServerPlayer player)) {
return;
@@ -1216,10 +1127,9 @@ public final class AntarchyNeoForgeEvents {
}
}
static void tickMinersDreamExcavations(ServerTickEvent.Post event) {
static void tickAttitudeAdjusterSlams(ServerTickEvent.Post event) {
for (ServerLevel level : event.getServer().getAllLevels()) {
AttitudeAdjusterSlamManager.tick(level);
MinersDreamExcavationManager.tick(level);
}
}
@@ -127,6 +127,9 @@ public final class AntarchyNeoforgeSounds {
public static final DeferredHolder<SoundEvent, SoundEvent> PORTAL_OPEN_BLUE = registerSoundEvent("portal_open_blue");
public static final DeferredHolder<SoundEvent, SoundEvent> PORTAL_OPEN_ORANGE = registerSoundEvent("portal_open_orange");
public static final DeferredHolder<SoundEvent, SoundEvent> PORTAL_FIZZLE = registerSoundEvent("portal_fizzle");
public static final DeferredHolder<SoundEvent, SoundEvent> PORTAL_ENTER = registerSoundEvent("portal_enter");
public static final DeferredHolder<SoundEvent, SoundEvent> PORTAL_EXIT = registerSoundEvent("portal_exit");
public static final DeferredHolder<SoundEvent, SoundEvent> PORTAL_AMBIENT = registerSoundEvent("portal_ambient");
public static final DeferredHolder<SoundEvent, SoundEvent> BED_BUG_AMBIENT = registerSoundEvent("bed_bug_ambient");
public static final DeferredHolder<SoundEvent, SoundEvent> BED_BUG_HURT = registerSoundEvent("bed_bug_hurt");
public static final DeferredHolder<SoundEvent, SoundEvent> BED_BUG_ATTACK = registerSoundEvent("bed_bug_attack");
@@ -51,7 +51,7 @@ public class AntarchyNeoforgeSpawnPlacements {
event.register(AntarchyNeoforgeEntites.VORTEX.get(), SpawnPlacementTypes.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.vortex.VortexEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR);
event.register(AntarchyNeoforgeEntites.SCORPION.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ScorpionEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR);
event.register(AntarchyNeoforgeEntites.BASILISK.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BasiliskEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR);
event.register(AntarchyNeoforgeEntites.EMPEROR_SCORPION.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EmperorScorpionEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR);
event.register(AntarchyNeoforgeEntites.EMPEROR_SCORPION.get(), SpawnPlacementTypes.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EmperorScorpionEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR);
event.register(AntarchyNeoforgeEntites.CRAWLING_BLIGHT.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CrawlingBlightEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR);
event.register(AntarchyNeoforgeEntites.SKULKING_FRIGHT.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, SkulkingFrightEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR);
event.register(AntarchyNeoforgeEntites.MANTICORE.get(), SpawnPlacementTypes.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.ManticoreEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR);
@@ -0,0 +1,25 @@
package com.craisinlord.antarchy.neoforge.registry;
import com.craisinlord.antarchy.Antarchy;
import com.craisinlord.antarchy.content.portalgun.PortalGunGrabManager;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.server.ServerStoppingEvent;
import net.neoforged.neoforge.event.tick.ServerTickEvent;
@EventBusSubscriber(modid = Antarchy.MODID)
public final class PortalGunGrabEvents {
private PortalGunGrabEvents() {
}
@SubscribeEvent
public static void onServerTick(ServerTickEvent.Post event) {
PortalGunGrabManager.tick(event.getServer());
}
@SubscribeEvent
public static void onServerStopping(ServerStoppingEvent event) {
PortalGunGrabManager.clear(event.getServer());
com.craisinlord.antarchy.content.portalgun.PortalGunResetManager.clear(event.getServer());
}
}
@@ -17,6 +17,9 @@ displayURL="https://www.curseforge.com/minecraft/mc-mods/antarchy"
[[mixins]]
config = "antarchy-common.mixins.json"
[[mixins]]
config = "antarchy-sodium.mixins.json"
[[mixins]]
config = "antarchy-neoforge.mixins.json"
@@ -68,6 +71,22 @@ modId="antos"
side="BOTH"
reason="Antarchy requires Infinite Dimensions 2.7.3 or newer"
[[dependencies.antarchy]]
modId="apple_cows"
type="incompatible"
versionRange="*"
ordering="NONE"
side="BOTH"
reason="Antarchy already includes Apple Cows. Remove the standalone Apple Cows mod."
[[dependencies.antarchy]]
modId="hoverboards"
type="incompatible"
versionRange="*"
ordering="NONE"
side="BOTH"
reason="Antarchy already includes Hoverboards. Remove the standalone Hoverboards mod."
[[dependencies.antarchy]]
modId="configured"
type="optional"