Skip to content

开发接口

提示

开发接口可在售后群下载,如果你是开发者,欢迎联系作者 15568820 进行交流咨询

API

kotlin
package me.yeezhi.combatview.api

object CombatAPI {

    /**
     * 伤害特效接口
     */
    lateinit var DamageFxAPI: IDamageFxAPI

    /**
     * 战斗信息接口
     */
    lateinit var CombatStatsAPI: ICombatStatsAPI

    /**
     * 字体接口
     */
    lateinit var FontAPI: IFontAPI

    /**
     * 弹幕消息接口
     */

    lateinit var DanmakuAPI: IDanmakuAPI

    /**
     * 拾取HUD接口
     */
    lateinit var PickupAPI: IPickupAPI

    /**
     * 组队接口
     */
    lateinit var CombatTeamAPI: ICombatTeamAPI

    /**
     * 临时属性接口
     */
    lateinit var TempAttributeAPI: ITempAttributeAPI
}
kotlin
package me.yeezhi.combatview.api

import me.yeezhi.combatview.api.combatstats.CombatStats
import org.bukkit.entity.Entity
import org.bukkit.entity.Player

interface ICombatStatsAPI {
    /**
     * 记录一次攻击并更新统计
     */
    fun recordAttack(attacker: Player, victim: Entity, damage: Double)

    /**
     * 获取玩家当前统计
     */
    fun getStats(player: Player): CombatStats

    /**
     * 累加自定义字段数值
     */
    fun addCustomStat(player: Player, key: String, delta: Double)

    /**
     * 获取自定义字段数值
     */
    fun getCustomStat(player: Player, key: String): Double

    /**
     * 设置自定义字段数值
     */
    fun setCustomStat(player: Player, key: String, value: Double)

    /**
     * 更新玩家战斗信息
     */
    fun Player.updateCombatStatsData()

    /**
     * 更新玩家队伍战斗信息,一般不用手动调用
     */
    fun Player.updateTeamStatsData()
    fun Player.sendEmptyTeamStatsData()

    /**
     * 清除玩家战斗统计
     */
    fun clearStats(player: Player)
}
kotlin
package me.yeezhi.combatview.api

import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack

interface IPickupAPI {
    /**
     * 发送拾取 HUD
     *
     * @param player 玩家
     * @param itemStack 物品
     * @param amount 数量
     * @param source 来源
     */
    fun sendPickup(
        player: Player, itemStack: ItemStack, amount: Int, source: String
    )
}
kotlin
package me.yeezhi.combatview.api

import org.bukkit.entity.Entity
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player

interface IDamageFxAPI {
    /**
     * 发送伤害特效
     * @param damager 攻击者
     * @param entity 实体
     * @param damage 伤害
     *
     */
    fun sendDamageFx(damager: Entity, entity: Entity, damage: Double)

    /**
     * 发送伤害特效
     * @param damager 攻击者
     * @param entity 实体
     * @param text 内容
     */
    fun sendDamageFx(damager: Entity, entity: Entity, text: String)

    /**
     * 发送伤害特效
     * @param damager 攻击者
     * @param entity 实体
     * @param type 类型
     * @param damage 伤害
     */
    fun sendDamageFx(damager: Entity, entity: Entity, type: String, damage: Double)

    /**
     * 发送伤害特效
     * @param damager 攻击者
     * @param entity 实体
     * @param text 内容
     */
    fun sendDamageFx(damager: Entity, entity: Entity, type: String, text: String)

    /**
     * 是否隐藏其他玩家的伤害显示
     */
    fun Player.isHideOtherDamage(): Boolean

    /**
     * 设置隐藏其他玩家的伤害显示
     */
    fun Player.setHideOtherDamage(enable: Boolean)
}
kotlin
package me.yeezhi.combatview.api

import org.bukkit.entity.Player

/**
 * 战斗队伍适配接口
 */
interface ICombatTeamAPI {
    fun getMembers(player: Player): List<Player>
}
kotlin
package me.yeezhi.combatview.api

