Excluding ProtocolLib from fake player events
This commit is contained in:
parent
67074017d2
commit
649fd4611f
2 changed files with 70 additions and 4 deletions
|
@ -134,11 +134,11 @@ public class MCChatListener implements Listener, IListener<MessageReceivedEvent>
|
||||||
val sender = new DiscordConnectedPlayer(user, channel, mcp.getUUID());
|
val sender = new DiscordConnectedPlayer(user, channel, mcp.getUUID());
|
||||||
ConnectedSenders.put(user.getStringID(), sender);
|
ConnectedSenders.put(user.getStringID(), sender);
|
||||||
if (p == null)// Player is offline - If the player is online, that takes precedence
|
if (p == null)// Player is offline - If the player is online, that takes precedence
|
||||||
Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(sender, ""));
|
MCListener.callEventExcluding(new PlayerJoinEvent(sender, ""), "ProtocolLib");
|
||||||
} else {
|
} else {
|
||||||
val sender = ConnectedSenders.remove(user.getStringID());
|
val sender = ConnectedSenders.remove(user.getStringID());
|
||||||
if (p == null)// Player is offline - If the player is online, that takes precedence
|
if (p == null)// Player is offline - If the player is online, that takes precedence
|
||||||
Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(sender, ""));
|
MCListener.callEventExcluding(new PlayerQuitEvent(sender, ""), "ProtocolLib");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return start //
|
return start //
|
||||||
|
|
|
@ -1,14 +1,22 @@
|
||||||
package buttondevteam.discordplugin.listeners;
|
package buttondevteam.discordplugin.listeners;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.event.server.ServerCommandEvent;
|
import org.bukkit.event.server.ServerCommandEvent;
|
||||||
|
import org.bukkit.plugin.AuthorNagException;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.plugin.RegisteredListener;
|
||||||
|
|
||||||
import com.earth2me.essentials.CommandSource;
|
import com.earth2me.essentials.CommandSource;
|
||||||
|
|
||||||
|
@ -41,7 +49,7 @@ public class MCListener implements Listener {
|
||||||
new DiscordPlayerSender(user, DiscordPlugin.chatchannel, p));
|
new DiscordPlayerSender(user, DiscordPlugin.chatchannel, p));
|
||||||
MCChatListener.ConnectedSenders.values().stream()
|
MCChatListener.ConnectedSenders.values().stream()
|
||||||
.filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny()
|
.filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny()
|
||||||
.ifPresent(dcp -> Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(dcp, "")));
|
.ifPresent(dcp -> callEventExcluding(new PlayerQuitEvent(dcp, ""), "ProtocolLib"));
|
||||||
}
|
}
|
||||||
if (ConnectCommand.WaitingToConnect.containsKey(e.GetPlayer().PlayerName().get())) {
|
if (ConnectCommand.WaitingToConnect.containsKey(e.GetPlayer().PlayerName().get())) {
|
||||||
IUser user = DiscordPlugin.dc
|
IUser user = DiscordPlugin.dc
|
||||||
|
@ -62,7 +70,7 @@ public class MCListener implements Listener {
|
||||||
.removeIf(entry -> entry.getValue().getUniqueId().equals(e.getPlayer().getUniqueId()));
|
.removeIf(entry -> entry.getValue().getUniqueId().equals(e.getPlayer().getUniqueId()));
|
||||||
MCChatListener.ConnectedSenders.values().stream()
|
MCChatListener.ConnectedSenders.values().stream()
|
||||||
.filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny()
|
.filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny()
|
||||||
.ifPresent(dcp -> Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(dcp, "")));
|
.ifPresent(dcp -> callEventExcluding(new PlayerJoinEvent(dcp, ""), "ProtocolLib"));
|
||||||
MCChatListener.sendSystemMessageToChat(e.GetPlayer().PlayerName().get() + " left the game");
|
MCChatListener.sendSystemMessageToChat(e.GetPlayer().PlayerName().get() + " left the game");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,4 +129,62 @@ public class MCListener implements Listener {
|
||||||
ex);
|
ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls an event with the given details.
|
||||||
|
* <p>
|
||||||
|
* This method only synchronizes when the event is not asynchronous.
|
||||||
|
*
|
||||||
|
* @param event
|
||||||
|
* Event details
|
||||||
|
* @param plugins
|
||||||
|
* The plugins to exclude. Not case sensitive.
|
||||||
|
*/
|
||||||
|
public static void callEventExcluding(Event event, String... plugins) { // Copied from Spigot-API and modified a bit
|
||||||
|
if (event.isAsynchronous()) {
|
||||||
|
if (Thread.holdsLock(Bukkit.getPluginManager())) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
event.getEventName() + " cannot be triggered asynchronously from inside synchronized code.");
|
||||||
|
}
|
||||||
|
if (Bukkit.getServer().isPrimaryThread()) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
event.getEventName() + " cannot be triggered asynchronously from primary server thread.");
|
||||||
|
}
|
||||||
|
fireEventExcluding(event, plugins);
|
||||||
|
} else {
|
||||||
|
synchronized (Bukkit.getPluginManager()) {
|
||||||
|
fireEventExcluding(event, plugins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void fireEventExcluding(Event event, String... plugins) {
|
||||||
|
HandlerList handlers = event.getHandlers(); // Code taken from SimplePluginManager in Spigot-API
|
||||||
|
RegisteredListener[] listeners = handlers.getRegisteredListeners();
|
||||||
|
val server = Bukkit.getServer();
|
||||||
|
|
||||||
|
for (RegisteredListener registration : listeners) {
|
||||||
|
if (!registration.getPlugin().isEnabled()
|
||||||
|
|| Arrays.stream(plugins).anyMatch(p -> p.equalsIgnoreCase(registration.getPlugin().getName())))
|
||||||
|
continue; // Modified to exclude plugins
|
||||||
|
|
||||||
|
try {
|
||||||
|
registration.callEvent(event);
|
||||||
|
} catch (AuthorNagException ex) {
|
||||||
|
Plugin plugin = registration.getPlugin();
|
||||||
|
|
||||||
|
if (plugin.isNaggable()) {
|
||||||
|
plugin.setNaggable(false);
|
||||||
|
|
||||||
|
server.getLogger().log(Level.SEVERE,
|
||||||
|
String.format("Nag author(s): '%s' of '%s' about the following: %s",
|
||||||
|
plugin.getDescription().getAuthors(), plugin.getDescription().getFullName(),
|
||||||
|
ex.getMessage()));
|
||||||
|
}
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
server.getLogger().log(Level.SEVERE, "Could not pass event " + event.getEventName() + " to "
|
||||||
|
+ registration.getPlugin().getDescription().getFullName(), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue