19
19
import net .kyori .adventure .text .Component ;
20
20
import net .kyori .adventure .text .serializer .legacy .LegacyComponentSerializer ;
21
21
import org .jetbrains .annotations .NotNull ;
22
+ import org .jetbrains .annotations .Nullable ;
22
23
23
24
import java .util .Collections ;
24
25
import java .util .HashMap ;
25
26
import java .util .Map ;
27
+ import java .util .Objects ;
26
28
import java .util .Optional ;
27
29
import java .util .UUID ;
28
30
import java .util .concurrent .ConcurrentHashMap ;
29
31
30
32
public class VelocityLanguagePlayer extends TritonLanguagePlayer <Player > {
31
- @ Getter
32
- private final Player parent ;
33
+ @ NotNull
34
+ private final UUID uuid ;
35
+ @ Nullable
36
+ @ Setter
37
+ private Player parent ;
33
38
34
39
private Language language ;
35
40
@@ -45,21 +50,21 @@ public class VelocityLanguagePlayer extends TritonLanguagePlayer<Player> {
45
50
private String clientLocale ;
46
51
private final RefreshFeatures refresher ;
47
52
48
- public VelocityLanguagePlayer (@ NotNull Player parent ) {
53
+ public VelocityLanguagePlayer (@ NotNull UUID uuid ) {
49
54
super ();
50
- this .parent = parent ;
55
+ Objects .requireNonNull (uuid , "cannot build VelocityLanguagePlayer from null UUID" );
56
+ this .uuid = uuid ;
51
57
this .refresher = new RefreshFeatures (this );
52
58
Triton .get ().runAsync (this ::load );
53
59
}
54
60
55
- public static VelocityLanguagePlayer fromUUID (UUID uuid ) {
56
- val player = VelocityTriton .asVelocity ().getLoader ().getServer ().getPlayer (uuid );
57
- return player .map (VelocityLanguagePlayer ::new ).orElse (null );
58
- }
59
-
60
61
@ Override
61
62
public @ NotNull Optional <Player > getPlatformPlayer () {
62
- return Optional .of (this .parent );
63
+ if (this .parent == null ) {
64
+ return VelocityTriton .asVelocity ().getLoader ().getServer ().getPlayer (this .uuid );
65
+ } else {
66
+ return Optional .of (this .parent );
67
+ }
63
68
}
64
69
65
70
public void setBossbar (UUID uuid , Component lastBossBar ) {
@@ -119,14 +124,18 @@ public void setLang(Language language) {
119
124
120
125
public void setLang (Language language , boolean sendToSpigot ) {
121
126
// TODO fire Triton's API change language event
122
- if (this .waitingForClientLocale && getParent () != null )
123
- parent .sendMessage (LegacyComponentSerializer .legacyAmpersand ().deserialize (Triton .get ().getMessagesConfig ()
124
- .getMessage ("success.detected-language" , language .getDisplayName ())));
127
+ val player = getPlatformPlayer ();
128
+ if (this .waitingForClientLocale ) {
129
+ player .ifPresent (parent -> parent .sendMessage (
130
+ LegacyComponentSerializer .legacyAmpersand ().deserialize (Triton .get ().getMessagesConfig ()
131
+ .getMessage ("success.detected-language" , language .getDisplayName ()))));
132
+
133
+ }
125
134
this .language = language ;
126
135
this .waitingForClientLocale = false ;
127
136
128
- if (sendToSpigot && getParent () != null ) {
129
- VelocityTriton .asVelocity ().getBridgeManager ().sendPlayerLanguage (this );
137
+ if (sendToSpigot ) {
138
+ player . ifPresent ( p -> VelocityTriton .asVelocity ().getBridgeManager ().sendPlayerLanguage (this ) );
130
139
}
131
140
132
141
save ();
@@ -146,50 +155,59 @@ public void injectNettyPipeline() {
146
155
Triton .get ().getLogger ().logDebug ("Skipped injecting into netty pipeline for player %1 because PacketEvents is in use" , getUUID ());
147
156
return ;
148
157
}
149
- ConnectedPlayer connectedPlayer = (ConnectedPlayer ) this .parent ;
150
- connectedPlayer .getConnection ().getChannel ().pipeline ()
151
- .addAfter (Connections .MINECRAFT_ENCODER , "triton-custom-encoder" , new VelocityNettyEncoder (this ));
158
+ val player = this .getPlatformPlayer ();
159
+ player .ifPresent (parent -> {
160
+ ConnectedPlayer connectedPlayer = (ConnectedPlayer ) parent ;
161
+ connectedPlayer .getConnection ().getChannel ().pipeline ()
162
+ .addAfter (Connections .MINECRAFT_ENCODER , "triton-custom-encoder" , new VelocityNettyEncoder (this ));
163
+ });
152
164
}
153
165
154
166
@ Override
155
167
public UUID getUUID () {
156
- return this .parent . getUniqueId () ;
168
+ return this .uuid ;
157
169
}
158
170
159
171
public @ NotNull ProtocolVersion getProtocolVersion () {
160
- return this .getParent ().getProtocolVersion ( );
172
+ return this .getPlatformPlayer ().map ( Player :: getProtocolVersion ). orElse ( ProtocolVersion . UNKNOWN );
161
173
}
162
174
163
175
private void load () {
176
+ val player = getPlatformPlayer ();
164
177
this .language = Triton .get ().getStorage ().getLanguage (this );
165
178
if (this .clientLocale != null && this .isWaitingForClientLocale ()) {
166
179
this .waitingForClientLocale = false ;
167
180
this .language = Triton .get ().getLanguageManager ().getLanguageByLocaleOrDefault (this .clientLocale );
168
- if (getParent () != null ) {
169
- getParent ().sendMessage (LegacyComponentSerializer .legacyAmpersand ().deserialize (Triton .get ().getMessagesConfig ()
170
- .getMessage ("success.detected-language" , language .getDisplayName ())));
171
- }
172
- }
173
- if (getParent () != null ) {
174
- Triton .get ().getStorage ()
175
- .setLanguage (null , SocketUtils .getIpAddress (getParent ().getRemoteAddress ()), language );
181
+ player .ifPresent (parent -> parent .sendMessage (
182
+ LegacyComponentSerializer .legacyAmpersand ().deserialize (Triton .get ().getMessagesConfig ()
183
+ .getMessage ("success.detected-language" , language .getDisplayName ()))));
176
184
}
185
+ player .ifPresent (parent -> Triton .get ().getStorage ()
186
+ .setLanguage (null , SocketUtils .getIpAddress (parent .getRemoteAddress ()), language ));
177
187
}
178
188
179
189
private void save () {
180
190
Triton .get ().runAsync (() -> {
181
- val ip = SocketUtils .getIpAddress (getParent ().getRemoteAddress ());
182
- Triton .get ().getStorage ().setLanguage (getParent ().getUniqueId (), ip , language );
191
+ val ip = getPlatformPlayer ()
192
+ .map (player -> SocketUtils .getIpAddress (player .getRemoteAddress ()))
193
+ .orElse (null );
194
+ Triton .get ().getStorage ().setLanguage (getUUID (), ip , language );
183
195
});
184
196
}
185
197
186
198
public void executeCommands (RegisteredServer overrideServer ) {
187
- val currentServer = getParent ().getCurrentServer ();
199
+ val playerOpt = getPlatformPlayer ();
200
+ if (!playerOpt .isPresent ()) {
201
+ return ;
202
+ }
203
+ val player = playerOpt .get ();
204
+
205
+ val currentServer = player .getCurrentServer ();
188
206
if (overrideServer == null && !currentServer .isPresent ()) return ;
189
207
val server = overrideServer == null ? currentServer .get ().getServer () : overrideServer ;
190
208
for (val cmd : ((com .rexcantor64 .triton .language .Language ) language ).getCmds ()) {
191
- val cmdText = cmd .getCmd ().replace ("%player%" , getParent () .getUsername ())
192
- .replace ("%uuid%" , getParent () .getUniqueId ().toString ());
209
+ val cmdText = cmd .getCmd ().replace ("%player%" , player .getUsername ())
210
+ .replace ("%uuid%" , player .getUniqueId ().toString ());
193
211
194
212
if (!cmd .isUniversal () && !cmd .getServers ().contains (server .getServerInfo ().getName ())) {
195
213
continue ;
@@ -200,20 +218,19 @@ public void executeCommands(RegisteredServer overrideServer) {
200
218
if (cmd .getType () == ExecutableCommand .Type .SERVER ) {
201
219
VelocityTriton .asVelocity ().getBridgeManager ().sendExecutableCommand (cmdText , server );
202
220
} else if (cmd .getType () == ExecutableCommand .Type .PLAYER ) {
203
- getParent () .spoofChatInput ("/" + cmdText );
221
+ player .spoofChatInput ("/" + cmdText );
204
222
} else if (cmd .getType () == ExecutableCommand .Type .BUNGEE ) {
205
223
velocity .getCommandManager ().executeAsync (velocity .getConsoleCommandSource (), cmdText );
206
224
} else if (cmd .getType () == ExecutableCommand .Type .BUNGEE_PLAYER ) {
207
- velocity .getCommandManager ().executeAsync (getParent () , cmdText );
225
+ velocity .getCommandManager ().executeAsync (player , cmdText );
208
226
}
209
227
}
210
228
}
211
229
212
230
@ Override
213
231
public String toString () {
214
232
return "VelocityLanguagePlayer{" +
215
- "username=" + parent .getUsername () +
216
- ", uuid=" + parent .getUniqueId () +
233
+ "uuid=" + this .getUUID () +
217
234
", language=" + Optional .ofNullable (language ).map (Language ::getName ).orElse ("null" ) +
218
235
'}' ;
219
236
}
0 commit comments