击杀助攻

击杀助攻

在游戏中增加了助攻显示功能,可以查看是谁导致你倒下!包含百分比设置和供其他模组调用的API。

图书馆

描述

想看看是谁参与了玩家的死亡?这个模组就是为你准备的。

它会追踪在一场战斗中对玩家造成伤害的所有实体,并在死亡界面和击杀信息中显示它们的名字。该模组还包含一个 API,允许其他模组访问这些数据。例如,PvP 模组可以在玩家击杀另一名玩家时给予其经验值。

击杀助攻有两个主要的配置模式:最后一击和最高伤害。

  • 最后一击:击杀归属于最后击中受害者的玩家。
  • 最高伤害:击杀归属于造成最高伤害的玩家,可以防止抢人头。

该模组(及其 API!)也能提供伤害百分比,让你看到每个参与者造成了多少伤害。模组开发者可以利用这些数据,例如,根据造成的伤害来按比例分配经验值。

包含面向模组开发者的完整集成文档!

Hydowned Revival! 兼容!

面向服主/模组拥有者的用户和API文档

KillAssists — 文档


第 1 部分:配置

作为服务器所有者,你需要配置模组的一切。无需写代码。

配置文件

首次启动时,会在 mods/KillAssists/config.json(相对于服务器工作目录)创建一个配置文件。编辑它并重启服务器,或者使用游戏内命令实时更改设置。

{
  "_comment_assistWindowMs": "时间窗口(毫秒)。在此窗口内对死亡前造成的任何伤害都算作助攻。范围:1000-120000",
  "assistWindowMs": 10000,

  "_comment_maxAssistsDisplayed": "在击杀信息和死亡界面中显示的最大助攻名称数量。范围:1-10",
  "maxAssistsDisplayed": 3,

  "_comment_trackMobDamage": "如果为 true,则怪物/NPC 造成的伤害会被追踪为助攻。如果为 false,则只计算玩家伤害。",
  "trackMobDamage": true,

  "_comment_killAttribution": "在 API 中(发送给其他模组的数据),谁被视为击杀者。'last_hit' = 造成最后一击的实体。'top_damage' = 造成总伤害最高的实体。**不**影响游戏内显示。",
  "killAttribution": "last_hit",

  "_comment_displayMode": "在击杀信息和死亡界面中显示谁为击杀者。'last_hit' = 最后一击者。'top_damage' = 最高伤害者(用 % 标记)。独立于 killAttribution。",
  "displayMode": "last_hit",

  "_comment_showPercentages": "如果为 true,则在击杀信息和死亡界面中每个人名旁边显示伤害百分比。例:'PlayerA (62%) [+PlayerB (25%), Mob (13%)]'。与两种 displayMode 值都兼容。",
  "showPercentages": false
}

设置说明

assistWindowMs

时间窗口(毫秒)。当一名玩家死亡时,模组会回溯这么长的时间来寻找所有造成伤害的实体。默认值:10000(10 秒)。范围:1000120000

maxAssistsDisplayed

在击杀信息和死亡界面中显示的最大助攻名称数量。如果超过这个数量,其余的会显示为 +N。默认值:3。范围:110

trackMobDamage

如果为 true,怪物和 NPC 造成的伤害算作助攻。如果为 false,则只追踪玩家造成的伤害。默认值:true

killAttribution

在 API 中(发送给其他模组(如 PvP 统计追踪器)的 KillEvent),谁被视为“击杀者”。会改变玩家在游戏内看到的内容。

行为
last_hit 造成最后一击的实体获得击杀计数(默认)
top_damage 在时间窗口内造成总伤害最高的实体获得击杀计数

displayMode

在游戏内(击杀信息标记和死亡界面),谁被显示为击杀者。独立于 killAttribution

行为
last_hit 最后一击者被显示为击杀者(默认)
top_damage 最高伤害者被显示为击杀者,并用 % 符号标记

你可以混合搭配——例如,killAttribution: "top_damage"(API 将击杀归属于最高伤害者)+ displayMode: "last_hit"(玩家看到经典的最后一击显示)。

showPercentages

如果为 true,则在击杀信息和死亡界面中,每个人名旁边会显示伤害百分比。

showPercentages displayMode 击杀信息示例
false last_hit PlayerB [+PlayerA, Mob1]
true last_hit PlayerB (10%) [+PlayerA (62%), Mob1 (28%)]
false top_damage PlayerA% [+Mob1, PlayerB]
true top_damage PlayerA% (62%) [+Mob1 (28%), PlayerB (10%)]

游戏内命令

/killassists [设置项] [值]

设置项 描述
window 1000120000 (毫秒) 追踪伤害的时间窗口
maxdisplay 110 击杀信息/死亡界面中显示的最大助攻数
trackmobs true / false 将怪物伤害追踪为助攻
killmode last_hit / top_damage 击杀归属模式 (API)
display last_hit / top_damage 显示模式 (UI)
showpct true / false 在游戏中显示伤害百分比

不带参数:显示当前配置。所有更改都会立即保存到配置文件中。


第 2 部分:面向模组开发者的 API

从另一个模组连接 KillAssists 所需的一切。

依赖项

在你的 manifest.json 中将 KillAssists 添加为依赖项:

{
  "dependencies": ["KillAssists"]
}

公共类位于 com.killassists.api 包中。

监听击杀事件

每次玩家死亡都会触发一个 KillEvent无论是否有助攻。无论配置如何,该事件始终包含每个参与实体的伤害百分比。在你的插件的 setup() 中注册一个监听器:

import com.killassists.api.KillAssistsAPI;
import com.killassists.api.KillEvent;

