我正在为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);
}
问题在于,当他们杀死一名球员时,它并没有给予杀手奖金。
答案 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());
}
}
}