SteamWar/BungeeCore
Archiviert
13
2

Merge branch 'master' into ban-rework

Dieser Commit ist enthalten in:
Chaoscaot 2020-12-30 12:56:17 +01:00
Commit 5fb8a617a7
7 geänderte Dateien mit 163 neuen und 48 gelöschten Zeilen

Datei anzeigen

@ -25,6 +25,7 @@ import de.steamwar.bungeecore.listeners.*;
import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker; import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker;
import de.steamwar.bungeecore.listeners.mods.Forge; import de.steamwar.bungeecore.listeners.mods.Forge;
import de.steamwar.bungeecore.listeners.mods.LabyMod; import de.steamwar.bungeecore.listeners.mods.LabyMod;
import de.steamwar.bungeecore.listeners.mods.WorldDownloader;
import de.steamwar.bungeecore.sql.SQL; import de.steamwar.bungeecore.sql.SQL;
import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team; import de.steamwar.bungeecore.sql.Team;
@ -85,6 +86,7 @@ public class BungeeCore extends Plugin {
new BanListener(); new BanListener();
new CheckListener(); new CheckListener();
new ModLoaderBlocker(); new ModLoaderBlocker();
new WorldDownloader();
commands.put("/b", null); commands.put("/b", null);
commands.put("/gs", null); commands.put("/gs", null);

Datei anzeigen

@ -19,7 +19,6 @@
package de.steamwar.bungeecore.commands; package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.Message;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.CommandSender;
@ -37,6 +36,6 @@ public class AlertCommand extends BasicCommand {
return; return;
} }
Message.broadcast("ALERT", ChatColor.translateAlternateColorCodes('&', BungeeCore.CHAT_PREFIX + String.join(" ", args))); Message.broadcast("ALERT", ChatColor.translateAlternateColorCodes('&', String.join(" ", args)));
} }
} }

Datei anzeigen

