From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samsuik 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 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 states(boolean minimal) { + ImmutableList.Builder 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 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 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() {