Skip to content

Commit 4b209c5

Browse files
committed
feat: World Border Fade, World Border Render Distance
1 parent b8e9057 commit 4b209c5

File tree

8 files changed

+157
-6
lines changed

8 files changed

+157
-6
lines changed

src/client/java/net/modgarden/flowerbed/client/mixin/Mixin_WorldBorderRenderer.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22

33
import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
44
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
5+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
6+
import net.minecraft.client.Minecraft;
57
import net.minecraft.client.renderer.WorldBorderRenderer;
68
import net.minecraft.world.level.border.WorldBorder;
79
import net.minecraft.world.phys.Vec3;
10+
import net.modgarden.flowerbed.client.render.OpacityState;
811
import net.modgarden.flowerbed.registry.FlowerbedGameRules;
912
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.injection.At;
1014

1115
@Mixin(WorldBorderRenderer.class)
1216
public class Mixin_WorldBorderRenderer {
@@ -20,7 +24,22 @@ public class Mixin_WorldBorderRenderer {
2024
) {
2125
if (FlowerbedGameRules.showWorldBorder)
2226
{
27+
OpacityState.update(worldBorder, cameraPosition);
2328
original.call(worldBorder, cameraPosition, renderDistance, farPlaneDepth);
2429
}
2530
}
31+
32+
@WrapOperation(
33+
method = "render",
34+
at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;setShaderColor(FFFF)V", ordinal = 0)
35+
)
36+
private void flowerbed$changeAlpha(
37+
float f,
38+
float g,
39+
float h,
40+
float i,
41+
Operation<Void> original
42+
) {
43+
original.call(f, g, h, i * OpacityState.getAlpha(Minecraft.getInstance().getDeltaTracker().getRealtimeDeltaTicks()));
44+
}
2645
}

src/client/java/net/modgarden/flowerbed/client/network/FlowerbedNetworkClient.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,32 @@
22

33
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
44
import net.modgarden.flowerbed.client.FlowerbedClient;
5-
import net.modgarden.flowerbed.network.clientbound.ClientboundShowWorldBorderPacket;
6-
import net.modgarden.flowerbed.network.clientbound.SendDisabledPassiveHungerLossValueClientboundPacket;
7-
import net.modgarden.flowerbed.network.clientbound.SendPerPlayerPvpValueClientboundPacket;
5+
import net.modgarden.flowerbed.network.clientbound.*;
86
import net.modgarden.flowerbed.registry.FlowerbedGameRules;
97

