9
9
import net .md_5 .bungee .api .plugin .Listener ;
10
10
import net .md_5 .bungee .event .EventHandler ;
11
11
12
- import java .util .ArrayList ;
12
+ import java .util .concurrent . CopyOnWriteArrayList ;
13
13
import java .util .List ;
14
14
15
15
/**
@@ -19,7 +19,7 @@ public class Listeners implements Listener {
19
19
20
20
private final ProxyServer proxyServer = ProxyServer .getInstance ();
21
21
22
- private final List <String > loggedInPlayerList = new ArrayList <>();
22
+ private final List <String > loggedInPlayerList = new CopyOnWriteArrayList <>();
23
23
24
24
/**
25
25
* 登录之前不能输入bc指令
@@ -30,62 +30,45 @@ public void onChat(ChatEvent event) {
30
30
if (!event .isProxyCommand () || !(sender instanceof ProxiedPlayer )) return ;
31
31
ProxiedPlayer proxiedPlayer = (ProxiedPlayer ) sender ;
32
32
String message = event .getMessage ();
33
- boolean loggedIn ;
34
33
String playerName = proxiedPlayer .getName ();
35
- synchronized (loggedInPlayerList ) {
36
- loggedIn = loggedInPlayerList .contains (playerName );
37
- }
38
- if (!loggedIn ) {
34
+
35
+ if (!loggedInPlayerList .contains (playerName )) {
39
36
event .setCancelled (true );
40
37
41
38
PluginMain .runAsync (() -> {
42
39
if (Communication .sendConnectRequest (playerName ) == 1 ) {
43
- synchronized (loggedInPlayerList ) {
44
- loggedInPlayerList .add (playerName );
45
- }
46
- PluginMain .instance .getProxy ().getPluginManager ().dispatchCommand (proxiedPlayer , message .substring (1 ));
40
+ loggedInPlayerList .add (playerName );
41
+ proxyServer .getPluginManager ().dispatchCommand (proxiedPlayer , message .substring (1 ));
47
42
}
48
43
});
49
44
}
50
-
51
-
52
45
}
53
46
54
47
/**
55
48
* 玩家切换子服时,检查bc端该玩家的登录状态,
56
- * 如果没有登录,就请求登录服获取登录状态然后更新bc端该玩家的登录状态 ,
57
- * 如果登录服获取结果还是没有登录,就强制把切换目标服务器改为登录服
49
+ * 如果没有登录,在登录服获取登录状态后更新bc端该玩家的登录状态 ,
50
+ * 如果登录服依然未登录,强制切换目标服务器为登录服
58
51
*/
59
52
@ EventHandler
60
53
public void onServerConnect (ServerConnectEvent event ) {
61
54
ServerInfo target = event .getTarget ();
62
55
if (event .isCancelled () || target .getName ().equals (Config .LoginServerName )) return ;
63
56
ProxiedPlayer player = event .getPlayer ();
64
- boolean loggedIn ;
65
- synchronized (loggedInPlayerList ) {
66
- loggedIn = loggedInPlayerList .contains (player .getName ());
67
- }
68
- if (!loggedIn ) {
57
+
58
+ if (!loggedInPlayerList .contains (player .getName ())) {
69
59
PluginMain .runAsync (() -> {
70
60
if (Communication .sendConnectRequest (player .getName ()) == 1 ) {
71
- synchronized (loggedInPlayerList ) {
72
- loggedInPlayerList .add (player .getName ());
73
- player .connect (target );
74
- }
61
+ loggedInPlayerList .add (player .getName ());
62
+ player .connect (target );
75
63
}
76
64
});
77
65
78
66
event .setTarget (proxyServer .getServerInfo (Config .LoginServerName ));
79
-
80
-
81
67
}
82
-
83
68
}
84
69
85
-
86
70
/**
87
- * 玩家切换到登录服务之后,如果bc端是已登录的状态,就使用bc端的登录状态去更新子服的登录状态,
88
- * 避免使玩家每次切换到登录服时需要重新进行登录
71
+ * 玩家切换到登录服务之后,如果bc端已登录模式,使用登录状态更新子服务器登录状态,避免玩家需要重新登录
89
72
*/
90
73
@ EventHandler
91
74
public void onServerConnected (ServerConnectedEvent event ) {
@@ -94,49 +77,32 @@ public void onServerConnected(ServerConnectedEvent event) {
94
77
String playerName = player .getName ();
95
78
96
79
PluginMain .runAsync (() -> {
97
- boolean loggedIn ;
98
- synchronized (loggedInPlayerList ) {
99
- loggedIn = loggedInPlayerList .contains (playerName );
100
- }
101
- if (loggedIn ) {
80
+ if (loggedInPlayerList .contains (playerName )) {
102
81
Communication .sendKeepLoggedInRequest (playerName );
103
82
}
104
-
105
83
});
106
84
}
107
-
108
85
}
109
86
110
87
/**
111
- * 玩家离线时,删除玩家在bc端的登录状态
88
+ * 玩家离线时,从bc端删除玩家的登录状态
112
89
*/
113
90
@ EventHandler
114
91
public void onPlayerDisconnect (PlayerDisconnectEvent event ) {
115
92
ProxiedPlayer player = event .getPlayer ();
116
93
String playerName = player .getName ();
117
- PluginMain .runAsync (() -> {
118
- synchronized (loggedInPlayerList ) {
119
- loggedInPlayerList .remove (playerName );
120
- }
121
- });
94
+ loggedInPlayerList .remove (playerName );
122
95
}
123
96
124
97
/**
125
- * 玩家在登录之前,检查bc端和子服的登录状态,如果是其中一项是已登录,则禁止连接
98
+ * 玩家在登录前,检查bc端和子服务器的登录状态,如果任一已登录,阻止连接
126
99
*/
127
100
@ EventHandler
128
101
public void onPreLogin (PreLoginEvent event ) {
129
102
String playerName = event .getConnection ().getName ();
130
- boolean loggedIn ;
131
- synchronized (loggedInPlayerList ) {
132
- loggedIn = loggedInPlayerList .contains (playerName );
133
- }
134
- if (loggedIn || Communication .sendConnectRequest (playerName ) == 1 ) {
103
+ if (loggedInPlayerList .contains (playerName ) || Communication .sendConnectRequest (playerName ) == 1 ) {
135
104
event .setCancelReason (new TextComponent ("" ));
136
105
event .setCancelled (true );
137
106
}
138
-
139
107
}
140
-
141
-
142
- }
108
+ }
0 commit comments