如何在Spigot中逐步应用速度?

时间:2016-02-05 01:18:13

标签: velocity minecraft bukkit

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

3 个答案:

答案 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