diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index fe118680..6b92436c 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -130,6 +130,7 @@ USAGE_ALERT=§8/§7alert §8[§emessage§8] USAGE_IGNORE=§8/§7ignore §8[§eplayer§8] #ModListener +CLIENT_DISALLOWED=Attempted use of client {0} MOD_RED_SING=Attempted use of mod {0} MOD_RED_PLUR=Attempted use of mods:\n{0} MOD_YELLOW_SING=§7Deactivate the mod §e{0}§7 to continue playing on §eSteam§8War§7. @@ -292,7 +293,7 @@ FIGHT_UNKNOWN_GAMEMODE=§cUnknown gamemode: {0} FIGHT_UNKNOWN_ARENA=§cThe desired arena does not exist. FIGHT_IN_ARENA=§cYou are already in an arena. FIGHT_BROADCAST=§7Click §ehere§7 to fight §e{0} §7against §e{1}! -FIGHT_BROADCAST_HOVER=§aFight §eagainst §7{1} +FIGHT_BROADCAST_HOVER=§aFight §eagainst §7{0} #CheckCommand CHECK_REMINDER=§7There are §e{0} §7schematics left for review§8! diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties index 2dea174b..fb4067c8 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -115,6 +115,7 @@ USAGE_ALERT=§8/§7alert §8[§eNachricht§8] USAGE_IGNORE=§8/§7ignore §8[§eSpieler§8] #ModListener +CLIENT_DISALLOWED=Versuchte Benutzung des Clients {0} MOD_RED_SING=Versuchte Benutzung des Mods {0} MOD_RED_PLUR=Versuchte Benutzung der Mods:\n{0} MOD_YELLOW_SING=§7Deaktiviere den Mod §e{0}§7, um weiter auf §eSteam§8War §7spielen zu können. @@ -275,7 +276,7 @@ FIGHT_UNKNOWN_GAMEMODE=§cUnbekannter Spielmodus: {0} FIGHT_UNKNOWN_ARENA=§cDie gewünschte Arena gibt es nicht. FIGHT_IN_ARENA=§cDu befindest dich bereits in einer Arena. FIGHT_BROADCAST=§7Klicke §ehier§7, um §e{0} §7gegen §e{1} §7zu §7kämpfen! -FIGHT_BROADCAST_HOVER=§aGegen §7{1} §ekämpfen +FIGHT_BROADCAST_HOVER=§aGegen §7{0} §ekämpfen #CheckCommand CHECK_REMINDER=§7Es sind §e{0} §7Schematics zu prüfen§8! @@ -642,7 +643,6 @@ RANK_PLAYER_FOUND=§eRang §7von §e{0} RANK_HEADER={0} §e{1} {2} RANK_UNPLACED=§7unplatziert RANK_PLACED=§e{0}§8. §7mit §e{1} §7Elo§8. -RANK_EMBLEM=§7Emblem§8: {0} #Fabric Mod Sender MODIFICATION_BAN_MESSAGE=Du hast probiert den FabricModSender zu umgehen / zu modifizieren! diff --git a/VelocityCore/src/de/steamwar/velocitycore/EventStarter.java b/VelocityCore/src/de/steamwar/velocitycore/EventStarter.java index 1be170f3..17d4f537 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/EventStarter.java +++ b/VelocityCore/src/de/steamwar/velocitycore/EventStarter.java @@ -20,6 +20,7 @@ package de.steamwar.velocitycore; import de.steamwar.messages.Chatter; +import de.steamwar.messages.Message; import de.steamwar.persistent.Subserver; import de.steamwar.sql.EventFight; import de.steamwar.sql.Team; @@ -43,7 +44,7 @@ public class EventStarter { public EventStarter() { EventFight.loadAllComingFights(); - VelocityCore.schedule(this::run).delay(10, TimeUnit.SECONDS).schedule(); + VelocityCore.schedule(this::run).repeat(10, TimeUnit.SECONDS).schedule(); } public static Map getEventServer() { @@ -73,7 +74,7 @@ public class EventStarter { } else { command = "/" + spectatePorts.get(next.getSpectatePort()); } - Chatter.broadcast().system("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER", ClickEvent.runCommand(command), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName()); + Chatter.broadcast().system("EVENT_FIGHT_BROADCAST", new Message("EVENT_FIGHT_BROADCAST_HOVER"), ClickEvent.runCommand(command), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName()); } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/FightCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/FightCommand.java index 1d5283ea..633405e8 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/FightCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/FightCommand.java @@ -130,7 +130,7 @@ public class FightCommand extends SWCommand { public void fight(@Validator("arenaPlayer") PlayerChatter sender, @Mapper("nonHistoricArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) { createArena(sender, "/fight ", true, arenaMode, map, false, (p, mode, m) -> new ServerStarter().arena(mode, m).blueLeader(p.getPlayer()).callback( - arena -> Chatter.broadcast().system("FIGHT_BROADCAST", new Message("FIGHT_BROADCAST_HOVER"), ClickEvent.runCommand("/arena " + arena.getServer().getName()), mode.getGameName(), p.getPlayer().getUsername()) + arena -> Chatter.broadcast().system("FIGHT_BROADCAST", new Message("FIGHT_BROADCAST_HOVER", p.getPlayer().getUsername()), ClickEvent.runCommand("/arena " + arena.getServer().getName()), mode.getGameName(), p.getPlayer().getUsername()) ).start() ); } diff --git a/VelocityCore/src/de/steamwar/velocitycore/mods/Badlion.java b/VelocityCore/src/de/steamwar/velocitycore/mods/Badlion.java index 59ac26bb..fa48ba7d 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/mods/Badlion.java +++ b/VelocityCore/src/de/steamwar/velocitycore/mods/Badlion.java @@ -22,6 +22,7 @@ package de.steamwar.velocitycore.mods; import com.google.gson.JsonObject; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import de.steamwar.messages.Chatter; public class Badlion { // https://github.com/BadlionClient/BadlionClientModAPI @@ -53,6 +54,10 @@ public class Badlion { } public void sendRestrictions(Player player) { + // TODO: Remove when Badlion is fixed, or we fixed the Badlion packet + Chatter sender = Chatter.of(player); + player.disconnect(sender.parse("CLIENT_DISALLOWED", "Badlion")); + player.sendPluginMessage(MinecraftChannelIdentifier.from("badlion:mods"), packet); } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloPlayerHandler.java b/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloPlayerHandler.java index 327adbac..417a0e5e 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloPlayerHandler.java +++ b/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloPlayerHandler.java @@ -20,13 +20,13 @@ package de.steamwar.velocitycore.network.handlers; import com.velocitypowered.api.proxy.Player; -import de.steamwar.velocitycore.ArenaMode; -import de.steamwar.velocitycore.VelocityCore; import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.common.FightEndsPacket; import de.steamwar.sql.SchematicType; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserElo; +import de.steamwar.velocitycore.ArenaMode; +import de.steamwar.velocitycore.VelocityCore; import lombok.RequiredArgsConstructor; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -52,8 +52,15 @@ public class EloPlayerHandler extends PacketHandler { */ @Handler public void handle(FightEndsPacket fightEndsPacket) { - if (!ArenaMode.getBySchemType(SchematicType.fromDB(fightEndsPacket.getGameMode())).isRanked()) - return; + SchematicType schematicType = SchematicType.fromDB(fightEndsPacket.getGameMode()); + ArenaMode arenaMode; + if (schematicType == null) { + arenaMode = ArenaMode.getByInternal(fightEndsPacket.getGameMode()); + } else { + arenaMode = ArenaMode.getBySchemType(schematicType); + } + if (arenaMode == null) return; + if (!arenaMode.isRanked()) return; if (EloSchemHandler.publicVsPrivate(fightEndsPacket)) return; diff --git a/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloSchemHandler.java b/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloSchemHandler.java index 68144738..49da0116 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloSchemHandler.java +++ b/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloSchemHandler.java @@ -19,18 +19,21 @@ package de.steamwar.velocitycore.network.handlers; -import de.steamwar.velocitycore.ArenaMode; import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.common.FightEndsPacket; import de.steamwar.sql.SchemElo; import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SchematicType; +import de.steamwar.velocitycore.ArenaMode; public class EloSchemHandler extends PacketHandler { private static final int K = 20; public static boolean publicVsPrivate(FightEndsPacket packet) { + if (packet.getRedSchem() == -1 && packet.getBlueSchem() == -1) { + return false; + } SchematicNode blueSchem = SchematicNode.getSchematicNode(packet.getBlueSchem()); SchematicNode redSchem = SchematicNode.getSchematicNode(packet.getRedSchem()); return (blueSchem.getOwner() == 0) != (redSchem.getOwner() == 0); @@ -38,9 +41,10 @@ public class EloSchemHandler extends PacketHandler { @Handler public void handle(FightEndsPacket fightEndsPacket) { - if (!ArenaMode.getBySchemType(SchematicType.fromDB(fightEndsPacket.getGameMode())).isRanked()) { - return; - } + SchematicType type = SchematicType.fromDB(fightEndsPacket.getGameMode()); + if (type == null) return; + ArenaMode arenaMode = ArenaMode.getBySchemType(type); + if (!arenaMode.isRanked()) return; if (publicVsPrivate(fightEndsPacket)) return; diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java index f8dc1783..315717a6 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java @@ -43,6 +43,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import java.util.*; +import java.util.logging.Level; import java.util.stream.IntStream; @ChannelHandler.Sharable @@ -63,7 +64,6 @@ public class Tablist extends ChannelInboundHandlerAdapter { this.player = player; this.viewer = Chatter.of(player); this.directTabItems = Storage.directTabItems.computeIfAbsent(player, p -> new HashMap<>()); - injection(); } public void update(TablistPart global, int seconds) { @@ -139,7 +139,9 @@ public class Tablist extends ChannelInboundHandlerAdapter { synchronized (directTabItems) { directTabItems.clear(); } + } + public void onServerPostSwitch() { if(player.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_20)) { current.clear(); sendPacket(player, createTeamPacket); @@ -148,8 +150,14 @@ public class Tablist extends ChannelInboundHandlerAdapter { private void injection() { connection = (VelocityServerConnection) player.getCurrentServer().orElse(null); - if(connection == null) - return; + if(connection == null) { + connection = ((ConnectedPlayer) player).getConnectionInFlight(); + + if(connection == null) { + VelocityCore.getLogger().log(Level.WARNING, "Could not inject Tablist: %s".formatted(player)); + return; + } + } ChannelPipeline pipeline = connection.getConnection().getChannel().pipeline(); if(pipeline.get("steamwar-tablist") != null) //Catch unclean exit diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java index 2b8b47bd..29cebb38 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java @@ -21,8 +21,9 @@ package de.steamwar.velocitycore.tablist; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.DisconnectEvent; -import com.velocitypowered.api.event.connection.PostLoginEvent; +import com.velocitypowered.api.event.player.ServerConnectedEvent; import com.velocitypowered.api.event.player.ServerPostConnectEvent; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.network.packets.common.FightInfoPacket; @@ -59,17 +60,19 @@ public class TablistManager extends BasicListener { } @Subscribe - public void onJoin(PostLoginEvent event) { + public void onServerConnection(ServerConnectedEvent event) { synchronized (tablists) { - tablists.put(event.getPlayer(), new Tablist(event.getPlayer())); + tablists.computeIfAbsent(event.getPlayer(), Tablist::new).onServerSwitch(); } - Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); + + if(event.getPlayer().getProtocolVersion().noGreaterThan(ProtocolVersion.MINECRAFT_1_20)) + Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); } @Subscribe - public void onServerConnection(ServerPostConnectEvent event) { + public void onServerPostConnection(ServerPostConnectEvent event) { synchronized (tablists) { - tablists.get(event.getPlayer()).onServerSwitch(); + tablists.get(event.getPlayer()).onServerPostSwitch(); } } @@ -90,14 +93,14 @@ public class TablistManager extends BasicListener { private void updateTablist() { List subservers = new ArrayList<>(); - for (RegisteredServer server : new ArrayList<>(VelocityCore.getProxy().getAllServers())){ - if(server.getPlayersConnected().isEmpty()) + for (RegisteredServer server : new ArrayList<>(VelocityCore.getProxy().getAllServers())) { + if (server.getPlayersConnected().isEmpty()) continue; Subserver subserver = Subserver.getSubserver(server.getServerInfo()); - if(fightInfos.containsKey(server)) + if (fightInfos.containsKey(server)) subservers.add(new TablistServer(server, fightInfos.get(server))); - else if(subserver == null || subserver.getType() != Servertype.BAUSERVER) + else if (subserver == null || subserver.getType() != Servertype.BAUSERVER) subservers.add(new TablistServer(server)); } subservers.add(new TablistBuild());