Skip to content

Commit

Permalink
feat(Events): Improve management of Player connections and skin parts…
Browse files Browse the repository at this point in the history
… with new events.
  • Loading branch information
GeorgeV220 committed Apr 21, 2023
1 parent 8d46a21 commit 1768d28
Show file tree
Hide file tree
Showing 15 changed files with 265 additions and 78 deletions.
@@ -1,6 +1,7 @@
package com.georgev22.skinoverlay.listeners.bukkit;

import com.georgev22.skinoverlay.SkinOverlay;
import com.georgev22.skinoverlay.event.events.player.PlayerSkinPartOptionsChangedEvent;
import com.georgev22.skinoverlay.utilities.OptionsUtil;
import net.glowstone.events.player.PlayerClientOptionsChangeEvent;
import org.bukkit.event.EventHandler;
Expand All @@ -11,15 +12,17 @@ public class GlowStonePlayerListeners implements Listener {

private final SkinOverlay skinOverlay = SkinOverlay.getInstance();

@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
@EventHandler(priority = EventPriority.HIGHEST)
public void onClientSettingsChange(PlayerClientOptionsChangeEvent event) {
if (OptionsUtil.EXPERIMENTAL_FEATURES.getBooleanValue()) {
if (!event.getPlayer().isOnline()) {
return;
}
if (event.hasSkinPartsChanged()) {
skinOverlay.getPlayer(event.getPlayer().getUniqueId()).orElseThrow().updateSkin();
}
skinOverlay.getEventManager().callEvent(new PlayerSkinPartOptionsChangedEvent(
skinOverlay.getPlayer(event.getPlayer().getUniqueId()).orElseThrow(),
event.hasSkinPartsChanged(),
true)
);
}
}

Expand Down
Expand Up @@ -2,23 +2,28 @@

import com.destroystokyo.paper.event.player.PlayerClientOptionsChangeEvent;
import com.georgev22.skinoverlay.SkinOverlay;
import com.georgev22.skinoverlay.event.events.player.PlayerSkinPartOptionsChangedEvent;
import com.georgev22.skinoverlay.utilities.OptionsUtil;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;

public class PaperPlayerListeners implements Listener {

private final SkinOverlay skinOverlay = SkinOverlay.getInstance();

@EventHandler
@EventHandler(priority = EventPriority.HIGHEST)
public void onPLayerClientOptionsChange(PlayerClientOptionsChangeEvent event) {
if (OptionsUtil.EXPERIMENTAL_FEATURES.getBooleanValue()) {
if (!event.getPlayer().isOnline()) {
return;
}
if (event.hasSkinPartsChanged()) {
skinOverlay.getPlayer(event.getPlayer().getUniqueId()).orElseThrow().updateSkin();
}

skinOverlay.getEventManager().callEvent(new PlayerSkinPartOptionsChangedEvent(
skinOverlay.getPlayer(event.getPlayer().getUniqueId()).orElseThrow(),
event.hasSkinPartsChanged(),
true)
);
}
}

Expand Down
@@ -1,8 +1,7 @@
package com.georgev22.skinoverlay.listeners.bukkit;

import com.georgev22.library.scheduler.SchedulerManager;
import com.georgev22.skinoverlay.SkinOverlay;
import com.georgev22.skinoverlay.utilities.OptionsUtil;
import com.georgev22.skinoverlay.event.events.player.PlayerObjectConnectionEvent;
import com.georgev22.skinoverlay.utilities.SkinOptions;
import com.georgev22.skinoverlay.utilities.Utilities;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
Expand Down Expand Up @@ -32,23 +31,26 @@
public class PlayerListeners implements Listener, PluginMessageListener {
private final SkinOverlay skinOverlay = SkinOverlay.getInstance();

@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
@EventHandler(priority = EventPriority.LOWEST)
public void onJoin(PlayerJoinEvent playerJoinEvent) {
PlayerObject playerObject = skinOverlay.getPlayer(playerJoinEvent.getPlayer().getUniqueId()).orElseThrow();
playerObject.playerJoin();
if (OptionsUtil.PROXY.getBooleanValue())
SchedulerManager.getScheduler().runTaskAsynchronously(skinOverlay.getClass(), () -> {
skinOverlay.getPluginMessageUtils().setChannel("skinoverlay:message");
if (playerJoinEvent.getPlayer().isOnline())
skinOverlay.getPluginMessageUtils().sendDataToPlayer("playerJoin", playerObject, playerObject.playerUUID().toString());
else
skinOverlay.getLogger().warning("Player " + playerObject.playerName() + " is not online");
});
skinOverlay.getEventManager().callEvent(
new PlayerObjectConnectionEvent(
skinOverlay.getPlayer(playerJoinEvent.getPlayer().getUniqueId()).orElseThrow(),
PlayerObjectConnectionEvent.ConnectionType.CONNECT,
true
)
);
}

@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
@EventHandler(priority = EventPriority.LOWEST)
public void onQuit(PlayerQuitEvent playerQuitEvent) {
skinOverlay.getPlayer(playerQuitEvent.getPlayer().getUniqueId()).orElseThrow().playerQuit();
skinOverlay.getEventManager().callEvent(
new PlayerObjectConnectionEvent(
skinOverlay.getPlayer(playerQuitEvent.getPlayer().getUniqueId()).orElseThrow(),
PlayerObjectConnectionEvent.ConnectionType.DISCONNECT,
true
)
);
}

@SneakyThrows
Expand Down
Expand Up @@ -2,6 +2,7 @@

import com.georgev22.library.scheduler.SchedulerManager;
import com.georgev22.skinoverlay.SkinOverlay;
import com.georgev22.skinoverlay.event.events.player.PlayerObjectConnectionEvent;
import com.georgev22.skinoverlay.utilities.Utilities;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
import com.google.common.io.ByteArrayDataInput;
Expand All @@ -24,12 +25,24 @@ public class PlayerListeners implements Listener {
public void onLogin(PostLoginEvent postLoginEvent) {
if (!postLoginEvent.getPlayer().isConnected())
return;
skinOverlay.getPlayer(postLoginEvent.getPlayer().getUniqueId()).orElseThrow().playerJoin();
skinOverlay.getEventManager().callEvent(
new PlayerObjectConnectionEvent(
skinOverlay.getPlayer(postLoginEvent.getPlayer().getUniqueId()).orElseThrow(),
PlayerObjectConnectionEvent.ConnectionType.CONNECT,
true
)
);
}

@EventHandler(priority = 1)
public void onQuit(PlayerDisconnectEvent playerDisconnectEvent) {
skinOverlay.getPlayer(playerDisconnectEvent.getPlayer().getUniqueId()).orElseThrow().playerQuit();
skinOverlay.getEventManager().callEvent(
new PlayerObjectConnectionEvent(
skinOverlay.getPlayer(playerDisconnectEvent.getPlayer().getUniqueId()).orElseThrow(),
PlayerObjectConnectionEvent.ConnectionType.DISCONNECT,
true
)
);
}

@EventHandler
Expand Down
Expand Up @@ -70,13 +70,13 @@ public void unregister(EventListener @NotNull ... listeners) {
*
* @param event the event to call
*/
public void callEvent(Event event) {
if (event == null) return;
public Event callEvent(@NotNull Event event) {
if (event.isAsynchronous()) {
SchedulerManager.getScheduler().runTaskAsynchronously(clazz, () -> callEvent0(event));
} else {
callEvent0(event);
}
return event;
}

private void callEvent0(@NotNull Event event) {
Expand Down
@@ -0,0 +1,44 @@
package com.georgev22.skinoverlay.event.events.player;

import com.georgev22.skinoverlay.event.Cancellable;
import com.georgev22.skinoverlay.event.HandlerList;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
import org.jetbrains.annotations.NotNull;

public class PlayerObjectConnectionEvent extends PlayerObjectEvent implements Cancellable {

private static final HandlerList handlers = new HandlerList();

private final ConnectionType connectionType;

/**
* Constructs a {@code PlayerObjectConnectionEvent} with the specified player object, connection type and asynchronous status.
*
* @param playerObject the player object associated with this event
* @param connectionType the player connection type
* @param async whether this event should be run asynchronously
*/
public PlayerObjectConnectionEvent(PlayerObject playerObject, ConnectionType connectionType, boolean async) {
super(playerObject, async);
this.connectionType = connectionType;
}

public ConnectionType getConnectionType() {
return connectionType;
}

@NotNull
@Override
public HandlerList getHandlers() {
return handlers;
}

public static HandlerList getHandlerList() {
return handlers;
}

public enum ConnectionType {
CONNECT,
DISCONNECT
}
}
@@ -1,34 +1,33 @@
package com.georgev22.skinoverlay.event.events.player;

import com.georgev22.library.utilities.UserManager;
import com.georgev22.skinoverlay.event.Cancellable;
import com.georgev22.skinoverlay.event.Event;
import com.georgev22.skinoverlay.event.HandlerList;
import com.georgev22.skinoverlay.event.events.user.UserEvent;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
* An event that represents a player object event.
*/
public class PlayerObjectEvent extends UserEvent implements Cancellable {
public class PlayerObjectEvent extends Event implements Cancellable {

private static final HandlerList handlers = new HandlerList();

private boolean cancelled;

/**
* The player object associated with this event.
*/
private final PlayerObject playerObject;

/**
* Constructs a {@code PlayerObjectEvent} with the specified player object, user, and asynchronous status.
* Constructs a {@code PlayerObjectEvent} with the specified player object and asynchronous status.
*
* @param playerObject the player object associated with this event
* @param user the user associated with this event, or {@code null} if there is no user associated with this event
* @param async whether this event should be run asynchronously
*/
public PlayerObjectEvent(PlayerObject playerObject, @Nullable UserManager.User user, boolean async) {
super(user == null ? new UserManager.User(playerObject.playerUUID()) : user, async);
public PlayerObjectEvent(PlayerObject playerObject, boolean async) {
super(async);
this.playerObject = playerObject;
}

Expand All @@ -50,4 +49,24 @@ public HandlerList getHandlers() {
public static HandlerList getHandlerList() {
return handlers;
}

/**
* Cancels the event.
*
* @return {@code true} if the event was successfully cancelled, {@code false} otherwise
*/
@Override
public boolean cancel() {
return cancelled = true;
}

/**
* Returns whether the event has been cancelled.
*
* @return {@code true} if the event has been cancelled, {@code false} otherwise
*/
@Override
public boolean isCancelled() {
return cancelled;
}
}
Expand Up @@ -10,7 +10,7 @@
/**
* An event that represents a user player object event.
*/
public class UserPlayerObjectEvent extends UserEvent implements Cancellable {
public class PlayerObjectUserEvent extends UserEvent implements Cancellable {

private final static HandlerList handlers = new HandlerList();

Expand All @@ -20,13 +20,14 @@ public class UserPlayerObjectEvent extends UserEvent implements Cancellable {
private final PlayerObject playerObject;

/**
* Constructs a {@code UserPlayerObjectEvent} with the specified user, player object, and asynchronous status.
* Constructs a {@code PlayerObjectUserEvent} with the specified user, player object, and asynchronous status.
* <p>
*
* @param user the user associated with this event
* @param playerObject the player object associated with this event
* @param user the user associated with this event
* @param async whether this event should be run asynchronously
*/
public UserPlayerObjectEvent(@NotNull UserManager.User user, @NotNull PlayerObject playerObject, boolean async) {
public PlayerObjectUserEvent(@NotNull PlayerObject playerObject, @NotNull UserManager.User user, boolean async) {
super(user, async);
this.playerObject = playerObject;
}
Expand Down
@@ -0,0 +1,36 @@
package com.georgev22.skinoverlay.event.events.player;

import com.georgev22.skinoverlay.event.HandlerList;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
import org.jetbrains.annotations.NotNull;

public class PlayerSkinPartOptionsChangedEvent extends PlayerObjectEvent {

private static final HandlerList handlers = new HandlerList();
private final boolean hasSkinPartsChanged;

/**
* Constructs a {@code PlayerSkinPartOptionsChangedEvent} with the specified player object and asynchronous status.
*
* @param playerObject the player object associated with this event
* @param async whether this event should be run asynchronously
*/
public PlayerSkinPartOptionsChangedEvent(PlayerObject playerObject, boolean hasSkinPartsChanged, boolean async) {
super(playerObject, async);
this.hasSkinPartsChanged = hasSkinPartsChanged;
}

public boolean hasSkinPartsChanged() {
return hasSkinPartsChanged;
}

@NotNull
@Override
public HandlerList getHandlers() {
return handlers;
}

public static HandlerList getHandlerList() {
return handlers;
}
}
Expand Up @@ -3,15 +3,15 @@
import com.georgev22.library.utilities.UserManager;
import com.georgev22.skinoverlay.event.Cancellable;
import com.georgev22.skinoverlay.event.HandlerList;
import com.georgev22.skinoverlay.event.events.player.PlayerObjectEvent;
import com.georgev22.skinoverlay.event.events.player.PlayerObjectUserEvent;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
* Represents an event that is called before the player's skin is updated.
*/
public class PlayerObjectPreUpdateSkinEvent extends PlayerObjectEvent implements Cancellable {
public class PlayerObjectPreUpdateSkinEvent extends PlayerObjectUserEvent implements Cancellable {

private static final HandlerList handlers = new HandlerList();

Expand Down
Expand Up @@ -3,7 +3,7 @@
import com.georgev22.library.utilities.UserManager;
import com.georgev22.skinoverlay.event.Cancellable;
import com.georgev22.skinoverlay.event.HandlerList;
import com.georgev22.skinoverlay.event.events.player.PlayerObjectEvent;
import com.georgev22.skinoverlay.event.events.player.PlayerObjectUserEvent;
import com.georgev22.skinoverlay.utilities.SkinOptions;
import com.georgev22.skinoverlay.utilities.Utilities;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
Expand All @@ -17,7 +17,7 @@
* This event is cancellable, which allows you to prevent the player's skin from being updated.
* If you want to modify the skin options of a player, use {@link PlayerObjectPreUpdateSkinEvent}.
*/
public class PlayerObjectUpdateSkinEvent extends PlayerObjectEvent implements Cancellable {
public class PlayerObjectUpdateSkinEvent extends PlayerObjectUserEvent implements Cancellable {

/**
* A list of all registered handlers for this event.
Expand All @@ -39,7 +39,7 @@ public class PlayerObjectUpdateSkinEvent extends PlayerObjectEvent implements Ca
* If true, the event will be handled on a separate thread.
* If false, the event will be handled on the main thread.
*/
public PlayerObjectUpdateSkinEvent(PlayerObject playerObject, UserManager.@Nullable User user, @Nullable SkinOptions skinOptions, boolean async) {
public PlayerObjectUpdateSkinEvent(PlayerObject playerObject, UserManager.User user, @Nullable SkinOptions skinOptions, boolean async) {
super(playerObject, user, async);
this.skinOptions = skinOptions;
}
Expand Down

0 comments on commit 1768d28

Please sign in to comment.