Skip to content

Commit 7975795

Browse files
authored
Merge pull request #3 from MinceraftMC/feat/1.21.7
1.21.6/1.21.7 support
2 parents 129badc + 16cbae6 commit 7975795

27 files changed

+1431
-13
lines changed

README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ The screenshot below was taken at `0 2250 0` in the end dimension with a view di
3838

3939
| Minecraft Version | Paper | Fabric |
4040
|-------------------|-------|--------|
41+
| 1.21.7 |||
42+
| 1.21.6 |||
4143
| 1.21.5 |||
4244
| 1.21.4 |||
4345
| 1.21.3 |||
@@ -73,9 +75,11 @@ On the first start, this plugin will automatically create a configuration file.
7375
- `cache-duration`: The cache duration for how long extended chunks should be kept in memory (default: `PT5M`,
7476
5 minutes)
7577
- `anti-xray`:
76-
- `enabled`: Whether anti-xray will be enabled or disabled in this world (default: `false`)
77-
- `engine-mode`: Engine modes of anti-xray, either `HIDE`, `OBFUSCATE`, or `OBFUSCATE_LAYER` (default: `HIDE`)
78-
- `hidden-blocks`: The list of blocks to hide/obfuscate (default: all ores and all base blocks of dimensions)
78+
- `enabled`: Whether anti-xray will be enabled or disabled in this world (default: `false`)
79+
- `engine-mode`: Engine modes of anti-xray, either `HIDE`, `OBFUSCATE`, or `OBFUSCATE_LAYER`
80+
(default: `HIDE`)
81+
- `hidden-blocks`: The list of blocks to hide/obfuscate (default: all ores and
82+
all base blocks of dimensions)
7983

8084
Feel free to play around with the chunk generations and chunk sending limits for
8185
an optimal experience on your server setup.

