2021-06-11 12:02:28 +00:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2021-11-27 08:11:43 +00:00
|
|
|
From: MiniDigger <admin@benndorf.dev>
|
2021-06-11 12:02:28 +00:00
|
|
|
Date: Mon, 20 Jan 2020 21:38:34 +0100
|
|
|
|
Subject: [PATCH] Add Player Client Options API
|
|
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/ClientOption.java b/src/main/java/com/destroystokyo/paper/ClientOption.java
|
|
|
|
new file mode 100644
|
2022-10-26 23:09:03 +00:00
|
|
|
index 0000000000000000000000000000000000000000..f89bfeba29e6988db849957a508ca97ff5322242
|
2021-06-11 12:02:28 +00:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/ClientOption.java
|
2022-10-26 23:09:03 +00:00
|
|
|
@@ -0,0 +1,52 @@
|
2021-06-11 12:02:28 +00:00
|
|
|
+package com.destroystokyo.paper;
|
|
|
|
+
|
2021-08-14 04:11:12 +00:00
|
|
|
+import net.kyori.adventure.translation.Translatable;
|
|
|
|
+import net.kyori.adventure.util.Index;
|
2021-06-11 12:02:28 +00:00
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
|
+
|
|
|
|
+import org.bukkit.inventory.MainHand;
|
|
|
|
+
|
|
|
|
+public final class ClientOption<T> {
|
|
|
|
+
|
|
|
|
+ public static final ClientOption<SkinParts> SKIN_PARTS = new ClientOption<>(SkinParts.class);
|
|
|
|
+ public static final ClientOption<Boolean> CHAT_COLORS_ENABLED = new ClientOption<>(Boolean.class);
|
|
|
|
+ public static final ClientOption<ChatVisibility> CHAT_VISIBILITY = new ClientOption<>(ChatVisibility.class);
|
|
|
|
+ public static final ClientOption<String> LOCALE = new ClientOption<>(String.class);
|
|
|
|
+ public static final ClientOption<MainHand> MAIN_HAND = new ClientOption<>(MainHand.class);
|
|
|
|
+ public static final ClientOption<Integer> VIEW_DISTANCE = new ClientOption<>(Integer.class);
|
2022-10-26 23:09:03 +00:00
|
|
|
+ public static final ClientOption<Boolean> ALLOW_SERVER_LISTINGS = new ClientOption<>(Boolean.class);
|
|
|
|
+ public static final ClientOption<Boolean> TEXT_FILTERING_ENABLED = new ClientOption<>(Boolean.class);
|
2021-06-11 12:02:28 +00:00
|
|
|
+
|
|
|
|
+ private final Class<T> type;
|
|
|
|
+
|
|
|
|
+ private ClientOption(@NotNull Class<T> type) {
|
|
|
|
+ this.type = type;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @NotNull
|
|
|
|
+ public Class<T> getType() {
|
|
|
|
+ return type;
|
|
|
|
+ }
|
|
|
|
+
|
2021-08-14 04:11:12 +00:00
|
|
|
+ public enum ChatVisibility implements Translatable {
|
|
|
|
+ FULL("full"),
|
|
|
|
+ SYSTEM("system"),
|
|
|
|
+ HIDDEN("hidden"),
|
|
|
|
+ UNKNOWN("unknown");
|
|
|
|
+
|
|
|
|
+ public static Index<String, ChatVisibility> NAMES = Index.create(ChatVisibility.class, chatVisibility -> chatVisibility.name);
|
|
|
|
+ private final String name;
|
|
|
|
+
|
|
|
|
+ ChatVisibility(String name) {
|
|
|
|
+ this.name = name;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public @NotNull String translationKey() {
|
|
|
|
+ if (this == UNKNOWN) {
|
|
|
|
+ throw new UnsupportedOperationException(this.name + " doesn't have a translation key");
|
|
|
|
+ }
|
|
|
|
+ return "options.chat.visibility." + this.name;
|
|
|
|
+ }
|
2021-06-11 12:02:28 +00:00
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/SkinParts.java b/src/main/java/com/destroystokyo/paper/SkinParts.java
|
|
|
|
new file mode 100644
|
|
|
|
index 0000000000000000000000000000000000000000..4a0c39405d4fbed457787e3c6ded4cc6591bc8c2
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/SkinParts.java
|
|
|
|
@@ -0,0 +1,20 @@
|
|
|
|
+package com.destroystokyo.paper;
|
|
|
|
+
|
|
|
|
+public interface SkinParts {
|
|
|
|
+
|
|
|
|
+ boolean hasCapeEnabled();
|
|
|
|
+
|
|
|
|
+ boolean hasJacketEnabled();
|
|
|
|
+
|
|
|
|
+ boolean hasLeftSleeveEnabled();
|
|
|
|
+
|
|
|
|
+ boolean hasRightSleeveEnabled();
|
|
|
|
+
|
|
|
|
+ boolean hasLeftPantsEnabled();
|
|
|
|
+
|
|
|
|
+ boolean hasRightPantsEnabled();
|
|
|
|
+
|
|
|
|
+ boolean hasHatsEnabled();
|
|
|
|
+
|
|
|
|
+ int getRaw();
|
|
|
|
+}
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerClientOptionsChangeEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerClientOptionsChangeEvent.java
|
|
|
|
new file mode 100644
|
2022-10-26 23:09:03 +00:00
|
|
|
index 0000000000000000000000000000000000000000..cf67dc7d465223710adbf2b798109f525d3b057d
|
2021-06-11 12:02:28 +00:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerClientOptionsChangeEvent.java
|
2022-10-26 23:09:03 +00:00
|
|
|
@@ -0,0 +1,134 @@
|
2021-06-11 12:02:28 +00:00
|
|
|
+package com.destroystokyo.paper.event.player;
|
|
|
|
+
|
|
|
|
+import com.destroystokyo.paper.ClientOption;
|
|
|
|
+import com.destroystokyo.paper.ClientOption.ChatVisibility;
|
|
|
|
+import com.destroystokyo.paper.SkinParts;
|
|
|
|
+import org.bukkit.entity.Player;
|
|
|
|
+import org.bukkit.event.HandlerList;
|
|
|
|
+import org.bukkit.event.player.PlayerEvent;
|
|
|
|
+import org.bukkit.inventory.MainHand;
|
2022-10-26 23:09:03 +00:00
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
|
+
|
|
|
|
+import java.util.Map;
|
2021-06-11 12:02:28 +00:00
|
|
|
+
|
|
|
|
+/**
|
2022-10-26 23:09:03 +00:00
|
|
|
+ * Called when the player changes their client settings
|
2021-06-11 12:02:28 +00:00
|
|
|
+ */
|
|
|
|
+public class PlayerClientOptionsChangeEvent extends PlayerEvent {
|
|
|
|
+
|
|
|
|
+ private static final HandlerList handlers = new HandlerList();
|
|
|
|
+
|
|
|
|
+ private final String locale;
|
|
|
|
+ private final int viewDistance;
|
|
|
|
+ private final ChatVisibility chatVisibility;
|
|
|
|
+ private final boolean chatColors;
|
|
|
|
+ private final SkinParts skinparts;
|
|
|
|
+ private final MainHand mainHand;
|
2022-10-26 23:09:03 +00:00
|
|
|
+ private final boolean allowsServerListings;
|
|
|
|
+ private final boolean textFilteringEnabled;
|
2021-06-11 12:02:28 +00:00
|
|
|
+
|
2022-10-26 23:09:03 +00:00
|
|
|
+ @Deprecated
|
2021-06-11 12:02:28 +00:00
|
|
|
+ public PlayerClientOptionsChangeEvent(@NotNull Player player, @NotNull String locale, int viewDistance, @NotNull ChatVisibility chatVisibility, boolean chatColors, @NotNull SkinParts skinParts, @NotNull MainHand mainHand) {
|
|
|
|
+ super(player);
|
|
|
|
+ this.locale = locale;
|
|
|
|
+ this.viewDistance = viewDistance;
|
|
|
|
+ this.chatVisibility = chatVisibility;
|
|
|
|
+ this.chatColors = chatColors;
|
|
|
|
+ this.skinparts = skinParts;
|
|
|
|
+ this.mainHand = mainHand;
|
2022-10-26 23:09:03 +00:00
|
|
|
+ this.allowsServerListings = false;
|
|
|
|
+ this.textFilteringEnabled = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public PlayerClientOptionsChangeEvent(@NotNull Player player, @NotNull Map<ClientOption<?>, ?> options) {
|
|
|
|
+ super(player);
|
|
|
|
+
|
|
|
|
+ this.locale = (String) options.get(ClientOption.LOCALE);
|
|
|
|
+ this.viewDistance = (int) options.get(ClientOption.VIEW_DISTANCE);
|
|
|
|
+ this.chatVisibility = (ChatVisibility) options.get(ClientOption.CHAT_VISIBILITY);
|
|
|
|
+ this.chatColors = (boolean) options.get(ClientOption.CHAT_COLORS_ENABLED);
|
|
|
|
+ this.skinparts = (SkinParts) options.get(ClientOption.SKIN_PARTS);
|
|
|
|
+ this.mainHand = (MainHand) options.get(ClientOption.MAIN_HAND);
|
|
|
|
+ this.allowsServerListings = (boolean) options.get(ClientOption.ALLOW_SERVER_LISTINGS);
|
|
|
|
+ this.textFilteringEnabled = (boolean) options.get(ClientOption.TEXT_FILTERING_ENABLED);
|
2021-06-11 12:02:28 +00:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @NotNull
|
|
|
|
+ public String getLocale() {
|
|
|
|
+ return locale;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasLocaleChanged() {
|
|
|
|
+ return !locale.equals(player.getClientOption(ClientOption.LOCALE));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public int getViewDistance() {
|
|
|
|
+ return viewDistance;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasViewDistanceChanged() {
|
|
|
|
+ return viewDistance != player.getClientOption(ClientOption.VIEW_DISTANCE);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @NotNull
|
|
|
|
+ public ChatVisibility getChatVisibility() {
|
|
|
|
+ return chatVisibility;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasChatVisibilityChanged() {
|
|
|
|
+ return chatVisibility != player.getClientOption(ClientOption.CHAT_VISIBILITY);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasChatColorsEnabled() {
|
|
|
|
+ return chatColors;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasChatColorsEnabledChanged() {
|
|
|
|
+ return chatColors != player.getClientOption(ClientOption.CHAT_COLORS_ENABLED);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @NotNull
|
|
|
|
+ public SkinParts getSkinParts() {
|
|
|
|
+ return skinparts;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasSkinPartsChanged() {
|
|
|
|
+ return skinparts.getRaw() != player.getClientOption(ClientOption.SKIN_PARTS).getRaw();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @NotNull
|
|
|
|
+ public MainHand getMainHand() {
|
|
|
|
+ return mainHand;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasMainHandChanged() {
|
|
|
|
+ return mainHand != player.getClientOption(ClientOption.MAIN_HAND);
|
|
|
|
+ }
|
|
|
|
+
|
2022-10-26 23:09:03 +00:00
|
|
|
+ public boolean allowsServerListings() {
|
|
|
|
+ return allowsServerListings;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasAllowServerListingsChanged() {
|
|
|
|
+ return allowsServerListings != player.getClientOption(ClientOption.ALLOW_SERVER_LISTINGS);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasTextFilteringEnabled() {
|
|
|
|
+ return textFilteringEnabled;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasTextFilteringChanged() {
|
|
|
|
+ return textFilteringEnabled != player.getClientOption(ClientOption.TEXT_FILTERING_ENABLED);
|
|
|
|
+ }
|
|
|
|
+
|
2021-06-11 12:02:28 +00:00
|
|
|
+ @Override
|
|
|
|
+ @NotNull
|
|
|
|
+ public HandlerList getHandlers() {
|
|
|
|
+ return handlers;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @NotNull
|
|
|
|
+ public static HandlerList getHandlerList() {
|
|
|
|
+ return handlers;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
|
2023-02-07 15:55:53 +00:00
|
|
|
index 0dd3fcd86099e5a032b09b46309894d5c3e6f39d..e277cf56c8c2c005efdbe1dd450c158debf46569 100644
|
2021-06-11 12:02:28 +00:00
|
|
|
--- a/src/main/java/org/bukkit/entity/Player.java
|
|
|
|
+++ b/src/main/java/org/bukkit/entity/Player.java
|
2022-09-24 01:38:12 +00:00
|
|
|
@@ -3,6 +3,7 @@ package org.bukkit.entity;
|
2021-06-11 12:02:28 +00:00
|
|
|
import java.net.InetSocketAddress;
|
2022-09-24 01:38:12 +00:00
|
|
|
import java.util.Collection;
|
2021-06-11 12:02:28 +00:00
|
|
|
import java.util.UUID;
|
|
|
|
+import com.destroystokyo.paper.ClientOption; // Paper
|
|
|
|
import com.destroystokyo.paper.Title; // Paper
|
|
|
|
import net.kyori.adventure.text.Component;
|
2022-02-12 13:20:33 +00:00
|
|
|
import org.bukkit.DyeColor;
|
2023-02-07 15:55:53 +00:00
|
|
|
@@ -2534,6 +2535,12 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
2021-06-11 12:02:28 +00:00
|
|
|
* Reset the cooldown counter to 0, effectively starting the cooldown period.
|
|
|
|
*/
|
|
|
|
void resetCooldown();
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @return the client option value of the player
|
|
|
|
+ */
|
|
|
|
+ @NotNull
|
|
|
|
+ <T> T getClientOption(@NotNull ClientOption<T> option);
|
|
|
|
// Paper end
|
|
|
|
|
|
|
|
// Spigot start
|