diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/common/ai/pathing/BlockStatePathingCache.java b/common/src/main/java/net/caffeinemc/mods/lithium/common/ai/pathing/BlockStatePathingCache.java index 436af40bc..35f6f903d 100644 --- a/common/src/main/java/net/caffeinemc/mods/lithium/common/ai/pathing/BlockStatePathingCache.java +++ b/common/src/main/java/net/caffeinemc/mods/lithium/common/ai/pathing/BlockStatePathingCache.java @@ -6,4 +6,6 @@ public interface BlockStatePathingCache { PathType lithium$getPathNodeType(); PathType lithium$getNeighborPathNodeType(); + + void lithium$initializePathNodeTypeCache(); } diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/common/block/BlockStateFlagHolder.java b/common/src/main/java/net/caffeinemc/mods/lithium/common/block/BlockStateFlagHolder.java index a438daecd..e8517b653 100644 --- a/common/src/main/java/net/caffeinemc/mods/lithium/common/block/BlockStateFlagHolder.java +++ b/common/src/main/java/net/caffeinemc/mods/lithium/common/block/BlockStateFlagHolder.java @@ -2,4 +2,6 @@ public interface BlockStateFlagHolder { int lithium$getAllFlags(); + + void lithium$initializeFlags(); } diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/BlockStateBaseMixin.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/BlockStateBaseMixin.java index 67b5d6e12..090615d11 100644 --- a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/BlockStateBaseMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/BlockStateBaseMixin.java @@ -12,18 +12,14 @@ import org.apache.commons.lang3.Validate; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BlockBehaviour.BlockStateBase.class) public abstract class BlockStateBaseMixin implements BlockStatePathingCache { private PathType pathNodeType = null; private PathType pathNodeTypeNeighbor = null; - //TODO fix injection point - @Inject(method = "initCache()V", at = @At("RETURN")) - private void init(CallbackInfo ci) { + @Override + public void lithium$initializePathNodeTypeCache() { // Reset the cached path node types, to ensure they are re-calculated. this.pathNodeType = null; this.pathNodeTypeNeighbor = null; @@ -41,7 +37,9 @@ private void init(CallbackInfo ci) { try { //Passing null as previous node type to the method signals to other lithium mixins that we only want the neighbor behavior of this block and not its neighbors //Using exceptions for control flow, but this way we do not need to copy the code for the cache initialization, reducing required maintenance and improving mod compatibility + //noinspection DataFlowIssue this.pathNodeTypeNeighbor = (WalkNodeEvaluator.checkNeighbourBlocks(new PathfindingContext(singleBlockBlockView, null), 1, 1, 1, null)); + //noinspection ConstantValue if (this.pathNodeTypeNeighbor == null) { this.pathNodeTypeNeighbor = PathType.OPEN; } diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/BootstrapMixin.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/BootstrapMixin.java new file mode 100644 index 000000000..16fdbd9fe --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/BootstrapMixin.java @@ -0,0 +1,23 @@ +package net.caffeinemc.mods.lithium.mixin.ai.pathing; + +import net.caffeinemc.mods.lithium.common.ai.pathing.BlockStatePathingCache; +import net.minecraft.server.Bootstrap; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Bootstrap.class) +public class BootstrapMixin { + @Inject( + method = "bootStrap", + at = @At("RETURN") + ) + private static void afterBootstrap(CallbackInfo ci) { + for (BlockState blockState : Block.BLOCK_STATE_REGISTRY) { + ((BlockStatePathingCache) blockState).lithium$initializePathNodeTypeCache(); + } + } +} diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/package-info.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/package-info.java index 68133b378..8db200259 100644 --- a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/package-info.java +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/pathing/package-info.java @@ -6,7 +6,8 @@ """, depends = @MixinConfigDependency( dependencyPath = "mixin.util.chunk_access" - ), enabled = false // TODO: Broken by 1.21.2 or 1.21.3 Update due to initialization order change. Needs new injection points for cache initialization. + ), + enabled = false // TODO handle data pack tag changes etc. Just injecting into Bootstrap is not enough. ) package net.caffeinemc.mods.lithium.mixin.ai.pathing; diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/BlockStateBaseMixin.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/BlockStateBaseMixin.java index 94a4f41c1..601a7ead1 100644 --- a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/BlockStateBaseMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/BlockStateBaseMixin.java @@ -7,22 +7,14 @@ import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = BlockBehaviour.BlockStateBase.class, priority = 1010) public class BlockStateBaseMixin implements BlockStateFlagHolder { @Unique private int flags; - @Inject(method = "initCache()V", at = @At("RETURN")) - private void init(CallbackInfo ci) { - this.initFlags(); - } - - @Unique - private void initFlags() { + @Override + public void lithium$initializeFlags() { TrackedBlockStatePredicate.FULLY_INITIALIZED.set(true); int flags = 0; diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/BootstrapMixin.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/BootstrapMixin.java new file mode 100644 index 000000000..ea18ba630 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/BootstrapMixin.java @@ -0,0 +1,23 @@ +package net.caffeinemc.mods.lithium.mixin.util.block_tracking; + +import net.caffeinemc.mods.lithium.common.block.BlockStateFlagHolder; +import net.minecraft.server.Bootstrap; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = Bootstrap.class, priority = 1010) +public class BootstrapMixin { + @Inject( + method = "bootStrap", + at = @At("RETURN") + ) + private static void afterBootstrap(CallbackInfo ci) { + for (BlockState blockState : Block.BLOCK_STATE_REGISTRY) { + ((BlockStateFlagHolder) blockState).lithium$initializeFlags(); + } + } +} diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/package-info.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/package-info.java index d200c59ce..2f38620e8 100644 --- a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/package-info.java +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/util/block_tracking/package-info.java @@ -5,7 +5,8 @@ depends = { @MixinConfigDependency(dependencyPath = "mixin.util.data_storage"), @MixinConfigDependency(dependencyPath = "mixin.util.chunk_status_tracking") - }, enabled = false // TODO inject point bad + }, + enabled = false // TODO handle data pack tag changes etc. Just injecting into Bootstrap is not enough. ) package net.caffeinemc.mods.lithium.mixin.util.block_tracking; diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/world/inline_height/package-info.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/world/inline_height/package-info.java index 460abf0d1..8f4f2222f 100644 --- a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/world/inline_height/package-info.java +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/world/inline_height/package-info.java @@ -1,4 +1,7 @@ -@MixinConfigOption(description = "Reduces indirection by inlining world height access methods", enabled = false) //TODO find out why this crashes the render thread +@MixinConfigOption( + description = "Reduces indirection by inlining world height access methods", + enabled = false //TODO find out why this crashes the render thread +) package net.caffeinemc.mods.lithium.mixin.world.inline_height; import net.caffeinemc.gradle.MixinConfigOption; \ No newline at end of file diff --git a/common/src/main/resources/lithium.mixins.json b/common/src/main/resources/lithium.mixins.json index fd03a0092..749487924 100644 --- a/common/src/main/resources/lithium.mixins.json +++ b/common/src/main/resources/lithium.mixins.json @@ -8,6 +8,7 @@ }, "mixins" : [ "ai.pathing.BlockStateBaseMixin", + "ai.pathing.BootstrapMixin", "ai.pathing.FlyNodeEvaluatorMixin", "ai.pathing.PathfindingContextAccessor", "ai.pathing.PathfindingContextMixin", @@ -172,6 +173,7 @@ "util.accessors.ServerLevelAccessor", "util.block_entity_retrieval.LevelMixin", "util.block_tracking.BlockStateBaseMixin", + "util.block_tracking.BootstrapMixin", "util.block_tracking.LevelChunkSectionMixin", "util.chunk_access.LevelReaderMixin", "util.chunk_access.PathNavigationRegionMixin", diff --git a/fabric/src/main/java/net/caffeinemc/mods/lithium/fabric/mixin/compat/transfer_api/package-info.java b/fabric/src/main/java/net/caffeinemc/mods/lithium/fabric/mixin/compat/transfer_api/package-info.java index d418ec317..778048e4a 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/lithium/fabric/mixin/compat/transfer_api/package-info.java +++ b/fabric/src/main/java/net/caffeinemc/mods/lithium/fabric/mixin/compat/transfer_api/package-info.java @@ -1,6 +1,6 @@ @MixinConfigOption( description = "Allow hoppers to check whether a transfer-api inventory is present to avoid sleeping, which would prevent the hopper-inventory interaction. Enabled automatically when the transfer-api is present.", - enabled = false + enabled = false // Enabled automatically when the transfer-api is present ) package net.caffeinemc.mods.lithium.fabric.mixin.compat.transfer_api; diff --git a/fabric/src/main/java/net/caffeinemc/mods/lithium/fabric/mixin/compat/worldedit/package-info.java b/fabric/src/main/java/net/caffeinemc/mods/lithium/fabric/mixin/compat/worldedit/package-info.java index 6229c7b92..a69ea053f 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/lithium/fabric/mixin/compat/worldedit/package-info.java +++ b/fabric/src/main/java/net/caffeinemc/mods/lithium/fabric/mixin/compat/worldedit/package-info.java @@ -2,7 +2,7 @@ description = "Send updates to hoppers when adding inventory block entities to chunks when world edit is loaded. " + "Fixes the issue of hoppers not noticing when inventories are placed using worldedit without any block updates. Enabled automatically when worldedit is present.", depends = @MixinConfigDependency(dependencyPath = "mixin.util.block_entity_retrieval"), - enabled = false + enabled = false // Enabled automatically when worldedit is present ) package net.caffeinemc.mods.lithium.fabric.mixin.compat.worldedit; diff --git a/lithium-fabric-mixin-config.md b/lithium-fabric-mixin-config.md index d257f8480..1129051a8 100644 --- a/lithium-fabric-mixin-config.md +++ b/lithium-fabric-mixin-config.md @@ -152,7 +152,6 @@ Fluid optimizations Fluid flow optimization ### `mixin.block.hopper` - (default: `true`) Reduces hopper lag using caching, notification systems and BlockEntity sleeping Requirements: @@ -317,7 +316,6 @@ Skip checking whether an entity is inside powder snow for movement speed slowdow Access entities faster when accessing a relatively small number of entity sections ### `mixin.entity.inactive_navigations` - (default: `true`) Block updates skip notifying mobs that won't react to the block update anyways Requirements: @@ -449,7 +447,6 @@ Various VoxelShape optimizations Use a faster collection for the full cube test cache ### `mixin.shapes.lazy_shape_context` - (default: `true`) Entity shape contexts initialize rarely used fields only on first use @@ -516,12 +513,10 @@ Requirements: Entity sections store their position ### `mixin.util.inventory_change_listening` - (default: `true`) Certain BlockEntity Inventories emit updates to their listeners when their stack list is changed or the inventory becomes invalid ### `mixin.util.inventory_comparator_tracking` - (default: `true`) BlockEntity Inventories update their listeners when a comparator is placed near them Requirements: @@ -548,7 +543,6 @@ Various BlockEntity ticking optimizations Allows BlockEntities to sleep, meaning they are no longer ticked until woken up, e.g. by updates to their inventory or block state ### `mixin.world.block_entity_ticking.sleeping.brewing_stand` - (default: `true`) BlockEntity sleeping for inactive brewing stands @@ -565,7 +559,6 @@ BlockEntity sleeping for inactive lit campfires BlockEntity sleeping for inactive unlit campfires ### `mixin.world.block_entity_ticking.sleeping.furnace` - (default: `true`) BlockEntity sleeping for inactive furnaces diff --git a/lithium-neoforge-mixin-config.md b/lithium-neoforge-mixin-config.md index 882916d57..8d26b0b7a 100644 --- a/lithium-neoforge-mixin-config.md +++ b/lithium-neoforge-mixin-config.md @@ -152,7 +152,6 @@ Fluid optimizations Fluid flow optimization ### `mixin.block.hopper` - (default: `true`) Reduces hopper lag using caching, notification systems and BlockEntity sleeping Requirements: @@ -300,7 +299,6 @@ Skip checking whether an entity is inside powder snow for movement speed slowdow Access entities faster when accessing a relatively small number of entity sections ### `mixin.entity.inactive_navigations` - (default: `true`) Block updates skip notifying mobs that won't react to the block update anyways Requirements: @@ -426,7 +424,6 @@ Various VoxelShape optimizations Use a faster collection for the full cube test cache ### `mixin.shapes.lazy_shape_context` - (default: `true`) Entity shape contexts initialize rarely used fields only on first use @@ -497,12 +494,10 @@ Requirements: Entity sections store their position ### `mixin.util.inventory_change_listening` - (default: `true`) Certain BlockEntity Inventories emit updates to their listeners when their stack list is changed or the inventory becomes invalid ### `mixin.util.inventory_comparator_tracking` - (default: `true`) BlockEntity Inventories update their listeners when a comparator is placed near them Requirements: @@ -529,7 +524,6 @@ Various BlockEntity ticking optimizations Allows BlockEntities to sleep, meaning they are no longer ticked until woken up, e.g. by updates to their inventory or block state ### `mixin.world.block_entity_ticking.sleeping.brewing_stand` - (default: `true`) BlockEntity sleeping for inactive brewing stands @@ -546,7 +540,6 @@ BlockEntity sleeping for inactive lit campfires BlockEntity sleeping for inactive unlit campfires ### `mixin.world.block_entity_ticking.sleeping.furnace` - (default: `true`) BlockEntity sleeping for inactive furnaces