我正在使用player.setVelocity(player.getLocation().getDirection().multiply(Main.instance.getConfig().getDouble("velocity_multiplier")).setY(Main.instance.getConfig().getInt("Y_axis")));
为玩家设置速度。它允许通过配置进行高配置移动,但问题是当你设置它太高时,Spigot会阻止它。我不想启用:
server.properties:allow_flight。
那我怎么能避免这个呢?我将乘数增加到30只是为了测试,它会开始移动你,小故障,并让你退缩。它还表示即使从较小的速度,玩家在控制台中移动得太快。我正在考虑让它逐渐应用速度。当你跳跃时,它会应用起始速度,当你走的时候它会更高(Y_axis)和更远(velocity_multiplier),但我不知道该怎么做。
答案 0 :(得分:1)
您可以在应用速度之前为播放器启用,并在延迟的任务中禁用它
public void blabla(Player player){
player.setAllowFlight(true);
player.setVelocity(player.getLocation().getDirection().multiply(Main.instance.getConfig().getDouble("velocity_multiplier")).setY(Main.instance.getConfig().getInt("Y_axis")));
new BukkitRunnable() {
@Override
public void run() {
player.setAllowFlight(false);
}
}.runTaskLater(this, 20 * 5);
}
在代码中,我使用20 * 5在5秒后禁用飞行,您可以将其更改为您想要的。
答案 1 :(得分:1)
除了代码之外,您最有可能通过允许在Spigot文件中进行飞行以及在游戏中安装或开发反作弊来解决您的问题。 Spigot的飞行保护功能很差,很多插件并没有成功阻止许多试图飞行的玩家。
最好的建议是超越临时代码解决方案,而是创建自己的反飞行。
答案 2 :(得分:0)
bukkit(和龙头)的最大速度是每个刻度10个块。这是所有方向的组合。
如果初始速度为高,则可以使用调度程序重复计算下一个速度。
要计算这一点,我们需要一些神奇的值:以下值来自The Minecraft Wiki。
private final static double DECELERATION_RATE = 0.98D;
private final static double GRAVITY_CONSTANT = 0.08D;
private final static double VANILA_ANTICHEAT_THRESHOLD = 9.5D; // actual 10D
我们首先需要计算玩家使用这些速度达到的位置,然后在应用第一部分的速度时传送他。
我们将使用BukkitRunnable
来运行计算上述任务的任务:
Vector speed = ...;
Player player = ...;
new BukkitRunnable() {
double velY = speed.getY();
Location locCached = new Location(null,0,0,0);
@Override
public void run() {
if (velY > VANILA_ANTICHEAT_THRESHOLD) {
player.getLocation(locCached).setY(locCached.getY() + velY);
player.teleport(locCached);
player.setVelocity(new Vector(0,ANILA_ANTICHEAT_THRESHOLD,0));
} else {
player.setVelocity(new Vector(0,velY,0));
this.cancel();
}
velY -= GRAVITY_CONSTANT;
velY *= DECELERATION_RATE;
}
}.runTaskTimer(plugin,0,1);
以上代码将为我们处理速度问题,并可用于代替setVelocity
。