From 5c4e18ead112ad60282b0f4789ccaa3c8e66f6eb Mon Sep 17 00:00:00 2001 From: 2No2Name <50278648+2No2Name@users.noreply.github.com> Date: Sat, 5 Feb 2022 22:42:50 +0000 Subject: [PATCH] new: creativePlayersLoadChunks carpet rule (#1314) enabled by default: behavior like vanilla disabled: creative players do not load chunks like spectators with gamerule spectatorsGenerateChunks false --- src/main/java/carpet/CarpetSettings.java | 9 ++++++++ ...unkMap_creativePlayersLoadChunksMixin.java | 21 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 3 ++- 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/main/java/carpet/mixins/ChunkMap_creativePlayersLoadChunksMixin.java diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index f01da85c..863a7a8b 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -1092,4 +1092,13 @@ public class CarpetSettings return "Cannot be negative, can be true, false, or # > 0"; } } + + @Rule( + desc = "Creative players load chunks, or they don't! Just like spectators!", + extra = {"Toggling behaves exactly as if the player is in spectator mode and toggling the gamerule spectatorsGenerateChunks." + }, + category = {CREATIVE, FEATURE} + ) + public static boolean creativePlayersLoadChunks = true; + } diff --git a/src/main/java/carpet/mixins/ChunkMap_creativePlayersLoadChunksMixin.java b/src/main/java/carpet/mixins/ChunkMap_creativePlayersLoadChunksMixin.java new file mode 100644 index 00000000..1f046bf0 --- /dev/null +++ b/src/main/java/carpet/mixins/ChunkMap_creativePlayersLoadChunksMixin.java @@ -0,0 +1,21 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerPlayer; +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.CallbackInfoReturnable; + +@Mixin(ChunkMap.class) +public class ChunkMap_creativePlayersLoadChunksMixin { + + @Inject(method = "skipPlayer(Lnet/minecraft/server/level/ServerPlayer;)Z", at = @At("HEAD"), cancellable = true) + private void startProfilerSection(ServerPlayer serverPlayer, CallbackInfoReturnable cir) + { + if (!CarpetSettings.creativePlayersLoadChunks && serverPlayer.isCreative()) { + cir.setReturnValue(true); + } + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 727039c7..14cdce31 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -190,7 +190,8 @@ "LivingEntity_creativeFlyMixin", "Level_updateSuppressionCrashFixMixin", "MinecraftServer_updateSuppressionCrashFixMixin", - "ServerPlayer_updateSuppressionCrashFixMixin" + "ServerPlayer_updateSuppressionCrashFixMixin", + "ChunkMap_creativePlayersLoadChunksMixin" ], "client": [ "Timer_tickSpeedMixin",