Magical-H 发表于 2025-2-20 21:32:39

【服务端】[GMS083] 飞镖、子弹等道具如何实现消耗完毕自动补充

如果你需要自动补充飞镖、子弹等消耗品的数量,又或者不想它们被消耗,可以参考这个方法。


本教程以北斗服务端(https://github.com/BeiDouMS/BeiDou-Server)为基础进行制作

本次思路为服务端在接收到投掷飞镖、子弹等道具时对消耗函数进行修改时其对指定道具进行自动补充或者不消耗。
打开源码路径:gms-server/src/main/java/org/gms/net/server/channel/handlers/RangedAttackHandler.java


按下Ctrl+F搜索
InventoryManipulator.removeFromSlot(c, InventoryType.USE, slot, bulletConsume, false, true);    //减去消耗品指定栏位物品数量
可以看到这里是减少消耗品数量的函数,通过分析函数参数得知 bulletConsume 为数量
因此我们可以从这里入手,通过改变 bulletConsume 的数量达到增加或者不消耗的目的。

这里以修复平衡之怒自动补充为例(北斗里已经修复了):

1、首先我们需要定义一个变量用于储存补充的数量,在short bulletCount = 1;下方加上short supplement = 0;   //用于补充平衡之怒的变量
2、在boolean cbow = ItemConstants.isArrowForCrossBow(id);下方增加
if (id == ItemId.BALANCED_FURY && (item.getQuantity() - bulletCount) <= 10) {   //平衡之怒低于10,则自动补充,如果设置数值过低时,会造成出拳平A
      supplement = (short) -ItemInformationProvider.getInstance().getSlotMax(c,id);//设定补充到限制的最高数值
}下方增加
if (supplement < 0 ) {
      bulletConsume = supplement;   //将消耗飞镖设为补充飞镖
}

至此,平衡之怒数量低于10的时候会自动补充。

如果不想让飞镖、子弹被消耗,可以简单粗暴的将第3步改成这样
if (id >= 2070000 && id <= 2070018) {      //此范围内的飞镖不被消耗,其它ID可自行添加判断
      bulletConsume = 0;      //将不消耗飞镖
}

页: [1]
查看完整版本: 【服务端】[GMS083] 飞镖、子弹等道具如何实现消耗完毕自动补充