Skip to content

Commit 1924266

Browse files
fixed unsuccessful connections to the server that led to the queue blocking and added titles
1 parent d03c05b commit 1924266

5 files changed

Lines changed: 80 additions & 23 deletions

File tree

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,15 @@ tasks {
5858
}
5959
}
6060

61-
tasks.register('runServerMain', runServer.getClass()) {
61+
tasks.register('runServerMain', runServer.getClass() as Class<Task>) {
6262
minecraftVersion("${project.minecraft_version}")
6363
systemProperty('com.mojang.eula.agree', 'true')
6464
systemProperty('Paper.skipServerPropertiesComments', 'true')
6565
runDirectory = layout.projectDirectory.dir('run').dir('main')
6666
dependsOn('build')
6767
}
6868

69-
tasks.register('runServerQueue', runServer.getClass()) {
69+
tasks.register('runServerQueue', runServer.getClass() as Class<Task>) {
7070
minecraftVersion("${project.minecraft_version}")
7171
systemProperty('com.mojang.eula.agree', 'true')
7272
systemProperty('Paper.skipServerPropertiesComments', 'true')

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
plugin_version=3.0.5-INDEV
1+
plugin_version=3.0.6-INDEV
22
velocity_api_version=3.3.0-SNAPSHOT
33
minecraft_version=1.20.6

src/main/java/org/zeroBzeroT/anarchyqueue/Config.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public class Config {
2929

3030
public static int waitOnKick = 16;
3131

32+
public static boolean sendTitle = true;
33+
3234
/**
3335
* Load the config from the plugin data folder
3436
*
@@ -65,5 +67,6 @@ static void loadConfig(Path path) throws IOException {
6567
messageOffline = toml.getString("message-offline", "Server is currently down!");
6668
kick = toml.getBoolean("kick", true);
6769
waitOnKick = toml.getLong("wait-on-kick", 16L).intValue();
70+
sendTitle = toml.getBoolean("send-title", true);
6871
}
6972
}

src/main/java/org/zeroBzeroT/anarchyqueue/Queue.java

Lines changed: 73 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.velocitypowered.api.proxy.server.RegisteredServer;
99
import net.kyori.adventure.text.Component;
1010
import net.kyori.adventure.text.logger.slf4j.ComponentLogger;
11+
import net.kyori.adventure.title.Title;
1112

1213
import java.time.Duration;
1314
import java.time.Instant;
@@ -19,6 +20,8 @@
1920

2021
// velocity api event docs:
2122
// https://jd.papermc.io/velocity/3.3.0/com/velocitypowered/api/event/package-summary.html
23+
// TODO: direct connection to the main server if the queue is empty
24+
// TODO: replace player objects with uuids
2225

2326
public class Queue {
2427
private final ComponentLogger log;
@@ -99,18 +102,7 @@ public void onKickedFromServer(KickedFromServerEvent event) {
99102
Player player = event.getPlayer();
100103
Component reason = event.getServerKickReason().isPresent() ? event.getServerKickReason().get() : mm("Kicked without a reason.");
101104

102-
// - kicking is not enabled
103-
if (!Config.kick) {
104-
// save the disconnection time
105-
kickedPlayers.put(player, Instant.now().getEpochSecond());
106-
107-
// send message
108-
player.sendMessage(mm("<gold>You were sent back to the queue for: <red>").append(reason).append(mm("<reset>")));
109-
log.info(mm("<white>" + player.getUsername() + "<dark_aqua> was sent back to server <yellow>" + Config.queue + "<dark_aqua> after a disconnection (\"").append(reason).append(mm("<dark_aqua>\"). Kicked count is " + kickedPlayers.size() + ".")));
110-
} else {
111-
// set the disconnect reason from the target server (not the bungee message)
112-
player.disconnect(reason);
113-
}
105+
KickOrRequeue(player, reason);
114106
} catch (InterruptedException e1) {
115107
e1.printStackTrace();
116108
} finally {
@@ -119,6 +111,30 @@ public void onKickedFromServer(KickedFromServerEvent event) {
119111
}
120112
}
121113

114+
/**
115+
* Kick a player if kicking is allowed in the config
116+
*
117+
* @param player Player to kick
118+
* @param reason kicking reason from the target server
119+
*/
120+
private void KickOrRequeue(Player player, Component reason) {
121+
// is kicking enabled?
122+
if (!Config.kick) {
123+
// save the disconnection time
124+
kickedPlayers.put(player, Instant.now().getEpochSecond());
125+
126+
// send message
127+
player.sendMessage(mm("<gold>You were sent back to the queue for: <red>").append(reason).append(mm("<reset>")));
128+
log.info(mm("<white>" + player.getUsername() + "<dark_aqua> was sent back to server <yellow>" + Config.queue + "<dark_aqua> after a disconnection (\"").append(reason).append(mm("<dark_aqua>\"). Kicked count is " + kickedPlayers.size() + ".")));
129+
} else {
130+
playerQueue.remove(player);
131+
132+
// set the disconnect reason from the parameter (not the velocity message)
133+
player.disconnect(reason);
134+
log.info(mm("<white>" + player.getUsername() + "<dark_aqua> was kicked from the server (\"").append(reason).append(mm("<dark_aqua>\"). Queue count is " + playerQueue.size() + ".")));
135+
}
136+
}
137+
122138
/**
123139
* Try to connect one player to the server.
124140
*/
@@ -166,6 +182,7 @@ public void flushQueue() {
166182
break;
167183
}
168184

185+
// no player to connect to the main server
169186
if (currPlayer == null) {
170187
mutex.release();
171188
return;
@@ -178,23 +195,29 @@ public void flushQueue() {
178195
serverQueue.getPlayersConnected().stream()
179196
.filter(p -> p.getUniqueId().equals(uuid))
180197
.findAny().ifPresentOrElse(p -> {
181-
// TODO: direct connection to the main server if the queue is empty
182198
p.sendMessage(mm(Config.messageConnecting));
183199
try {
184-
if (p.createConnectionRequest(serverMain).connect().get().isSuccessful()) {
200+
var conReq = p.createConnectionRequest(serverMain).connect().get();
201+
202+
if (conReq.isSuccessful()) {
185203
playerQueue.removeFirst();
204+
// Clear the title
205+
if (Config.sendTitle) {
206+
sendTitle(finalCurrPlayer, mm(" "), mm(" "), 0, 0, 0);
207+
}
186208
log.info(mm("<white>" + p.getUsername() + "<dark_aqua> connected to server <aqua>" + serverMain.getServerInfo().getName() + "<dark_aqua>. Queue count is " + serverQueue.getPlayersConnected().size() + ". Main count is " + (serverMain.getPlayersConnected().size()) + " of " + Config.maxPlayers + "."));
209+
} else {
210+
var reason = conReq.getReasonComponent().isPresent() ? conReq.getReasonComponent().get() : mm("Connection to the main server failed.");
211+
KickOrRequeue(finalCurrPlayer, reason);
187212
}
188213
} catch (InterruptedException | ExecutionException e) {
189-
log.error(mm("<white>" + p.getUsername() + "s<red> connection to server <aqua>" + Config.target + "<red> failed: " + e.getMessage()));
190-
// count that as a kick ;)
214+
log.error(mm("<white>" + p.getUsername() + "s<red> connection to server <aqua>" + Config.target + "<red> failed with an exception: " + e.getMessage()));
215+
// server down?
191216
kickedPlayers.put(finalCurrPlayer, Instant.now().getEpochSecond());
192217
}
193218
},
194-
() -> {
195-
log.error(mm("<white>" + finalCurrPlayer.getUsername() + "s<red> connection to server <aqua>" + Config.target + "<red> failed: player is not connected to " + serverQueue.getServerInfo().getName()));
196-
playerQueue.removeFirst();
197-
}
219+
// player is in the queue, but not connected to the queue server
220+
playerQueue::removeFirst
198221
);
199222
} catch (InterruptedException e) {
200223
e.printStackTrace();
@@ -211,6 +234,13 @@ public void sendUpdate() {
211234

212235
for (Player player : playerQueue) {
213236
player.sendMessage(mm(Config.messagePosition.replaceAll("%position%", Integer.toString(i)).replaceAll("%size%", Integer.toString(playerQueue.size()))));
237+
238+
// Title in the center of the screen
239+
if (Config.sendTitle) {
240+
// 10 Seconds + 1 s buffer
241+
sendTitle(player, mm(" "), mm(Config.messagePosition.replaceAll("%position%", Integer.toString(i)) + "<reset>"), 0, 20 * 11, 0);
242+
}
243+
214244
i++;
215245
}
216246
}
@@ -237,4 +267,27 @@ private RegisteredServer getServer(String name) throws ServerNotReachableExcepti
237267

238268
return server;
239269
}
270+
271+
/**
272+
* Sends a title and a subtitle message to the player.
273+
*
274+
* @param title Title text
275+
* @param subtitle Subtitle text
276+
* @param fadeIn Time in ticks for titles to fade in. Defaults to 10.
277+
* @param stay Time in ticks for titles to stay. Defaults to 70.
278+
* @param fadeOut Time in ticks for titles to fade out. Defaults to 20.
279+
*/
280+
public void sendTitle(Player player, Component title, Component subtitle, int fadeIn, int stay, int fadeOut) {
281+
try {
282+
Title bungeeTitle = Title.title(
283+
title,
284+
subtitle,
285+
Title.Times.times(Duration.ofMillis(fadeIn * 20L),
286+
Duration.ofMillis(stay * 20L),
287+
Duration.ofMillis(fadeOut * 20L)));
288+
player.showTitle(bungeeTitle);
289+
} catch (Exception e) {
290+
log.error(mm("<red>Could not send title to <white>" + player.getUsername() + "<red>: " + e.getMessage()));
291+
}
292+
}
240293
}

src/main/resources/config.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ message-full = "<red>Server is currently full!<reset>"
88
message-offline = "<red>Server is currently down!<reset>"
99
kick = true
1010
wait-on-kick = 16
11+
send-title = true

0 commit comments

Comments
 (0)