[1.8-26.x][玩家交互][玩家@艾特]HanAtPlayerPlus全新的适用现代服务器的使玩家像QQ那样艾特@玩家的插件

原创 开源 聊天 娱乐 [1.8-26.x][玩家交互][玩家@艾特]HanAtPlayerPlus全新的适用现代服务器的使玩家像QQ那样艾特@玩家的插件 4.11

完成注册/登录后下载
指令变化

/at 多人写法由逗号分隔改为空格分隔:

  • 旧:/at 玩家1,玩家2
  • 新:/at 玩家1 玩家2

逗号写法已不再支持,会被当成一个不存在的玩家名。

Tab 补全同步支持逐段补全,已写过的名字不再重复推荐。




API 变化

方法


方法作用
sendTitle(Player target, String raw)向指定玩家发送跨版本屏幕标题,支持 1.8 ~ 26.x,支持 & 颜色码
sendSound(Player target, String raw)向指定玩家播放跨版本音效,支持 1.8 ~ 26.x,自动适配音效名格式
at(Player sender, Player... targets)发起一次或多次艾特;sender 为 null 时改为全服公告
randomAt(Player sender, int count)随机艾特若干在线玩家;sender 为 null 时从全体在线抽取
atAll(Player sender)艾特全体在线玩家,等同 /at all;sender 为 null 时走全服公告

事件

事件说明
AtEvent玩家与控制台艾特共用,发出通知前触发,可取消;批量时每个目标各抛一次
RandomAtEvent玩家与控制台随机艾特共用,抽中目标后触发,可取消;取消则本次不发出




线程说明

  • v4.0 / v4.1:AtEvent / RandomAtEvent 为异步线程触发,监听器内不要直接调用 Bukkit 主线程专属 API。需要操作玩家、发物品、发消息等,请用 runTask 回到主线程。
  • v4.11 起:改为在主线程触发,可以直接调用 Bukkit API。




本次变化重点

原 AtFromPlayerEvent / AtFromConsoleEvent 合并为统一的 AtEvent,用 getSender() 是否为 null 区分玩家 / 控制台。




调用例子

Java:
// 发送标题
// raw 格式:"标题,副标题,fadeIn,stay,fadeOut"(后三项单位 tick,20 tick = 1 秒)
// 1.8 ~ 1.10 服务端会自动忽略后三项;支持 & 颜色码
AtAPI.sendTitle(player, "&6提醒,&b有人在艾特你,10,30,10");

// 播放音效
// raw 格式:"音效名,音量,音调"
// 音效名写枚举名或资源路径都行,插件会按服务端版本自动转换:
//   ENTITY_CAT_AMBIENT  →  1.13+ 转成 entity.cat.ambient
//                       →  1.9~1.12 直接可用
//                       →  1.8 需写该版本存在的枚举名,如 CAT_AMBIENT
AtAPI.sendSound(player, "ENTITY_CAT_AMBIENT,1,1");

// 玩家艾特指定目标
AtAPI.at(sender, target1, target2);

// 全服公告艾特
AtAPI.at(null, target);

// 随机艾特 3 名在线玩家
AtAPI.randomAt(sender, 3);

// 控制台随机艾特 3 名在线玩家
AtAPI.randomAt(null, 3);

// 艾特全体在线玩家
AtAPI.atAll(sender);




监听事件例子

Java:
// AtEvent:任何一次艾特真正发出通知之前触发
// v4.0 / v4.1:异步线程触发,操作 Bukkit API 需 runTask 回主线程
// v4.11+:主线程触发,可直接调用 Bukkit API
@EventHandler
public void onAt(AtEvent event) {
    if (event.isFromConsole()) {
        // 控制台发起的艾特
    } else {
        // 玩家发起的艾特,用 event.getSender() 取发起者
    }
}

Java:
// RandomAtEvent:@random / at random 抽到目标之后触发
// v4.0 / v4.1:异步线程触发,操作 Bukkit API 需 runTask 回主线程
// v4.11+:主线程触发,可直接调用 Bukkit API
@EventHandler
public void onRandomAt(RandomAtEvent event) {
    Player target = event.getTarget();
    if (target.isOp()) {
        // 取消则本次随机艾特不发出、不记历史
        event.setCancelled(true);
    }
}




随机事件发物品

Java:
@EventHandler
public void onRandomAt(RandomAtEvent event) {
    // 抽中目标后触发,此时还未发出任何通知
    Player target = event.getTarget();

    // 给被随机抽中的玩家发一个物品
    // v4.11 起事件在主线程抛出,可直接操作背包,不需要 runTask
    ItemStack reward = new ItemStack(Material.DIAMOND, 1);
    target.getInventory().addItem(reward);
}
v4.1更新公告(按照重要程度排序):
1: 修复中文名不能艾特的重大bug

2: 支持一次艾特多人: 聊天框格式: @ 玩家A @玩家B;指令: /at 玩家A,玩家B

3: random艾特支持自定义随机艾特人数,比如这次我绝定随机艾特2人,
聊天框: @随机玩家 @随机玩家(写俩就随机挑俩)
指令: at random [数量](艾特的人数)

4: 新增papi占位符,并把以前的删除,现在的papi为:
%tuolingat_cooldown% 剩余冷却秒数
%tuolingat_target% 我最近一次艾特的人(10 秒内,过期返回空)
%tuolingat_sender% 最近一次艾特我的人(10 秒内,过期返回空)

5: 开发者相关,新增AtAPI,玩家之间艾特,控制台艾特,随机艾特事件
AtAPI: 直接艾特玩家,发送title,sound(支持1.8-26.x)也就是说,开发者如果要兼容
1.8-26.x所有的title,sound可以直接调用此插件的api,不需要自己去写代码兼容
完整的请见最下方

6:: 修复边界,@ 小红帽 结果把小红给艾特了,现在完全匹配

7:command包结构修改,模块化,然后删除ParseMode的枚举

8: 区分了玩家艾特玩家,控制台艾特玩家
9: tab体验升级,玩家输入/at 玩家A,玩家B 全程有tab补全
10: 修复控制台艾特聊天框没反馈,很僵硬问题
11: 删除对Player的多余缓存
12: 修复配置文件有些命名不是大驼峰的问题
13: 优化架构细节

API完整如下:

方法​

sendTitle(Player target, String raw) — 发屏幕标题,自动适配 1.8 ~ 26.x

sendSound(Player target, String raw) — 播音效,自动适配 1.8 ~ 26.x

playerAt(Player sender, Player... targets) — 玩家艾特玩家(可多个)

consoleAt(Player... targets) — 控制台/服务器发起,走全服公告

randomAt(Player sender, int count) — 随机艾特;sender 传 null 即控制台发起

事件​

AtFromPlayerEvent — 玩家之间的艾特发触发,可以获取艾特人的玩家,和被艾特的玩家

AtFromConsoleEvent — 控制台艾特玩家触发的事件,可以获取被艾特的玩家

RandomAtEvent — 聊天框输入 @ 随机玩家 / at random 触发的事件,可以获取,被抽到的玩家

你可以取消上述三个事件,也可以植入自己的业务逻辑,比如打开一个龙核hud来代替我的title,
或者说在RandomAtEvent加一个奖励给与,等等,
当服务器人数多的时候,开启双线程模式,人数少的时候开启单线程,配置可以改
/hanAt at 玩家名 艾特玩家"
/hanAt reload 重载配置
/hanAt all 艾特所有玩家
/hanAt random 艾特随机玩家
/hanAt clearCooldown 清除冷却
后退
顶部 底部