@Override
public void setup() {
    KillAssistsAPI.addKillListener(event -> {
        String victim = event.getVictimName();       // "Steve"
        UUID victimUuid = event.getVictimUuid();

        String killer = event.getKillerName();       // "Alex"
        float killerPct = event.getKillerDamagePercent(); // e.g. 35.0
        String mode = event.getAttributionMode();    // "last_hit" or "top_damage"

        for (KillEvent.AssistEntry assist : event.getAssists()) {
            assist.getDisplayName();     // "Skeleton Fighter", "PlayerX"
            assist.getTotalDamage();     // raw damage dealt
            assist.getDamagePercent();   // percentage of total damage (e.g. 45.2)
            assist.isPlayer();           // true if player
            assist.getPlayerUuid();      // player UUID (null if mob)
        }
    });
}

移除监听器:

KillAssistsAPI.removeKillListener(myListener);

KillEvent

每次玩家死亡时接收。所有列表都是不可变的。

方法 返回类型 描述
getVictimUuid() UUID 死亡玩家的 UUID
getVictimName() String 死亡玩家的用户名
getKillerKey() String 内部击杀者键("player:<uuid>""mob:<hash>"
getKillerName() String 击杀者的显示名称
getKillerDamagePercent() float 击杀者造成的总伤害百分比 (0-100)
isKillerPlayer() boolean 如果击杀者是玩家,则为 true
getKillerUuid() UUID 如果击杀者是玩家,则为击杀者 UUID;如果是怪物,则为 null
getAssists() List<AssistEntry> 助攻者列表,按伤害降序排列(可以为空)
hasAssists() boolean 如果至少有一个助攻,则为 true
getAttributionMode() String "last_hit""top_damage"——哪种模式决定了击杀者

AssistEntry

在时间窗口内造成伤害的每个实体(玩家或怪物),不包括击杀者

方法 返回类型 描述
getSourceKey() String 内部键("player:<uuid>""mob:<hash>"
getDisplayName() String 显示名称
getTotalDamage() float 该实体造成的总伤害
getDamagePercent() float 总伤害百分比 (0-100)
isPlayer() boolean 如果是玩家,则为 true
getPlayerUuid() UUID 如果是玩家,则为 UUID;如果是怪物,则为 null

API 中的击杀归属

killAttribution 配置设置控制谁在 KillEvent 中被标记为“击杀者” vs “助攻者”。displayModeshowPercentages 设置对 API 没有影响——它们只改变游戏内显示。

// 示例:PlayerA 造成 90% 伤害,PlayerB 拿到最后一击
// killAttribution = last_hit:   killer = PlayerB (10%), assists = [PlayerA (90%)]
// killAttribution = top_damage: killer = PlayerA (90%), assists = [PlayerB (10%)]

所有模式下,KillEvent 始终包含每个实体的完整伤害百分比。

在运行时读取/修改配置

允许另一个模组以编程方式调整 KillAssists 设置。所有更改会立即保存到 mods/KillAssists/config.json 并在重启后持久化。

// 读取
long window = KillAssistsAPI.getAssistWindowMs();             // default: 10000
int maxDisplay = KillAssistsAPI.getMaxAssistsDisplayed();     // default: 3
boolean trackMobs = KillAssistsAPI.isTrackMobDamage();        // default: true
String attribution = KillAssistsAPI.getKillAttribution();     // default: "last_hit"
boolean isTopAttr = KillAssistsAPI.isTopDamageAttribution();  // default: false
String display = KillAssistsAPI.getDisplayMode();             // default: "last_hit"
boolean isTopDisp = KillAssistsAPI.isTopDamageDisplay();      // default: false
boolean showPct = KillAssistsAPI.isShowPercentages();         // default: false

// 修改
KillAssistsAPI.setAssistWindowMs(15000);             // 15 seconds
KillAssistsAPI.setMaxAssistsDisplayed(5);            // max 5 assists displayed
KillAssistsAPI.setTrackMobDamage(false);             // ignore mob damage
KillAssistsAPI.setKillAttribution("top_damage");     // API: top damage = killer
KillAssistsAPI.setDisplayMode("top_damage");         // UI: top damage = killer
KillAssistsAPI.setShowPercentages(true);             // UI: show damage %

完整示例:PvP 统计模组

public class PvPStatsPlugin extends JavaPlugin {

    public PvPStatsPlugin(JavaPluginInit init) { super(init); }

    @Override
    public void setup() {
        KillAssistsAPI.addKillListener(event -> {
            if (!event.isKillerPlayer()) return;

            UUID killerUuid = event.getKillerUuid();
            UUID victimUuid = event.getVictimUuid();

            // 记录击杀及其伤害占比
            addKill(killerUuid, event.getKillerDamagePercent());
            addDeath(victimUuid);

            // 记录所有玩家助攻及其伤害贡献
            for (KillEvent.AssistEntry assist : event.getAssists()) {
                if (assist.isPlayer()) {
                    addAssist(assist.getPlayerUuid(),
                              assist.getTotalDamage(),
                              assist.getDamagePercent());
                }
            }
        });
    }
}

注意事项

  • 该事件在服务端的 ECS 系统内触发,在处理死亡事件期间。
  • 监听器是线程安全的(使用 CopyOnWriteArrayList)。
  • 监听器中的异常会被静默吞掉,以避免影响其他监听器或游戏本身。
  • KillEvent 中的助攻列表包含所有助攻者(不受 maxAssistsDisplayed 限制——该限制仅适用于游戏内显示)。
  • 无论 killAttributiondisplayModeshowPercentages 设置如何,伤害百分比始终会被计算并包含在 KillEvent 中。
  • killAttributiondisplayMode 是独立的:你可以让 API 将击杀归于最高伤害者,而 UI 显示最后一击者,反之亦然。