Atlas

Atlas - 自定义数据包监听与实用工具集

最紧凑、精确且功能全面的 Bukkit 插件 API。
Bukkit / Spigot 作者 DawsonH 支持版本 1.7 - 1.19
服务器使用量
未统计
服务玩家数
未统计
下载量
14,046
插件详细介绍

需要反作弊方案?试试 Kauri Anticheat!

Atlas 是一个一体化且高度集成的 API,专为希望提升其 Bukkit 插件或反作弊系统性能的开发者设计。它提供了一套强大的工具集,旨在简化开发流程并增强插件功能。

核心特性

Atlas 包含以下核心组件,帮助开发者构建高效、稳定的插件:

  • 高级数据包嗅探系统:提供无缝的自定义数据包嗅探功能,并包含独立的数据包包装器。
  • 自定义事件系统:事件在异步线程中运行,确保使用您插件的服务器在主线程上不会出现任何性能下降。
  • 丰富的数学工具库:包含大量实用的数学工具,足以让您忘记在数学课上学到的东西。
  • 便捷工具方法:包含许多实用方法,例如向控制台发送彩色消息等。
  • 精准轻量的碰撞箱系统:目前最精确且轻量级的公开碰撞箱获取系统。
  • 反射工具集:提供大量反射方法和工具,包括用于获取 NMS 的抓取器。

使用 Atlas 的热门插件

以下是一些知名插件正在使用 Atlas

  • Iris Anticheat
  • 项目地址:https://github.com/funkemunky/Iris
  • Daedalus Anticheat
  • 项目地址:https://www.spigotmc.org/resources/daedalus-anticheat-advanced-detection.49215/
  • Kauri Anticheat
  • 项目地址:https://www.spigotmc.org/resources/...ction-new-official-release-sale-25-off.53721/

Maven 依赖

将以下配置添加到您的 pom.xml 文件中以使用 Atlas:

<repositories>
    <repository>
        <id>funkemunky-releases</id>
        <url>http://nexus.funkemunky.cc/content/repositories/releases/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>cc.funkemunky.plugins</groupId>
        <artifactId>Atlas</artifactId>
        <version>1.5.4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

自定义事件系统

创建事件

您可以创建继承自 AtlasEvent 的自定义事件。以下是一个示例:

package cc.funkemunky.anticheat.api.event;
import cc.funkemunky.api.events.AtlasEvent;
import cc.funkemunky.api.events.Cancellable;
import lombok.AllArgsConstructor;
import lombok.Getter;

public class TickEvent extends AtlasEvent implements Cancellable {
    private int currentTick;
    public TickEvent(int currentTick) {
        this.currentTick = currentTick;
    }
    public int getCurrentTick() {
        return currentTick;
    }
    @Override
    public boolean isCancelled() {
        return false;
    }
    @Override
    public void setCancelled(boolean b) {
    }
}

触发事件

您可以在异步任务中触发事件

new BukkitRunnable() {
    public void run() {
        TickEvent tickEvent = new TickEvent(currentTicks++);
        Atlas.getInstance().getEventManager().callEvent(tickEvent);
    }
}.runTaskTimerAsynchronously(this, 1L, 1L);

创建监听器

创建一个类并实现 AtlasListener 接口,使用 @Listen 注解来监听事件:

package cc.funkemunky.anticheat.impl.listeners;
import cc.funkemunky.anticheat.Rock;
import cc.funkemunky.anticheat.api.data.PlayerData;
import cc.funkemunky.anticheat.api.event.TickEvent;
import cc.funkemunky.api.Atlas;
import cc.funkemunky.api.events.AtlasListener;
import cc.funkemunky.api.events.Listen;
import cc.funkemunky.api.utils.Init;

@Init
public class FunkeListeners implements AtlasListener {
    @Listen
    public void onTickEvent(TickEvent event) {
        Atlas.getInstance().executeTask(() -> Rock.getInstance().getDataManager().getDataObjects().keySet().forEach(key -> {
            PlayerData data = Rock.getInstance().getDataManager().getDataObjects().get(key);
            data.getActionProcessor().update(data);
        }));
    }
}

注册监听器

在插件启用时注册您的监听器

public void onEnable() {
    Atlas.getInstance().getEventManager().registerListeners(new FunkeListeners(), this);
}

自定义数据包系统

发送数据包

使用 TinyProtocolHandler 发送自定义数据包:

TinyProtocolHandler.sendPacket(e.getPlayer(), new WrappedOutKeepAlivePacket(233 + e.getPlayer().getEntityId() + 935));

监听接收的数据包

通过监听 PacketRecieveEvent 来处理客户端发送的数据包:

@Listen
public void onEvent(PacketRecieveEvent e) {
    if (e.getType().equals(Packet.Client.ENTITY_ACTION)) {
        WrappedInEntityActionPacket packet = new WrappedInEntityActionPacket(e.getPacket(), e.getPlayer());
        switch (packet.getAction()) {
            case START_SNEAKING:
                data.skiderino.sneak = true;
                break;
            case STOP_SNEAKING:
                data.skiderino.sneak = false;
                break;
            case START_SPRINTING:
                data.skiderino.sprint = true;
                break;
            case STOP_SPRINTING:
                data.skiderino.sprint = false;
                break;
        }
    }
}

监听发送的数据包

通过监听 PacketSendEvent 来处理服务器发送给客户端的数据包:

@Listen
public void onPacketSend(PacketSendEvent e) {
    PlayerData data = Fiona.getInstance().getDataManager().getPlayerData(e.getPlayer());
    if (data != null) {
        switch (e.getType()) {
            case Packet.Server.KEEP_ALIVE:
                data.lastServerKeepAlive = System.currentTimeMillis();
                break;
            case Packet.Server.ENTITY_METADATA:
                WrappedOutEntityMetadata wrapper = new WrappedOutEntityMetadata(e.getPacket(), e.getPlayer());
                if(wrapper.getObjects().size() > 0) {
                    if(wrapper.getObjects().get(0).getObject() instanceof Byte && (data.isUsingItem = ((Byte) wrapper.getObjects().get(0).getObject()) % 0x5 == 1)) {
                        data.lastUseItem.reset();
                    }
                }
                break;
        }
    }
}

碰撞箱系统

获取特定方块的碰撞箱

此示例展示了如何获取被点击方块的碰撞箱并可视化其边界:

@EventHandler(priority = EventPriority.HIGHEST)
public void onEvent(PlayerInteractEvent event) {
    if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
        if (event.getItem() != null && event.getItem().getType().equals(Material.BLAZE_ROD) && event.getItem().getItemMeta().getDisplayName().equalsIgnoreCase(Color.Red + "Magic Box Wand")) {
            Block block = event.getClickedBlock();
            event.getPlayer().sendMessage(block.getType().name() + "'s Data: " + block.getData());
            for (BoundingBox box : Atlas.getInstance().getBlockBoxManager().getBlockBox().getSpecificBox(block.getLocation())) {
                for (float x = box.minX; x < box.maxX; x += 0.2f) {
                    for (float y = box.minY; y < box.maxY; y += 0.2f) {
                        for (float z = box.minZ; z < box.maxZ; z += 0.2f) {
                            WrappedPacketPlayOutWorldParticle packet = new WrappedPacketPlayOutWorldParticle(WrappedEnumParticle.FLAME, true, x, y, z, 0f, 0f, 0f, 0f, 1, null);
                            packet.sendPacket(event.getPlayer());
                        }
                    }
                }
                event.getPlayer().sendMessage(ReflectionsUtil.getVanillaBlock(event.getClickedBlock()).getClass().getSimpleName() + ": " + box.toString());
            }
        }
    }
}

获取碰撞范围内的所有碰撞箱

获取与指定边界框发生碰撞的所有方块碰撞箱

List<BoundingBox> box = Atlas.getInstance().getBlockBoxManager().getBlockBox().getCollidingBoxes(to.getWorld(), data.boundingBox.grow(0.5f, 0.1f, 0.5f).subtract(0, 0.5f, 0, 0, 0, 0));
CollisionAssessment assessment = new CollisionAssessment(data.boundingBox, data);
box.forEach(bb -> assessment.assessBox(bb, to.getWorld()));

获取实体的碰撞箱

使用工具方法获取实体的边界框

MiscUtils.getEntityBoundingBox(e.getPlayer());

更多帮助

如果您有任何疑问,请查阅 [官方 Wiki](这里)。该 Wiki 仍在持续更新和完善中。

测试支持版本
1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19
版本分布
基本信息
插件名称 Atlas
作者 DawsonH
平台 Bukkit / Spigot
支持版本 1.7 - 1.19
点赞数 6
最近版本
暂无数据 -

友情链接: 网易我的世界 | 泰拉瑞亚 | ocent云计算 | 米饭Minecraft插件文档 | 友链合作

历史访问人数:2,586,120  |  历史访问人次:3,137,426

今日访问人数:6,592  |  今日访问人次:7,047

昨日访问人数:24,332  |  昨日访问人次:29,698

Copyright © 2019-2026 我的世界服务器列表站. All rights reserved.

Powered by GermMC 京ICP备17023959号-6