initial commit

This commit is contained in:
Elias Müller 2021-11-27 23:06:48 +01:00
commit 441ded118b
24 changed files with 449 additions and 0 deletions

3
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

8
.idea/artifacts/BungeeQueue_jar.xml generated Normal file
View File

@ -0,0 +1,8 @@
<component name="ArtifactManager">
<artifact type="jar" name="BungeeQueue:jar">
<output-path>$PROJECT_DIR$/out/artifacts/BungeeQueue_jar</output-path>
<root id="archive" name="BungeeQueue.jar">
<element id="module-output" name="BungeeQueue" />
</root>
</artifact>
</component>

9
.idea/libraries/waterfall_1_17_451.xml generated Normal file
View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="waterfall-1.17-451">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../ClientBlocker/run/proxy/waterfall-1.17-451.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

11
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<list size="1">
<item index="0" class="java.lang.String" itemvalue="net.md_5.bungee.event.EventHandler" />
</list>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="adopt-openjdk-11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/BungeeQueue.iml" filepath="$PROJECT_DIR$/BungeeQueue.iml" />
</modules>
</component>
</project>

10
.idea/runConfigurations.xml generated Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
</set>
</option>
</component>
</project>

124
.idea/uiDesigner.xml generated Normal file
View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

21
BungeeQueue.iml Normal file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="minecraft" name="Minecraft">
<configuration>
<autoDetectTypes>
<platformType>WATERFALL</platformType>
</autoDetectTypes>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="waterfall-1.17-451" level="project" />
</component>
</module>

Binary file not shown.

View File

@ -0,0 +1,3 @@
name: BungeeQueue
main: eu.mhsl.minecraft.bungeequeue.BungeeQueue
version: 0.1

View File

@ -0,0 +1,47 @@
package eu.mhsl.minecraft.bungeequeue;
import eu.mhsl.minecraft.bungeequeue.command.MaxPlayers;
import eu.mhsl.minecraft.bungeequeue.listener.PlayerJoin;
import eu.mhsl.minecraft.bungeequeue.scheduler.MoveToTarget;
import eu.mhsl.minecraft.bungeequeue.scheduler.PlayersWaitingCheck;
import eu.mhsl.minecraft.bungeequeue.scheduler.QueueInfoMessager;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Plugin;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class BungeeQueue extends Plugin {
public static Plugin plugin;
public static ServerInfo queueServer;
public static ServerInfo targetServer;
public static int maxPlayers = 1; //mutable per command
public static List<ProxiedPlayer> list = new ArrayList<>();
@Override
public void onEnable() {
plugin = this;
ProxyServer instance = ProxyServer.getInstance();
queueServer = instance.getServerInfo("queue");
targetServer = instance.getServerInfo("server");
instance.getPluginManager().registerListener(this, new PlayerJoin());
instance.getPluginManager().registerCommand(this, new MaxPlayers());
instance.getScheduler().schedule(this, new MoveToTarget(), 5, 1, TimeUnit.SECONDS);
instance.getScheduler().schedule(this, new QueueInfoMessager(), 5, 2, TimeUnit.SECONDS);
instance.getScheduler().schedule(this, new PlayersWaitingCheck(), 10, 10, TimeUnit.SECONDS);
}
public void onDisable() {
}
}

View File

