1 355
收录服务器
1 918
注册
27 384
玩家
Phoenix Anti-Cheat 凤凰反作弊
反黑客系统。
作 者 TheMuhammed2188
发布时间 2015年4月19日
支持核心 Spigot
原生版本
支持版本 1.7,1.8,1.9,1.10,1.11,1.12,1.13
点此下载

🛡️ Phoenix AntiCheat (PAC)

PAC 是一款反作弊系统,目前仍在开发中,未来会加入更多作弊类型的检测。你可以通过提交 Bug 来支持我们。

Discord: https://discord.gg/zB7797a

GitHub (for issues): Confuser2188/PhoenixAntiCheat

⚙️ 配置详解

Actions 示例

以下展示了 actions 部分的用法示例:


killaura:
  enabled: true
  actions: cancel:notify:vl>=3:pacmessage r u using <hack> m8?:vl==5:kick <player> <tag> st0p h4ck1ng n00b

在这个例子中,所有违规行为都会被取消并通知管理员。如果违规值大于等于 3,会向玩家发送消息。如果违规值等于 5,则会踢出玩家。

注意:

  • 使用 : 字符分隔多个命令。
  • 如果想在消息中使用 :,请使用 \: 进行转义。

违规值运算符

  • == (等于)
  • > (大于)
  • < (小于)
  • >= (大于等于)
  • <= (小于等于)

可用命令

  • cancel
  • notify
  • pacmessage
  • pacbroadcast

可用占位符

  • <player>
  • <tag>
  • <vl>
  • <ping>
  • <tps>
  • <hack><module>

✅ 兼容性

PAC 的最新版本兼容 Spigot 1.7、1.8、1.9、1.10、1.11、1.12 和 1.13。

PAC 还支持协议破解 (1.7 - 1.8) 和 ViaVersion 插件。

如果您的服务器版本与 PAC 兼容,则无需任何其他插件即可自由使用它。

🔑 权限列表

  • Phoenix.Command - 使用 PAC 命令
  • Phoenix.Notification - 接收通知
  • Phoenix.Bypass.<module_name> - 绕过特定模块的检测

🚫 阻止的作弊类型

战斗

  • KillAura
  • ForceField
  • TpAura
  • Criticals

移动

  • Flight/Fly
  • Speed
  • Glide
  • LongJump
  • AirJump
  • Blink
  • AntiWeb
  • BunnyHop
  • InventoryMove
  • Spider
  • Timer
  • HeadRoll
  • Phase

玩家

  • ImpossibleInteract
  • MoreInventory
  • Regen

聊天

  • Spam
  • UnknownCharacters

渲染

  • HealthESP/DamageIndicator

其他

  • SpamBot
  • NBT exploit

⚠️ API 注意事项

API 在 2.0.0-pre6 版本中已损坏。

🧱 API

API 版本: 1

PACAPI

PACAPI 是 API 的主类。

用法:


import me.themuhammed2188.pac.api.PACAPI;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{

    PACAPI pacapi;

    public void onEnable() {
        pacapi = new PACAPI(this);
    }
}

方法:


PlayerPAC getPlayer(Player player) // 返回自定义玩家类
int getMajorVersion() // 返回 API 的主版本号
int getMinorVersion() // 返回 API 的次版本号
ServerPAC getServer() // 返回自定义服务器类
String getVersionPAC() // 返回 PAC 插件的版本
Plugin getPlugin() // 返回 PAC 插件对象
void addCheck(Check check)  // 添加检测到列表
boolean removeCheck(Check check) // 从列表中删除检测

🎉 事件

PlayerViolationEvent

当玩家未能通过检测时调用。

用法:


