方法getHealth()对于Player-Bukkit 1.6.4类型是不明确的

时间:2013-10-31 16:11:52

标签: java minecraft bukkit ambiguous

这是我的插件代码。

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发布以来,这可能是一个非常受欢迎的问题,但我所做的搜索都没有给我一个我能理解的解决方案。

如果this确实是解决方案,请你帮我理解我能做些什么......

感谢-你。

4 个答案:

答案 0 :(得分:5)

你可以尝试加倍h = player.getHealth()吗?据我所知,由于向后兼容性,有两种getHealth方法。可能有一些反射魔法来确定是否请求new(类型double)或old(类型int)。

同样,setHealth有两个版本,因此编译器无法确定它是否应该将getHealth() + health强制转换为int并使用setHealth(int),或者它是否应该将getHealth() + health强制转换为double并使用{{1}因为setHealth(double)是暧昧的。

@Yourcomment 它已被弃用,但仍然支持向后兼容性,此时我对于为什么会发生这种情况一无所知,似乎bukkit有一个复杂的构建过程及其罐子因此可能出现问题,但是我在{{3上找到了一个解决方案建议将播放器转换为Damageable可以解决问题。

getHealth()

答案 1 :(得分:0)

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

double playerHealth = (double)player.getHealth();
player.setHealth(playerHealth + heal);

答案 2 :(得分:0)

似乎有多个getHealth()。 Java无法确定您所指的是什么,因为它们在您使用它的上下文中都是有效的。

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

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

答案 3 :(得分:0)

我遇到了同样的问题,但我找到了一个简单的解决方案。只有你需要使用一些思考: 您可以获得double的健康状况,但也可以使用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);