From 500544c32b07d74d9367996a636452cc1808f317 Mon Sep 17 00:00:00 2001 From: asofold Date: Fri, 20 Apr 2018 12:06:21 +0200 Subject: [PATCH] More safe IPlayerData getting for the net checks. --- .../net/protocollib/CatchAllAdapter.java | 7 +++++- .../checks/net/protocollib/DebugAdapter.java | 2 +- .../net/protocollib/KeepAliveAdapter.java | 2 +- .../checks/net/protocollib/MovingFlying.java | 4 ++-- .../nocheatplus/players/DataManager.java | 24 +++++++++++++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/CatchAllAdapter.java b/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/CatchAllAdapter.java index 0d479430..f16d8b03 100644 --- a/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/CatchAllAdapter.java +++ b/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/CatchAllAdapter.java @@ -28,6 +28,7 @@ import fr.neatmonster.nocheatplus.NCPAPIProvider; import fr.neatmonster.nocheatplus.checks.net.NetConfig; import fr.neatmonster.nocheatplus.checks.net.NetData; import fr.neatmonster.nocheatplus.checks.net.PacketFrequency; +import fr.neatmonster.nocheatplus.logging.StaticLog; import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.players.IPlayerData; @@ -73,7 +74,11 @@ public class CatchAllAdapter extends BaseAdapter { // TODO: Is this a problem, as the server has the player so it could break a block)? return; } - final IPlayerData pData = DataManager.getPlayerData(player); + final IPlayerData pData = DataManager.getPlayerDataSafe(player); + if (pData == null) { + StaticLog.logWarning("Failed to fetch player data with " + event.getPacketType() + " for: " + player.toString()); + return; + } if (packetFrequency.isEnabled(player, pData)) { final NetConfig cc = pData.getGenericInstance(NetConfig.class); final NetData data = pData.getGenericInstance(NetData.class); diff --git a/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/DebugAdapter.java b/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/DebugAdapter.java index 28fb6dc9..1ca32efd 100644 --- a/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/DebugAdapter.java +++ b/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/DebugAdapter.java @@ -36,7 +36,7 @@ public class DebugAdapter extends BaseAdapter { @Override public void onPacketReceiving(PacketEvent event) { final Player player = event.getPlayer(); - if (DataManager.getPlayerData(player).isDebugActive(CheckType.NET)) { + if (DataManager.getPlayerDataSafe(player).isDebugActive(CheckType.NET)) { debug(player, "packet: " + event.getPacketType()); } } diff --git a/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/KeepAliveAdapter.java b/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/KeepAliveAdapter.java index c7041c3f..657e8cc5 100644 --- a/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/KeepAliveAdapter.java +++ b/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/KeepAliveAdapter.java @@ -65,7 +65,7 @@ public class KeepAliveAdapter extends BaseAdapter { return; } // Always update last received time. - final IPlayerData pData = DataManager.getPlayerData(player); + final IPlayerData pData = DataManager.getPlayerDataSafe(player); final NetData data = pData.getGenericInstance(NetData.class); data.lastKeepAliveTime = time; final NetConfig cc = pData.getGenericInstance(NetConfig.class); diff --git a/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/MovingFlying.java b/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/MovingFlying.java index 2bd73098..c388cd11 100644 --- a/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/MovingFlying.java +++ b/NCPCompatProtocolLib/src/main/java/fr/neatmonster/nocheatplus/checks/net/protocollib/MovingFlying.java @@ -158,7 +158,7 @@ public class MovingFlying extends BaseAdapter { return; } final Player player = event.getPlayer(); - final IPlayerData pData = DataManager.getPlayerData(player); + final IPlayerData pData = DataManager.getPlayerDataSafe(player); final NetData data = pData.getGenericInstance(NetData.class); final AlmostBoolean matched = data.teleportQueue.processAck(teleportId); if (matched.decideOptimistically()) { @@ -195,7 +195,7 @@ public class MovingFlying extends BaseAdapter { return; } - final IPlayerData pData = DataManager.getPlayerData(player); + final IPlayerData pData = DataManager.getPlayerDataSafe(player); // Always update last received time. final NetData data = pData.getGenericInstance(NetData.class); data.lastKeepAliveTime = time; // Update without much of a contract. diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java index a183b1f5..bd5690c3 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java @@ -259,4 +259,28 @@ public class DataManager { return instance.getNewInstance(registeredFor, arg); } + /** + * Attempt to get or create an IPlayerData instance. Creation will only be + * done, if the player name, UUID and world can be fetched. + * + * @param player + * @return null in case of failures. + */ + public static IPlayerData getPlayerDataSafe(final Player player) { + try { + return getPlayerData(player); + } + catch (UnsupportedOperationException e) {} + try { + return getPlayerData(player.getUniqueId()); + } + catch (UnsupportedOperationException e) {} + try { + return getPlayerData(player.getName()); + } + catch (UnsupportedOperationException e) {} + // Failure. + return null; + } + }