P2P-Develop/PeyangSuperbAntiCheat

View on GitHub
src/main/java/ml/peya/plugins/Detect/TestKnockback.java

Summary

Maintainability
A
0 mins
Test Coverage
package ml.peya.plugins.Detect;

import ml.peya.plugins.Enum.DetectType;
import ml.peya.plugins.PeyangSuperbAntiCheat;
import net.minecraft.server.v1_12_R1.PacketPlayOutEntityDestroy;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.scheduler.BukkitRunnable;

import static ml.peya.plugins.Utils.MessageEngine.get;
import static ml.peya.plugins.Utils.MessageEngine.pair;
import static ml.peya.plugins.Variables.cheatMeta;
import static ml.peya.plugins.Variables.config;

/**
 * ノックバックを確認するクラス。
 */
public class TestKnockback
{
    /**
     * 透明な矢をplayerに向けて発射する。
     *
     * @param player プレイヤー。
     * @param type   判定タイプ(不使用)。(AuraBotやAuraPanicは無視。)
     * @param sender イベントsender。
     */
    public static void scan(Player player, DetectType type, CommandSender sender)
    {
        if (type == DetectType.AURA_BOT || type == DetectType.AURA_PANIC)
            return;

        Location location = player.getLocation();
        location.add(0, 1, 0);
        location.setPitch(0);
        location.add(location.getDirection().multiply(-0.1f));

        Arrow arrow = (Arrow) player.getWorld().spawnEntity(location, EntityType.ARROW);
        cheatMeta.add(player, arrow.getUniqueId(), arrow.getEntityId(), DetectType.ANTI_KB);
        arrow.setMetadata("testArrow-" + arrow.getUniqueId(), new FixedMetadataValue(PeyangSuperbAntiCheat
            .getPlugin(), player.getUniqueId()));
        Bukkit.getOnlinePlayers().parallelStream().map(hide -> ((CraftPlayer) hide).getHandle().playerConnection)
            .forEachOrdered(connection -> connection.sendPacket(new PacketPlayOutEntityDestroy(arrow.getEntityId())));

        arrow.setVelocity(location.getDirection().multiply(32767f));

        cheatMeta.add(player, arrow.getUniqueId(), arrow.getEntityId(), type).setTesting(true);

        scanFinally(player, sender, arrow);
    }

    /**
     * 後始末をする。
     *
     * @param player プレイヤー。
     * @param sender イベントsender。
     * @param arrow  矢。
     */
    private static void scanFinally(Player player, CommandSender sender, Arrow arrow)
    {
        new BukkitRunnable()
        {
            @Override
            public void run()
            {
                sender.sendMessage(get(config
                    .getBoolean("message.lynx") ? "message.testkb.normal": "message.textkb.lynx", pair("name", player
                    .getName())));
                arrow.remove();
                cheatMeta.remove(arrow.getUniqueId());
            }
        }.runTaskLater(PeyangSuperbAntiCheat.getPlugin(), 20);
    }
}