2

这是我的一段插件代码。

public boolean reapSoul(Player player, Player tplayer, double damage)
{
    if(player.hasPermission("myrace.wraith.reap"))
    {
        player.sendMessage(ChatColor.DARK_GRAY + "You have reaped " + tplayer.getName() + "'s soul.");
        damage = player.getLevel()/10;
        double heal = damage/2;
        tplayer.damage(damage);
        player.setHealth(player.getHealth() + heal);
    }
    return true;
}

我知道可能有很多错误,我可以自己处理它们。我无法处理的是

player.setHealth(player.getHealth() + heal);

Eclipse(我的 IDE)告诉我 getHealth() 方法对于 Player 类型不明确。

我知道这可能是自 Bukkit 1.6.x 发布以来非常受欢迎的问题,但我所做的搜索都没有给我一个我能理解的解决方案。

如果确实是解决方案,请您帮助我了解我能做什么...

谢谢。

4

4 回答 4

5

你可以试试双倍h = player.getHealth()吗?据我了解,由于向后兼容,有两种 getHealth 方法。可能有一些反射魔法来确定是请求新的(类型 double)还是旧的(类型 int)。

同样 setHealth 有两个版本,因此编译器无法确定它是否应该getHealth() + health转换为 int 并使用setHealth(int),或者是否应该getHealth() + health转换为 double 并使用setHealth(double),因为getHealth()它是模棱两可的。

@Yourcomment 它已被弃用但仍支持向后兼容性,此时我不知道为什么会发生这种情况,似乎 bukkit 的 jar 具有复杂的构建过程,所以那里可能出现问题,但是我在google上找到了一个解决方案建议将玩家施放到 Damageable 可以解决这个问题。

Damageable d = (Damageable) player;
于 2013-10-31T16:26:07.270 回答
0

我不确定,但我认为您可能需要显式转换为类型:

double playerHealth = (double)player.getHealth();
player.setHealth(playerHealth + heal);
于 2013-10-31T16:20:45.840 回答
0

似乎有不止一个 getHealth()。Java 无法确定您指的是哪个,因为它们在您使用它的上下文中都是有效的。

如果第一响应者的回答不起作用,您也可以...

player.setHealth(new Double(player.getHealth()) + heal);
于 2013-10-31T16:25:43.200 回答
0

我有同样的问题,但我找到了一个简单的解决方案。只有你需要使用一些反射:你可以获得双倍的健康,也可以在 int 中:

Player j;   
int health_in_int=(int)j.getClass().getMethod("getHealth", double.class).invoke(j);
double health_in_double=(double)j.getClass().getMethod("getHealth", double.class).invoke(j);
于 2014-07-09T16:54:41.097 回答