1

我正在为我的服务器开发一个用于 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);
}

问题是当他们杀死一个玩家时它并没有给杀手钱。

4

2 回答 2

2

从我所见,您在 Main.java 的 econ 字段中注册和引用 Economy 服务对象,但在您的 MoneyPerKill.java PlayerDeathEvent 侦听器中,您在 MoneyPerKill 的 econ 中引用 econ,它为空。所以在这个时间点,每当玩家死亡时,你的代码都会抛出 NullPointerExceptions。

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

PS您应该考虑使用您的 Main 类实例,而不是在所有地方制作静态字段,但这不是主题。

还要考虑 Rishaan Gupta 所说的话。

于 2015-04-25T11:17:49.740 回答
0

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

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

}
于 2015-04-24T05:34:52.027 回答