我如何在 Spigot 中逐渐应用速度?

How do I gradually apply velocity in Spigot?

我正在使用 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),但我不知道该怎么做。

bukkit(和 spigot)中的最大速度是每滴答 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

您可以在应用速度之前只为玩家启用,并在延迟任务中禁用它

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秒后的飞行,您可以将其更改为您想要的。

除了代码之外,您可能最适合通过允许在 Spigot 文件中飞行并在游戏中安装或开发反作弊来解决您的问题。 Spigot 的飞行保护与许多插件配合使用效果不佳,无法成功阻止许多试图飞行的玩家。

最好的建议是超越临时代码解决方案,而是创建自己的防飞。