import me.themuhammed2188.pac.api.HackType;
import me.themuhammed2188.pac.api.event.PlayerViolationEvent;
import me.themuhammed2188.pac.api.utils.Attribute;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener{

    public void onEnable() {
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onViolation(PlayerViolationEvent event)
    {
        Player player = event.getPlayer();
        HackType hackType = event.getHackType();
        int VL = event.getVL();
        Attribute[] attributes = event.getAttributes();

        event.setCancelled(true);
    }
}

PlayerPacketReceivedEvent

当服务器收到来自玩家的数据包时调用。

PlayerPacketSentEvent

当服务器向玩家发送数据包时调用。

用法:


import me.themuhammed2188.pac.api.event.PlayerPacketReceivedEvent;
import me.themuhammed2188.pac.api.event.PlayerPacketSentEvent;
import me.themuhammed2188.pac.api.utils.Packet;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener{

    public void onEnable() {
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onPacketReceived(PlayerPacketReceivedEvent event)
    {
        Player player = event.getPlayer();
        Packet packet = event.getPacket();

        event.setCancelled(true);
    }

    @EventHandler
    public void onPacketSent(PlayerPacketSentEvent event)
    {
        Player player = event.getPlayer();
        Packet packet = event.getPacket();

        event.setCancelled(true);
    }
}

PhoenixCommandEvent

当玩家使用以 "/pac" 开头的命令时调用。

用法:


import me.themuhammed2188.pac.api.event.PhoenixCommandEvent;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener{

    public void onEnable() {
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onCommand(PhoenixCommandEvent event)
    {
        Player player = event.getPlayer();
        CommandSender sender = event.getSender();
        String[] args = event.getArgs();
        String cmd = event.getCmd();
    }
}

🔍 Check

你需要使用 addCheck(Check paramCheck) 方法在 PACAPI 中启用你的模块。

用法:


import me.themuhammed2188.pac.api.Check;
import me.themuhammed2188.pac.api.utils.Attribute;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerMoveEvent;

public class TestCheck extends Check {

    public TestCheck() {
        super("Test");
    }

    @EventHandler
    public void onMove(PlayerMoveEvent e)
    {
        sendNotification(e.getPlayer(), "moving = hacking", 1, new Attribute[] { Attribute.get("type", 999)});
    }
}

方法:


String getName()
void sendNotification(Player player, String info, int vl, Attribute[] attributes)

👤 PlayerPAC

方法:


Player getBukkitPlayer() // 返回 org.bukkit.entity.Player
int getCPS() // 返回每秒点击次数
int getMovementPacketRate() // 返回每秒移动数据包数量
int getPing() // 返回 NMS ping
boolean isOnGround() // 返回 PAC 中的 onGround 方法

🌐 ServerPAC

方法:


List<Plugin> getPlugins() // 返回 PAC 插件列表
double getTPS() // 返回服务器每秒 Tick
String getVersion() // 返回服务器版本
String getMinecraftVersion() // 返回服务器的 Minecraft 版本
String getSpigotName() // 返回服务器构建名称

✨ Attribute List


MorePackets:
("type", String: "instant") ("rate", int: rate) ("expected", expected)
("type", String: "sendRate") ("rate", int: preRate) ("expected", expected)

ASCII:
("msg", message)

Inventory:
("type", String: "move")
("type", String: "hit")

KillAura:
("type", String: "autoBlock")
("type", String: "forcefield") ("count", int: count)
("type", String: "instant") ("prev", fp) ("cur", float: diff)
("type", String: "static") ("val", float: val)
("type", String: "reaction") ("avg", float: avg) ("diff", float: diff) ("diffb", float: diffb)
("type", String: "zero") ("cur", float: cur) ("prev", int: 0)
("type", String: "wrong") ("diff", float: diff1) ("diff2" float: diff2)

HeadRoll:
("pitch", float: pitch)

Phase:
("block", org.bukkit.block.Block: b)

Speed:
("flags", String: flags) ("speed", double: dist) ("expected", double: expected)

Flight:
("type", String: "levitationSpeed") ("speed", double: speed) ("expected", double: expected)
("type", String: "fastLadder") ("speed", double: ladderSpeed) ("excepted", double: defaultSpeed)
("type", String: "miniJump") ("height", double: distHeight) ("jumpStep", int: jumpStep)
("type", String: "airJump") ("diff", double: adiff)
("type", String: "step") ("diff" double: adiff)
("type", String: "maxHeight") ("maxJumpHeight", double: max) ("height", double: adiff)
("type", String: "fastFall") ("height", double: height)
("type", String: "glide") ("fs", double: fallSpeed)
("type", String: "glide-b")

NBT:
("type", String: "bookPages") ("pages", int: list.size)
("type", String: "bookLength") ("length" int: list.length)