Skip to content

Commit

Permalink
Listener optimizations (#1884)
Browse files Browse the repository at this point in the history
* Drop CraftBukkit support, listeners cleanup

* Codestyle

* Codestyle

* Remove useless player.saveData() calls

* Micro optimization on the join process

* Requested changes

* Fix unit test

* Test onPlayerHeldItem listener

* Requested changes

* Remove unused import
  • Loading branch information
sgdc3 committed Aug 11, 2019
1 parent e2f2ff0 commit d30580d
Show file tree
Hide file tree
Showing 24 changed files with 444 additions and 503 deletions.
6 changes: 4 additions & 2 deletions src/main/java/fr/xephi/authme/AuthMe.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,10 @@ public void onEnable() {
logger = ConsoleLoggerFactory.get(AuthMe.class);

// Check server version
if (!isClassLoaded("org.bukkit.event.player.PlayerInteractAtEntityEvent")) {
logger.warning("You are running an unsupported server version! AuthMe requires MC 1.8.X or later!");
if (!isClassLoaded("org.spigotmc.event.player.PlayerSpawnLocationEvent")
|| !isClassLoaded("org.bukkit.event.player.PlayerInteractAtEntityEvent")) {
logger.warning("You are running an unsupported server version!"
+ "AuthMe requires Spigot 1.8.X or later!");
stopOrUnload();
return;
}
Expand Down
1 change: 0 additions & 1 deletion src/main/java/fr/xephi/authme/listener/BlockListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,4 @@ public void onBlockBreak(BlockBreakEvent event) {
event.setCancelled(true);
}
}

}
42 changes: 5 additions & 37 deletions src/main/java/fr/xephi/authme/listener/EntityListener.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package fr.xephi.authme.listener;

import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
Expand All @@ -16,32 +13,19 @@
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.projectiles.ProjectileSource;

import javax.inject.Inject;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class EntityListener implements Listener {

private final ConsoleLogger logger = ConsoleLoggerFactory.get(EntityListener.class);
private final ListenerService listenerService;

private Method getShooter;
private boolean shooterIsLivingEntity;

@Inject
EntityListener(ListenerService listenerService) {
this.listenerService = listenerService;

try {
getShooter = Projectile.class.getDeclaredMethod("getShooter");
shooterIsLivingEntity = getShooter.getReturnType() == LivingEntity.class;
} catch (NoSuchMethodException | SecurityException e) {
logger.logException("Cannot load getShooter() method on Projectile class", e);
}
}

// Note #360: npc status can be used to bypass security!!!
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onDamage(EntityDamageEvent event) {
if (listenerService.shouldCancelEvent(event)) {
Expand Down Expand Up @@ -81,6 +65,7 @@ public void entityRegainHealthEvent(EntityRegainHealthEvent event) {
}
}

//TODO sgdc3 20190808: We listen at the same event twice, does it make any sense?
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityInteract(EntityInteractEvent event) {
if (listenerService.shouldCancelEvent(event)) {
Expand All @@ -97,26 +82,10 @@ public void onLowestEntityInteract(EntityInteractEvent event) {

@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onProjectileLaunch(ProjectileLaunchEvent event) {
if (event.getEntity() == null) {
return;
}
final Projectile projectile = event.getEntity();

Projectile projectile = event.getEntity();
// In the Bukkit API prior to 1.7, getShooter() returns a LivingEntity instead of a ProjectileSource
Object shooterRaw = null;
if (shooterIsLivingEntity) {
try {
if (getShooter == null) {
getShooter = Projectile.class.getMethod("getShooter");
}
shooterRaw = getShooter.invoke(projectile);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
logger.logException("Error getting shooter", e);
}
} else {
shooterRaw = projectile.getShooter();
}
if (shooterRaw instanceof Player && listenerService.shouldCancelEvent((Player) shooterRaw)) {
ProjectileSource shooter = projectile.getShooter();
if (shooter instanceof Player && listenerService.shouldCancelEvent((Player) shooter)) {
event.setCancelled(true);
}
}
Expand All @@ -127,5 +96,4 @@ public void onShoot(EntityShootBowEvent event) {
event.setCancelled(true);
}
}

}
66 changes: 0 additions & 66 deletions src/main/java/fr/xephi/authme/listener/JoiningPlayer.java

This file was deleted.

16 changes: 8 additions & 8 deletions src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
* Service for performing various verifications when a player joins.
*/
public class OnJoinVerifier implements Reloadable {

private final ConsoleLogger logger = ConsoleLoggerFactory.get(OnJoinVerifier.class);

@Inject
Expand Down Expand Up @@ -67,16 +67,16 @@ public void reload() {
/**
* Checks if Antibot is enabled.
*
* @param joiningPlayer the joining player to check
* @param name the joining player name to check
* @param isAuthAvailable whether or not the player is registered
* @throws FailedVerificationException if the verification fails
*/
public void checkAntibot(JoiningPlayer joiningPlayer, boolean isAuthAvailable) throws FailedVerificationException {
if (isAuthAvailable || permissionsManager.hasPermission(joiningPlayer, PlayerStatePermission.BYPASS_ANTIBOT)) {
public void checkAntibot(String name, boolean isAuthAvailable) throws FailedVerificationException {
if (isAuthAvailable || permissionsManager.hasPermissionOffline(name, PlayerStatePermission.BYPASS_ANTIBOT)) {
return;
}
if (antiBotService.shouldKick()) {
antiBotService.addPlayerKick(joiningPlayer.getName());
antiBotService.addPlayerKick(name);
throw new FailedVerificationException(MessageKey.KICK_ANTIBOT);
}
}
Expand Down Expand Up @@ -170,16 +170,16 @@ public void checkNameCasing(String connectingName, PlayerAuth auth) throws Faile
/**
* Checks that the player's country is admitted.
*
* @param joiningPlayer the joining player to verify
* @param name the joining player name to verify
* @param address the player address
* @param isAuthAvailable whether or not the user is registered
* @throws FailedVerificationException if the verification fails
*/
public void checkPlayerCountry(JoiningPlayer joiningPlayer, String address,
public void checkPlayerCountry(String name, String address,
boolean isAuthAvailable) throws FailedVerificationException {
if ((!isAuthAvailable || settings.getProperty(ProtectionSettings.ENABLE_PROTECTION_REGISTERED))
&& settings.getProperty(ProtectionSettings.ENABLE_PROTECTION)
&& !permissionsManager.hasPermission(joiningPlayer, PlayerStatePermission.BYPASS_COUNTRY_CHECK)
&& !permissionsManager.hasPermissionOffline(name, PlayerStatePermission.BYPASS_COUNTRY_CHECK)
&& !validationService.isCountryAdmitted(address)) {
throw new FailedVerificationException(MessageKey.COUNTRY_BANNED_ERROR);
}
Expand Down

0 comments on commit d30580d

Please sign in to comment.