如何基于KitBattle Advanced插件API实现击杀后给玩家添加物品
问题根因
- 触发时机错误:你配置了
isAttackActivated()返回true,对应技能在玩家攻击他人的瞬间触发,此时被攻击目标尚未死亡,p.isDead()的判定永远不成立,添加物品的逻辑根本不会运行。 - 缺少非空校验:没有判断
p.getKiller()是否为null,非玩家击杀场景下会直接抛出空指针异常。 - 无效冗余代码:判定块内调用
p.getKiller()后没有接收返回值,属于无效操作。 - 返回值设置错误:该插件的
execute()方法返回true才代表技能执行生效,你固定返回false会导致背包修改被插件自带逻辑覆盖回滚。 - 药水创建不规范:部分Spigot版本中,自定义药水需要先设置基础药水类型,否则物品属性无效无法加入背包。
修复代码
public class ChemistryAbility extends Ability{ // 返回技能名称 @Override public String getName() { return "Chemistry"; } // 从配置文件加载数据 @Override public void load(FileConfiguration file) { // 按需实现配置读取逻辑 } // 获取触发技能的物品材料 @Override public Material getActivationMaterial() { return null; } // 获取触发技能的弹射物类型 @Override public EntityType getActivationProjectile() { return null; } // 玩家攻击他人时是否触发技能 @Override public boolean isAttackActivated() { return true; } // 玩家被攻击时是否触发技能 @Override public boolean isAttackReceiveActivated() { return false; } // 玩家受到伤害时是否触发技能 @Override public boolean isDamageActivated() { return false; } // 玩家与实体交互时是否触发技能 @Override public boolean isEntityInteractionActivated() { return false; } @Override public boolean execute(final Player p, final PlayerData PD, final Event e) { // 先判断被攻击玩家是否处于死亡状态,且存在玩家击杀者 if (!p.isDead() || p.getKiller() == null || !(p.getKiller() instanceof Player)) { return false; } Player killer = p.getKiller(); // 规范创建自定义药水 ItemStack potion = new ItemStack(Material.SPLASH_POTION, 3); PotionMeta pmeta = (PotionMeta) potion.getItemMeta(); // 高版本兼容:先设置基础药水类型为瞬间伤害 pmeta.setBasePotionData(new PotionData(PotionType.INSTANT_DAMAGE)); pmeta.addCustomEffect(new PotionEffect(PotionEffectType.HARM, 1, 2), true); potion.setItemMeta(pmeta); // 添加物品到击杀者背包 killer.getInventory().addItem(potion); // 返回true标记技能执行成功,避免修改被回滚 return true; } }
内容的提问来源于stack exchange,提问作者UNDERTALE VN
相关产品推荐
相关产品推荐

