检查玩家是否在移动
Check if a player is moving or not
我正在为一个事件创建一个插件,这个事件只是:当你停止移动时,你就松了。我创造了一切,但我检查玩家是否移动不起作用:
我尝试制作一个数组,当玩家移动事件时它被添加,但它不起作用,
@EventHandler
public static void OnPlayerMoov(PlayerMoveEvent e) {
if(!playerHaveMooved.contains(e.getPlayer())) {
playerHaveMooved.add(e.getPlayer());
}
}
public static boolean isMoving(Player p){
System.out.println(Respawn.playerHaveMooved.contains(p));
return Respawn.playerHaveMooved.contains(p);
}
我尝试使用速度;没用,
public static boolean isMoving(Player p){
return (p.getVelocity().length() == 0);
}
没用。当我移动时它会杀死我。
你有解决办法吗?
第一个不起作用,因为您只是检查玩家是否已经移动了一次,这将始终为真。
第二个关于速度检查,例如玩家被击退时。
第一个解决方案
保存最后一次移动,每隔几次检查是否停止移动。
在这个例子中,我将强制玩家每秒移动一次。
private final HashMap<Player, Long> timeMove = new HashMap<>(); // map for data
@Eventhandler
public void onMove(PlayerMoveEvent e) {
timeMove.put(e.getPlayer(), System.currentTimeMillis()); // update last move
}
public void startChecking(JavaPlugin pl) {
pl.getServer().getScheduler().runTaskTimer(pl, () -> {
long current = System.currentTimeMillis();
for(Player p : Bukkit.getOnlinePlayers()) {
long last = timeMove.getOrDefault(p, 0);
long diff = current - last;
if(diff > 1000) { // 1000 = second
// player don't move
}
}
}, 20, 20);
}
第二种解决方案
从上次和当前位置开始每 X 次检查一次
private final HashMap<Player, Location> lastLoc = new HashMap<>(); // map for data
public void startChecking(JavaPlugin pl) {
pl.getServer().getScheduler().runTaskTimer(pl, () -> {
for(Player p : Bukkit.getOnlinePlayers()) {
Location lastPlayerLoc = lastLoc.get(p); // get loc, or keep null if not registered
if(lastPlayerLoc != null) {
double distance = lastPlayerLoc.distance(p.getLocation());
if(distance == 0.0) {
// here the player don't move
continue; // go to next player
}
}
lastLoc.put(p, p.getLocation()); // update loc
}
}, 20, 20);
}
我正在为一个事件创建一个插件,这个事件只是:当你停止移动时,你就松了。我创造了一切,但我检查玩家是否移动不起作用:
我尝试制作一个数组,当玩家移动事件时它被添加,但它不起作用,
@EventHandler
public static void OnPlayerMoov(PlayerMoveEvent e) {
if(!playerHaveMooved.contains(e.getPlayer())) {
playerHaveMooved.add(e.getPlayer());
}
}
public static boolean isMoving(Player p){
System.out.println(Respawn.playerHaveMooved.contains(p));
return Respawn.playerHaveMooved.contains(p);
}
我尝试使用速度;没用,
public static boolean isMoving(Player p){
return (p.getVelocity().length() == 0);
}
没用。当我移动时它会杀死我。
你有解决办法吗?
第一个不起作用,因为您只是检查玩家是否已经移动了一次,这将始终为真。
第二个关于速度检查,例如玩家被击退时。
第一个解决方案
保存最后一次移动,每隔几次检查是否停止移动。
在这个例子中,我将强制玩家每秒移动一次。
private final HashMap<Player, Long> timeMove = new HashMap<>(); // map for data
@Eventhandler
public void onMove(PlayerMoveEvent e) {
timeMove.put(e.getPlayer(), System.currentTimeMillis()); // update last move
}
public void startChecking(JavaPlugin pl) {
pl.getServer().getScheduler().runTaskTimer(pl, () -> {
long current = System.currentTimeMillis();
for(Player p : Bukkit.getOnlinePlayers()) {
long last = timeMove.getOrDefault(p, 0);
long diff = current - last;
if(diff > 1000) { // 1000 = second
// player don't move
}
}
}, 20, 20);
}
第二种解决方案
从上次和当前位置开始每 X 次检查一次
private final HashMap<Player, Location> lastLoc = new HashMap<>(); // map for data
public void startChecking(JavaPlugin pl) {
pl.getServer().getScheduler().runTaskTimer(pl, () -> {
for(Player p : Bukkit.getOnlinePlayers()) {
Location lastPlayerLoc = lastLoc.get(p); // get loc, or keep null if not registered
if(lastPlayerLoc != null) {
double distance = lastPlayerLoc.distance(p.getLocation());
if(distance == 0.0) {
// here the player don't move
continue; // go to next player
}
}
lastLoc.put(p, p.getLocation()); // update loc
}
}, 20, 20);
}