我正在為一個事件創建一個插件,這個事件只是:當你停止移動時,你就松了。我創建了所有內容,但我檢查玩家是否移動不起作用:
我試圖制作一個陣列,當一個玩家移動事件被添加時,但它不起作用,
@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);
}
它不起作用。當我移動時它會殺死我。
你有解決方案嗎?
uj5u.com熱心網友回復:
第一個不起作用,因為您只是檢查玩家是否已經移動了一段時間,這將始終為真。
例如,僅當玩家被擊退時,第二個關于速度檢查。
第一個解決方案
保存上次移動的時間,每隔幾次檢查是否停止移動。
在這個例子中,我將強制玩家每秒鐘移動一次。
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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362166.html