import me.yeezhi.combatview.api.entity.config.FontConfig
import org.bukkit.entity.Entity
import org.bukkit.entity.Player

interface IFontAPI {
    /**
     * 获取默认字体
     */
    fun getDefaultFontConfig(): FontConfig

    /**
     * 获取玩家当前字体配置
     */
    fun Entity.getFontConfig(): FontConfig

    /**
     * 获取玩家字体穿戴后属性
     */
    fun Player.getFontWearAttribute(): MutableList<String>

    /**
     * 获取玩家字体获取后属性
     */
    fun Player.getFontObtainAttribute(): MutableList<String>

    /**
     * 玩家切换字体
     */
    fun Player.changeFont(fontId: String): FontConfig

    /**
     * 切换玩家字体开关
     */
    fun Player.setFontEnabled(enable: Boolean): FontConfig

    /**
     * 获取玩家已拥有的字体列表(包含默认字体)
     */
    fun Player.getFonts(): MutableSet<String>

    /**
     * 获取玩家字体开关状态
     */
    fun Player.isFontEnabled(): Boolean

    /**
     * 给予玩家字体时效(毫秒)
     * @return 到期时间戳
     */
    fun Player.giveFontTimed(fontId: String, durationMillis: Long): Long

    /**
     * 根据类型与数值,返回映射后的伤害文本
     */
    fun formatDamageText(fontConfig: FontConfig, type: String, damage: Double): String
}
kotlin
package me.yeezhi.combatview.api

import org.bukkit.entity.Player

interface ITempAttributeAPI {
    /**
     * 设置临时属性(秒)
     */
    fun setTempAttribute(player: Player, nodeId: String, attributes: List<String>, seconds: Long)

    /**
     * 设置临时属性(自动节点)
     */
    fun setTempAttribute(player: Player, attributes: List<String>, seconds: Long): String

    /**
     * 获取节点属性
     */
    fun getTempAttribute(player: Player, nodeId: String): List<String>

    /**
     * 获取剩余时间(毫秒)
     */
    fun getRemainingMillis(player: Player, nodeId: String): Long

    /**
     * 获取全部生效属性
     */
    fun getAllAttribute(player: Player): List<String>

    /**
     * 清空节点属性
     */
    fun clearTempAttribute(player: Player, nodeId: String)
}
kotlin
package me.yeezhi.combatview.api

import org.bukkit.entity.Player


interface IDanmakuAPI {
    /**
     * 发送弹幕消息
     */
    fun sendDanmaku(player: Player, message: String)
}

脚本调用

以 AttributePlus 脚本为例,展示如何调用战斗视图相关接口

yaml
#格式为 [占位符: 类] 如果不懂,请不要自己修改
scriptTools:
  "Utils": "org.serverct.ersha.script.AttrScriptUtils"
  "AttributeAPI": "org.serverct.ersha.api.AttributeAPI"
  "Bukkit": "org.bukkit.Bukkit"
  "EntityType": "org.bukkit.entity.EntityType"
  "Arrays": "java.util.Arrays"
  "Data": "org.serverct.ersha.manager.data.Data"
  # 战斗视图接口
  CombatAPI: "me.yeezhi.combatview.api.CombatAPI"
javascript
var priority = 999;
var combatPower = 5.0;
var attributeName = "重写暴击";
var attributeType = "ATTACK";
var placeholder = "cxbj";

function onLoad(attr) {
    Utils.registerOtherAttribute("暴击几率", 1.0, "critchance");
    Utils.registerOtherAttribute("暴击伤害", 1.0, "critdamage_attack");
    Utils.registerOtherAttribute("暴击抵抗", 1.0, "critdamage_defense");
    Utils.registerOtherAttribute("暴击躲避", 1.0, "critchance_defense");

    Utils.registerOtherAttribute("吸血几率", 1.0, "vampire_chance");
    Utils.registerOtherAttribute("吸血倍率", 1.0, "vampire_attack");
    Utils.registerOtherAttribute("吸血躲避", 1.0, "vampirechance_defense");
    Utils.registerOtherAttribute("吸血抵抗", 1.0, "vampiredamage_defense");

	attr.setAsync(true)
	attr.setSkipFilter(true)
    return attr;
}

