@@ -5,6 +5,7 @@ Subject: [PATCH] Implement Player Client Options API
5
5
6
6
== AT ==
7
7
public net.minecraft.world.entity.player.Player DATA_PLAYER_MODE_CUSTOMISATION
8
+ public net.minecraft.server.level.ServerPlayer particleStatus
8
9
9
10
diff --git a/src/main/java/com/destroystokyo/paper/PaperSkinParts.java b/src/main/java/com/destroystokyo/paper/PaperSkinParts.java
10
11
new file mode 100644
@@ -87,7 +88,7 @@ index 0000000000000000000000000000000000000000..b6f4400df3d8ec7e06a996de54f8cabb
87
88
+ }
88
89
+ }
89
90
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
90
- index 363175d3325c012f31ba84060bb0bfac694f6ab8..9911e231ad021286f2da90057b06874f7b4e3b4d 100644
91
+ index 0c68c0a9ec9b353b353eff0c36af2993df5f59b3..eebf44c7124c4f48b6d48562a00633b1e8ff9b00 100644
91
92
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
92
93
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
93
94
@@ -420,7 +420,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
@@ -99,31 +100,27 @@ index 363175d3325c012f31ba84060bb0bfac694f6ab8..9911e231ad021286f2da90057b06874f
99
100
this.object = null;
100
101
101
102
// CraftBukkit start
102
- @@ -2404,7 +2404,23 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
103
- }
103
+ @@ -2405,6 +2405,19 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
104
104
}
105
105
106
- + // Paper start - Client option API
107
- + 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) {
108
- + java.util.Map<com.destroystokyo.paper.ClientOption<?>, Object> map = new java.util.HashMap<>();
109
- + map.put(com.destroystokyo.paper.ClientOption.LOCALE, locale);
110
- + map.put(com.destroystokyo.paper.ClientOption.VIEW_DISTANCE, viewDistance);
111
- + map.put(com.destroystokyo.paper.ClientOption.CHAT_VISIBILITY, chatVisibility);
112
- + map.put(com.destroystokyo.paper.ClientOption.CHAT_COLORS_ENABLED, chatColors);
113
- + map.put(com.destroystokyo.paper.ClientOption.SKIN_PARTS, skinParts);
114
- + map.put(com.destroystokyo.paper.ClientOption.MAIN_HAND, mainHand);
115
- + map.put(com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS, allowsServerListing);
116
- + map.put(com.destroystokyo.paper.ClientOption.TEXT_FILTERING_ENABLED, textFilteringEnabled);
117
- + return map;
118
- + }
119
- + // Paper end
120
- +
121
106
public void updateOptions(ClientInformation clientOptions) {
122
- + 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
107
+ + // Paper start - settings event
108
+ + new com.destroystokyo.paper.event.player.PlayerClientOptionsChangeEvent(this.getBukkitEntity(), Util.make(new java.util.IdentityHashMap<>(), map -> {
109
+ + map.put(com.destroystokyo.paper.ClientOption.LOCALE, clientOptions.language());
110
+ + map.put(com.destroystokyo.paper.ClientOption.VIEW_DISTANCE, clientOptions.viewDistance());
111
+ + map.put(com.destroystokyo.paper.ClientOption.CHAT_VISIBILITY, com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(clientOptions.chatVisibility().name()));
112
+ + map.put(com.destroystokyo.paper.ClientOption.CHAT_COLORS_ENABLED, clientOptions.chatColors());
113
+ + map.put(com.destroystokyo.paper.ClientOption.SKIN_PARTS, new com.destroystokyo.paper.PaperSkinParts(clientOptions.modelCustomisation()));
114
+ + map.put(com.destroystokyo.paper.ClientOption.MAIN_HAND, clientOptions.mainHand() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT);
115
+ + map.put(com.destroystokyo.paper.ClientOption.TEXT_FILTERING_ENABLED, clientOptions.textFilteringEnabled());
116
+ + map.put(com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS, clientOptions.allowsListing());
117
+ + map.put(com.destroystokyo.paper.ClientOption.PARTICLE_VISIBILITY, com.destroystokyo.paper.ClientOption.ParticleVisibility.valueOf(clientOptions.particleStatus().name()));
118
+ + })).callEvent();
119
+ + // Paper end - settings event
123
120
// CraftBukkit start
124
121
if (this.getMainArm() != clientOptions.mainHand()) {
125
122
PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(this.getBukkitEntity(), this.getMainArm() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT);
126
- @@ -2415,6 +2431 ,11 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
123
+ @@ -2415,6 +2428 ,11 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
127
124
this.server.server.getPluginManager().callEvent(event);
128
125
}
129
126
// CraftBukkit end
@@ -136,32 +133,34 @@ index 363175d3325c012f31ba84060bb0bfac694f6ab8..9911e231ad021286f2da90057b06874f
136
133
this.adventure$locale = java.util.Objects.requireNonNullElse(net.kyori.adventure.translation.Translator.parseLocale(this.language), java.util.Locale.US); // Paper
137
134
this.requestedViewDistance = clientOptions.viewDistance();
138
135
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
139
- index 341dbff92d15886afe8fe628e06d1c07817241ed..66e5e949c8711103ae9bf73161422f350c217874 100644
136
+ index b3b13f1baea0b170fd4f1546689aad40f53d3c27..8cfcd8797d056be07b09ec9627bc35bf75eb0d2d 100644
140
137
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
141
138
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
142
- @@ -658,6 +658,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
139
+ @@ -658,6 +658,30 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
143
140
connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message);
144
141
}
145
142
}
146
143
+
147
144
+ @Override
148
145
+ public <T> T getClientOption(com.destroystokyo.paper.ClientOption<T> type) {
149
146
+ if (com.destroystokyo.paper.ClientOption.SKIN_PARTS == type) {
150
- + return type.getType().cast(new com.destroystokyo.paper.PaperSkinParts(getHandle().getEntityData().get(net.minecraft.world.entity.player.Player.DATA_PLAYER_MODE_CUSTOMISATION)));
147
+ + return type.getType().cast(new com.destroystokyo.paper.PaperSkinParts(this. getHandle().getEntityData().get(net.minecraft.world.entity.player.Player.DATA_PLAYER_MODE_CUSTOMISATION)));
151
148
+ } else if (com.destroystokyo.paper.ClientOption.CHAT_COLORS_ENABLED == type) {
152
- + return type.getType().cast(getHandle().canChatInColor());
149
+ + return type.getType().cast(this. getHandle().canChatInColor());
153
150
+ } else if (com.destroystokyo.paper.ClientOption.CHAT_VISIBILITY == type) {
154
- + return type.getType().cast(getHandle().getChatVisibility() == null ? com.destroystokyo.paper.ClientOption.ChatVisibility.UNKNOWN : com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(getHandle().getChatVisibility().name()));
151
+ + return type.getType().cast(this. getHandle().getChatVisibility() == null ? com.destroystokyo.paper.ClientOption.ChatVisibility.UNKNOWN : com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(this. getHandle().getChatVisibility().name()));
155
152
+ } else if (com.destroystokyo.paper.ClientOption.LOCALE == type) {
156
- + return type.getType().cast(getLocale());
153
+ + return type.getType().cast(this. getLocale());
157
154
+ } else if (com.destroystokyo.paper.ClientOption.MAIN_HAND == type) {
158
- + return type.getType().cast(getMainHand());
155
+ + return type.getType().cast(this. getMainHand());
159
156
+ } else if (com.destroystokyo.paper.ClientOption.VIEW_DISTANCE == type) {
160
- + return type.getType().cast(getClientViewDistance());
161
- + } else if (com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS == type) {
162
- + return type.getType().cast(getHandle().allowsListing());
157
+ + return type.getType().cast(this.getClientViewDistance());
163
158
+ } else if (com.destroystokyo.paper.ClientOption.TEXT_FILTERING_ENABLED == type) {
164
- + return type.getType().cast(getHandle().isTextFilteringEnabled());
159
+ + return type.getType().cast(this.getHandle().isTextFilteringEnabled());
160
+ + } else if (com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS == type) {
161
+ + return type.getType().cast(this.getHandle().allowsListing());
162
+ + } else if (com.destroystokyo.paper.ClientOption.PARTICLE_VISIBILITY == type) {
163
+ + return type.getType().cast(com.destroystokyo.paper.ClientOption.ParticleVisibility.valueOf(this.getHandle().particleStatus.name()));
165
164
+ }
166
165
+ throw new RuntimeException("Unknown settings type");
167
166
+ }
@@ -170,15 +169,15 @@ index 341dbff92d15886afe8fe628e06d1c07817241ed..66e5e949c8711103ae9bf73161422f35
170
169
@Override
171
170
diff --git a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
172
171
new file mode 100644
173
- index 0000000000000000000000000000000000000000..7f8b6462d2a1bbd39a870d2543bebc135f7eb45b
172
+ index 0000000000000000000000000000000000000000..01e0936ea8ce5bcacafd9e89a1c0dfd2c172024d
174
173
--- /dev/null
175
174
+++ b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
176
- @@ -0,0 +1,18 @@
175
+ @@ -0,0 +1,25 @@
177
176
+ package io.papermc.paper.world;
178
177
+
179
178
+ import com.destroystokyo.paper.ClientOption;
179
+ + import net.minecraft.server.level.ParticleStatus;
180
180
+ import net.minecraft.world.entity.player.ChatVisiblity;
181
- + import org.bukkit.Difficulty;
182
181
+ import org.junit.jupiter.api.Assertions;
183
182
+ import org.junit.jupiter.api.Test;
184
183
+
@@ -191,4 +190,11 @@ index 0000000000000000000000000000000000000000..7f8b6462d2a1bbd39a870d2543bebc13
191
190
+ Assertions.assertEquals(ChatVisiblity.valueOf(chatVisibility.name()).getKey(), chatVisibility.translationKey(), chatVisibility + "'s translation key doesn't match");
192
191
+ }
193
192
+ }
193
+ +
194
+ + @Test
195
+ + public void testParticleVisibilityKeys() {
196
+ + for (ClientOption.ParticleVisibility particleVisibility : ClientOption.ParticleVisibility.values()) {
197
+ + Assertions.assertEquals(ParticleStatus.valueOf(particleVisibility.name()).getKey(), particleVisibility.translationKey(), particleVisibility + "'s translation key doesn't match");
198
+ + }
199
+ + }
194
200
+ }
0 commit comments