@ -68,7 +68,7 @@ public class CheckCommand extends BasicCommand {
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
List<Schematic> schematics = getSchemsToCheck(); List<Schematic> schematics = getSchemsToCheck();
if(schematics.size() != currentCheckers.size()) if(schematics.size() != currentCheckers.size())
ServerTeamchatCommand.sendToTeam("§7Es sind §e" + (schematics.size() - currentCheckers.size()) + " §7Schematics zu prüfen§8!"); Message.team("CHECK_REMINDER", schematics.size() - currentCheckers.size());
}, 10, 10, TimeUnit.MINUTES); }, 10, 10, TimeUnit.MINUTES);
} }
@ -91,7 +91,7 @@ public class CheckCommand extends BasicCommand {
schematic(player, args[1]); schematic(player, args[1]);
break; break;
case "next": case "next":
case "allow": case "accept":
next(player, args); next(player, args);
break; break;
case "cancel": case "cancel":
@ -118,27 +118,27 @@ public class CheckCommand extends BasicCommand {
private void list(ProxiedPlayer player) { private void list(ProxiedPlayer player) {
List<Schematic> schematicList = getSchemsToCheck(); List<Schematic> schematicList = getSchemsToCheck();
BungeeCore.send(player, "§e§lZu prüfen sind " + schematicList.size() + " Schematics"); Message.sendPrefixless("CHECK_LIST_HEADER", player, schematicList.size());
for (Schematic schematic : schematicList) { for (Schematic schematic : schematicList) {
CheckSession current = currentSchems.get(schematic.getSchemID()); CheckSession current = currentSchems.get(schematic.getSchemID());
if (current == null) { if (current == null) {
BungeeCore.send(player, Message.sendPrefixless("CHECK_LIST_TO_CHECK", player,
"§8" + schematic.getSchemType().getKuerzel() + " §7" + SteamwarUser.get(schematic.getSchemOwner()).getUserName() + " §e" + schematic.getSchemName(), Message.parse("CHECK_LIST_TO_CHECK_HOVER", player),
"§eSchematic prüfen", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check schematic " + schematic.getSchemID()),
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check schematic " + schematic.getSchemID())); schematic.getSchemType().getKuerzel(), SteamwarUser.get(schematic.getSchemOwner()).getUserName(), schematic.getSchemName());
} else { } else {
BungeeCore.send(player, Message.sendPrefixless("CHECK_LIST_CHECKING", player,
"§8" + schematic.getSchemType().getKuerzel() + " §7" + SteamwarUser.get(schematic.getSchemOwner()).getUserName() + " §e" + schematic.getSchemName() + " §7wird geprüft von §e" + current.checker.getName(), Message.parse("CHECK_LIST_CHECKING_HOVER", player),
"§eZum Prüfer", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + current.checker.getName()),
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + current.checker.getName())); schematic.getSchemType().getKuerzel(), SteamwarUser.get(schematic.getSchemOwner()).getUserName(), schematic.getSchemName(), current.checker.getName());
} }
} }
} }
private void schematic(ProxiedPlayer player, String schemID){ private void schematic(ProxiedPlayer player, String schemID){
if(isChecking(player)){ if(isChecking(player)){
BungeeCore.send(player, "§cDu prüfst schon eine Schematic!"); Message.send("CHECK_SCHEMATIC_ALREADY_CHECKING", player);
return; return;
} }
@ -147,7 +147,7 @@ public class CheckCommand extends BasicCommand {
ProxyServer.getInstance().getLogger().log(Level.SEVERE, player.getName() + " tried to check an uncheckable schematic!"); ProxyServer.getInstance().getLogger().log(Level.SEVERE, player.getName() + " tried to check an uncheckable schematic!");
return; return;
}else if(schem.getSchemOwner() == SteamwarUser.get(player.getUniqueId()).getId()) { }else if(schem.getSchemOwner() == SteamwarUser.get(player.getUniqueId()).getId()) {
BungeeCore.send(player, "§cDu kannst nicht deine eigenen Schematics prüfen"); Message.send("CHECK_SCHEMATIC_OWN", player);
return; return;
} }
@ -156,7 +156,7 @@ public class CheckCommand extends BasicCommand {
private static boolean notChecking(ProxiedPlayer player){ private static boolean notChecking(ProxiedPlayer player){
if(!isChecking(player)){ if(!isChecking(player)){
BungeeCore.send(player, "§cDu prüfst derzeit nicht."); Message.send("CHECK_NOT_CHECKING", player);
return true; return true;
} }
return false; return false;
@ -171,7 +171,7 @@ public class CheckCommand extends BasicCommand {
try{ try{
rank = Integer.parseInt(args[1]); rank = Integer.parseInt(args[1]);
}catch(NumberFormatException e){ }catch(NumberFormatException e){
BungeeCore.send(player, "Der angegebene Rang ist ungültig!"); Message.send("CHECK_INVALID_RANK", player);
return; return;
} }
} }
@ -183,7 +183,7 @@ public class CheckCommand extends BasicCommand {
if(notChecking(player)) if(notChecking(player))
return; return;
BungeeCore.send(player, "§aDer Prüfvorgang wurde abgebrochen!"); Message.send("CHECK_ABORT", player);
currentCheckers.get(player.getUniqueId()).abort(); currentCheckers.get(player.getUniqueId()).abort();
} }
@ -204,11 +204,10 @@ public class CheckCommand extends BasicCommand {
} }
private void help(CommandSender sender){ private void help(CommandSender sender){
BungeeCore.send(sender, "§8/§echeck list §8- §7Zeigt die Liste der ungeprüften Schematics"); Message.sendPrefixless("CHECK_HELP_LIST", sender);
BungeeCore.send(sender, "§8/§echeck next §8- §7Nächste Prüffrage"); Message.sendPrefixless("CHECK_HELP_NEXT", sender);
BungeeCore.send(sender, "§8/§echeck allow §8- §7Schematic freigeben"); Message.sendPrefixless("CHECK_HELP_DECLINE", sender);
BungeeCore.send(sender, "§8/§echeck decline [Grund] §8- §7Schematic nicht freigeben"); Message.sendPrefixless("CHECK_HELP_CANCEL", sender);
BungeeCore.send(sender, "§8/§echeck cancel §8- §7Bricht das Prüfen ab");
} }
private static class CheckSession{ private static class CheckSession{
@ -235,6 +234,8 @@ public class CheckCommand extends BasicCommand {
SubserverSystem.startTestServer(checker, mode, FightCommand.getMap(checker, mode, "Random"), schematic.getSchemID()); SubserverSystem.startTestServer(checker, mode, FightCommand.getMap(checker, mode, "Random"), schematic.getSchemID());
currentCheckers.put(checker.getUniqueId(), this); currentCheckers.put(checker.getUniqueId(), this);
currentSchems.put(schematic.getSchemID(), this); currentSchems.put(schematic.getSchemID(), this);
for(CheckedSchematic previous : CheckedSchematic.previousChecks(schematic.getSchemName(), schematic.getSchemOwner()))
Message.sendPrefixless("CHECK_SCHEMATIC_PREVIOUS", checker, previous.getEndTime(), SteamwarUser.get(previous.getValidator()).getUserName(), previous.getReason());
next(0); next(0);
}); });
} }
@ -245,26 +246,28 @@ public class CheckCommand extends BasicCommand {
return; return;
} }
BungeeCore.send(checker, checkList.next()); checker.sendMessage(TextComponent.fromLegacyText(checkList.next()));
TextComponent next; TextComponent next = new TextComponent();
next.setColor(ChatColor.GREEN);
if(checkList.hasNext()){ if(checkList.hasNext()){
next = new TextComponent("next "); next.setText(Message.parse("CHECK_NEXT", checker));
next.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check next")); next.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check next"));
}else if(ranks.containsKey(schematic.getSchemType())){ }else if(ranks.containsKey(schematic.getSchemType())){
next = new TextComponent();
List<String> r = ranks.get(schematic.getSchemType()); List<String> r = ranks.get(schematic.getSchemType());
for(int i = 0; i < r.size(); i++){ for(int i = 0; i < r.size(); i++){
BungeeCore.send(checker, "§aRang " + (i+1) + ": " + r.get(i), "§aMit diesem Rang freigeben", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check allow " + (i+1))); Message.sendPrefixless("CHECK_RANK", checker,
BungeeCore.send(checker, ""); Message.parse("CHECK_RANK_HOVER", checker),
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check accept " + (i+1)),
i+1, r.get(i));
Message.sendPrefixless("SPACER", checker);
} }
}else{ }else{
next = new TextComponent("accept "); next.setText(Message.parse("CHECK_ACCEPT", checker));
next.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check allow")); next.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check accept"));
} }
next.setColor(ChatColor.GREEN);
TextComponent decline = new TextComponent("decline"); TextComponent decline = new TextComponent(" " + Message.parse("CHECK_DECLINE", checker));
decline.setColor(ChatColor.RED); decline.setColor(ChatColor.RED);
decline.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/check decline ")); decline.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/check decline "));
@ -275,7 +278,7 @@ public class CheckCommand extends BasicCommand {
private void accept(int rank){ private void accept(int rank){
if(ranks.containsKey(schematic.getSchemType())){ if(ranks.containsKey(schematic.getSchemType())){
if(rank <= 0 || ranks.get(schematic.getSchemType()).size() < rank){ if(rank <= 0 || ranks.get(schematic.getSchemType()).size() < rank){
BungeeCore.send(checker, "§cUnbekannter Schematic-Rang"); Message.send("CHECK_INVALID_RANK", checker);
return; return;
} }
schematic.setRank(rank); schematic.setRank(rank);
@ -283,24 +286,31 @@ public class CheckCommand extends BasicCommand {
schematic.setSchemType(schematic.getSchemType().fightType()); schematic.setSchemType(schematic.getSchemType().fightType());
CheckedSchematic.create(schematic.getSchemName(), schematic.getSchemOwner(), SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), "freigegeben"); CheckedSchematic.create(schematic.getSchemName(), schematic.getSchemOwner(), SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), "freigegeben");
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(SteamwarUser.get(schematic.getSchemOwner()).getUuid()); SteamwarUser user = SteamwarUser.get(schematic.getSchemOwner());
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUuid());
if(player != null) if(player != null)
BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§aDein §e" + schematic.getSchemType().name() + " " + schematic.getSchemName() + " §ewurde freigegeben§8!"); Message.send("CHECK_ACCEPTED", player, schematic.getSchemType().name(), schematic.getSchemName());
ServerTeamchatCommand.sendToTeam("§aDie Schematic §e" + schematic.getSchemName() + " §avon §e" + SteamwarUser.get(schematic.getSchemOwner()).getUserName() + " §aist nun freigegeben!"); Message.team("CHECK_ACCEPTED_TEAM", schematic.getSchemName(), user.getUserName());
abort(); stop();
} }
private void decline(String reason){ private void decline(String reason){
schematic.setSchemType(SchematicType.Normal); schematic.setSchemType(SchematicType.Normal);
CheckedSchematic.create(schematic.getSchemName(), schematic.getSchemOwner(), SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), reason); CheckedSchematic.create(schematic.getSchemName(), schematic.getSchemOwner(), SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), reason);
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(SteamwarUser.get(schematic.getSchemOwner()).getUuid()); SteamwarUser user = SteamwarUser.get(schematic.getSchemOwner());
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUuid());
if(player != null) if(player != null)
BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§cDein §e" + schematic.getSchemType().name() + " " + schematic.getSchemName() + " §cwurde abgelehnt§8: §c" + reason); Message.send("CHECK_DECLINED", player, schematic.getSchemType().name(), schematic.getSchemName(), reason);
ServerTeamchatCommand.sendToTeam("§aDie Schematic §e" + schematic.getSchemName() + " §avon §e" + SteamwarUser.get(schematic.getSchemOwner()).getUserName() + " §awurde aufgrund von §e" + reason + " §aabgelehnt!"); Message.team("CHECK_DECLINED_TEAM", schematic.getSchemName(), user.getUserName(), reason);
abort(); stop();
} }
private void abort(){ private void abort(){
CheckedSchematic.create(schematic.getSchemName(), schematic.getSchemOwner(), SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), "Prüfvorgang abgebrochen");
stop();
}
private void stop(){
currentCheckers.remove(checker.getUniqueId()); currentCheckers.remove(checker.getUniqueId());
currentSchems.remove(schematic.getSchemID()); currentSchems.remove(schematic.getSchemID());
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {

Datei anzeigen

@ -33,7 +33,6 @@ import net.md_5.bungee.api.event.LoginEvent;
import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.event.EventHandler;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.Instant;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
@ -52,7 +51,7 @@ public class BanListener extends BasicListener {
List<BannedUserIPs> ips = BannedUserIPs.get(event.getConnection().getAddress().getAddress().getHostAddress()); List<BannedUserIPs> ips = BannedUserIPs.get(event.getConnection().getAddress().getAddress().getHostAddress());
if(!ips.isEmpty()){ if(!ips.isEmpty()){
Timestamp highestBan = Timestamp.from(Instant.now()); Timestamp highestBan = ips.get(0).getTimestamp();
for(BannedUserIPs banned : ips) { for(BannedUserIPs banned : ips) {
if(highestBan.before(banned.getTimestamp())) if(highestBan.before(banned.getTimestamp()))
highestBan = banned.getTimestamp(); highestBan = banned.getTimestamp();
@ -70,8 +69,8 @@ public class BanListener extends BasicListener {
for(BannedUserIPs banned : ips) { for(BannedUserIPs banned : ips) {
SteamwarUser bannedUser = SteamwarUser.get(banned.getUserID()); SteamwarUser bannedUser = SteamwarUser.get(banned.getUserID());
potentialBan.append(Message.parse("BAN_AVOIDING_LIST", target, bannedUser.getId(), potentialBan.append(Message.parse("BAN_AVOIDING_LIST", target, bannedUser.getUserName(),
banned.getTimestamp().toLocalDateTime().format(BungeeCore.DATE_FORMAT), bannedUser.getUserName())); banned.getTimestamp().toLocalDateTime().format(BungeeCore.DATE_FORMAT)));
} }
TextComponent msg = new TextComponent(potentialBan.toString()); TextComponent msg = new TextComponent(potentialBan.toString());

Datei anzeigen

@ -0,0 +1,33 @@
package de.steamwar.bungeecore.listeners.mods;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import de.steamwar.bungeecore.listeners.BasicListener;
import de.steamwar.bungeecore.sql.Mod;
import net.md_5.bungee.api.connection.Connection;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.event.EventHandler;
import java.util.Collections;
import java.util.Set;
public class WorldDownloader extends BasicListener {
private static final Set<String> wdlTags = Collections.unmodifiableSet(
Sets.newHashSet("WDL|INIT", "wdl:init", "WDL|REQUEST", "wdl:request")
);
@EventHandler
public void onPluginMessageEvent(PluginMessageEvent event){
if(!wdlTags.contains(event.getTag()))
return;
Connection sender = event.getSender();
if(!(sender instanceof ProxiedPlayer))
return;
event.setCancelled(true);
Utils.handleMods((ProxiedPlayer) sender, Lists.newArrayList(Mod.get("wdl", Mod.Platform.FORGE)));
}
}

Datei anzeigen

@ -19,13 +19,57 @@
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
public class CheckedSchematic { public class CheckedSchematic {
private CheckedSchematic(){}
private final String schemName;
private final int schemOwner;
private final int validator;
private final Timestamp startTime;
private final Timestamp endTime;
private final String reason;
private CheckedSchematic(ResultSet rs) throws SQLException {
schemName = rs.getString("SchemName");
schemOwner = rs.getInt("SchemOwner");
validator = rs.getInt("Validator");
startTime = rs.getTimestamp("StartTime");
endTime = rs.getTimestamp("EndTime");
reason = rs.getString("DeclineReason");
}
public static void create(String schemName, int schemOwner, int validator, Timestamp startTime, Timestamp endTime, String reason){ public static void create(String schemName, int schemOwner, int validator, Timestamp startTime, Timestamp endTime, String reason){
SQL.update("INSERT INTO CheckedSchematic (SchemName, SchemOwner, Validator, StartTime, EndTime, DeclineReason) VALUES (?, ?, ?, ?, ?, ?)", SQL.update("INSERT INTO CheckedSchematic (SchemName, SchemOwner, Validator, StartTime, EndTime, DeclineReason) VALUES (?, ?, ?, ?, ?, ?)",
schemName, schemOwner, validator, startTime, endTime, reason); schemName, schemOwner, validator, startTime, endTime, reason);
} }
public static List<CheckedSchematic> previousChecks(String schemName, int schemOwner){
ResultSet rs = SQL.select("SELECT * FROM CheckedSchematic WHERE SchemName = ? AND SchemOwner = ? ORDER BY EndTime ASC", schemName, schemOwner);
List<CheckedSchematic> schematics = new ArrayList<>();
try {
while(rs.next())
schematics.add(new CheckedSchematic(rs));
} catch (SQLException e) {
throw new SecurityException("Could not load previous checks", e);
}
return schematics;
}
public int getValidator() {
return validator;
}
public Timestamp getEndTime() {
return endTime;
}
public String getReason() {
return reason;
}
} }

Datei anzeigen

@ -1,4 +1,5 @@
PREFIX=§eSteam§8War» PREFIX=§eSteam§8War»
SPACER=
UNKNOWN_COMMAND=§cUnbekannter Befehl. UNKNOWN_COMMAND=§cUnbekannter Befehl.
UNKNOWN_PLAYER=§cDiesen Spieler gibt es nicht. UNKNOWN_PLAYER=§cDiesen Spieler gibt es nicht.
@ -125,3 +126,30 @@ POLLRESULT_LIST=§e{0}§8: §7{1}
BAU_DELETE_GUI_NAME=§eWirklich Welt löschen? BAU_DELETE_GUI_NAME=§eWirklich Welt löschen?
BAU_DELETE_GUI_CANCEL=§cAbbrechen BAU_DELETE_GUI_CANCEL=§cAbbrechen
BAU_DELETE_GUI_DELETE=§aLöschen BAU_DELETE_GUI_DELETE=§aLöschen
#CheckCommand
CHECK_REMINDER=§7Es sind §e{0} §7Schematics zu prüfen§8!
CHECK_NOT_CHECKING=§cDu prüfst derzeit nicht.
CHECK_HELP_LIST=§8/§echeck list §8- §7Zeigt die Liste der ungeprüften Schematics
CHECK_HELP_NEXT=§8/§echeck next §8- §7Nächste Prüffrage§8/§7freigeben
CHECK_HELP_DECLINE=§8/§echeck decline §8[§eGrund§8] - §7Schematic ablehnen
CHECK_HELP_CANCEL=§8/§echeck cancel §8- §7Bricht den Prüfvorgang ab
CHECK_LIST_HEADER=§e§lZu prüfen sind {0} Schematics
CHECK_LIST_TO_CHECK=§8{0} §7{1} §e{2}
CHECK_LIST_TO_CHECK_HOVER=§eSchematic prüfen
CHECK_LIST_CHECKING=§8{0} §7{1} §e{2} §7wird geprüft von §e{3}
CHECK_LIST_CHECKING_HOVER=§eZum Prüfer
CHECK_SCHEMATIC_ALREADY_CHECKING=§cDu prüfst schon eine Schematic!
CHECK_SCHEMATIC_OWN=§cDu kannst nicht deine eigenen Schematics prüfen.
CHECK_SCHEMATIC_PREVIOUS=§7{0} von {1}§8: §e{2}
CHECK_INVALID_RANK=§cUnbekannter Schematicrang.
CHECK_ABORT=§aDer Prüfvorgang wurde abgebrochen!
CHECK_NEXT=Nächste Frage
CHECK_ACCEPT=Annehmen
CHECK_DECLINE=Ablehnen
CHECK_RANK=§aRang {0}: {1}
CHECK_RANK_HOVER=§aMit diesem Rang freigeben
CHECK_ACCEPTED=§aDein §e{0} {1} §ewurde freigegeben§8!
CHECK_ACCEPTED_TEAM=§7Die Schematic §e{0} §7von §e{1} §7ist nun freigegeben!
CHECK_DECLINED=§cDein §e{0} {1} §cwurde abgelehnt§8: §c{2}
CHECK_DECLINED_TEAM=§7Die Schematic §e{0} §7von §e{1} §awurde aufgrund von §e{2} §7abgelehnt!