diff --git a/gradle.properties b/gradle.properties index c5188392a9e..9262e645e0f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,10 +13,10 @@ artifact_basename=appliedenergistics2-neoforge # Minecraft Versions # ######################################################### minecraft_release=1.20 -minecraft_version=1.20.5 -minecraft_version_range=1.20.5 -neoforge_version=20.5.0-beta -neoforge_version_range=[20.5.0-beta,) +minecraft_version=1.20.6 +minecraft_version_range=1.20.6 +neoforge_version=20.6.1-beta +neoforge_version_range=[20.6.1-beta,) ######################################################### # Parchment # diff --git a/src/main/java/appeng/api/behaviors/FluidContainerItemStrategy.java b/src/main/java/appeng/api/behaviors/FluidContainerItemStrategy.java index 2927735b9e4..0eca9b5c1b5 100644 --- a/src/main/java/appeng/api/behaviors/FluidContainerItemStrategy.java +++ b/src/main/java/appeng/api/behaviors/FluidContainerItemStrategy.java @@ -8,7 +8,6 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.capabilities.Capabilities; -import net.neoforged.neoforge.items.ItemHandlerHelper; import appeng.api.config.Actionable; import appeng.api.stacks.AEFluidKey; @@ -43,7 +42,7 @@ class FluidContainerItemStrategy @Override public long extract(Context context, AEFluidKey what, long amount, Actionable mode) { var stack = context.getStack(); - var copy = ItemHandlerHelper.copyStackWithSize(stack, 1); + var copy = stack.copyWithCount(1); var fluidHandler = copy.getCapability(Capabilities.FluidHandler.ITEM); if (fluidHandler == null) { return 0; @@ -60,7 +59,7 @@ public long extract(Context context, AEFluidKey what, long amount, Actionable mo @Override public long insert(Context context, AEFluidKey what, long amount, Actionable mode) { var stack = context.getStack(); - var copy = ItemHandlerHelper.copyStackWithSize(stack, 1); + var copy = stack.copyWithCount(1); var fluidHandler = copy.getCapability(Capabilities.FluidHandler.ITEM); if (fluidHandler == null) { return 0; diff --git a/src/main/java/appeng/blockentity/misc/VibrationChamberBlockEntity.java b/src/main/java/appeng/blockentity/misc/VibrationChamberBlockEntity.java index cf4e789228b..ba52e23617f 100644 --- a/src/main/java/appeng/blockentity/misc/VibrationChamberBlockEntity.java +++ b/src/main/java/appeng/blockentity/misc/VibrationChamberBlockEntity.java @@ -34,7 +34,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.common.CommonHooks; import appeng.api.config.Actionable; import appeng.api.inventories.ISegmentedInventory; @@ -309,7 +308,7 @@ private void eatFuel() { } public static int getBurnTime(ItemStack is) { - return CommonHooks.getBurnTime(is, null); + return is.getBurnTime(null); } public static boolean hasBurnTime(ItemStack is) { diff --git a/src/main/java/appeng/client/guidebook/Guide.java b/src/main/java/appeng/client/guidebook/Guide.java index cb0383bb5b3..f9d559ba348 100644 --- a/src/main/java/appeng/client/guidebook/Guide.java +++ b/src/main/java/appeng/client/guidebook/Guide.java @@ -42,10 +42,10 @@ import net.minecraft.world.level.validation.DirectoryValidator; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.RegisterClientReloadListenersEvent; import net.neoforged.neoforge.client.event.ScreenEvent; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.TickEvent; import appeng.client.guidebook.compiler.PageCompiler; import appeng.client.guidebook.compiler.ParsedGuidePage; @@ -345,12 +345,10 @@ public String getName() { private void watchDevelopmentSources() { var watcher = new GuideSourceWatcher(developmentSourceNamespace, developmentSourceFolder); - NeoForge.EVENT_BUS.addListener((TickEvent.ClientTickEvent evt) -> { - if (evt.phase == TickEvent.Phase.START) { - var changes = watcher.takeChanges(); - if (!changes.isEmpty()) { - applyChanges(changes); - } + NeoForge.EVENT_BUS.addListener((ClientTickEvent.Pre evt) -> { + var changes = watcher.takeChanges(); + if (!changes.isEmpty()) { + applyChanges(changes); } }); Runtime.getRuntime().addShutdownHook(new Thread(watcher::close)); diff --git a/src/main/java/appeng/client/guidebook/hotkey/OpenGuideHotkey.java b/src/main/java/appeng/client/guidebook/hotkey/OpenGuideHotkey.java index bceb514b3e6..f30170dff99 100644 --- a/src/main/java/appeng/client/guidebook/hotkey/OpenGuideHotkey.java +++ b/src/main/java/appeng/client/guidebook/hotkey/OpenGuideHotkey.java @@ -17,9 +17,9 @@ import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.settings.KeyConflictContext; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; import appeng.client.guidebook.GuidebookText; @@ -59,7 +59,7 @@ public static void init() { if (AEConfig.instance().isGuideHotkeyEnabled()) { NeoForge.EVENT_BUS.addListener( (ItemTooltipEvent evt) -> handleTooltip(evt.getItemStack(), evt.getFlags(), evt.getToolTip())); - NeoForge.EVENT_BUS.addListener((TickEvent.ClientTickEvent evt) -> newTick = true); + NeoForge.EVENT_BUS.addListener((ClientTickEvent.Post evt) -> newTick = true); } else { LOG.info("AE2 guide hotkey is disabled via config."); } diff --git a/src/main/java/appeng/core/AppEngClient.java b/src/main/java/appeng/core/AppEngClient.java index eea4654c127..6a2df455b35 100644 --- a/src/main/java/appeng/core/AppEngClient.java +++ b/src/main/java/appeng/core/AppEngClient.java @@ -44,6 +44,7 @@ import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; +import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.InputEvent; import net.neoforged.neoforge.client.event.ModelEvent; @@ -56,7 +57,6 @@ import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; import net.neoforged.neoforge.client.settings.KeyConflictContext; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.event.server.ServerStartingEvent; import net.neoforged.neoforge.network.PacketDistributor; @@ -156,10 +156,8 @@ public AppEngClient(IEventBus modEventBus) { guide = createGuide(modEventBus); OpenGuideHotkey.init(); - NeoForge.EVENT_BUS.addListener(EventPriority.LOWEST, (TickEvent.ClientTickEvent e) -> { - if (e.phase == TickEvent.Phase.START) { - updateCableRenderMode(); - } + NeoForge.EVENT_BUS.addListener(EventPriority.LOWEST, (ClientTickEvent.Pre e) -> { + updateCableRenderMode(); }); modEventBus.addListener(this::clientSetup); @@ -171,11 +169,9 @@ public AppEngClient(IEventBus modEventBus) { PinnedKeys.clearPinnedKeys(); }); - NeoForge.EVENT_BUS.addListener((TickEvent.ClientTickEvent e) -> { - if (e.phase == TickEvent.Phase.END) { - tickPinnedKeys(Minecraft.getInstance()); - Hotkeys.checkHotkeys(); - } + NeoForge.EVENT_BUS.addListener((ClientTickEvent.Post e) -> { + tickPinnedKeys(Minecraft.getInstance()); + Hotkeys.checkHotkeys(); }); } diff --git a/src/main/java/appeng/core/definitions/AEBlocks.java b/src/main/java/appeng/core/definitions/AEBlocks.java index fcfe7a9ea3a..92e8c87716d 100644 --- a/src/main/java/appeng/core/definitions/AEBlocks.java +++ b/src/main/java/appeng/core/definitions/AEBlocks.java @@ -202,17 +202,17 @@ private static BlockDefinition craftingBlock(String english public static final BlockDefinition LIGHT_DETECTOR = block("Light Detecting Fixture", AEBlockIds.LIGHT_DETECTOR, LightDetectorBlock::new); public static final BlockDefinition PAINT = block("Paint", AEBlockIds.PAINT, PaintSplotchesBlock::new); - public static final BlockDefinition SKY_STONE_STAIRS = block("Sky Stone Stairs", AEBlockIds.SKY_STONE_STAIRS, () -> new StairBlock(SKY_STONE_BLOCK.block()::defaultBlockState, SKYSTONE_PROPERTIES)); - public static final BlockDefinition SMOOTH_SKY_STONE_STAIRS = block("Sky Stone Block Stairs", AEBlockIds.SMOOTH_SKY_STONE_STAIRS, () -> new StairBlock(SMOOTH_SKY_STONE_BLOCK.block()::defaultBlockState, SKYSTONE_PROPERTIES)); - public static final BlockDefinition SKY_STONE_BRICK_STAIRS = block("Sky Stone Brick Stairs", AEBlockIds.SKY_STONE_BRICK_STAIRS, () -> new StairBlock(SKY_STONE_BRICK.block()::defaultBlockState, SKYSTONE_PROPERTIES)); - public static final BlockDefinition SKY_STONE_SMALL_BRICK_STAIRS = block("Sky Stone Small Brick Stairs", AEBlockIds.SKY_STONE_SMALL_BRICK_STAIRS, () -> new StairBlock(SKY_STONE_SMALL_BRICK.block()::defaultBlockState, SKYSTONE_PROPERTIES)); - public static final BlockDefinition FLUIX_STAIRS = block("Fluix Stairs", AEBlockIds.FLUIX_STAIRS, () -> new StairBlock(FLUIX_BLOCK.block()::defaultBlockState, QUARTZ_PROPERTIES)); - public static final BlockDefinition QUARTZ_STAIRS = block("Certus Quartz Stairs", AEBlockIds.QUARTZ_STAIRS, () -> new StairBlock(QUARTZ_BLOCK.block()::defaultBlockState, QUARTZ_PROPERTIES)); + public static final BlockDefinition SKY_STONE_STAIRS = block("Sky Stone Stairs", AEBlockIds.SKY_STONE_STAIRS, () -> new StairBlock(SKY_STONE_BLOCK.block().defaultBlockState(), SKYSTONE_PROPERTIES)); + public static final BlockDefinition SMOOTH_SKY_STONE_STAIRS = block("Sky Stone Block Stairs", AEBlockIds.SMOOTH_SKY_STONE_STAIRS, () -> new StairBlock(SMOOTH_SKY_STONE_BLOCK.block().defaultBlockState(), SKYSTONE_PROPERTIES)); + public static final BlockDefinition SKY_STONE_BRICK_STAIRS = block("Sky Stone Brick Stairs", AEBlockIds.SKY_STONE_BRICK_STAIRS, () -> new StairBlock(SKY_STONE_BRICK.block().defaultBlockState(), SKYSTONE_PROPERTIES)); + public static final BlockDefinition SKY_STONE_SMALL_BRICK_STAIRS = block("Sky Stone Small Brick Stairs", AEBlockIds.SKY_STONE_SMALL_BRICK_STAIRS, () -> new StairBlock(SKY_STONE_SMALL_BRICK.block().defaultBlockState(), SKYSTONE_PROPERTIES)); + public static final BlockDefinition FLUIX_STAIRS = block("Fluix Stairs", AEBlockIds.FLUIX_STAIRS, () -> new StairBlock(FLUIX_BLOCK.block().defaultBlockState(), QUARTZ_PROPERTIES)); + public static final BlockDefinition QUARTZ_STAIRS = block("Certus Quartz Stairs", AEBlockIds.QUARTZ_STAIRS, () -> new StairBlock(QUARTZ_BLOCK.block().defaultBlockState(), QUARTZ_PROPERTIES)); public static final BlockDefinition CUT_QUARTZ_STAIRS = block("Cut Certus Quartz Stairs", AEBlockIds.CUT_QUARTZ_STAIRS, () -> new StairBlock(CUT_QUARTZ_BLOCK.block().defaultBlockState(), QUARTZ_PROPERTIES)); public static final BlockDefinition SMOOTH_QUARTZ_STAIRS = block("Smooth Certus Quartz Stairs", AEBlockIds.SMOOTH_QUARTZ_STAIRS, () -> new StairBlock(SMOOTH_QUARTZ_BLOCK.block().defaultBlockState(), QUARTZ_PROPERTIES)); public static final BlockDefinition QUARTZ_BRICK_STAIRS = block("Certus Quartz Brick Stairs", AEBlockIds.QUARTZ_BRICK_STAIRS, () -> new StairBlock(QUARTZ_BRICKS.block().defaultBlockState(), QUARTZ_PROPERTIES)); - public static final BlockDefinition CHISELED_QUARTZ_STAIRS = block("Chiseled Certus Quartz Stairs", AEBlockIds.CHISELED_QUARTZ_STAIRS, () -> new StairBlock(CHISELED_QUARTZ_BLOCK.block()::defaultBlockState, QUARTZ_PROPERTIES)); - public static final BlockDefinition QUARTZ_PILLAR_STAIRS = block("Certus Quartz Pillar Stairs", AEBlockIds.QUARTZ_PILLAR_STAIRS, () -> new StairBlock(QUARTZ_PILLAR.block()::defaultBlockState, QUARTZ_PROPERTIES)); + public static final BlockDefinition CHISELED_QUARTZ_STAIRS = block("Chiseled Certus Quartz Stairs", AEBlockIds.CHISELED_QUARTZ_STAIRS, () -> new StairBlock(CHISELED_QUARTZ_BLOCK.block().defaultBlockState(), QUARTZ_PROPERTIES)); + public static final BlockDefinition QUARTZ_PILLAR_STAIRS = block("Certus Quartz Pillar Stairs", AEBlockIds.QUARTZ_PILLAR_STAIRS, () -> new StairBlock(QUARTZ_PILLAR.block().defaultBlockState(), QUARTZ_PROPERTIES)); public static final BlockDefinition SKY_STONE_WALL = block("Sky Stone Wall", AEBlockIds.SKY_STONE_WALL, () -> new WallBlock(SKYSTONE_PROPERTIES)); public static final BlockDefinition SMOOTH_SKY_STONE_WALL = block("Sky Stone Block Wall", AEBlockIds.SMOOTH_SKY_STONE_WALL, () -> new WallBlock(SKYSTONE_PROPERTIES)); diff --git a/src/main/java/appeng/hooks/ticking/TickHandler.java b/src/main/java/appeng/hooks/ticking/TickHandler.java index d0727674303..be0f5e978bf 100644 --- a/src/main/java/appeng/hooks/ticking/TickHandler.java +++ b/src/main/java/appeng/hooks/ticking/TickHandler.java @@ -45,13 +45,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.bus.api.EventPriority; -import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.TickEvent.LevelTickEvent; -import net.neoforged.neoforge.event.TickEvent.Phase; -import net.neoforged.neoforge.event.TickEvent.ServerTickEvent; import net.neoforged.neoforge.event.level.ChunkEvent; import net.neoforged.neoforge.event.level.LevelEvent; +import net.neoforged.neoforge.event.tick.LevelTickEvent; +import net.neoforged.neoforge.event.tick.ServerTickEvent; import appeng.blockentity.AEBaseBlockEntity; import appeng.core.AEConfig; @@ -96,8 +94,10 @@ private TickHandler() { } public void init() { - NeoForge.EVENT_BUS.addListener(this::onServerTick); - NeoForge.EVENT_BUS.addListener(this::onLevelTick); + NeoForge.EVENT_BUS.addListener(this::onServerTickStart); + NeoForge.EVENT_BUS.addListener(this::onServerTickEnd); + NeoForge.EVENT_BUS.addListener(this::onServerLevelTickStart); + NeoForge.EVENT_BUS.addListener(this::onServerLevelTickEnd); NeoForge.EVENT_BUS.addListener(this::onUnloadChunk); // Try to go last for level unloads since we use it to clean-up state NeoForge.EVENT_BUS.addListener(EventPriority.LOWEST, this::onUnloadLevel); @@ -113,7 +113,7 @@ public void addCallable(LevelAccessor level, Runnable c) { * Callbacks on the client are not support. *

