我如何在 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 的飞行保护与许多插件配合使用效果不佳,无法成功阻止许多试图飞行的玩家。
最好的建议是超越临时代码解决方案,而是创建自己的防飞。
我正在使用 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 的飞行保护与许多插件配合使用效果不佳,无法成功阻止许多试图飞行的玩家。
最好的建议是超越临时代码解决方案,而是创建自己的防飞。