这是我的插件代码。
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确实是解决方案,请你帮我理解我能做些什么......
感谢-你。
答案 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);