diff --git a/build.gradle b/build.gradle index 695a38a..a727d40 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,17 @@ group = project.maven_group repositories { mavenLocal() + mavenCentral() + maven { + url 'http://maven.fabricmc.net/' + name 'Fabric' + } + maven { + name = 'JitPack' + url = 'https://jitpack.io' + } + + jcenter() } dependencies { @@ -20,8 +31,14 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" compileOnly "com.google.code.findbugs:jsr305:3.0.2" + modCompileOnly "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modRuntime "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modCompileOnly "me.jellysquid.mods:lithium:0.6.3-SNAPSHOT" modCompileOnly "me.jellysquid.mods:lithium-api:0.6.3-SNAPSHOT" + + modCompileOnly "com.qouteall:imm_ptl_core:0.80" + modCompileOnly "com.qouteall:immersive-portals:0.80" } processResources { diff --git a/gradle.properties b/gradle.properties index fdf687d..e3acb28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,6 +4,9 @@ yarn_mappings = 1.16.5+build.4 loader_version = 0.11.1 # Mod Properties -mod_version = 1.0.0 +mod_version = 1.0.1 maven_group = dev.hephaestus -archives_base_name = FibLib \ No newline at end of file +archives_base_name = FibLib + +# Dependencies +fabric_version = 0.31.0+1.16 \ No newline at end of file diff --git a/src/main/java/dev/hephaestus/fiblib/mixin/CDSMAccessor.java b/src/main/java/dev/hephaestus/fiblib/mixin/CDSMAccessor.java new file mode 100644 index 0000000..fbe7f27 --- /dev/null +++ b/src/main/java/dev/hephaestus/fiblib/mixin/CDSMAccessor.java @@ -0,0 +1,14 @@ +package dev.hephaestus.fiblib.mixin; + +import com.qouteall.immersive_portals.chunk_loading.ChunkDataSyncManager; +import com.qouteall.immersive_portals.chunk_loading.DimensionalChunkPos; +import com.qouteall.immersive_portals.ducks.IEThreadedAnvilChunkStorage; +import net.minecraft.server.network.ServerPlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(ChunkDataSyncManager.class) +public interface CDSMAccessor { + @Invoker + void invokeSendChunkDataPacketNow(ServerPlayerEntity player, DimensionalChunkPos pos, IEThreadedAnvilChunkStorage tacs); +} diff --git a/src/main/java/dev/hephaestus/fiblib/mixin/ChunkReloader.java b/src/main/java/dev/hephaestus/fiblib/mixin/ChunkReloader.java index eeb9595..63aa071 100644 --- a/src/main/java/dev/hephaestus/fiblib/mixin/ChunkReloader.java +++ b/src/main/java/dev/hephaestus/fiblib/mixin/ChunkReloader.java @@ -3,10 +3,14 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ThreadedAnvilChunkStorage; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(ThreadedAnvilChunkStorage.class) public interface ChunkReloader { @Invoker("handlePlayerAddedOrRemoved") void reloadChunks(ServerPlayerEntity playerEntity, boolean added); + + @Accessor + int getWatchDistance(); } diff --git a/src/main/java/dev/hephaestus/fiblib/mixin/MixinMinecraftServer.java b/src/main/java/dev/hephaestus/fiblib/mixin/MixinMinecraftServer.java index 1f5015c..85c22c6 100644 --- a/src/main/java/dev/hephaestus/fiblib/mixin/MixinMinecraftServer.java +++ b/src/main/java/dev/hephaestus/fiblib/mixin/MixinMinecraftServer.java @@ -3,9 +3,13 @@ import com.mojang.authlib.GameProfileRepository; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.datafixers.DataFixer; +import com.qouteall.immersive_portals.Global; +import com.qouteall.immersive_portals.chunk_loading.DimensionalChunkPos; +import com.qouteall.immersive_portals.ducks.IEThreadedAnvilChunkStorage; import dev.hephaestus.fiblib.api.BlockFib; -import dev.hephaestus.fiblib.impl.LookupTable; import dev.hephaestus.fiblib.api.BlockFibRegistry; +import dev.hephaestus.fiblib.impl.LookupTable; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.BlockState; import net.minecraft.resource.DataPackSettings; import net.minecraft.resource.ResourcePackManager; @@ -16,6 +20,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ThreadedAnvilChunkStorage; import net.minecraft.util.UserCache; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.profiler.Profiler; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.SaveProperties; @@ -79,7 +84,28 @@ public void tickFibber(BooleanSupplier shouldKeepTicking, CallbackInfo ci) { ThreadedAnvilChunkStorage TACS = ((TACSAccessor) player.getServerWorld().getChunkManager()) .getThreadedAnvilChunkStorage(); - ((ChunkReloader) TACS).reloadChunks(player, true); + + if (FabricLoader.getInstance().isModLoaded("immersive_portals")) { + CDSMAccessor cdsm = (CDSMAccessor) Global.chunkDataSyncManager; + + + double scale = player.world.getDimension().getCoordinateScale(); + int i = MathHelper.floor(player.getX() * scale) >> 4; + int j = MathHelper.floor(player.getZ() * scale) >> 4; + int watchDistance = ((ChunkReloader) TACS).getWatchDistance(); + + + + for(int k = i - watchDistance; k <= i + watchDistance; ++k) { + for(int l = j - watchDistance; l <= j + watchDistance; ++l) { + DimensionalChunkPos chunkPos = new DimensionalChunkPos(player.world.getRegistryKey(), k, l); + cdsm.invokeSendChunkDataPacketNow(player, chunkPos, (IEThreadedAnvilChunkStorage) TACS); + } + } + } else { + + ((ChunkReloader) TACS).reloadChunks(player, true); + } } updated.clear(); diff --git a/src/main/java/dev/hephaestus/fiblib/mixin/VolatileMixinPlugin.java b/src/main/java/dev/hephaestus/fiblib/mixin/VolatileMixinPlugin.java index 843602e..7dc461d 100644 --- a/src/main/java/dev/hephaestus/fiblib/mixin/VolatileMixinPlugin.java +++ b/src/main/java/dev/hephaestus/fiblib/mixin/VolatileMixinPlugin.java @@ -20,8 +20,15 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + FabricLoader loader = FabricLoader.getInstance(); if (targetClassName.startsWith("me.jellysquid.mods.lithium")) { - return FabricLoader.getInstance().isModLoaded("lithium"); + return loader.isModLoaded("lithium"); + } + + if (loader.isModLoaded("immersive_portals")) { + return !mixinClassName.endsWith("MixinThreadedAnvilChunkStorage"); + } else if (mixinClassName.startsWith("com.qouteall")) { + return false; } return true; diff --git a/src/main/java/dev/hephaestus/fiblib/mixin/packets/chunkdata/MixinChunkDataSyncManager.java b/src/main/java/dev/hephaestus/fiblib/mixin/packets/chunkdata/MixinChunkDataSyncManager.java new file mode 100644 index 0000000..34af2b0 --- /dev/null +++ b/src/main/java/dev/hephaestus/fiblib/mixin/packets/chunkdata/MixinChunkDataSyncManager.java @@ -0,0 +1,19 @@ +package dev.hephaestus.fiblib.mixin.packets.chunkdata; + +import com.qouteall.immersive_portals.chunk_loading.ChunkDataSyncManager; +import com.qouteall.immersive_portals.chunk_loading.DimensionalChunkPos; +import com.qouteall.immersive_portals.ducks.IEThreadedAnvilChunkStorage; +import dev.hephaestus.fiblib.impl.FibLib; +import net.minecraft.server.network.ServerPlayerEntity; +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 = ChunkDataSyncManager.class, remap = false) +public class MixinChunkDataSyncManager { + @Inject(method = "sendChunkDataPacketNow", at = @At("HEAD")) + private void setPlayer(ServerPlayerEntity player, DimensionalChunkPos chunkPos, IEThreadedAnvilChunkStorage ieStorage, CallbackInfo ci) { + FibLib.PLAYER.set(player); + } +} diff --git a/src/main/resources/fiblib.mixins.json b/src/main/resources/fiblib.mixins.json index d6f3693..bb4232e 100644 --- a/src/main/resources/fiblib.mixins.json +++ b/src/main/resources/fiblib.mixins.json @@ -5,8 +5,9 @@ "plugin": "dev.hephaestus.fiblib.mixin.VolatileMixinPlugin", "compatibilityLevel": "JAVA_8", "mixins": [ - "MixinMinecraftServer", + "CDSMAccessor", "ChunkReloader", + "MixinMinecraftServer", "MixinServerPlayNetworkHandler", "TACSAccessor", "packets.MixinBlockUpdateS2CPacket", @@ -14,6 +15,7 @@ "packets.chunkdata.MixinArrayPalette", "packets.chunkdata.MixinBiMapPalette", "packets.chunkdata.MixinChunkDataS2CPacket", + "packets.chunkdata.MixinChunkDataSyncManager", "packets.chunkdata.MixinChunkDeltaUpdateS2CPacket", "packets.chunkdata.MixinChunkHolder", "packets.chunkdata.MixinChunkSection",