自定义NPC脚本论坛

搜索
查看: 303|回复: 0

[1.12.2]计算出原版最终受到的伤害

[复制链接]

7

主题

8

帖子

183

积分

Lv.4 地上月影

Rank: 6Rank: 6

积分
183

论坛元老勋章

QQ
发表于 2021-6-20 13:02:23 | 显示全部楼层 |阅读模式
本帖最后由 咸鱼羊 于 2021-6-26 23:35 编辑

也是一年前的作品
主要部分是提取属性和附魔的NBT,以及把MC的计算公式套进去
在代码里面的注释写了很多题外话,也懒得改了。
(实在是又长又臭,但提取NBT的方法值得不会的人参考)
function getNbtAttribute(item,name){
        //*获取某物品的某属性
    var armor = item.getNbt().getList("AttributeModifiers",10);
    //*获取物品中的属性NBT
    var value = new Array(0);
    //*创建一个空白的无长度新数组
    for(var i in armor){
        if(armor[i].getString("AttributeName") == name){
                //*如果有对应的属性
            value.push(armor[i].getDouble("Amount"));
            /*给value数组添加并赋值一个新元素
            *该元素的值为Amount键对应的Double值
            /*遍历属性NBT中所有的数组
            *即所有拥有的属性,
            *获取其中的属性名称与name相同的
            *并获取该属性的数值*/
            //*以下是代码解析
        }
    }
    if(value.length > 0){
            var s = 0
            for (var i in value){
                    s += value[i]
                    //*将数组内所有的数值加起来
            }
        return s;
    }else{
        return 0;
    }
    /*此处是除错,
    *如果无获取数据就添加一个0*/
    //*该函数由早上提供
}

function getNbtEnch(item,enchid){
        //*获取某物品的某附魔的等级
        var ench = item.getNbt().getList("ench",10);
    //*获取物品中的附魔NBT
    var value = new Array(0);
    //*创建一个空白的无长度新数组
    for(var i in ench){
        if(ench[i].getShort("id") == enchid){
                //*如果有对应的附魔
            value.push(ench[i].getShort("lvl"));
            /*遍历附魔NBT中所有的数组
            *即所有拥有的附魔,
            *获取其中的附魔名称与id相同的
            *并获取该附魔的数值
            */
        }
    }
    if(value.length > 0){
            var s = 0;
            for (var i in value){
                    s += value[i];
            }
        return s;
    }else{
        return 0;
    }
    //*此函数参考了早上
    //*ps:实际上是全抄
}
function getDressAttribute(player,name){
        //*获取所有穿着物品的name属性
        var Temp = 0;
        //*临时的数据
        for (var a=0;a<4;a++){
                //*遍历每一个装备
                Temp += getNbtAttribute(player.getArmor(a),name);
                //*获取每一个装备的属性值(数组)
        }
        Temp += getNbtAttribute(player.getMainhandItem(),name);
        Temp += getNbtAttribute(player.getOffhandItem(),name);
        //*获取主手和副手的属性值
        return Temp;
}
function getDressEnch(player,enchid){
        //*获取所有穿着物品的附魔
        //*enchid是附魔的ID
        var Temp = 0;
        //*临时的数据
        for (var a=0;a<4;a++){
                //*遍历每一个装备
                Temp += getNbtEnch(player.getArmor(a),enchid);
                //*获取每一个装备的附魔值(数组)
        }
        Temp += getNbtEnch(player.getMainhandItem(),enchid);
        Temp += getNbtEnch(player.getOffhandItem(),enchid);
        //*获取主手和副手的附魔值
        return Temp;
}
function damaged(e){
        var ar = getDressAttribute(e.player,"generic.armor");
        var art = getDressAttribute(e.player,"generic.armorToughness");
        var ench = getDressEnch(e.player,0);
        //*获取盔甲值,盔甲韧性,保护附魔值
        e.player.message("盔甲"+ar+";韧性"+art+";附魔"+ench);
        if(e.damage > 0){
                var enddamage = (e.damage * (1 - Math.min(20, Math.max(ar / 5, ar - e.damage / (2 + art / 4))) / 25)) * Math.max(0.2,(1-ench*0.05));
                //*这一句是依照MC的伤害公式计算你最后会受到的伤害
                e.player.message(enddamage);
                //*提示你受到的伤害,或许你可以改成自己喜欢的样子
                /*温馨提示:
                *且仅检测设了NBT的属性
                *没有用NBT修改过的属性无法检测
                *该计算公式中附魔只计算了保护
                *这段代码请放在最后执行
                *具体原因:
                *执行顺序:插件/MOD>MC
                */
        }
}


评分

参与人数 1人气 +2 收起 理由
小明 + 2 原创奖励

查看全部评分

暂时没有想好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表