var RATE_DEFAULT = 100;

function runAttack(attr, attacker, entity, handle) {
    var baseDamage = attr.getDamage(attacker, handle);
    if (baseDamage <= 0) return false;

    var critChanceAttacker = attr.getRandomValue(attacker, "暴击几率", handle);
    var critChanceDefender = attr.getRandomValue(entity, "暴击躲避", handle);
    var critDamageAttacker = attr.getRandomValue(attacker, "暴击伤害", handle);
    var critResistDefender = attr.getRandomValue(entity, "暴击抵抗", handle);
    var vampChanceAttacker = attr.getRandomValue(attacker, "吸血几率", handle);
    var vampChanceDefender = attr.getRandomValue(entity, "吸血躲避", handle);
    var vampDamageAttacker = attr.getRandomValue(attacker, "吸血倍率", handle);
    var vampResistDefender = attr.getRandomValue(entity, "吸血抵抗", handle);

    var critTriggered = attr.chance(critChanceAttacker - critChanceDefender);
    if (critTriggered) {
        var effectiveCritPercent = Math.max(0, critDamageAttacker - critResistDefender);
        var critExtraDamage = Math.floor(baseDamage * effectiveCritPercent * 0.01);
        if (critExtraDamage > 0) {
            attr.addDamage(attacker, critExtraDamage, handle);
            var critExtraDisplay = Math.round(critExtraDamage * 10) / 10;

            // 攻击者提示 + 特效 + 统计
            if (attacker instanceof org.bukkit.entity.Player) {
                attacker.sendMessage("§7[§c战斗§7] §f触发 §c暴击! §f对目标额外造成 §b" + critExtraDisplay + " §f点伤害!");


                // 显示自定义字体贴图 
                //CombatAPI.DamageFxAPI.sendDamageFx(attacker, entity, "other", "曖");
                
                // 记录暴击数值,插件检测到自动显示暴击数值特效
                attr.storageValue("crit", critExtraDamage, true, handle);

                // 统计自定义字段数值
                // 龙核组件:方法.取变量('combatview_自定义字段')
                //CombatAPI.CombatStatsAPI.addCustomStat(attacker, "自定义字段", critExtraDamage);
            }

            if (entity instanceof org.bukkit.entity.Player) {
                entity.sendMessage("§7[§c战斗§7] §f你受到 §e" + attacker.getName() + " §f的 §c暴击§f,额外受到 §b" + critExtraDisplay + " §f点伤害!");
            }
        } else if (attacker instanceof org.bukkit.entity.Player) {
            attacker.sendMessage("§7[§c战斗§7] §f触发 §c暴击! §f但对方暴击抵抗过高,无额外伤害!");
        }
    }

    var vampTriggered = attr.chance(vampChanceAttacker - vampChanceDefender);
    if (vampTriggered && attacker instanceof org.bukkit.entity.LivingEntity) {
        var vampireMultiplier = (RATE_DEFAULT + vampDamageAttacker - vampResistDefender) / RATE_DEFAULT;
        var vampHeal = Math.floor(baseDamage * vampireMultiplier);
        var currentHealth = attacker.getHealth();
        var maxHealth = attacker.getMaxHealth();
        var healAmount = Math.floor(Math.min(vampHeal, maxHealth - currentHealth));
        if (healAmount > 0) {
            attacker.setHealth(currentHealth + healAmount); 
            attacker.sendMessage("§7[§c战斗§7] §f触发 §4吸血! §f恢复 §c" + healAmount + " §f点生命!");

            // 显示自定义字体贴图 
            CombatAPI.DamageFxAPI.sendDamageFx(attacker, entity, "other", "軋");
        }
    }
    return false;
}

Event

提示

由于 YeePlugins 在 onEnable 阶段执行云端加载,若需注册监听,请在插件加载完成后通过循环检测再进行注册

暂无