使用Bukkit Vault API向玩家的帐户添加资金

时间:2014-10-27 02:02:15

标签: java minecraft bukkit bukkit-vault

我正在为KitPvP部分的服务器插件工作。

现在我正在添加MoneyPerKill,但遇到了问题。

我的代码是:

package com.lobbyist.junk.kitpvp;

import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;

import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.plugin.RegisteredServiceProvider;

public class MoneyPerKill implements Listener {

    public static Economy econ = null;

    @EventHandler
    public void onPlayerDeathEvent(PlayerDeathEvent event) {
        Player player = event.getEntity();
        Player killer = player.getKiller();
        EconomyResponse r = econ.depositPlayer(killer, 10.00);
        if (r.transactionSuccess()) {
            killer.sendMessage(ChatColor.GOLD + "You recieved $10 for killing" +  player.getDisplayName());
        }
    }
}

在我的主要课程Main.java中,我也注册了这些活动。

Main.java我有:

public static Economy econ = null;
private boolean setupEconomy() {
    RegisteredServiceProvider<Economy> economyProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
    if (economyProvider != null) {
        econ = economyProvider.getProvider();
    }

    return (econ != null);
}

问题在于,当他们杀死一名球员时,它并没有给予杀手奖金。

2 个答案:

答案 0 :(得分:2)

从我所看到的,您在Main.java的econ字段中注册和引用Economy服务对象,但是在您的MoneyPerKill.java PlayerDeathEvent侦听器中,您引用econ就像在MoneyPerKill的经济,这是空的。所以在这个时间点,只要玩家死亡,你的代码就会抛出NullPointerExceptions。

要解决此问题,您需要引用Main.java的econ字段。为此,您键入Main.econ.depositPlayer(killer,10.00)。

P.S。您应该考虑使用您的Main类实例,而不是在所有地方创建静态字段,但这是主题。

还要考虑Rishaan Gupta所说的话。

答案 1 :(得分:0)

这可能不是您的问题的解决方案,但它应该有助于防止一些错误。如果玩家是杀死目标玩家的玩家,则player.getKiller()返回玩家。如果杀手不是玩家,则返回null。

  

玩家getKiller()   获取被识别为生物实体杀手的玩家。

     

可能为空。

     

返回:

     
      
  • 杀手玩家,如果没有找到则为null
  •   

来源:https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/LivingEntity.html#getKiller()

在进行处理之前,请尝试检查杀手是否为空。

@EventHandler
public void onPlayerDeathEvent(PlayerDeathEvent event) {
    Player player = event.getEntity();
    Player killer = player.getKiller();
    /*
    * Checks if the killer is a player
    * If killer is null then the it is false
    * you can also use killer != null
    */
    if (killer instanceof Player) {
        EconomyResponse r = econ.depositPlayer(killer, 10.00);
        if (r.transactionSuccess()) {
            killer.sendMessage(ChatColor.GOLD + "You recieved $10 for killing" +  player.getDisplayName());
        }
    }

}