葱油鸡
本帖最后由 412859475 于 2022-1-18 10:02 编辑

最近想要在服务端里实现想要的宝石功能:镶嵌、摘除、多行lore等,四处搜集宝石插件。
包括一个站内插件Fargem,在上面投入时间是因为支持1.12.2和1.16.5两个游戏版本,而且有拆卸功能。
站内原文地址:
https://www.mcbbs.net/forum.php?mod=viewthread&tid=789733

不过该插件需要自己修改脚本来实现功能,所以为了调整实现想要的功能,给示例的脚本写了一些注释,因为原帖中的说明实在很少,不过自己接触java不多,所以无法保证注释的都是对的。为什么只有示例的攻击宝石做了注释呢?因为其他示例下载不了……
注释完了一看才注意到,好像不需要额外的属性插件,因为是对伤害的数值直接进行了拦截修改

脚本及注释如下:

/* global Java */
#定义变量“Enable”的值为真
var Enable = true;

#从游戏和插件中获得玩家、宝石配置等信息作为变量
var Gem = Java.type('Br.FarGem.Gem');
var GemDisplay = Java.type('Br.FarGem.GemDisplay');
var Config = Java.type('Br.FarGem.Gem.Config');
var Material = Java.type('org.bukkit.Material');
var Player = Java.type('org.bukkit.entity.Player');
var EntityType = Java.type('org.bukkit.entity.EntityType');

#定义脚本监听变量
var ScriptListener = Java.extend(Java.type('Br.API.Scripts.ScriptListener'));
#新建变量AttackGemType
var AttackGemType = Java.extend(Gem, GemDisplay);
#定义“显示lore的设定”变量;种类为设定,id为"DisplayLore",值为括号{}内内容,
var DisplayLoreConfig = new Config("DisplayLore", function (lv)
{
    return "§c" + lv + "级 攻击宝石  攻击力+" + lv * 3;
}, true);

#定义“宝石lore的设定”变量;种类为设定,id为"GemLoreConfig",值为括号{}内的内容
var GemLoreConfig = new Config("GemLoreConfig", function (lv)
{
#定义列表变量,种类为行列
    var list = new java.util.ArrayList();
    list.add("§c攻击宝石  等级- " + lv);
    list.add("§b增加攻击力- " + lv * 3);
    list.add("§6仅能安装到剑或斧头上");
    list.add("§a右键宝石开始安装");
#返回列表变量为函数值
    return list;
}, true);
#定义“攻击力设定”变量,种类为设定,id为"Attack",值为括号{}内的内容
var AttackConfig = new Config("Attack", function (lv)
{
#返回 等级乘三 为函数值
    return lv * 3;
}, true);

#定义“攻击宝石”变量,种类为攻击宝石类别,id为'AttackGem',值为"§c攻击宝石",包含十个值
var AttackGem = new AttackGemType('AttackGem', "§c攻击宝石", 10){
#获得显示的lore,其值为变量“DisplayLoreConfig”
    getDisplayLore: function (lv)
    {
        return DisplayLoreConfig.getValue(lv);
    },
#获得设定,包括“DisplayLoreConfig”、“GemLoreConfig”、“AttackConfig”和"Br.FarGem.Gem.Config[]"
    getConfigs: function ()
    {
        return Java.to([DisplayLoreConfig, GemLoreConfig, AttackConfig], "Br.FarGem.Gem.Config[]");
    },
#定义可以镶嵌的物品类型
    canInstall: function (is)
    {
        var s = is.getType().toString();
        return s.contains("_AXE") || s.contains("_SWORD");
    },
#获得种类(图标)
    getType: function (lv)
    {
        return Material.EMERALD;
    },
#获得耐久值
    getDurability: function (lv)
    {
        return 0;
    },
#在AttackGemType中定义显示名称
    getDisplayName: function (lv)
    {
        return "§c" + lv + "级 攻击宝石";
    },
#从GemLoreConfig中得到函数值作为lore
    getLore: function (lv) {
        return GemLoreConfig.getValue(lv);
    }
};
#定义监听变量
var Listener = new ScriptListener()
{
    onEvent: function (evt)
    {
        if (evt.getDamager().getType() !== EntityType.PLAYER)
        {
            return;
        }
        var p = evt.getDamager();
#定义变量is为手上的道具
        var is = p.getItemInHand();
#定义变量“lv”(等级)为从“AttackGem”中获得的等级
        var lv = AttackGem.getEquipLevel(is);
#如果“lv”大于0
        if (lv > 0)
        {
#将伤害设置为“evt.getDamage()”(即未算入宝石的伤害)+“AttackConfig”的值(前面设定的宝石加成)
            evt.setDamage(evt.getDamage() + AttackConfig.getValue(lv));
        }
    },
    getEventName: function () {
        return 'org.bukkit.event.entity.EntityDamageByEntityEvent';
    }
};

#定义公式“获得宝石”的返回值
function getGem() {
    return AttackGem;
}

#调用Br.API的监听功能
function getListener() {
    return Java.to([Listener], "Br.API.Scripts.ScriptListener[]");
}

#是否启用,返回变量“Enable”的值
function isEnable(){
    return Enable;
}


贴贴迷离
好家伙,这个应该…不是发茶馆的吧?

葱油鸡
诡灬稽 发表于 2022-1-18 09:57
好家伙,这个应该…不是发茶馆的吧?

实际上是因为我不知道发哪里比较好,所以干脆发茶馆了。看了版规,好像是能发。而且茶馆在我印象中,基本无所不包,所以不容易出错。

贴贴迷离
412859475 发表于 2022-1-18 09:59
实际上是因为我不知道发哪里比较好,所以干脆发茶馆了。看了版规,好像是能发。而且茶馆在我印象中,基本 ...

确实大部分都可以发,我觉得可能…mod研讨会合适一点?

419942604
这应该是提问吧

不良の人
虽然我看不懂,但我大受震撼

cutemiku
感觉这种优秀内容发这里屈才了,都可以发到别的板块去了

尸先peng
好家伙,这技术力让我瞬间觉得我不太配当一个水怪

太古巨龙
转到其他板块吧 茶馆看这个的不多 很快就会被水淹没

第一页 上一页 下一页 最后一页