diff --git a/common/src/main/resources/valkyrienskies-common.mixins.json b/common/src/main/resources/valkyrienskies-common.mixins.json index 43e69db8f..3260c9970 100644 --- a/common/src/main/resources/valkyrienskies-common.mixins.json +++ b/common/src/main/resources/valkyrienskies-common.mixins.json @@ -44,7 +44,6 @@ "feature.shipyard_entities.MixinEntity", "feature.shipyard_entities.MixinEntitySection", "feature.shipyard_entities.MixinEntitySectionStorage", - "feature.shipyard_entities.MixinPersistentEntitySectionManager", "feature.shipyard_entities.MixinServerLevel", "feature.shipyard_entities.MixinTransientEntitySectionManager", "feature.spawn_player_on_ship.MixinServerGamePacketListenerImpl", diff --git a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java similarity index 88% rename from common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java rename to fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java index b0fca76da..3a98256bb 100644 --- a/common/src/main/java/org/valkyrienskies/mod/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java +++ b/fabric/src/main/java/org/valkyrienskies/mod/fabric/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java @@ -1,5 +1,6 @@ -package org.valkyrienskies.mod.mixin.feature.shipyard_entities; +package org.valkyrienskies.mod.fabric.mixin.feature.shipyard_entities; +import java.util.function.LongPredicate; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.entity.EntitySectionStorage; @@ -42,8 +43,9 @@ public void setLevel(final Level level) { value = "INVOKE" ) ) - private java.util.function.LongPredicate processUnloads_catchException( - final java.util.function.LongPredicate par1) { + private LongPredicate processUnloads_catchException( + final LongPredicate par1 + ) { return (l) -> { try { return par1.test(l); diff --git a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json index 8a8fdc95e..19ec9ef6f 100644 --- a/fabric/src/main/resources/valkyrienskies-fabric.mixins.json +++ b/fabric/src/main/resources/valkyrienskies-fabric.mixins.json @@ -14,6 +14,7 @@ "compat.create.client.MixinTrackBlockOutline", "compat.sodium.MixinRenderSectionManager", "feature.explosions.ClipContextMixin", + "feature.shipyard_entities.MixinPersistentEntitySectionManager", "world.level.block.FireMixin" ], "client": [ diff --git a/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java new file mode 100644 index 000000000..bda6225c3 --- /dev/null +++ b/forge/src/main/java/org/valkyrienskies/mod/forge/mixin/feature/shipyard_entities/MixinPersistentEntitySectionManager.java @@ -0,0 +1,58 @@ +package org.valkyrienskies.mod.forge.mixin.feature.shipyard_entities; + +import it.unimi.dsi.fastutil.longs.LongPredicate; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.entity.EntitySectionStorage; +import net.minecraft.world.level.entity.PersistentEntitySectionManager; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.valkyrienskies.mod.mixinducks.world.OfLevel; + +@Mixin(PersistentEntitySectionManager.class) +public abstract class MixinPersistentEntitySectionManager implements OfLevel { + @Shadow + @Final + EntitySectionStorage sectionStorage; + + @Unique + private Level valkyrienskies$level; + + @Override + public Level getLevel() { + return valkyrienskies$level; + } + + @Override + public void setLevel(final Level level) { + this.valkyrienskies$level = level; + ((OfLevel) this.sectionStorage).setLevel(level); + } + + /** + * This fixes this function randomly crashing. I'm not sure why but the removeIf() function is buggy + */ + @ModifyArg( + method = "processUnloads", + at = @At( + target = "Lit/unimi/dsi/fastutil/longs/LongSet;removeIf(Lit/unimi/dsi/fastutil/longs/LongPredicate;)Z", + value = "INVOKE" + ) + ) + private LongPredicate processUnloads_catchException( + final LongPredicate par1 + ) { + return (l) -> { + try { + return par1.test(l); + } catch (final Exception e) { + e.printStackTrace(); + return false; + } + }; + } +} diff --git a/forge/src/main/resources/valkyrienskies-forge.mixins.json b/forge/src/main/resources/valkyrienskies-forge.mixins.json index a09fd8411..76bf8fb5d 100644 --- a/forge/src/main/resources/valkyrienskies-forge.mixins.json +++ b/forge/src/main/resources/valkyrienskies-forge.mixins.json @@ -18,6 +18,7 @@ "compat.thermalexpansion.MixinTileCoFH", "compat.tis3d.MixinInfraredPacketEntity", "feature.forge_interact.MixinIForgePlayer", + "feature.shipyard_entities.MixinPersistentEntitySectionManager", "world.level.block.FireMixin" ], "client": [