* Using null as level will queue it into the global {@link ServerTickEvent}, otherwise it will be ticked with the - * corresponding {@link WorldTickEvent}. + * corresponding {@link LevelTickEvent}. * * @param level null or the specific {@link Level} * @param c the callback @@ -229,28 +229,10 @@ public void onUnloadLevel(final LevelEvent.Unload ev) { this.callQueue.remove(level); } - /** - * Tick a single {@link Level} - *

- * This can happen multiple times per level, but each level should only be ticked once per minecraft tick. - */ - public void onLevelTick(final LevelTickEvent ev) { - var level = ev.level; - - if (!(level instanceof ServerLevel serverLevel) || ev.side != LogicalSide.SERVER) { - // While forge doesn't generate this event for client worlds, - // the event is generic enough that some other mod might be insane enough to do so. + private void onServerLevelTickStart(LevelTickEvent.Pre event) { + if (!(event.getLevel() instanceof ServerLevel level)) { return; } - - if (ev.phase == Phase.START) { - onServerLevelTickStart(serverLevel); - } else if (ev.phase == Phase.END) { - onServerLevelTickEnd(serverLevel); - } - } - - private void onServerLevelTickStart(ServerLevel level) { var queue = this.callQueue.remove(level); processQueueElementsRemaining += this.processQueue(queue, level); var newQueue = this.callQueue.put(level, queue); @@ -273,7 +255,10 @@ private void onServerLevelTickStart(ServerLevel level) { } } - private void onServerLevelTickEnd(ServerLevel level) { + private void onServerLevelTickEnd(LevelTickEvent.Post event) { + if (!(event.getLevel() instanceof ServerLevel level)) { + return; + } this.simulateCraftingJobs(level); this.readyBlockEntities(level); @@ -290,18 +275,7 @@ private void onServerLevelTickEnd(ServerLevel level) { } } - /** - * Tick everything related to the global server tick once per minecraft tick. - */ - public void onServerTick(final ServerTickEvent ev) { - if (ev.phase == Phase.START) { - onServerTickStart(); - } else if (ev.phase == Phase.END) { - onServerTickEnd(); - } - } - - private void onServerTickStart() { + private void onServerTickStart(ServerTickEvent.Pre event) { // Reset the stop watch on the start of each server tick. this.processQueueElementsProcessed = 0; this.processQueueElementsRemaining = 0; @@ -319,7 +293,7 @@ private void onServerTickStart() { } } - private void onServerTickEnd() { + private void onServerTickEnd(ServerTickEvent.Post event) { // tick networks for (var g : this.grids.getNetworks()) { try { diff --git a/src/main/java/appeng/server/testplots/P2PTestPlots.java b/src/main/java/appeng/server/testplots/P2PTestPlots.java index 32dbd582160..b4ebaf60a09 100644 --- a/src/main/java/appeng/server/testplots/P2PTestPlots.java +++ b/src/main/java/appeng/server/testplots/P2PTestPlots.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Fluids; -import net.neoforged.neoforge.fluids.FluidStack; import appeng.blockentity.networking.EnergyCellBlockEntity; import appeng.blockentity.storage.SkyStoneTankBlockEntity; @@ -89,7 +88,7 @@ public static void fluid(PlotBuilder plot) { var tank = (SkyStoneTankBlockEntity) helper.getBlockEntity(outputPos); var storage = tank.getTank(); helper.check( - new FluidStack(Fluids.WATER, 1).isFluidEqual(storage.getFluid()), + storage.getFluid().is(Fluids.WATER), "No water stored"); helper.check( storage.getFluidAmount() > 0, diff --git a/src/main/java/appeng/siteexport/SiteExporter.java b/src/main/java/appeng/siteexport/SiteExporter.java index 804535eaee6..30cde3b6c46 100644 --- a/src/main/java/appeng/siteexport/SiteExporter.java +++ b/src/main/java/appeng/siteexport/SiteExporter.java @@ -56,9 +56,9 @@ import net.minecraft.world.level.material.Fluids; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.fluids.FluidStack; import appeng.api.features.P2PTunnelAttunement; @@ -129,22 +129,20 @@ public static void initialize() { if (Boolean.getBoolean("appeng.runGuideExportAndExit")) { Path outputFolder = Paths.get(System.getProperty("appeng.guideExportFolder")); - NeoForge.EVENT_BUS.addListener((TickEvent.ClientTickEvent evt) -> { - if (evt.phase == TickEvent.Phase.END) { - var client = Minecraft.getInstance(); - if (client.getOverlay() instanceof LoadingOverlay) { - return; // Do nothing while it's loading - } - - var guide = AppEngClient.instance().getGuide(); - try { - export(client, outputFolder, guide); - } catch (Exception e) { - e.printStackTrace(); - System.exit(1); - } - System.exit(0); + NeoForge.EVENT_BUS.addListener((ClientTickEvent.Post evt) -> { + var client = Minecraft.getInstance(); + if (client.getOverlay() instanceof LoadingOverlay) { + return; // Do nothing while it's loading } + + var guide = AppEngClient.instance().getGuide(); + try { + export(client, outputFolder, guide); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + System.exit(0); }); } }