P2P-Develop/PeyangSuperbAntiCheat

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

Summary

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

import ml.peya.plugins.DetectClasses.*;
import ml.peya.plugins.Enum.*;
import ml.peya.plugins.Moderate.*;
import ml.peya.plugins.*;
import ml.peya.plugins.Utils.*;
import net.minecraft.server.v1_12_R1.*;
import org.apache.commons.lang3.tuple.*;
import org.bukkit.*;
import org.bukkit.command.*;
import org.bukkit.entity.*;
import org.bukkit.scheduler.*;

import java.util.*;

import static ml.peya.plugins.Variables.*;

/**
 * NPCの出陣命令を、NPCスポーン命令に変換
 * 装備を指定や、コマンド等から受け取った物の管理
 */
public class DetectConnection
{
    /**
     * アーマー付きでスポーンさせる。
     *
     * @param player    プレイヤー。
     * @param type      判定タイプ。
     * @param reachMode リーチモードかどうか。
     * @return 万能クラス。
     */
    public static CheatDetectNowMeta spawnWithArmor(Player player, DetectType type, boolean reachMode)
    {
        EntityPlayer uuid = NPC.spawn(player, type, reachMode);
        CheatDetectNowMeta meta = cheatMeta.add(player, uuid.getUniqueID(), uuid.getId(), type);
        meta.setTesting(true);
        return meta;
    }

    /**
     * スキャン
     *
     * @param player    プレイヤー。
     * @param type      判定タイプ。
     * @param sender    イベントsender。
     * @param reachMode リーチモードかどうか。
     */
    public static void scan(Player player, DetectType type, CommandSender sender, boolean reachMode)
    {
        if (type == DetectType.ANTI_KB)
        {
            TestKnockback.scan(player, type, sender);
            return;
        }

        CheatDetectNowMeta meta = spawnWithArmor(player, type, reachMode);

        new BukkitRunnable()
        {
            @Override
            public void run()
            {
                meta.setTesting(false);

                final double vl = meta.getVL();
                final Double[] angles = cheatMeta.getMetaByPlayerUUID(player.getUniqueId()).getAngles().toArray(new Double[0]);
                //ごにょごにょする ← 一時的になんとなく実装

                if (learnCount > learnCountLimit)
                {
                    logger.info(String.valueOf(Arrays.stream(angles).mapToDouble(angle -> network.commit(Pair.of(vl, angle))).sum() / angles.length));
                    if (Arrays.stream(angles).mapToDouble(angle -> network.commit(Pair.of(vl, angle))).sum() / angles.length > PeyangSuperbAntiCheat.lv)
                    {
                        Arrays.stream(angles).forEachOrdered(angle -> learn(vl, angle));

                        learnCount++;

                        if (kick(player)) return;
                    }
                }
                else if (banLeft <= vl)
                {
                    Arrays.stream(angles).forEachOrdered(angle -> learn(vl, angle));

                    learnCount++;

                    if (kick(player)) return;
                }

                new BukkitRunnable()
                {
                    @Override
                    public void run()
                    {
                        String name = player.getDisplayName() + (player.getDisplayName().equals(player.getName()) ? "": (" (" + player.getName() + ") "));

                        switch (type)
                        {
                            case AURA_BOT:
                                if (sender == null)
                                    Bukkit.getOnlinePlayers().parallelStream()
                                        .filter(np -> np.hasPermission("psac.aurabot"))
                                        .forEachOrdered(np ->
                                            np.spigot().sendMessage(TextBuilder.textTestRep(name, meta.getVL(), banLeft).create()));
                                else
                                    sender.spigot().sendMessage(TextBuilder.textTestRep(name, meta.getVL(), banLeft).create());
                                break;

                            case AURA_PANIC:
                                if (sender == null)
                                    Bukkit.getOnlinePlayers()
                                        .parallelStream()
                                        .filter(np -> np.hasPermission("psac.aurapanic"))
                                        .forEachOrdered(np -> np.spigot().sendMessage(TextBuilder.textPanicRep(name, meta.getVL()).create()));
                                else
                                    sender.spigot().sendMessage(TextBuilder.textPanicRep(name, meta.getVL()).create());
                                break;
                            default:
                                break;
                        }

                        cheatMeta.remove(meta.getUUIDs());
                        this.cancel();
                    }
                }.runTaskLater(PeyangSuperbAntiCheat.getPlugin(), 10);
                this.cancel();
            }
        }.runTaskLater(PeyangSuperbAntiCheat.getPlugin(), Math.multiplyExact(config.getInt("npc.seconds"), 20));
    }

    /**
     * 学習回数を増やしAIを学習させる。
     *
     * @param vl    評価したVL。
     * @param angle あんぐるず
     */
    private static void learn(double vl, double angle)
    {
        ArrayList<Triple<Double, Double, Double>> arr = new ArrayList<>();
        arr.add(Triple.of(vl, angle, angle / vl));
        network.learn(arr, 100);
    }

    /**
     * キック動作の開始DA!
     *
     * @param player プレイヤー。
     * @return 処理が正常に終了したかどうか。
     */
    private static boolean kick(final Player player)
    {
        KickManager.kickPlayer(
            player,
            "PEYANG CHEAT DETECTION",
            true,
            false
        );
        return true;
    }
}