Implemented CustomPlayerMoveEvent that only fires on certain conditions and only checks every 10ticks

master
Ruakij 4 years ago
parent c0917a1ab6
commit ddb6525c40

@ -0,0 +1,35 @@
package eu.ruekov.ruakij.LinkedBeaconTeleporters.customPlayerMoveEvent;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import java.io.InvalidObjectException;
public class CustomPlayerMoveEvent {
Player p;
Location loc;
Location oldLoc;
protected double distance;
public CustomPlayerMoveEvent(Player p, Location loc, Location oldLoc){
this.p = p;
this.loc = loc;
this.oldLoc = oldLoc;
}
public Player player(){
return p;
}
public Location location(){
return loc;
}
public Location oldLocation(){
return oldLoc;
}
public double distance(){
return distance;
}
}

@ -0,0 +1,89 @@
package eu.ruekov.ruakij.LinkedBeaconTeleporters.customPlayerMoveEvent;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
public class CustomPlayerMoveEventHandler {
List<CustomPlayerMoveEventListener> listeners = new ArrayList<>();
HashMap<UUID, Location> oldPlayerLoc = new HashMap<>();
boolean locationChangeOnBlockChange;
public CustomPlayerMoveEventHandler(Plugin plugin, boolean locationChangeOnBlockChange){
this.locationChangeOnBlockChange = locationChangeOnBlockChange;
startRunnable(plugin);
}
public CustomPlayerMoveEventHandler(Plugin plugin){
this(plugin, false);
}
void startRunnable(Plugin plugin){
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
// Dont do anything without listeners
if(listeners.size() == 0) return;
// Check all players
for(Player p : Bukkit.getOnlinePlayers()){
UUID uuid = p.getUniqueId();
Location loc = p.getLocation();
// Get old-location
Location oldLoc = oldPlayerLoc.get(uuid);
// Create data-obj
CustomPlayerMoveEvent e = new CustomPlayerMoveEvent(p, loc, oldLoc);
// When player has an old-location
if(oldLoc != null){
if(!locationChangeOnBlockChange){
double distance = loc.distance(oldLoc);
e.distance = distance;
if(distance > 0)
locationChangeListeners(e);
}
else
locationChangeListeners(e);
}
tickListeners(e);
// Save old location
oldPlayerLoc.put(uuid, loc);
}
}, 20, 10);
}
boolean blockLocationChanged(Location loc, Location oldLoc){
return loc.getBlockX() != oldLoc.getBlockX() ||
loc.getBlockY() != oldLoc.getBlockY() ||
loc.getBlockZ() != oldLoc.getBlockZ();
}
void tickListeners(CustomPlayerMoveEvent e){
for(CustomPlayerMoveEventListener listener : listeners){
listener.tick(e);
}
}
void locationChangeListeners(CustomPlayerMoveEvent e){
for(CustomPlayerMoveEventListener listener : listeners){
listener.locationChange(e);
}
}
public void registerListener(CustomPlayerMoveEventListener listener){
listeners.add(listener);
}
}

@ -0,0 +1,10 @@
package eu.ruekov.ruakij.LinkedBeaconTeleporters.customPlayerMoveEvent;
import org.bukkit.entity.Player;
public interface CustomPlayerMoveEventListener {
void tick(CustomPlayerMoveEvent e);
void locationChange(CustomPlayerMoveEvent e);
}
Loading…
Cancel
Save