本帖最后由 咸鱼羊 于 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
*/
}
}
|