Java 给玩家增加金钱';Bukkit Vault API的s帐户

Java 给玩家增加金钱';Bukkit Vault API的s帐户,java,minecraft,bukkit,bukkit-vault,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.Playe

我正在为我的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);
}
public static econ=null;
私营经济(){
RegisteredServiceProvider economyProvider=getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.economy.class);
如果(economyProvider!=null){
econ=economyProvider.getProvider();
}
返回(经济!=null);
}

问题是,当杀手杀死一名玩家时,它不会给杀手钱。

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

玩家getKiller() 获取被标识为活实体杀手的玩家

可能为空

返回:

  • 杀手玩家,如果找不到则为空
资料来源:

在继续之前尝试检查killer是否为null

@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());
        }
    }

}

从我看到的情况来看,您正在Main.java的econ字段中注册和引用Economy服务对象,但在MoneyPerKill.java PlayerDeathEvent侦听器中,您在MoneyPerKill的econ中引用econ,该字段为null。因此,此时,每当玩家死亡时,您的代码将抛出NullPointerException

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

P.S.你应该考虑使用你的主类实例,而不是让静态字段到处都是,但这是偏离主题。


也要考虑Rishaan Gupta所说的。

没有足够的信息来诊断问题。我猜每当玩家死亡时,您的事件处理程序就会崩溃,因为代码中的某个地方出错了。如果是这样,请发布堆栈跟踪,否则请添加用于加载
setupEconomy()
MoneyPerKill
的相关代码。如果没有足够的可编译代码让我重现这一点,我就无能为力了。完成后,请随意使用
@Unihedron(注释文本)
回复此注释。