fabric-1217/build.gradle.kts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import net.fabricmc.loom.task.AbstractRemapJarTask
2+
3+
plugins {
4+
alias(libs.plugins.loom)
5+
}
6+
7+
repositories {
8+
// adventure-platform-mod hasn't been released yet, use snapshot version
9+
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") {
10+
mavenContent { snapshotsOnly() }
11+
}
12+
}
13+
14+
dependencies {
15+
minecraft(libs.minecraft.v1217)
16+
mappings(loom.layered {
17+
officialMojangMappings()
18+
parchment(variantOf(libs.parchment.v1217) { artifactType("zip") })
19+
})
20+
modImplementation(libs.fabric.loader)
21+
22+
// common project setup
23+
api(projects.common)
24+
25+
// adventure platform for better integration with everything
26+
modImplementation(libs.adventure.platform.fabric.v1217)
27+
include(libs.adventure.platform.fabric.v1217)
28+
29+
// depend on moonrise for chunk loading stuff
30+
modApi(libs.moonrise.v1217)
31+
}
32+
33+
tasks.named<ProcessResources>("processResources") {
34+
inputs.property("version", project.version)
35+
filesMatching("fabric.mod.json") {
36+
expand("version" to project.version)
37+
}
38+
}
39+
40+
tasks.withType<AbstractRemapJarTask> {
41+
archiveBaseName = "${rootProject.name}-${project.name}".lowercase()
42+
}
43+
44+
loom {
45+
accessWidenerPath = file("src/main/resources/betterview.accesswidener")
46+
mixin.defaultRefmapName = "${rootProject.name}-${project.name}-refmap.json".lowercase()
47+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package dev.booky.betterview.fabric.v1217;
2+
// Created by booky10 in BetterView (04:12 05.06.2025)
3+
4+
import dev.booky.betterview.common.BetterViewManager;
5+
import dev.booky.betterview.common.hooks.BetterViewHook;
6+
import dev.booky.betterview.common.hooks.LevelHook;
7+
import dev.booky.betterview.common.hooks.PlayerHook;
8+
import net.fabricmc.api.ModInitializer;
9+
import net.minecraft.core.registries.Registries;
10+
import net.minecraft.resources.ResourceKey;
11+
import net.minecraft.resources.ResourceLocation;
12+
import net.minecraft.server.MinecraftServer;
13+
import net.minecraft.server.level.ServerLevel;
14+
import net.minecraft.server.level.ServerPlayer;
15+
import net.minecraft.world.level.Level;
16+
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
17+
import org.jspecify.annotations.NullMarked;
18+
import org.jspecify.annotations.Nullable;
19+
20+
import java.lang.ref.WeakReference;
21+
import java.nio.file.Path;
22+
import java.util.Set;
23+
import java.util.UUID;
24+
25+
@NullMarked
26+
public class BetterViewMod implements BetterViewHook, ModInitializer {
27+
28+
public static @MonotonicNonNull BetterViewMod INSTANCE = null;
29+
30+
private @Nullable WeakReference<MinecraftServer> server = null;
31+
private @Nullable BetterViewManager manager;
32+
33+
public BetterViewMod() {
34+
if (INSTANCE != null) {
35+
throw new IllegalStateException("Mod has already been constructed");
36+
}
37+
INSTANCE = this;
38+
}
39+
40+
@Override
41+
public void onInitialize() {
42+
// NO-OP
43+
}
44+
45+
public void triggerPreLoad(MinecraftServer server, Path worldDir) {
46+
// save server instance
47+
this.server = new WeakReference<>(server);
48+
// initialize BV manager with config inside the root world directory
49+
Path configPath = worldDir.resolve("betterview.yml");
50+
this.manager = new BetterViewManager(__ -> this, configPath);
51+
}
52+
53+
public void triggerPostLoad(Set<ResourceKey<Level>> levelKeys) {
54+
BetterViewManager manager = this.getManager();
55+
// eagerly load all available dimensions once on startup to allow
56+
// population of config file - every other dimension gets lazy loaded
57+
for (ResourceKey<Level> levelKey : levelKeys) {
58+
manager.getLevel(levelKey.location());
59+
}
60+
// call post-load action
61+
manager.onPostLoad();
62+
}
63+
64+
public void triggerShutdown() {
65+
this.server = null;
66+
this.manager = null;
67+
}
68+
69+
private MinecraftServer getServer() {
70+
MinecraftServer server;
71+
if (this.server == null || (server = this.server.get()) == null) {
72+
throw new IllegalStateException("No MinecraftServer instance is currently running");
73+
}
74+
return server;
75+
}
76+
77+
@Override
78+
public long getNanosPerServerTick() {
79+
return this.getServer().tickRateManager().nanosecondsPerTick();
80+
}
81+
82+
@Override
83+
public LevelHook constructLevel(String worldName) {
84+
ResourceKey<Level> levelKey = ResourceKey.create(Registries.DIMENSION, ResourceLocation.parse(worldName));
85+
ServerLevel level = this.getServer().getLevel(levelKey);
86+
if (level == null) {
87+
throw new IllegalArgumentException("Can't find level with name " + worldName);
88+
}
89+
return (LevelHook) level;
90+
}
91+
92+
@Override
93+
public PlayerHook constructPlayer(UUID playerId) {
94+
ServerPlayer player = this.getServer().getPlayerList().getPlayer(playerId);
95+
if (player == null) {
96+
throw new IllegalArgumentException("Can't find player with id " + playerId);
97+
}
98+
return (PlayerHook) player;
99+
}
100+
101+
public BetterViewManager getManager() {
102+
if (this.manager == null) {
103+
throw new IllegalStateException("Manager not loaded");
104+
}
105+
return this.manager;
106+
}
107+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package dev.booky.betterview.fabric.v1217.mixin.accessor;
2+
// Created by booky10 in BetterView (05:02 05.06.2025)
3+
4+
import ca.spottedleaf.moonrise.patches.starlight.light.SWMRNibbleArray;
5+
import org.jspecify.annotations.NullMarked;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.gen.Accessor;
8+
9+
@NullMarked
10+
@Mixin(value = SWMRNibbleArray.class, remap = false)
11+
public interface SWMRNibbleArrayAccessor {
12+
13+
@Accessor(remap = false)
14+
byte[] getStorageVisible();
15+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package dev.booky.betterview.fabric.v1217.mixin.listener;
2+
// Created by booky10 in BetterView (05:08 05.06.2025)
3+
4+
import dev.booky.betterview.fabric.v1217.packet.PacketHandler;
5+
import io.netty.channel.ChannelPipeline;
6+
import net.minecraft.network.Connection;
7+
import net.minecraft.network.protocol.PacketFlow;
8+
import org.jspecify.annotations.NullMarked;
9+
import org.spongepowered.asm.mixin.Final;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
15+
16+
@NullMarked
17+
@Mixin(Connection.class)
18+
public class ConnectionMixin {
19+
20+
@Shadow @Final
21+
private PacketFlow receiving;
22+
23+
@Inject(
24+
method = "configurePacketHandler",
25+
at = @At("TAIL")
26+
)
27+
private void postPacketHandlerConfig(ChannelPipeline pipeline, CallbackInfo ci) {
28+
if (this.receiving != PacketFlow.SERVERBOUND) {
29+
return; // wrong side, we only care about the server-side of connections
30+
}
31+
pipeline.addBefore("packet_handler", PacketHandler.HANDLER_NAME, new PacketHandler());
32+
}
33+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package dev.booky.betterview.fabric.v1217.mixin.listener;
2+
// Created by booky10 in BetterView (18:03 06.06.2025)
3+
4+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
5+
import dev.booky.betterview.common.config.BvConfig;
6+
import dev.booky.betterview.fabric.v1217.BetterViewMod;
7+
import net.fabricmc.api.EnvType;
8+
import net.fabricmc.api.Environment;
9+
import net.minecraft.client.server.IntegratedServer;
10+
import org.jspecify.annotations.NullMarked;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
14+
@NullMarked
15+
@Environment(EnvType.CLIENT)
16+
@Mixin(IntegratedServer.class)
17+
public class IntegratedServerMixin {
18+
19+
@ModifyExpressionValue(
20+
method = "tickServer",
21+
at = @At(
22+
value = "INVOKE",
23+
target = "Lnet/minecraft/client/OptionInstance;get()Ljava/lang/Object;",
24+
ordinal = 0
25+
)
26+
)
27+
private Object replaceRenderDistance(Object original) {
28+
BvConfig config = BetterViewMod.INSTANCE.getManager().getConfig();
29+
int serverRenderDistance = config.getIntegratedServerRenderDistance();
30+
return serverRenderDistance == -1 ? original : serverRenderDistance;
31+
}
32+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package dev.booky.betterview.fabric.v1217.mixin.listener;
2+
// Created by booky10 in BetterView (04:11 05.06.2025)
3+
4+
import dev.booky.betterview.fabric.v1217.BetterViewMod;
5+
import net.minecraft.resources.ResourceKey;
6+
import net.minecraft.server.MinecraftServer;
7+
import net.minecraft.world.level.Level;
8+
import net.minecraft.world.level.storage.LevelStorageSource;
9+
import org.jspecify.annotations.NullMarked;
10+
import org.objectweb.asm.Opcodes;
11+
import org.spongepowered.asm.mixin.Final;
12+
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.Shadow;
14+
import org.spongepowered.asm.mixin.injection.At;
15+
import org.spongepowered.asm.mixin.injection.Inject;
16+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
17+
18+
import java.nio.file.Path;
19+
import java.util.Set;
20+
21+
@NullMarked
22+
@Mixin(MinecraftServer.class)
23+
public abstract class MinecraftServerMixin {
24+
25+
@Final @Shadow
26+
protected LevelStorageSource.LevelStorageAccess storageSource;
27+
28+
@Shadow
29+
public abstract Set<ResourceKey<Level>> levelKeys();
30+
31+
@Inject(
32+
method = "<init>",
33+
at = @At("TAIL")
34+
)
35+
private void postInit(CallbackInfo ci) {
36+
Path worldDir = this.storageSource.getLevelDirectory().path();
37+
BetterViewMod.INSTANCE.triggerPreLoad((MinecraftServer) (Object) this, worldDir);
38+
}
39+
40+
@Inject(
41+
method = "runServer",
42+
at = @At(
43+
value = "FIELD",
44+
target = "Lnet/minecraft/server/MinecraftServer;status:Lnet/minecraft/network/protocol/status/ServerStatus;",
45+
opcode = Opcodes.PUTFIELD,
46+
shift = At.Shift.AFTER
47+
)
48+
)
49+
private void postServerInit(CallbackInfo ci) {
50+
BetterViewMod.INSTANCE.triggerPostLoad(this.levelKeys());
51+
}
52+
53+
@Inject(
54+
method = "tickChildren",
55+
at = @At("TAIL")
56+
)
57+
private void postServerTick(CallbackInfo ci) {
58+
BetterViewMod.INSTANCE.getManager().runTick();
59+
}
60+
61+
@Inject(
62+
method = "stopServer",
63+
at = @At(
64+
// inject after players have been disconnected
65+
value = "INVOKE",
66+
target = "Lnet/minecraft/server/players/PlayerList;removeAll()V",
67+
shift = At.Shift.AFTER
68+
)
69+
)
70+
private void onShutdown(CallbackInfo ci) {
71+
BetterViewMod.INSTANCE.triggerShutdown();
72+
}
73+
}

0 commit comments

Comments
 (0)