2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2021-11-27 09:11:43 +01:00
|
|
|
From: MiniDigger <admin@benndorf.dev>
|
2021-06-11 14:02:28 +02:00
|
|
|
Date: Mon, 20 Jan 2020 21:38:15 +0100
|
|
|
|
Subject: [PATCH] Implement Player Client Options API
|
|
|
|
|
2022-11-20 00:53:20 +01:00
|
|
|
== AT ==
|
|
|
|
public net.minecraft.world.entity.player.Player DATA_PLAYER_MODE_CUSTOMISATION
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperSkinParts.java b/src/main/java/com/destroystokyo/paper/PaperSkinParts.java
|
|
|
|
new file mode 100644
|
|
|
|
index 0000000000000000000000000000000000000000..b6f4400df3d8ec7e06a996de54f8cabba57885e1
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperSkinParts.java
|
|
|
|
@@ -0,0 +1,74 @@
|
|
|
|
+package com.destroystokyo.paper;
|
|
|
|
+
|
|
|
|
+import com.google.common.base.Objects;
|
|
|
|
+
|
|
|
|
+import java.util.StringJoiner;
|
|
|
|
+
|
|
|
|
+public class PaperSkinParts implements SkinParts {
|
|
|
|
+
|
|
|
|
+ private final int raw;
|
|
|
|
+
|
|
|
|
+ public PaperSkinParts(int raw) {
|
|
|
|
+ this.raw = raw;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasCapeEnabled() {
|
|
|
|
+ return (raw & 1) == 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasJacketEnabled() {
|
|
|
|
+ return (raw >> 1 & 1) == 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasLeftSleeveEnabled() {
|
|
|
|
+ return (raw >> 2 & 1) == 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasRightSleeveEnabled() {
|
|
|
|
+ return (raw >> 3 & 1) == 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasLeftPantsEnabled() {
|
|
|
|
+ return (raw >> 4 & 1) == 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasRightPantsEnabled() {
|
|
|
|
+ return (raw >> 5 & 1) == 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasHatsEnabled() {
|
|
|
|
+ return (raw >> 6 & 1) == 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int getRaw() {
|
|
|
|
+ return raw;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean equals(Object o) {
|
|
|
|
+ if (this == o) return true;
|
|
|
|
+ if (o == null || getClass() != o.getClass()) return false;
|
|
|
|
+ PaperSkinParts that = (PaperSkinParts) o;
|
|
|
|
+ return raw == that.raw;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int hashCode() {
|
|
|
|
+ return Objects.hashCode(raw);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public String toString() {
|
|
|
|
+ return new StringJoiner(", ", PaperSkinParts.class.getSimpleName() + "[", "]")
|
|
|
|
+ .add("raw=" + raw)
|
|
|
|
+ .add("cape=" + hasCapeEnabled())
|
|
|
|
+ .add("jacket=" + hasJacketEnabled())
|
|
|
|
+ .add("leftSleeve=" + hasLeftSleeveEnabled())
|
|
|
|
+ .add("rightSleeve=" + hasRightSleeveEnabled())
|
|
|
|
+ .add("leftPants=" + hasLeftPantsEnabled())
|
|
|
|
+ .add("rightPants=" + hasRightPantsEnabled())
|
|
|
|
+ .add("hats=" + hasHatsEnabled())
|
|
|
|
+ .toString();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
2024-01-24 13:07:40 +01:00
|
|
|
index f6d266c5b279a22dee273cda109866b627e706da..6e3a791c4623ee904c3348ad7be5ede4b1657a12 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
2024-01-24 13:07:40 +01:00
|
|
|
@@ -338,7 +338,7 @@ public class ServerPlayer extends Player {
|
2023-10-14 20:32:00 +02:00
|
|
|
this.advancements = server.getPlayerList().getPlayerAdvancements(this);
|
|
|
|
this.setMaxUpStep(1.0F);
|
2024-01-21 12:11:43 +01:00
|
|
|
// this.fudgeSpawnLocation(world); // Paper - Don't move existing players to world spawn
|
2023-10-14 20:32:00 +02:00
|
|
|
- this.updateOptions(clientOptions);
|
|
|
|
+ this.updateOptionsNoEvents(clientOptions); // Paper - don't call options events on login
|
|
|
|
|
|
|
|
this.cachedSingleHashSet = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper
|
|
|
|
|
2024-01-24 13:07:40 +01:00
|
|
|
@@ -2004,7 +2004,23 @@ public class ServerPlayer extends Player {
|
2023-03-14 20:54:57 +01:00
|
|
|
}
|
2022-10-27 01:09:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
+ // Paper start - Client option API
|
|
|
|
+ private java.util.Map<com.destroystokyo.paper.ClientOption<?>, ?> getClientOptionMap(String locale, int viewDistance, com.destroystokyo.paper.ClientOption.ChatVisibility chatVisibility, boolean chatColors, com.destroystokyo.paper.PaperSkinParts skinParts, org.bukkit.inventory.MainHand mainHand, boolean allowsServerListing, boolean textFilteringEnabled) {
|
|
|
|
+ java.util.Map<com.destroystokyo.paper.ClientOption<?>, Object> map = new java.util.HashMap<>();
|
|
|
|
+ map.put(com.destroystokyo.paper.ClientOption.LOCALE, locale);
|
|
|
|
+ map.put(com.destroystokyo.paper.ClientOption.VIEW_DISTANCE, viewDistance);
|
|
|
|
+ map.put(com.destroystokyo.paper.ClientOption.CHAT_VISIBILITY, chatVisibility);
|
|
|
|
+ map.put(com.destroystokyo.paper.ClientOption.CHAT_COLORS_ENABLED, chatColors);
|
|
|
|
+ map.put(com.destroystokyo.paper.ClientOption.SKIN_PARTS, skinParts);
|
|
|
|
+ map.put(com.destroystokyo.paper.ClientOption.MAIN_HAND, mainHand);
|
|
|
|
+ map.put(com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS, allowsServerListing);
|
|
|
|
+ map.put(com.destroystokyo.paper.ClientOption.TEXT_FILTERING_ENABLED, textFilteringEnabled);
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
2023-09-22 05:29:51 +02:00
|
|
|
+
|
|
|
|
public void updateOptions(ClientInformation clientOptions) {
|
|
|
|
+ new com.destroystokyo.paper.event.player.PlayerClientOptionsChangeEvent(getBukkitEntity(), getClientOptionMap(clientOptions.language(), clientOptions.viewDistance(), com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(clientOptions.chatVisibility().name()), clientOptions.chatColors(), new com.destroystokyo.paper.PaperSkinParts(clientOptions.modelCustomisation()), clientOptions.mainHand() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT, clientOptions.allowsListing(), clientOptions.textFilteringEnabled())).callEvent(); // Paper - settings event
|
2021-06-11 14:02:28 +02:00
|
|
|
// CraftBukkit start
|
2023-10-27 01:34:58 +02:00
|
|
|
if (this.getMainArm() != clientOptions.mainHand()) {
|
|
|
|
PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(this.getBukkitEntity(), this.getMainArm() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT);
|
2024-01-24 13:07:40 +01:00
|
|
|
@@ -2016,6 +2032,11 @@ public class ServerPlayer extends Player {
|
2023-10-14 20:32:00 +02:00
|
|
|
this.server.server.getPluginManager().callEvent(new com.destroystokyo.paper.event.player.PlayerLocaleChangeEvent(this.getBukkitEntity(), this.language, clientOptions.language())); // Paper
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
+ // Paper start - don't call options events on login
|
|
|
|
+ updateOptionsNoEvents(clientOptions);
|
|
|
|
+ }
|
|
|
|
+ public void updateOptionsNoEvents(ClientInformation clientOptions) {
|
|
|
|
+ // Paper end
|
|
|
|
this.language = clientOptions.language();
|
|
|
|
this.adventure$locale = net.kyori.adventure.translation.Translator.parseLocale(this.language); // Paper
|
|
|
|
this.requestedViewDistance = clientOptions.viewDistance();
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
2024-01-24 13:07:40 +01:00
|
|
|
index 1c8e4e3c53acc1c3043cb015cbe504f4cfb7a35c..549c14e2d861c0b4692ee56e1de5df13ef72f6f8 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
2024-01-24 13:07:40 +01:00
|
|
|
@@ -567,6 +567,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
2022-09-26 10:02:51 +02:00
|
|
|
connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message);
|
|
|
|
}
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
2021-06-14 03:06:38 +02:00
|
|
|
+ public <T> T getClientOption(com.destroystokyo.paper.ClientOption<T> type) {
|
2022-10-27 01:09:03 +02:00
|
|
|
+ if (com.destroystokyo.paper.ClientOption.SKIN_PARTS == type) {
|
2021-06-14 03:06:38 +02:00
|
|
|
+ return type.getType().cast(new com.destroystokyo.paper.PaperSkinParts(getHandle().getEntityData().get(net.minecraft.world.entity.player.Player.DATA_PLAYER_MODE_CUSTOMISATION)));
|
2022-10-27 01:09:03 +02:00
|
|
|
+ } else if (com.destroystokyo.paper.ClientOption.CHAT_COLORS_ENABLED == type) {
|
2021-06-14 03:06:38 +02:00
|
|
|
+ return type.getType().cast(getHandle().canChatInColor());
|
2022-10-27 01:09:03 +02:00
|
|
|
+ } else if (com.destroystokyo.paper.ClientOption.CHAT_VISIBILITY == type) {
|
2021-06-14 03:06:38 +02:00
|
|
|
+ return type.getType().cast(getHandle().getChatVisibility() == null ? com.destroystokyo.paper.ClientOption.ChatVisibility.UNKNOWN : com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(getHandle().getChatVisibility().name()));
|
2022-10-27 01:09:03 +02:00
|
|
|
+ } else if (com.destroystokyo.paper.ClientOption.LOCALE == type) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ return type.getType().cast(getLocale());
|
2022-10-27 01:09:03 +02:00
|
|
|
+ } else if (com.destroystokyo.paper.ClientOption.MAIN_HAND == type) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ return type.getType().cast(getMainHand());
|
2022-10-27 01:09:03 +02:00
|
|
|
+ } else if (com.destroystokyo.paper.ClientOption.VIEW_DISTANCE == type) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ return type.getType().cast(getClientViewDistance());
|
2022-10-27 01:09:03 +02:00
|
|
|
+ } else if (com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS == type) {
|
|
|
|
+ return type.getType().cast(getHandle().allowsListing());
|
|
|
|
+ } else if (com.destroystokyo.paper.ClientOption.TEXT_FILTERING_ENABLED == type) {
|
|
|
|
+ return type.getType().cast(getHandle().isTextFilteringEnabled());
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+ throw new RuntimeException("Unknown settings type");
|
|
|
|
+ }
|
|
|
|
// Paper end
|
|
|
|
|
2021-06-14 03:06:38 +02:00
|
|
|
@Override
|
2021-08-14 06:11:12 +02:00
|
|
|
diff --git a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
|
|
|
|
new file mode 100644
|
2023-09-25 01:05:05 +02:00
|
|
|
index 0000000000000000000000000000000000000000..7f8b6462d2a1bbd39a870d2543bebc135f7eb45b
|
2021-08-14 06:11:12 +02:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
|
2022-06-08 17:31:27 +02:00
|
|
|
@@ -0,0 +1,18 @@
|
2021-08-14 06:11:12 +02:00
|
|
|
+package io.papermc.paper.world;
|
|
|
|
+
|
|
|
|
+import com.destroystokyo.paper.ClientOption;
|
|
|
|
+import net.minecraft.world.entity.player.ChatVisiblity;
|
|
|
|
+import org.bukkit.Difficulty;
|
2023-09-24 09:16:58 +02:00
|
|
|
+import org.junit.jupiter.api.Assertions;
|
|
|
|
+import org.junit.jupiter.api.Test;
|
2021-08-14 06:11:12 +02:00
|
|
|
+
|
|
|
|
+public class TranslationKeyTest {
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testChatVisibilityKeys() {
|
|
|
|
+ for (ClientOption.ChatVisibility chatVisibility : ClientOption.ChatVisibility.values()) {
|
|
|
|
+ if (chatVisibility == ClientOption.ChatVisibility.UNKNOWN) continue;
|
2023-09-25 01:05:05 +02:00
|
|
|
+ Assertions.assertEquals(ChatVisiblity.valueOf(chatVisibility.name()).getKey(), chatVisibility.translationKey(), chatVisibility + "'s translation key doesn't match");
|
2021-08-14 06:11:12 +02:00
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|