108
public class FlowerbedNetworkClient {
119
public static void init() {
1210
ClientPlayNetworking.registerGlobalReceiver(SendDisabledPassiveHungerLossValueClientboundPacket.TYPE, FlowerbedNetworkClient::handleDisabledPassiveHungerLossValue);
1311
ClientPlayNetworking.registerGlobalReceiver(SendPerPlayerPvpValueClientboundPacket.TYPE, FlowerbedNetworkClient::handlePerPlayerPvpValue);
1412
ClientPlayNetworking.registerGlobalReceiver(ClientboundShowWorldBorderPacket.TYPE, FlowerbedNetworkClient::handleShowWorldBorder);
13+
ClientPlayNetworking.registerGlobalReceiver(ClientboundWorldBorderRenderDistancePacket.TYPE, FlowerbedNetworkClient::handleWorldBorderDistance);
14+
ClientPlayNetworking.registerGlobalReceiver(ClientboundWorldBorderFadeTicksPacket.TYPE, FlowerbedNetworkClient::handleWorldBorderFadeTicks);
15+
}
16+
17+
private static void handleWorldBorderDistance(
18+
ClientboundWorldBorderRenderDistancePacket packet,
19+
ClientPlayNetworking.Context context
20+
) {
21+
context.client().execute(() ->
22+
FlowerbedGameRules.worldBorderRenderDistance = packet.value());
23+
}
24+
25+
private static void handleWorldBorderFadeTicks(
26+
ClientboundWorldBorderFadeTicksPacket packet,
27+
ClientPlayNetworking.Context context
28+
) {
29+
context.client().execute(() ->
30+
FlowerbedGameRules.worldBorderFadeTicks = packet.value());
1531
}
1632

1733
private static void handleDisabledPassiveHungerLossValue(SendDisabledPassiveHungerLossValueClientboundPacket packet, ClientPlayNetworking.Context context) {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package net.modgarden.flowerbed.client.render;
2+
3+
import net.minecraft.world.level.border.WorldBorder;
4+
import net.minecraft.world.phys.Vec3;
5+
import net.modgarden.flowerbed.registry.FlowerbedGameRules;
6+
7+
/**
8+
* Copied from Barricade lol
9+
*/
10+
public final class OpacityState {
11+
private static float fadeTime = 0.0f;
12+
private static boolean isFading = false;
13+
private static boolean isChanging = false;
14+
private static boolean shouldRender = false;
15+
16+
public static void update(WorldBorder worldBorder, Vec3 cameraPosition) {
17+
int fadeTicks = FlowerbedGameRules.worldBorderFadeTicks;
18+
int fadeDistance = FlowerbedGameRules.worldBorderRenderDistance;
19+
boolean shouldRender = worldBorder.getDistanceToBorder(cameraPosition.x(), cameraPosition.z()) < fadeDistance;
20+
boolean fadeBarriers = fadeTicks > 0.0f;
21+
if (fadeBarriers && OpacityState.shouldRender && !shouldRender) {
22+
OpacityState.isFading = true;
23+
if (!OpacityState.isChanging) {
24+
OpacityState.fadeTime = fadeTicks;
25+
}
26+
OpacityState.isChanging = true;
27+
} else if (fadeBarriers && !OpacityState.shouldRender && shouldRender) {
28+
OpacityState.isFading = false;
29+
if (!OpacityState.isChanging) {
30+
OpacityState.fadeTime = 0.0f;
31+
}
32+
OpacityState.isChanging = true;
33+
}
34+
OpacityState.shouldRender = shouldRender;
35+
}
36+
37+
public static float getAlpha(float deltaTick) {
38+
int fadeTicks = FlowerbedGameRules.worldBorderFadeTicks;
39+
if (OpacityState.isFading && OpacityState.fadeTime >= 0.0f) {
40+
OpacityState.fadeTime -= deltaTick;
41+
return OpacityState.fadeTime / fadeTicks;
42+
} else if (!OpacityState.isFading && OpacityState.fadeTime <= fadeTicks) {
43+
OpacityState.fadeTime += deltaTick;
44+
return OpacityState.fadeTime / fadeTicks;
45+
} else {
46+
OpacityState.isChanging = false;
47+
return OpacityState.shouldRender ? 1.0f : 0.0f;
48+
}
49+
}
50+
51+
private OpacityState() {}
52+
}

src/main/java/net/modgarden/flowerbed/Flowerbed.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import net.modgarden.flowerbed.command.FlowerbedCommands;
1111
import net.modgarden.flowerbed.network.FlowerbedNetwork;
1212
import net.modgarden.flowerbed.network.clientbound.ClientboundShowWorldBorderPacket;
13+
import net.modgarden.flowerbed.network.clientbound.ClientboundWorldBorderFadeTicksPacket;
14+
import net.modgarden.flowerbed.network.clientbound.ClientboundWorldBorderRenderDistancePacket;
1315
import net.modgarden.flowerbed.network.clientbound.SendPerPlayerPvpValueClientboundPacket;
1416
import net.modgarden.flowerbed.registry.FlowerbedAttachments;
1517
import net.modgarden.flowerbed.registry.FlowerbedGameRules;
@@ -35,6 +37,8 @@ public void onInitialize() {
3537
GameRules gameRules = serverPlayer.getServer().getGameRules();
3638
ServerPlayNetworking.send(serverPlayer, new SendPerPlayerPvpValueClientboundPacket(gameRules.getBoolean(FlowerbedGameRules.PER_PLAYER_PVP)));
3739
ServerPlayNetworking.send(serverPlayer, new ClientboundShowWorldBorderPacket(gameRules.getBoolean(FlowerbedGameRules.SHOW_WORLD_BORDER)));
40+
ServerPlayNetworking.send(serverPlayer, new ClientboundWorldBorderRenderDistancePacket(gameRules.getInt(FlowerbedGameRules.WORLD_BORDER_RENDER_DISTANCE)));
41+
ServerPlayNetworking.send(serverPlayer, new ClientboundWorldBorderFadeTicksPacket(gameRules.getInt(FlowerbedGameRules.WORLD_BORDER_FADE_TICKS)));
3842
}
3943
});
4044
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package net.modgarden.flowerbed.network;
22

33
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
4-
import net.modgarden.flowerbed.network.clientbound.ClientboundShowWorldBorderPacket;
5-
import net.modgarden.flowerbed.network.clientbound.SendDisabledPassiveHungerLossValueClientboundPacket;
6-
import net.modgarden.flowerbed.network.clientbound.SendPerPlayerPvpValueClientboundPacket;
4+
import net.modgarden.flowerbed.network.clientbound.*;
75

