diff --git a/src/de/steamwar/bungeecore/BungeeCore.java b/src/de/steamwar/bungeecore/BungeeCore.java index 1606f03..a6a9cca 100644 --- a/src/de/steamwar/bungeecore/BungeeCore.java +++ b/src/de/steamwar/bungeecore/BungeeCore.java @@ -62,6 +62,7 @@ public class BungeeCore extends Plugin { public static String LOBBY_SERVER; public static String USERWORLDS15; public static String BAUWELT15; + public static boolean EVENT_MODE; private static BungeeCore instance; @@ -97,17 +98,14 @@ public class BungeeCore extends Plugin { new MsgCommand(); new RCommand(); new PingCommand(); - new WebregisterCommand(); new AlertCommand(); new KickCommand(); new JoinmeCommand(); new TpCommand(); - new FightCommand(); new HelpCommand(); new BanCommand(); new UnbanCommand(); new DenyCommand("watchcat", "wc"); - new ChallengeCommand(); new TeamCommand(); new ServerTeamchatCommand(); new EventCommand(); @@ -118,18 +116,26 @@ public class BungeeCore extends Plugin { new BugCommand(); new WhoisCommand(); new RegelnCommand(); - new HistoricCommand(); - new CheckCommand(); - new RankedCommand(); new RankCommand(); new IgnoreCommand(); new UnIgnoreCommand(); + if(!EVENT_MODE){ + new WebregisterCommand(); + new FightCommand(); + new ChallengeCommand(); + new HistoricCommand(); + new CheckCommand(); + new RankedCommand(); + + new Broadcaster(); + }else{ + new EventModeListener(); + } + new EventStarter(); - new Broadcaster(); new SessionManager(); new SpigotReceiver(); - new TablistManager(); getProxy().getScheduler().schedule(this, () -> { @@ -226,6 +232,7 @@ public class BungeeCore extends Plugin { LOBBY_SERVER = config.getString("lobbyserver"); USERWORLDS15 = config.getString("userworlds15"); BAUWELT15 = config.getString("bauwelt15"); + EVENT_MODE = config.getBoolean("eventmode"); Broadcaster.setBroadCastMsgs(config.getStringList("broadcasts").toArray(new String[1])); PollSystem.init(config.getString("poll.question"), config.getStringList("poll.answers")); CheckCommand.loadCheckQuestions(config.getSection("checkquestions")); diff --git a/src/de/steamwar/bungeecore/EventStarter.java b/src/de/steamwar/bungeecore/EventStarter.java index e2a44f8..9cb1eaf 100644 --- a/src/de/steamwar/bungeecore/EventStarter.java +++ b/src/de/steamwar/bungeecore/EventStarter.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore; +import de.steamwar.bungeecore.sql.Event; import de.steamwar.bungeecore.sql.EventFight; import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.Team; @@ -58,6 +59,9 @@ public class EventStarter implements Runnable { EventFight next; while((next = nextFight(fights)) != null){ + if(!BungeeCore.EVENT_MODE && Event.get(next.getEventID()).spectateSystem()) + break; //Don't start EventServer if not the event bungee + Team blue = Team.get(next.getTeamBlue()); Team red = Team.get(next.getTeamRed()); String serverName = blue.getTeamKuerzel() + " vs " + red.getTeamKuerzel(); diff --git a/src/de/steamwar/bungeecore/SubserverSystem.java b/src/de/steamwar/bungeecore/SubserverSystem.java index 66493aa..962ea79 100644 --- a/src/de/steamwar/bungeecore/SubserverSystem.java +++ b/src/de/steamwar/bungeecore/SubserverSystem.java @@ -41,6 +41,15 @@ public class SubserverSystem { private static final String SERVER_PATH = BACKBONE + "server/"; private static final String EVENT_PATH = BACKBONE + "event/"; + private static final int firstArenaPort; + + static { + if(BungeeCore.EVENT_MODE) + firstArenaPort = 6000; + else + firstArenaPort = 2500; + } + /** * This function starts every arena (even test- and eventarenas). * @@ -80,10 +89,14 @@ public class SubserverSystem { */ public static Subserver startArena(ArenaMode modus, String map, int eventFightID, int checkSchemID, String serverName, String mapName, UUID player1, UUID player2, boolean ranked){ //Generate missing parameters - int port = freePort(2500); + int port = freePort(firstArenaPort); - if(serverName == null) - serverName = modus.getDisplayName() + (port - 2500); + if(serverName == null){ + if(ranked) + serverName = "Ranked" + (port - firstArenaPort); + else + serverName = modus.getDisplayName() + (port - firstArenaPort); + } if(mapName == null) mapName = serverName; diff --git a/src/de/steamwar/bungeecore/commands/BanCommand.java b/src/de/steamwar/bungeecore/commands/BanCommand.java index 9382031..9ac7ff8 100644 --- a/src/de/steamwar/bungeecore/commands/BanCommand.java +++ b/src/de/steamwar/bungeecore/commands/BanCommand.java @@ -38,7 +38,7 @@ public class BanCommand extends BasicCommand { @Override public void execute(CommandSender sender, String[] args) { if(args.length < 3){ - BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "/ban [Spieler] [dd.mm.yyyy oder perma] [Grund]"); + BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "/ban [Spieler] [dd.mm.yyyy oder dd.mm.yyyy_hh:mm oder perma] [Grund]"); return; } @@ -63,13 +63,19 @@ public class BanCommand extends BasicCommand { if(arg.equalsIgnoreCase("perma")) { return Timestamp.from(Instant.ofEpochSecond(946674800)); }else{ - SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy_HH:mm"); try{ Date parsedDate = dateFormat.parse(arg); return new java.sql.Timestamp(parsedDate.getTime()); }catch(ParseException e){ - BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "§cUngültige Zeitangabe."); - return null; + dateFormat = new SimpleDateFormat("dd.MM.yyyy"); + try{ + Date parsedDate = dateFormat.parse(arg.split("_")[0]); + return new java.sql.Timestamp(parsedDate.getTime()); + }catch(ParseException exception){ + BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "§cUngültige Zeitangabe."); + return null; + } } } } diff --git a/src/de/steamwar/bungeecore/commands/BauCommand.java b/src/de/steamwar/bungeecore/commands/BauCommand.java index 045e1bb..3385650 100644 --- a/src/de/steamwar/bungeecore/commands/BauCommand.java +++ b/src/de/steamwar/bungeecore/commands/BauCommand.java @@ -37,6 +37,9 @@ public class BauCommand { private static final String UNKNOWN_PLAYER = BungeeCore.CHAT_PREFIX + "§cUnbekannter Spieler"; public static void onBau(ChatEvent e, String[] command){ + if(BungeeCore.EVENT_MODE) + return; + ProxiedPlayer p = (ProxiedPlayer) e.getSender(); Subserver server = Subserver.getSubserver(p); Bauserver bau = (server != null && server.getType() == Servertype.BAUSERVER) ? (Bauserver)server : null; diff --git a/src/de/steamwar/bungeecore/commands/MuteCommand.java b/src/de/steamwar/bungeecore/commands/MuteCommand.java index f3421aa..dc0d681 100644 --- a/src/de/steamwar/bungeecore/commands/MuteCommand.java +++ b/src/de/steamwar/bungeecore/commands/MuteCommand.java @@ -34,7 +34,7 @@ public class MuteCommand extends BasicCommand { @Override public void execute(CommandSender sender, String[] args) { if(args.length < 3){ - BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "/mute [Spieler] [dd.mm.yyyy oder perma] [Grund]"); + BungeeCore.send(sender, BungeeCore.CHAT_PREFIX + "/mute [Spieler] [dd.mm.yyyy oder dd.mm.yyyy_hh:mm oder perma] [Grund]"); return; } diff --git a/src/de/steamwar/bungeecore/commands/RankedCommand.java b/src/de/steamwar/bungeecore/commands/RankedCommand.java index 5626f09..3f0914a 100644 --- a/src/de/steamwar/bungeecore/commands/RankedCommand.java +++ b/src/de/steamwar/bungeecore/commands/RankedCommand.java @@ -165,12 +165,11 @@ public class RankedCommand extends BasicCommand { removeFromAll(wp1.player); removeFromAll(wp2.player); - String serverName = wp1.player.getName() + " vs " + wp2.player.getName(); - Subserver arena = SubserverSystem.startArena(mode, mode.getRandomMap(), 0, 0, serverName, serverName.replace(' ', '_'), wp1.player.getUniqueId(), wp2.player.getUniqueId(), true); + Subserver arena = SubserverSystem.startArena(mode, mode.getRandomMap(), 0, 0, null, null, wp1.player.getUniqueId(), wp2.player.getUniqueId(), true); arena.sendPlayer(wp1.player); arena.sendPlayer(wp2.player); - BungeeCore.broadcast(BungeeCore.CHAT_PREFIX + "§7" + mode.getDisplayName() + "§8-§7Ranglistenspiel§8: §e" + serverName, + BungeeCore.broadcast(BungeeCore.CHAT_PREFIX + "§7" + mode.getDisplayName() + "§8-§7Ranglistenspiel§8: §e" + wp1.player.getName() + " vs " + wp2.player.getName(), "§aZuschauen", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + wp1.player.getName())); } diff --git a/src/de/steamwar/bungeecore/commands/TeamCommand.java b/src/de/steamwar/bungeecore/commands/TeamCommand.java index 4d8ff64..601bd58 100644 --- a/src/de/steamwar/bungeecore/commands/TeamCommand.java +++ b/src/de/steamwar/bungeecore/commands/TeamCommand.java @@ -264,6 +264,11 @@ public class TeamCommand extends BasicCommand { return; } + if (team.getTeamLeader() == target.getId()) { + BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§cLeader entfernen sich nicht selbst"); + return; + } + if(teamInvitations.containsKey(target.getId())){ if(teamInvitations.get(target.getId()).remove((Integer) team.getTeamId())){ BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§7Die Einladung wurde zurückgezogen"); diff --git a/src/de/steamwar/bungeecore/commands/WebregisterCommand.java b/src/de/steamwar/bungeecore/commands/WebregisterCommand.java index acc8ed0..06ed25d 100644 --- a/src/de/steamwar/bungeecore/commands/WebregisterCommand.java +++ b/src/de/steamwar/bungeecore/commands/WebregisterCommand.java @@ -59,7 +59,7 @@ public class WebregisterCommand extends BasicCommand { break; case "email_exists": BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§cDie E-Mail hast du bereits für einen anderen Account verwendet..."); - SWException.log("Bungee", "Duplicate E-Mail", player.getName() + " " + args[0]); + // SWException.log("Bungee", "Duplicate E-Mail", player.getName() + " " + args[0]); break; case "invalid_email": BungeeCore.send(player, BungeeCore.CHAT_PREFIX + "§c[E-Mail], nicht [Freitext]!"); diff --git a/src/de/steamwar/bungeecore/comms/PacketIdManager.java b/src/de/steamwar/bungeecore/comms/PacketIdManager.java index 32d25e3..b2c3300 100644 --- a/src/de/steamwar/bungeecore/comms/PacketIdManager.java +++ b/src/de/steamwar/bungeecore/comms/PacketIdManager.java @@ -20,11 +20,14 @@ package de.steamwar.bungeecore.comms; public class PacketIdManager { + private PacketIdManager(){} //0x0(X) Standalone Packets - public final static byte PING_PACKET = 0x01; + public static final byte PING_PACKET = 0x01; + public static final byte TABLIST_NAME = 0x02; + //0x1(X) Bungee Inventory - public final static byte INVENTORY_PACKET = 0x10; - public final static byte INVENTORY_CALLBACK_PACKET = 0x11; - public final static byte INVENTORY_CLOSE_PACKET = 0x12; + public static final byte INVENTORY_PACKET = 0x10; + public static final byte INVENTORY_CALLBACK_PACKET = 0x11; + public static final byte INVENTORY_CLOSE_PACKET = 0x12; } diff --git a/src/de/steamwar/bungeecore/comms/SpigotReceiver.java b/src/de/steamwar/bungeecore/comms/SpigotReceiver.java index 9a8da48..b18b3a0 100644 --- a/src/de/steamwar/bungeecore/comms/SpigotReceiver.java +++ b/src/de/steamwar/bungeecore/comms/SpigotReceiver.java @@ -22,6 +22,7 @@ package de.steamwar.bungeecore.comms; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteStreams; import de.steamwar.bungeecore.comms.handlers.InventoryCallbackHandler; +import de.steamwar.bungeecore.comms.handlers.TablistNameHandler; import de.steamwar.bungeecore.listeners.BasicListener; import net.md_5.bungee.api.event.PluginMessageEvent; import net.md_5.bungee.event.EventHandler; @@ -53,5 +54,6 @@ public class SpigotReceiver extends BasicListener { static { registerHandler(PacketIdManager.INVENTORY_CALLBACK_PACKET, new InventoryCallbackHandler()); + registerHandler(PacketIdManager.TABLIST_NAME, new TablistNameHandler()); } } diff --git a/src/de/steamwar/bungeecore/comms/handlers/TablistNameHandler.java b/src/de/steamwar/bungeecore/comms/handlers/TablistNameHandler.java new file mode 100644 index 0000000..6f04943 --- /dev/null +++ b/src/de/steamwar/bungeecore/comms/handlers/TablistNameHandler.java @@ -0,0 +1,17 @@ +package de.steamwar.bungeecore.comms.handlers; + +import com.google.common.io.ByteArrayDataInput; +import de.steamwar.bungeecore.Subserver; +import de.steamwar.bungeecore.comms.SpigotHandler; +import de.steamwar.bungeecore.sql.SteamwarUser; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public class TablistNameHandler implements SpigotHandler { + + @Override + public void handle(ByteArrayDataInput byteArrayDataInput) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(SteamwarUser.get(byteArrayDataInput.readInt()).getUuid()); + Subserver.getSubserver(player).getTablistNames().put(player, byteArrayDataInput.readUTF()); + } +} diff --git a/src/de/steamwar/bungeecore/listeners/EventModeListener.java b/src/de/steamwar/bungeecore/listeners/EventModeListener.java new file mode 100644 index 0000000..c5bc256 --- /dev/null +++ b/src/de/steamwar/bungeecore/listeners/EventModeListener.java @@ -0,0 +1,36 @@ +package de.steamwar.bungeecore.listeners; + +import de.steamwar.bungeecore.sql.Event; +import de.steamwar.bungeecore.sql.EventFight; +import de.steamwar.bungeecore.sql.SteamwarUser; +import de.steamwar.bungeecore.sql.TeamTeilnahme; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.event.PostLoginEvent; +import net.md_5.bungee.event.EventHandler; + +public class EventModeListener extends BasicListener { + + private static final BaseComponent[] nonParticipant = TextComponent.fromLegacyText("§cDu bist kein Eventteilnehmer."); + + @EventHandler + public void onPostLogin(PostLoginEvent e) { + SteamwarUser user = SteamwarUser.get(e.getPlayer().getUniqueId()); + + Event event = Event.get(); + if(event == null){ + e.getPlayer().disconnect(nonParticipant); + return; + } + + if(TeamTeilnahme.nimmtTeil(user.getTeam(), event.getEventID())) + return; + + for(EventFight eventFight : EventFight.getEvent(event.getEventID())){ + if(eventFight.getKampfleiter() == user.getId()) + return; + } + + e.getPlayer().disconnect(nonParticipant); + } +} diff --git a/src/de/steamwar/bungeecore/listeners/TablistManager.java b/src/de/steamwar/bungeecore/listeners/TablistManager.java index 8e63258..b24c10e 100644 --- a/src/de/steamwar/bungeecore/listeners/TablistManager.java +++ b/src/de/steamwar/bungeecore/listeners/TablistManager.java @@ -109,8 +109,6 @@ public class TablistManager extends BasicListener { ServerInfo server = pserver.getInfo(); String serverName = server.getName(); - if(serverName.equals("Developer")) - continue; Subserver subserver = Subserver.getSubserver(server); List players; @@ -198,6 +196,13 @@ public class TablistManager extends BasicListener { } private String getTablistName(ProxiedPlayer p, boolean sameServer) { + Subserver server = Subserver.getSubserver(p); + if(server != null){ + String tablistName = server.getTablistNames().get(p); + if(tablistName != null) + return tablistName; + } + StringBuilder st = new StringBuilder(); if (p.hasPermission("bungeecore.group.admin")) st.append("§4"); else if (p.hasPermission("bungeecore.group.developer")) st.append("§3"); diff --git a/src/de/steamwar/bungeecore/listeners/mods/Badlion.java b/src/de/steamwar/bungeecore/listeners/mods/Badlion.java index 1215624..b003616 100644 --- a/src/de/steamwar/bungeecore/listeners/mods/Badlion.java +++ b/src/de/steamwar/bungeecore/listeners/mods/Badlion.java @@ -3,6 +3,7 @@ package de.steamwar.bungeecore.listeners.mods; import de.steamwar.bungeecore.listeners.BasicListener; import net.md_5.bungee.api.event.PostLoginEvent; import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.protocol.packet.PluginMessage; public class Badlion extends BasicListener { @@ -22,17 +23,17 @@ public class Badlion extends BasicListener { "ToggleSprint":{"disabled":true} } */ - event.getPlayer().sendData("badlion:mods", ("{" + - "\"Clear Glass\":{\"disabled\":true}," + - "\"ClearWater\":{\"disabled\":true}," + - "\"FOV Changer\":{\"disabled\":true}," + - "\"Hitboxes\":{\"disabled\":true}," + - "\"MiniMap\":{\"disabled\":true}," + - "\"MLG Cobweb\":{\"disabled\":true}," + - "\"Replay\":{\"disabled\":true}," + - "\"Schematica\":{\"disabled\":true}," + - "\"ToggleSneak\":{\"disabled\":true}," + - "\"ToggleSprint\":{\"disabled\":true}" + - "}").getBytes()); + event.getPlayer().unsafe().sendPacket(new PluginMessage("badlion:mods", ("{" + + "\"Clear Glass\":{\"disabled\":true}," + + "\"ClearWater\":{\"disabled\":true}," + + "\"FOV Changer\":{\"disabled\":true}," + + "\"Hitboxes\":{\"disabled\":true}," + + "\"MiniMap\":{\"disabled\":true}," + + "\"MLG Cobweb\":{\"disabled\":true}," + + "\"Replay\":{\"disabled\":true}," + + "\"Schematica\":{\"disabled\":true}," + + "\"ToggleSneak\":{\"disabled\":true}," + + "\"ToggleSprint\":{\"disabled\":true}" + + "}").getBytes(), false)); } } diff --git a/src/de/steamwar/bungeecore/sql/Event.java b/src/de/steamwar/bungeecore/sql/Event.java index fae76cd..336128e 100644 --- a/src/de/steamwar/bungeecore/sql/Event.java +++ b/src/de/steamwar/bungeecore/sql/Event.java @@ -36,6 +36,7 @@ public class Event { private final Timestamp end; private final int maximumTeamMembers; private final boolean publicSchemsOnly; + private final boolean spectateSystem; private static Event current = null; @@ -46,6 +47,7 @@ public class Event { this.end = rs.getTimestamp("End"); this.maximumTeamMembers = rs.getInt("MaximumTeamMembers"); this.publicSchemsOnly = rs.getBoolean("PublicSchemsOnly"); + this.spectateSystem = rs.getBoolean("SpectateSystem"); } public static Event get(){ @@ -128,4 +130,7 @@ public class Event { public boolean publicSchemsOnly() { return publicSchemsOnly; } + public boolean spectateSystem(){ + return spectateSystem; + } } diff --git a/src/de/steamwar/bungeecore/sql/Team.java b/src/de/steamwar/bungeecore/sql/Team.java index e32049b..b44feb2 100644 --- a/src/de/steamwar/bungeecore/sql/Team.java +++ b/src/de/steamwar/bungeecore/sql/Team.java @@ -43,7 +43,9 @@ public class Team { teamKuerzel = kuerzel; teamName = name; teamLeader = leader; - teamCache.add(this); + if (leader != 0) { + teamCache.add(this); + } } private Team(ResultSet rs) throws SQLException {