Performance improvement for detecting player movement

This commit is contained in:
Esophose 2020-04-19 15:56:15 -06:00
parent e8c9278e76
commit 5d55eb05c2
4 changed files with 26 additions and 28 deletions

View file

@ -10,7 +10,7 @@ sourceCompatibility = 1.8
targetCompatibility = 1.8
compileJava.options.encoding = 'UTF-8'
group = 'dev.esophose'
version = '7.8'
version = '7.9'
java {
withJavadocJar()

View file

@ -1,3 +1,6 @@
=== v7.9 ===
* Fixed performance issues with toggle-on-move setting
* Fixed possible concurrency deadlock with arrows and fishing styles
=== v7.8 ===
+ Added style 'fishing'
* Moved GUI icon settings from the config.yml to the effects/ and styles/ files. You will need to set these again.

View file

@ -10,6 +10,7 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
@ -55,10 +56,7 @@ public class PPlayerCombatListener implements Listener {
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerAttack(EntityDamageByEntityEvent event) {
if (!Setting.TOGGLE_ON_COMBAT.getBoolean())
return;
if (!(event.getEntity() instanceof Player))
if (event.getEntity().getType() != EntityType.PLAYER)
return;
Player attacker;

View file

@ -11,21 +11,38 @@ import java.util.Map;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.util.Vector;
public class PPlayerMovementListener implements Listener {
private static final int CHECK_INTERVAL = 3;
private Map<UUID, Integer> timeSinceLastMovement;
private Map<UUID, Vector> previousVectors;
public PPlayerMovementListener() {
DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class);
this.timeSinceLastMovement = new HashMap<>();
this.previousVectors = new HashMap<>();
Bukkit.getScheduler().runTaskTimer(PlayerParticles.getInstance(), () -> {
for (Player player : Bukkit.getOnlinePlayers()) {
UUID playerUUID = player.getUniqueId();
Vector previousVector = this.previousVectors.get(playerUUID);
Location currentLocation = player.getLocation();
Vector currentVector = new Vector(currentLocation.getBlockX(), currentLocation.getBlockY(), currentLocation.getBlockZ());
this.previousVectors.put(playerUUID, currentVector);
if (previousVector == null || !previousVector.equals(currentVector)) {
if (!this.timeSinceLastMovement.containsKey(playerUUID)) {
this.timeSinceLastMovement.put(playerUUID, 0);
} else {
this.timeSinceLastMovement.replace(playerUUID, 0);
}
}
}
List<UUID> toRemove = new ArrayList<>();
for (UUID uuid : this.timeSinceLastMovement.keySet()) {
@ -45,24 +62,4 @@ public class PPlayerMovementListener implements Listener {
}, 0, CHECK_INTERVAL);
}
/**
* Used to detect if the player is moving
*
* @param event The event
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerMove(PlayerMoveEvent event) {
Location to = event.getTo();
Location from = event.getFrom();
if (to == null || (to.getBlockX() == from.getBlockX() && to.getBlockY() == from.getBlockY() && to.getBlockZ() == from.getBlockZ()))
return;
UUID playerUUID = event.getPlayer().getUniqueId();
if (!this.timeSinceLastMovement.containsKey(playerUUID)) {
this.timeSinceLastMovement.put(playerUUID, 0);
} else {
this.timeSinceLastMovement.replace(playerUUID, 0);
}
}
}