@ -0,0 +1,95 @@
package eu.mhsl.minecraft.bungeequeue.command;
import eu.mhsl.minecraft.bungeequeue.BungeeQueue;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class MaxPlayers extends Command {
public MaxPlayers() {
super("maxplayers", "bungeequeue.queue");
}
@Override
public void execute(CommandSender p, String[] strings) {
if(strings.length >= 1) {
switch (strings[0]) {
case "set":
if(strings.length == 2) {
BungeeQueue.maxPlayers = Integer.parseInt(strings[1]);
p.sendMessage(new ComponentBuilder("Die Maximale Spieleranzahl wurde auf " + strings[1] + " gesetzt.").color(ChatColor.GREEN).create());
} else p.sendMessage(new ComponentBuilder("Bitte definiere die maximale Spieleranzahl: /maxplayers set <amount> ").color(ChatColor.RED).create());
break;
case "query":
p.sendMessage(new ComponentBuilder("Die aktuelle Spielerzahl ist " + BungeeQueue.maxPlayers).color(ChatColor.GREEN)
.append("\n... davon belegt " + BungeeQueue.targetServer.getPlayers().size()).color(ChatColor.GREEN)
.append("\ndu kannst 'enforce' nutzen, um eine Überbelegung zu verhindern.").color(ChatColor.RED)
.create()
);
break;
case "enforce":
if(enforceMaxPlayer(strings.length == 2 ? Integer.parseInt(strings[1]) : 30))
p.sendMessage(new ComponentBuilder("Die maximale Spielerzahl wird durchgesetzt...").color(ChatColor.GREEN).create());
else
p.sendMessage(new ComponentBuilder("Die maximale Spielerzahl ist nicht erreicht und kann somit auch nicht durchgesetzt werden!").color(ChatColor.RED).create());
break;
case "bypass":
if(strings.length > 2) {
p.sendMessage(new ComponentBuilder("Bitte definiere nur einen Nutzernamen").color(ChatColor.RED).create());
} else if(strings.length == 2) {
ProxiedPlayer targetPlayer = ProxyServer.getInstance().getPlayer(strings[1]);
targetPlayer.connect(BungeeQueue.targetServer);
p.sendMessage(new ComponentBuilder(targetPlayer.getName() + " wurde an der Queue vorbeigelassen!").color(ChatColor.GREEN).create());
targetPlayer.sendMessage(new ComponentBuilder("Du wurdest von einem Administrator vorzeitig auf den Server verschoben!").color(ChatColor.GREEN).create());
} else {
((ProxiedPlayer) p).connect(BungeeQueue.targetServer);
p.sendMessage(new ComponentBuilder("Du wurdest per Befehl von der Queue befreit!").color(ChatColor.GREEN).create());
}
break;
default:
p.sendMessage(new ComponentBuilder("Invalide Command-Syntax, valide argumente sind <query | set <amount> | enforce>").color(ChatColor.RED).create());
}
} else p.sendMessage(new ComponentBuilder("Die Syntax des commands ist /maxplayers <query | set <amount> | enforce>").color(ChatColor.RED).create());
}
private boolean enforceMaxPlayer(int timeout) {
List<ProxiedPlayer> evaluatedPlayers = new ArrayList<>();
int leftOver = BungeeQueue.targetServer.getPlayers().size() - BungeeQueue.maxPlayers;
if(leftOver <= 0) return false;
List<ProxiedPlayer> players = new ArrayList<>(BungeeQueue.targetServer.getPlayers());
Collections.shuffle(players);
for (int i = 0; i < leftOver; i++) {
evaluatedPlayers.add(players.get(i));
players.get(i).sendMessage(new ComponentBuilder("\n\n>> Achtung >> \n").bold(true).color(ChatColor.RED)
.append("Aufgrund eines zu hohen Spieleraufkommens werden zufällige Spieler vom Server gekickt.\n Begebe dich an einen sicheren Ort.\n").color(ChatColor.GOLD)
.append("Du wirst in " + timeout + " sekunden in die Queue verschoben!\n\n").color(ChatColor.RED)
.create()
);
}
ProxyServer.getInstance().getScheduler().schedule(BungeeQueue.plugin, new Runnable() {
@Override
public void run() {
for(ProxiedPlayer p : evaluatedPlayers) {
p.connect(BungeeQueue.queueServer);
p.sendMessage(new ComponentBuilder("Du wurdest wie angekündigt aufgrund einer zu hohen Spielerzahl zurück in die Queue versetzt. Die Auswahl dich zu verschieben war Zufällig. Sorry - gönn dir eine Pause!").color(ChatColor.GOLD).create());
}
}
}, timeout, TimeUnit.SECONDS);
return true;
}
}

