Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tc.oc.pgm.listeners;

import static tc.oc.pgm.util.Assert.assertNotNull;
import static tc.oc.pgm.util.bukkit.MiscUtils.MISC_UTILS;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
Expand Down Expand Up @@ -30,6 +29,7 @@
import tc.oc.pgm.api.match.event.MatchLoadEvent;
import tc.oc.pgm.map.contrib.PlayerContributor;
import tc.oc.pgm.util.ClassLogger;
import tc.oc.pgm.util.event.ExtraPingDataRequestEvent;

public class ServerPingDataListener implements Listener {

Expand Down Expand Up @@ -66,7 +66,7 @@ public void onMatchLoad(MatchLoadEvent event) {

@EventHandler
public void onServerListPing(ServerListPingEvent event) {
if (!ready.get() || legacySportPaper.get()) return;
if (!ready.get()) return;

// Remove vanished players from player sample/ping count
Iterator<Player> playerSample = event.iterator();
Expand All @@ -76,9 +76,14 @@ public void onServerListPing(ServerListPingEvent event) {
playerSample.remove();
}
}
}

@EventHandler
public void onExtraDataRequest(ExtraPingDataRequestEvent event) {
if (legacySportPaper.get()) return;

try {
JsonObject root = MISC_UTILS.getServerListExtra(event, PGM.get());
JsonObject root = event.getServerListExtra(PGM.get());
this.matchManager.getMatches().forEachRemaining(match -> {
String matchId = match.getId();
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import static tc.oc.pgm.util.platform.Supports.Variant.PAPER;

import com.google.gson.JsonObject;
import java.nio.file.Path;
import java.util.List;
import net.kyori.adventure.key.Key;
Expand Down Expand Up @@ -33,9 +32,7 @@
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.server.ServerListPingEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.scoreboard.Team;
import tc.oc.pgm.platform.modern.material.ModernBlockMaterialData;
import tc.oc.pgm.util.DataVersions;
Expand All @@ -45,12 +42,6 @@

@Supports(value = PAPER, minVersion = "1.21.5")
public class ModernMiscUtil implements MiscUtils {
@Override
public JsonObject getServerListExtra(ServerListPingEvent event, Plugin plugin) {
// TODO: PLATFORM 1.20 no support for extra fields in server ping
return new JsonObject();
}

@Override
public EventException createEventException(Throwable cause, Event event) {
return new EventException(cause);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
package tc.oc.pgm.platform.modern.packets;

import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.injector.netty.WirePacket;
import com.google.gson.JsonObject;
import com.mojang.serialization.Codec;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.JsonOps;
import io.netty.buffer.Unpooled;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
import net.minecraft.network.protocol.status.ServerStatus;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.world.entity.Entity;
Expand All @@ -16,6 +25,7 @@
import org.bukkit.plugin.Plugin;
import tc.oc.pgm.platform.modern.listeners.PlayerTracker;
import tc.oc.pgm.platform.modern.util.Packets;
import tc.oc.pgm.util.event.ExtraPingDataRequestEvent;
import tc.oc.pgm.util.reflect.ReflectionUtils;

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -45,7 +55,8 @@ public PacketManipulations(Plugin plugin, PlayerTracker tracker) {
Map.of(
PacketType.Play.Server.ENTITY_STATUS, this::handleEntityStatus,
PacketType.Play.Server.PLAYER_COMBAT_KILL, this::handleCombatKill,
PacketType.Play.Server.ENTITY_METADATA, this::handleEntityMetadata));
PacketType.Play.Server.ENTITY_METADATA, this::handleEntityMetadata,
PacketType.Status.Server.SERVER_INFO, this::handleServerPing));
}

private void handleEntityStatus(PacketEvent event) {
Expand Down Expand Up @@ -127,4 +138,37 @@ private void handleEntityMetadata(PacketEvent event) {
if (!checkHealth && !hideParticles) return;
}
}

private void handleServerPing(PacketEvent event) {
JsonObject pingExtra = new JsonObject();
new ExtraPingDataRequestEvent() {
@Override
public JsonObject getServerListExtra(Plugin plugin) {
return (JsonObject)
pingExtra.asMap().computeIfAbsent(plugin.namespace(), k -> new JsonObject());
}
}.callEvent();

if (!pingExtra.isEmpty()) {
// Encode the response manually, otherwise the extra data will get lost
var serverPing = (ServerStatus) event.getPacket().getServerPings().read(0).getHandle();
var jsonData = ServerStatus.CODEC
.encodeStart(JsonOps.INSTANCE, serverPing)
.getOrThrow()
.getAsJsonObject();

jsonData.add("bukkit_extra", pingExtra);

var byteBuf = new FriendlyByteBuf(Unpooled.buffer());
byteBuf.writeJsonWithCodec(Codec.PASSTHROUGH, new Dynamic<>(JsonOps.INSTANCE, jsonData));

ProtocolLibrary.getProtocolManager()
.sendWirePacket(
event.getPlayer(),
new WirePacket(PacketType.Status.Server.SERVER_INFO, byteBuf.array()));

byteBuf.release();
event.setCancelled(true);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import static tc.oc.pgm.util.event.EventUtil.handleCall;

import com.google.gson.JsonObject;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import tc.oc.pgm.util.event.ExtraPingDataRequestEvent;
import tc.oc.pgm.util.event.block.BlockDispenseEntityEvent;
import tc.oc.pgm.util.event.block.BlockFallEvent;
import tc.oc.pgm.util.event.entity.EntityDespawnInVoidEvent;
Expand All @@ -19,7 +22,6 @@
import tc.oc.pgm.util.event.player.PlayerSpawnEntityEvent;

public class SportPaperListener implements Listener {

@EventHandler(ignoreCancelled = true)
public void onBlockFall(org.bukkit.event.block.BlockFallEvent sportEvent) {
BlockFallEvent pgmEvent = new BlockFallEvent(sportEvent.getBlock(), sportEvent.getEntity());
Expand Down Expand Up @@ -108,4 +110,16 @@ public void onEntityDespawn(org.bukkit.event.entity.EntityDespawnInVoidEvent spo
EntityDespawnInVoidEvent pgmEvent = new EntityDespawnInVoidEvent(sportEvent.getEntity());
handleCall(pgmEvent, sportEvent);
}

@EventHandler
public void onServerPing(final org.bukkit.event.server.ServerListPingEvent event) {
handleCall(
new ExtraPingDataRequestEvent() {
@Override
public JsonObject getServerListExtra(Plugin plugin) {
return event.getOrCreateExtra(plugin);
}
},
event);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import static tc.oc.pgm.util.platform.Supports.Priority.HIGH;
import static tc.oc.pgm.util.platform.Supports.Variant.SPORTPAPER;

import com.google.gson.JsonObject;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
Expand All @@ -30,9 +29,7 @@
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.server.ServerListPingEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import tc.oc.pgm.platform.sportpaper.material.LegacyMaterialData;
import tc.oc.pgm.util.DataVersions;
import tc.oc.pgm.util.bukkit.MiscUtils;
Expand All @@ -49,11 +46,6 @@ public boolean yield(Event event) {
return true;
}

@Override
public JsonObject getServerListExtra(ServerListPingEvent event, Plugin plugin) {
return event.getOrCreateExtra(plugin);
}

@Override
public EventException createEventException(Throwable cause, Event event) {
return new EventException(cause, event);
Expand Down
7 changes: 0 additions & 7 deletions util/src/main/java/tc/oc/pgm/util/bukkit/MiscUtils.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package tc.oc.pgm.util.bukkit;

import com.google.gson.JsonObject;
import java.nio.file.Path;
import java.util.List;
import net.kyori.adventure.key.Key;
Expand All @@ -19,9 +18,7 @@
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.server.ServerListPingEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.scoreboard.Team;
import tc.oc.pgm.util.material.BlockMaterialData;
import tc.oc.pgm.util.platform.Platform;
Expand All @@ -33,10 +30,6 @@ default boolean yield(Event event) {
return false;
}

default JsonObject getServerListExtra(ServerListPingEvent event, Plugin plugin) {
return new JsonObject();
}

default EventException createEventException(Throwable cause, Event event) {
return new EventException(cause);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package tc.oc.pgm.util.event;

import com.google.gson.JsonObject;
import org.bukkit.event.HandlerList;
import org.bukkit.event.server.ServerEvent;
import org.bukkit.plugin.Plugin;

/**
* Called by individual platform implementations to allow listeners to attach additional server ping
* data
*/
public abstract class ExtraPingDataRequestEvent extends ServerEvent {
public abstract JsonObject getServerListExtra(Plugin plugin);

private static final HandlerList handlers = new HandlerList();

@Override
public HandlerList getHandlers() {
return handlers;
}

public static HandlerList getHandlerList() {
return handlers;
}
}