9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-21 15:59:26 +00:00
Files
SakuraMC/patches/api/0002-Client-Visibility-Settings-API.patch
2024-11-21 18:04:17 +00:00

187 lines
7.0 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samsuik <kfian294ma4@gmail.com>
Date: Tue, 21 Sep 2021 23:55:45 +0100
Subject: [PATCH] Client Visibility Settings API
diff --git a/src/main/java/me/samsuik/sakura/player/visibility/VisibilitySettings.java b/src/main/java/me/samsuik/sakura/player/visibility/VisibilitySettings.java
new file mode 100644
index 0000000000000000000000000000000000000000..50ba48ebb99fac7f42fa1db76808f84ed9e601c4
--- /dev/null
+++ b/src/main/java/me/samsuik/sakura/player/visibility/VisibilitySettings.java
@@ -0,0 +1,48 @@
+package me.samsuik.sakura.player.visibility;
+
+import org.jspecify.annotations.NullMarked;
+
+@NullMarked
+public interface VisibilitySettings {
+ default boolean isEnabled(VisibilityType type) {
+ return this.get(type) == VisibilityState.ON;
+ }
+
+ default boolean isDisabled(VisibilityType type) {
+ return this.get(type) == VisibilityState.OFF;
+ }
+
+ default boolean isToggled(VisibilityType type) {
+ return !type.isDefault(this.get(type));
+ }
+
+ default VisibilityState toggle(VisibilityType type) {
+ VisibilityState state = this.get(type);
+ return this.set(type, toggleState(state));
+ }
+
+ default VisibilityState cycle(VisibilityType type) {
+ VisibilityState state = this.get(type);
+ return this.set(type, type.cycle(state));
+ }
+
+ default void toggleAll() {
+ VisibilityState state = this.currentState();
+ VisibilityState newState = toggleState(state);
+ for (VisibilityType type : VisibilityTypes.types()) {
+ this.set(type, newState);
+ }
+ }
+
+ VisibilityState get(VisibilityType type);
+
+ VisibilityState set(VisibilityType type, VisibilityState state);
+
+ VisibilityState currentState();
+
+ boolean playerModified();
+
+ static VisibilityState toggleState(VisibilityState state) {
+ return state != VisibilityState.OFF ? VisibilityState.OFF : VisibilityState.ON;
+ }
+}
diff --git a/src/main/java/me/samsuik/sakura/player/visibility/VisibilityState.java b/src/main/java/me/samsuik/sakura/player/visibility/VisibilityState.java
new file mode 100644
index 0000000000000000000000000000000000000000..d9cb2ea30f1cb1117437aa2c04a9471ece4be052
--- /dev/null
+++ b/src/main/java/me/samsuik/sakura/player/visibility/VisibilityState.java
@@ -0,0 +1,5 @@
+package me.samsuik.sakura.player.visibility;
+
+public enum VisibilityState {
+ ON, MODIFIED, MINIMAL, OFF;
+}
diff --git a/src/main/java/me/samsuik/sakura/player/visibility/VisibilityType.java b/src/main/java/me/samsuik/sakura/player/visibility/VisibilityType.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b6b482d1c34e2318e5ca3b7a68e628818f048f8
--- /dev/null
+++ b/src/main/java/me/samsuik/sakura/player/visibility/VisibilityType.java
@@ -0,0 +1,35 @@
+package me.samsuik.sakura.player.visibility;
+
+import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.NullMarked;
+
+@NullMarked
+public record VisibilityType(String key, ImmutableList<VisibilityState> states) {
+ public VisibilityState getDefault() {
+ return this.states.getFirst();
+ }
+
+ public boolean isDefault(VisibilityState state) {
+ return state == this.getDefault();
+ }
+
+ public VisibilityState cycle(VisibilityState state) {
+ int index = this.states.indexOf(state);
+ int next = (index + 1) % this.states.size();
+ return this.states.get(next);
+ }
+
+ public static VisibilityType from(String key, boolean minimal) {
+ return new VisibilityType(key, states(minimal));
+ }
+
+ private static ImmutableList<VisibilityState> states(boolean minimal) {
+ ImmutableList.Builder<VisibilityState> listBuilder = ImmutableList.builder();
+ listBuilder.add(VisibilityState.ON);
+ if (minimal) {
+ listBuilder.add(VisibilityState.MINIMAL);
+ }
+ listBuilder.add(VisibilityState.OFF);
+ return listBuilder.build();
+ }
+}
diff --git a/src/main/java/me/samsuik/sakura/player/visibility/VisibilityTypes.java b/src/main/java/me/samsuik/sakura/player/visibility/VisibilityTypes.java
new file mode 100644
index 0000000000000000000000000000000000000000..f323cfc2d7370ff8ea9020e79c5148a86e51e8c8
--- /dev/null
+++ b/src/main/java/me/samsuik/sakura/player/visibility/VisibilityTypes.java
@@ -0,0 +1,31 @@
+package me.samsuik.sakura.player.visibility;
+
+import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.NullMarked;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@NullMarked
+public final class VisibilityTypes {
+ private static final List<VisibilityType> TYPES = new ArrayList<>();
+
+ public static final VisibilityType TNT = register(create("tnt", true));
+ public static final VisibilityType SAND = register(create("sand", true));
+ public static final VisibilityType EXPLOSIONS = register(create("explosions", true));
+ public static final VisibilityType SPAWNERS = register(create("spawners", false));
+ public static final VisibilityType PISTONS = register(create("pistons", false));
+
+ public static ImmutableList<VisibilityType> types() {
+ return ImmutableList.copyOf(TYPES);
+ }
+
+ private static VisibilityType create(String key, boolean minimal) {
+ return VisibilityType.from(key, minimal);
+ }
+
+ private static VisibilityType register(VisibilityType type) {
+ TYPES.add(type);
+ return type;
+ }
+}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 95f0b3186e313c7fbd5c8531d52b82a69e525f94..0560784e8b71a927db6d8cdf9d36a23e3b56ef74 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
@@ -9,6 +9,8 @@ import java.util.Date;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
+
+import me.samsuik.sakura.player.visibility.VisibilitySettings;
import org.bukkit.BanEntry;
import org.bukkit.DyeColor;
import org.bukkit.Effect;
@@ -49,7 +51,6 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.messaging.PluginMessageRecipient;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
-import org.bukkit.profile.PlayerProfile;
import org.bukkit.scoreboard.Scoreboard;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@@ -60,6 +61,15 @@ import org.jetbrains.annotations.Nullable;
*/
public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, net.kyori.adventure.bossbar.BossBarViewer, com.destroystokyo.paper.network.NetworkClient { // Paper
+ // Sakura start
+ /**
+ * Visibility API for FPS settings.
+ *
+ * @return visibility api
+ */
+ VisibilitySettings getVisibility();
+ // Sakura end
+
// Paper start
@Override
default net.kyori.adventure.identity.@NotNull Identity identity() {