View File

@ -0,0 +1,16 @@
package eu.mhsl.minecraft.bungeequeue.listener;
import eu.mhsl.minecraft.bungeequeue.BungeeQueue;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
public class PlayerJoin implements Listener {
@EventHandler
public void onPlayerJoin(PostLoginEvent e) {
e.getPlayer().sendMessage(new ComponentBuilder("Du wurdest zur Queue hinzugefügt!").color(ChatColor.DARK_AQUA).create());
BungeeQueue.list.add(e.getPlayer());
}
}

View File

@ -0,0 +1,36 @@
package eu.mhsl.minecraft.bungeequeue.scheduler;
import eu.mhsl.minecraft.bungeequeue.BungeeQueue;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class MoveToTarget implements Runnable {
private boolean targetIsOnline = false;
@Override
public void run() {
//check if people are in Queue
if(BungeeQueue.list.size() == 0) return;
//check target-server reachable
BungeeQueue.targetServer.ping((result, error) -> {
targetIsOnline = (error == null);
if(!targetIsOnline) ProxyServer.getInstance().getLogger().warning(error.getMessage());
});
if(!targetIsOnline) {
ProxyServer.getInstance().getLogger().warning("Target-Server seems Offline! Cancelling Queue-Movement...");
return;
}
//test if target-server has free Space - move Players
if(BungeeQueue.targetServer.getPlayers().size() < BungeeQueue.maxPlayers) {
ProxiedPlayer p = BungeeQueue.list.remove(0);
p.sendMessage(new ComponentBuilder("Teleportiere zum Zielserver...").color(ChatColor.GRAY).append("\nViel Spaß!").color(ChatColor.GREEN).create());
p.connect(BungeeQueue.targetServer);
}
}
}

View File

@ -0,0 +1,29 @@
package eu.mhsl.minecraft.bungeequeue.scheduler;
import eu.mhsl.minecraft.bungeequeue.BungeeQueue;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class PlayersWaitingCheck implements Runnable {
@Override
public void run() {
for(ProxiedPlayer p : BungeeQueue.queueServer.getPlayers()) {
//check if there are players on queue but not registered by the Plugin
if(!BungeeQueue.list.contains(p)) {
ProxyServer.getInstance().getLogger().warning("Added missing Player " + p.getName() + " to Queue!");
BungeeQueue.list.add(p);
}
}
for(ProxiedPlayer p : BungeeQueue.list) {
//check if players not connected anymore in queue
if(!BungeeQueue.queueServer.getPlayers().contains(p)) {
ProxyServer.getInstance().getLogger().warning("Removed missing Player " + p.getName() + " from Queue!");
BungeeQueue.list.remove(p);
}
}
}
}

View File

@ -0,0 +1,26 @@
package eu.mhsl.minecraft.bungeequeue.scheduler;
import eu.mhsl.minecraft.bungeequeue.BungeeQueue;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class QueueInfoMessager implements Runnable {
@Override
public void run() {
for(ProxiedPlayer p : BungeeQueue.list) {
p.sendMessage(
ChatMessageType.ACTION_BAR,
new ComponentBuilder("Warteschlange platz ").color(ChatColor.DARK_GREEN)
.append((BungeeQueue.list.indexOf(p)+1)+"").bold(true).color(ChatColor.GREEN)
.append(" / ").bold(false).color(ChatColor.DARK_GREEN)
.append(BungeeQueue.list.size()+"").bold(true).color(ChatColor.GREEN)
.append(" - (").color(ChatColor.GRAY)
.append("" + ((BungeeQueue.list.indexOf(p) / BungeeQueue.list.size()) * 100))
.append("%)")
.create()
);
}
}
}

3
src/plugin.yml Normal file
View File

@ -0,0 +1,3 @@
name: BungeeQueue
main: eu.mhsl.minecraft.bungeequeue.BungeeQueue
version: 0.1