More safe IPlayerData getting for the net checks.

This commit is contained in:
asofold 2018-04-20 12:06:21 +02:00
parent 6bddb1a834
commit 500544c32b
5 changed files with 34 additions and 5 deletions

View File

@ -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);

View File

@ -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());
}
}

View File

@ -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);

View File

@ -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.

View File

@ -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;
}
}