86
public class FlowerbedNetwork {
97
public static void init() {
108
PayloadTypeRegistry.playS2C().register(SendDisabledPassiveHungerLossValueClientboundPacket.TYPE, SendDisabledPassiveHungerLossValueClientboundPacket.STREAM_CODEC);
119
PayloadTypeRegistry.playS2C().register(SendPerPlayerPvpValueClientboundPacket.TYPE, SendPerPlayerPvpValueClientboundPacket.STREAM_CODEC);
1210
PayloadTypeRegistry.playS2C().register(ClientboundShowWorldBorderPacket.TYPE, ClientboundShowWorldBorderPacket.STREAM_CODEC);
11+
PayloadTypeRegistry.playS2C().register(ClientboundWorldBorderRenderDistancePacket.TYPE, ClientboundWorldBorderRenderDistancePacket.STREAM_CODEC);
12+
PayloadTypeRegistry.playS2C().register(ClientboundWorldBorderFadeTicksPacket.TYPE, ClientboundWorldBorderFadeTicksPacket.STREAM_CODEC);
1313
}
1414
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package net.modgarden.flowerbed.network.clientbound;
2+
3+
import net.minecraft.network.RegistryFriendlyByteBuf;
4+
import net.minecraft.network.codec.ByteBufCodecs;
5+
import net.minecraft.network.codec.StreamCodec;
6+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
7+
import net.minecraft.resources.ResourceLocation;
8+
import net.modgarden.flowerbed.Flowerbed;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
public record ClientboundWorldBorderFadeTicksPacket(int value) implements CustomPacketPayload {
12+
public static final ResourceLocation ID = Flowerbed.asResource("world_border_fade_ticks");
13+
public static final Type<ClientboundWorldBorderFadeTicksPacket> TYPE = new Type<>(ID);
14+
public static final StreamCodec<RegistryFriendlyByteBuf, ClientboundWorldBorderFadeTicksPacket> STREAM_CODEC = ByteBufCodecs.INT
15+
.map(ClientboundWorldBorderFadeTicksPacket::new, ClientboundWorldBorderFadeTicksPacket::value).cast();
16+
17+
@Override
18+
public @NotNull Type<? extends CustomPacketPayload> type() {
19+
return TYPE;
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package net.modgarden.flowerbed.network.clientbound;
2+
3+
import net.minecraft.network.RegistryFriendlyByteBuf;
4+
import net.minecraft.network.codec.ByteBufCodecs;
5+
import net.minecraft.network.codec.StreamCodec;
6+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
7+
import net.minecraft.resources.ResourceLocation;
8+
import net.modgarden.flowerbed.Flowerbed;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
public record ClientboundWorldBorderRenderDistancePacket(int value) implements CustomPacketPayload {
12+
public static final ResourceLocation ID = Flowerbed.asResource("world_border_render_distance");
13+
public static final Type<ClientboundWorldBorderRenderDistancePacket> TYPE = new Type<>(ID);
14+
public static final StreamCodec<RegistryFriendlyByteBuf, ClientboundWorldBorderRenderDistancePacket> STREAM_CODEC = ByteBufCodecs.INT
15+
.map(ClientboundWorldBorderRenderDistancePacket::new, ClientboundWorldBorderRenderDistancePacket::value).cast();
16+
17+
@Override
18+
public @NotNull Type<? extends CustomPacketPayload> type() {
19+
return TYPE;
20+
}
21+
}

src/main/java/net/modgarden/flowerbed/registry/FlowerbedGameRules.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@
88
import net.minecraft.world.level.GameRules;
99
import net.minecraft.world.level.Level;
1010
import net.modgarden.flowerbed.network.clientbound.ClientboundShowWorldBorderPacket;
11+
import net.modgarden.flowerbed.network.clientbound.ClientboundWorldBorderRenderDistancePacket;
12+
import net.modgarden.flowerbed.network.clientbound.ClientboundWorldBorderFadeTicksPacket;
1113
import net.modgarden.flowerbed.network.clientbound.SendPerPlayerPvpValueClientboundPacket;
1214

1315
public class FlowerbedGameRules {
1416
public static boolean disablePassiveHungerLossGameruleEnabled = false;
1517
public static boolean showWorldBorder = true;
18+
public static int worldBorderRenderDistance = 0;
19+
public static int worldBorderFadeTicks = 40;
1620

1721
public static final GameRules.Key<GameRules.BooleanValue> PER_PLAYER_PVP =
1822
GameRuleRegistry.register("flowerbed:per_player_pvp", GameRules.Category.PLAYER, GameRuleFactory.createBooleanRule(true,
@@ -40,6 +44,20 @@ public class FlowerbedGameRules {
4044
}
4145
}));
4246

47+
public static final GameRules.Key<GameRules.IntegerValue> WORLD_BORDER_RENDER_DISTANCE =
48+
GameRuleRegistry.register("flowerbed:world_border_render_distance", GameRules.Category.MISC, GameRuleFactory.createIntRule(0, (server, value) -> {
49+
for (ServerPlayer serverPlayer : server.getPlayerList().getPlayers()) {
50+
ServerPlayNetworking.send(serverPlayer, new ClientboundWorldBorderRenderDistancePacket(value.get()));
51+
}
52+
}));
53+
54+
public static final GameRules.Key<GameRules.IntegerValue> WORLD_BORDER_FADE_TICKS =
55+
GameRuleRegistry.register("flowerbed:world_border_fade_ticks", GameRules.Category.MISC, GameRuleFactory.createIntRule(40, (server, value) -> {
56+
for (ServerPlayer serverPlayer : server.getPlayerList().getPlayers()) {
57+
ServerPlayNetworking.send(serverPlayer, new ClientboundWorldBorderFadeTicksPacket(value.get()));
58+
}
59+
}));
60+
4361
public static void init() {
4462

4563
}

0 commit comments

Comments
 (0)